pax_global_header00006660000000000000000000000064136532552010014514gustar00rootroot0000000000000052 comment=af4df578d1d903f99c001361341c76c6a350006a golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/000077500000000000000000000000001365325520100215655ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/.gitignore000066400000000000000000000000131365325520100235470ustar00rootroot00000000000000tls_vendor golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/.travis.yml000066400000000000000000000023501365325520100236760ustar00rootroot00000000000000sudo: required language: go go: - 1.13.x - 1.14.x - master matrix: include: - name: "Go on x86-64" os: linux script: - make clean - NOASM=0 make test - NOASM=1 make test - name: "Go 1.13 on ARM64" services: docker os: linux script: - docker run --rm --privileged multiarch/qemu-user-static:register --reset - docker run --rm -v `pwd`:`pwd` -w `pwd` "flowher/debian-buster-aarch64-go-1.13" /bin/bash -c "NOASM=0 make test" - docker run --rm -v `pwd`:`pwd` -w `pwd` "flowher/debian-buster-aarch64-go-1.13" /bin/bash -c "NOASM=1 make test" - name: "Go 1.14 on ARM64" services: docker os: linux script: - docker run --rm --privileged multiarch/qemu-user-static:register --reset - docker run --rm -v `pwd`:`pwd` -w `pwd` "flowher/debian-buster-aarch64-go-1.14" /bin/bash -c "NOASM=0 make test" - docker run --rm -v `pwd`:`pwd` -w `pwd` "flowher/debian-buster-aarch64-go-1.14" /bin/bash -c "NOASM=1 make test" - name: "Coverage" os: linux script: - NOASM=0 make cover - NOASM=1 make cover after_script: - bash <(curl -s https://codecov.io/bash) -t 8a75b459-85b1-4e5d-aa12-4dd705914700 golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/LICENSE000066400000000000000000000007311365325520100225730ustar00rootroot00000000000000 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO.golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/Makefile000066400000000000000000000035351365325520100232330ustar00rootroot00000000000000# I'm sure there is better way. But I would need to find it first MK_FILE_PATH = $(lastword $(MAKEFILE_LIST)) PRJ_DIR = $(abspath $(dir $(MK_FILE_PATH))) GO ?= go VENDOR_DIR = tls_vendor OPTS ?= -v NOASM ?= TEST_PATH ?= ./... GOCACHE ?= off BENCH_OPTS ?= -v -bench=. -run="^_" -benchmem TEST_PATH ?= ./... DBG = 1 OPTS_ENV = ifeq ($(NOASM),1) OPTS+=$(OPTS_TAGS) endif ifeq ($(PPROF),1) BENCH_OPTS+= -cpuprofile=cpu.out -memprofile=mem0.out endif ifeq ($(DBG),1) DBG_FLAGS+= #-m # escape analysis DBG_FLAGS+= -l # no inline DBG_FLAGS+= -N # debug symbols #OPTS+=-gcflags=all="$(DBG_FLAGS)" OPTS+=-gcflags "$(DBG_FLAGS)" OPTS_ENV+= GOTRACEBACK=crash # enable core dumps endif test: $(OPTS_ENV) $(GO) test $(OPTS) $(TEST_PATH) test_csidh: clean make_dirs $(addprefix prep-,$(TARGETS)) cd $(GOPATH_LOCAL); $(OPTS_ENV) GOPATH=$(GOPATH_LOCAL) go test $(OPTS) github.com/henrydcase/nobs/dh/csidh test_csidh_bin: clean make_dirs $(addprefix prep-,$(TARGETS)) cd $(GOPATH_LOCAL); $(OPTS_ENV) GOPATH=$(GOPATH_LOCAL) go test -c $(OPTS) github.com/henrydcase/nobs/dh/csidh cover: $(GO) test \ -coverprofile=coverage.txt -covermode=atomic $(OPTS) $(TEST_PATH) bench: $(GO) test $(BENCH_OPTS) $(TEST_PATH) bench_csidh: clean $(addprefix prep-,$(TARGETS)) cd $(GOPATH_LOCAL); GOCACHE=$(GOCACHE) GOPATH=$(GOPATH_LOCAL) $(GO) test \ $(BENCH_OPTS) github.com/henrydcase/nobs/dh/csidh clean: rm -rf $(VENDOR_DIR) rm -rf coverage.txt vendor-sidh-for-tls: clean mkdir -p $(VENDOR_DIR)/github_com/henrydcase/nobs/ rsync -a . $(VENDOR_DIR)/github_com/henrydcase/nobs/ --exclude=$(VENDOR_DIR) --exclude=.git --exclude=.travis.yml --exclude=README.md find $(VENDOR_DIR) -type f -print0 -name "*.go" | xargs -0 sed -i 's/github\.com/github_com/g' pprof-cpu: $(GO) tool pprof cpu.out pprof-mem: $(GO) tool pprof mem0.out golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/README.md000066400000000000000000000003031365325520100230400ustar00rootroot00000000000000# NOBS Crypto Cryptographic implementation of quantum-resistant primitives in Go. ## Licence [WTFPLv2](https://en.wikipedia.org/wiki/WTFPL) except if specified differently in the subfolders. golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/000077500000000000000000000000001365325520100221605ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/000077500000000000000000000000001365325520100232525ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/consts.go000066400000000000000000000060601365325520100251140ustar00rootroot00000000000000package csidh const ( // pbits is a bitsize of prime p pbits = 511 // primeCount number of Elkies primes used for constructing p primeCount = 74 // (2*5+1)^74 is roughly 2^256 expMax = int8(5) // size of the limbs, pretty much hardcoded to 64-bit words limbBitSize = 64 // size of the limbs in bytes limbByteSize = limbBitSize >> 3 // Number of limbs for a field element numWords = 8 // PrivateKeySize is a size of cSIDH/512 private key in bytes. PrivateKeySize = 37 // PublicKeySize is a size of cSIDH/512 public key in bytes. PublicKeySize = 64 // SharedSecretSize is a size of cSIDH/512 shared secret in bytes. SharedSecretSize = 64 ) var ( // Elkies primes up to 374 + prime 587 // p = 4 * product(primes) - 1 primes = [primeCount]uint64{ 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083, 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, 0x016F, 0x0175, 0x024B} p = fp{ 0x1B81B90533C6C87B, 0xC2721BF457ACA835, 0x516730CC1F0B4F25, 0xA7AAC6C567F35507, 0x5AFBFCC69322C9CD, 0xB42D083AEDC88C42, 0xFC8AB0D15E3E4C4A, 0x65B48E8F740F89BF, } /* Montgomery R = 2^512 mod p */ one = fp{ 0xC8FC8DF598726F0A, 0x7B1BC81750A6AF95, 0x5D319E67C1E961B4, 0xB0AA7275301955F1, 0x4A080672D9BA6C64, 0x97A5EF8A246EE77B, 0x06EA9E5D4383676A, 0x3496E2E117E0EC80, } // 2 in Montgomery domain two = fp{ 0x767762E5FD1E1599, 0x33C5743A49A0B6F6, 0x68FC0C0364C77443, 0xB9AA1E24F83F56DB, 0x3914101F20520EFB, 0x7B1ED6D95B1542B4, 0x114A8BE928C8828A, 0x03793732BBB24F40, } // -2 in Montgomery domain twoNeg = fp{ 0xA50A561F36A8B2E2, 0x8EACA7BA0E0BF13E, 0xE86B24C8BA43DAE2, 0xEE00A8A06FB3FE2B, 0x21E7ECA772D0BAD1, 0x390E316192B3498E, 0xEB4024E83575C9C0, 0x623B575CB85D3A7F, } // 4 in Montgomery domain four = fp{ 0xECEEC5CBFA3C2B32, 0x678AE87493416DEC, 0xD1F81806C98EE886, 0x73543C49F07EADB6, 0x7228203E40A41DF7, 0xF63DADB2B62A8568, 0x229517D251910514, 0x06F26E6577649E80, } // 4 * sqrt(p) fourSqrtP = fp{ 0x17895E71E1A20B3F, 0x38D0CD95F8636A56, 0x142B9541E59682CD, 0x856F1399D91D6592, 0x0000000000000002, } // -p^-1 mod 2^64 pNegInv = fp{ 0x66c1301f632e294d, } // (p-1)/2. Used as exponent, hence not in // montgomery domain pMin1By2 = fp{ 0x8DC0DC8299E3643D, 0xE1390DFA2BD6541A, 0xA8B398660F85A792, 0xD3D56362B3F9AA83, 0x2D7DFE63499164E6, 0x5A16841D76E44621, 0xFE455868AF1F2625, 0x32DA4747BA07C4DF, } // p-1 mod 2^64. Used as exponent, hence not // in montgomery domain pMin1 = fp{ 0x1B81B90533C6C879, 0xC2721BF457ACA835, 0x516730CC1F0B4F25, 0xA7AAC6C567F35507, 0x5AFBFCC69322C9CD, 0xB42D083AEDC88C42, 0xFC8AB0D15E3E4C4A, 0x65B48E8F740F89BF, } ) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/csidh.go000066400000000000000000000136641365325520100247050ustar00rootroot00000000000000package csidh import ( "io" ) // 511-bit number representing prime field element GF(p) type fp [numWords]uint64 // Represents projective point on elliptic curve E over fp type point struct { x fp z fp } // Curve coefficients type coeff struct { a fp c fp } type fpRngGen struct { // working buffer needed to avoid memory allocation wbuf [64]byte } // Defines operations on public key type PublicKey struct { fpRngGen // Montgomery coefficient: represents y^2 = x^3 + Ax^2 + x a fp } // Defines operations on private key type PrivateKey struct { fpRngGen e [PrivateKeySize]int8 } // randFp generates random element from Fp func (s *fpRngGen) randFp(v *fp, rng io.Reader) { mask := uint64(1<<(pbits%limbBitSize)) - 1 for { *v = fp{} _, err := io.ReadFull(rng, s.wbuf[:]) if err != nil { panic("Can't read random number") } for i := 0; i < len(s.wbuf); i++ { j := i / limbByteSize k := uint(i % 8) v[j] |= uint64(s.wbuf[i]) << (8 * k) } v[len(v)-1] &= mask if isLess(v, &p) { return } } } func cofactorMultiples(p *point, a *coeff, halfL, halfR int, order *fp) (bool, bool) { var Q point var r1, d1, r2, d2 bool if (halfR - halfL) == 1 { if !p.z.isZero() { var tmp = fp{primes[halfL]} xMul512(p, p, a, &tmp) if !p.z.isZero() { // order does not divide p+1 return false, true } mul512(order, order, primes[halfL]) if sub512(&tmp, &fourSqrtP, order) == 1 { // order > 4*sqrt(p) -> supersingular return true, true } } return false, false } // perform another recursive step mid := halfL + ((halfR - halfL + 1) / 2) var mulL, mulR = fp{1}, fp{1} for i := halfL; i < mid; i++ { mul512(&mulR, &mulR, primes[i]) } for i := mid; i < halfR; i++ { mul512(&mulL, &mulL, primes[i]) } xMul512(&Q, p, a, &mulR) xMul512(p, p, a, &mulL) r1, d1 = cofactorMultiples(&Q, a, mid, halfR, order) r2, d2 = cofactorMultiples(p, a, halfL, mid, order) return r1 || r2, d1 || d2 } func groupAction(pub *PublicKey, prv *PrivateKey, rng io.Reader) { var k [2]fp var e [2][primeCount]uint8 var done = [2]bool{false, false} var A = coeff{a: pub.a, c: one} k[0][0] = 4 k[1][0] = 4 for i, v := range primes { t := (prv.e[uint(i)>>1] << ((uint(i) % 2) * 4)) >> 4 if t > 0 { e[0][i] = uint8(t) e[1][i] = 0 mul512(&k[1], &k[1], v) } else if t < 0 { e[1][i] = uint8(-t) e[0][i] = 0 mul512(&k[0], &k[0], v) } else { e[0][i] = 0 e[1][i] = 0 mul512(&k[0], &k[0], v) mul512(&k[1], &k[1], v) } } for { var P point var rhs fp prv.randFp(&P.x, rng) P.z = one montEval(&rhs, &A.a, &P.x) sign := rhs.isNonQuadRes() if done[sign] { continue } xMul512(&P, &P, &A, &k[sign]) done[sign] = true for i, v := range primes { if e[sign][i] != 0 { var cof = fp{1} var K point for j := i + 1; j < len(primes); j++ { if e[sign][j] != 0 { mul512(&cof, &cof, primes[j]) } } xMul512(&K, &P, &A, &cof) if !K.z.isZero() { isom(&P, &A, &K, v) e[sign][i] = e[sign][i] - 1 if e[sign][i] == 0 { mul512(&k[sign], &k[sign], primes[i]) } } } done[sign] = done[sign] && (e[sign][i] == 0) } modExpRdc512(&A.c, &A.c, &pMin1) mulRdc(&A.a, &A.a, &A.c) A.c = one if done[0] && done[1] { break } } pub.a = A.a } // PrivateKey operations func (c *PrivateKey) Import(key []byte) bool { if len(key) < len(c.e) { return false } for i, v := range key { c.e[i] = int8(v) } return true } func (c PrivateKey) Export(out []byte) bool { if len(out) < len(c.e) { return false } for i, v := range c.e { out[i] = byte(v) } return true } func GeneratePrivateKey(key *PrivateKey, rng io.Reader) error { for i := range key.e { key.e[i] = 0 } for i := 0; i < len(primes); { _, err := io.ReadFull(rng, key.wbuf[:]) if err != nil { return err } for j := range key.wbuf { if int8(key.wbuf[j]) <= expMax && int8(key.wbuf[j]) >= -expMax { key.e[i>>1] |= int8((key.wbuf[j] & 0xF) << uint((i%2)*4)) i = i + 1 if i == len(primes) { break } } } } return nil } // Public key operations // Assumes key is in Montgomery domain func (c *PublicKey) Import(key []byte) bool { if len(key) != numWords*limbByteSize { return false } for i := 0; i < len(key); i++ { j := i / limbByteSize k := uint64(i % 8) c.a[j] |= uint64(key[i]) << (8 * k) } return true } // Assumes key is exported as encoded in Montgomery domain func (c *PublicKey) Export(out []byte) bool { if len(out) != numWords*limbByteSize { return false } for i := 0; i < len(out); i++ { j := i / limbByteSize k := uint64(i % 8) out[i] = byte(c.a[j] >> (8 * k)) } return true } func (c *PublicKey) reset() { for i := range c.a { c.a[i] = 0 } } func GeneratePublicKey(pub *PublicKey, prv *PrivateKey, rng io.Reader) { pub.reset() groupAction(pub, prv, rng) } // Validate does public key validation. It returns true if // a 'pub' is a valid cSIDH public key, otherwise false. func Validate(pub *PublicKey, rng io.Reader) bool { // Check if in range if !isLess(&pub.a, &p) { return false } // j-invariant for montgomery curves is something like // j = (256*(A^3-3)^3)/(A^2 - 4), so any |A| = 2 is invalid if pub.a.equal(&two) || pub.a.equal(&twoNeg) { return false } // P must have big enough order to prove supersingularity. The // probability that this loop will be repeated is negligible. for { var P point var A = point{pub.a, one} pub.randFp(&P.x, rng) P.z = one xDbl(&P, &P, &A) xDbl(&P, &P, &A) res, done := cofactorMultiples(&P, &coeff{A.x, A.z}, 0, len(primes), &fp{1}) if done { return res } } } // DeriveSecret computes a cSIDH shared secret. If successful, returns true // and fills 'out' with shared secret. Function returns false in case 'pub' is invalid. func DeriveSecret(out *[64]byte, pub *PublicKey, prv *PrivateKey, rng io.Reader) bool { if !Validate(pub, rng) { return false } groupAction(pub, prv, rng) pub.Export(out[:]) return true } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/csidh_test.go000066400000000000000000000230031365325520100257300ustar00rootroot00000000000000package csidh import ( "bytes" "encoding/hex" "encoding/json" "fmt" "os" "testing" crand "crypto/rand" "github.com/henrydcase/nobs/drbg" ) // Possible values for "Status" const ( Valid = iota // Indicates that shared secret must be agreed correctly ValidPublicKey2 // Public key 2 must succeed validation InvalidSharedSecret // Calculated shared secret must be different than test vector InvalidPublicKey1 // Public key 1 generated from private key must be different than test vector InvalidPublicKey2 // Public key 2 must fail validation ) var StatusValues = map[int]string{ Valid: "valid", ValidPublicKey2: "valid_public_key2", InvalidSharedSecret: "invalid_shared_secret", InvalidPublicKey1: "invalid_public_key1", InvalidPublicKey2: "invalid_public_key2", } type TestVector struct { ID int `json:"Id"` Pk1 string `json:"Pk1"` Pr1 string `json:"Pr1"` Pk2 string `json:"Pk2"` Ss string `json:"Ss"` Status string `json:"status"` } type TestVectors struct { Vectors []TestVector `json:"Vectors"` } var rng *drbg.CtrDrbg func init() { var tmp [32]byte // Init drbg rng = drbg.NewCtrDrbg() crand.Read(tmp[:]) if !rng.Init(tmp[:], nil) { panic("Can't initialize DRBG") } } func TestCompare64(t *testing.T) { const s uint64 = 0xFFFFFFFFFFFFFFFF var val1 = fp{0, 2, 3, 4, 5, 6, 7, 8} var val2 = fp{s, s, s, s, s, s, s, s} var fp fp if !fp.isZero() { t.Errorf("isZero returned true, where it should be false") } if val1.isZero() { t.Errorf("isZero returned false, where it should be true") } if val2.isZero() { t.Errorf("isZero returned false, where it should be true") } } func TestEphemeralKeyExchange(t *testing.T) { var ss1, ss2 [64]byte var prv1, prv2 PrivateKey var pub1, pub2 PublicKey prvBytes1 := []byte{0xaa, 0x54, 0xe4, 0xd4, 0xd0, 0xbd, 0xee, 0xcb, 0xf4, 0xd0, 0xc2, 0xbc, 0x52, 0x44, 0x11, 0xee, 0xe1, 0x14, 0xd2, 0x24, 0xe5, 0x0, 0xcc, 0xf5, 0xc0, 0xe1, 0x1e, 0xb3, 0x43, 0x52, 0x45, 0xbe, 0xfb, 0x54, 0xc0, 0x55, 0xb2} prv1.Import(prvBytes1) GeneratePublicKey(&pub1, &prv1, rng) GeneratePrivateKey(&prv2, rng) GeneratePublicKey(&pub2, &prv2, rng) if !DeriveSecret(&ss1, &pub1, &prv2, rng) { t.Errorf("Derivation failed\n") } if !DeriveSecret(&ss2, &pub2, &prv1, rng) { t.Errorf("Derivation failed\n") } if !bytes.Equal(ss1[:], ss2[:]) { fmt.Printf("%X\n", ss1) fmt.Printf("%X\n", ss2) t.Error("ss1 != ss2") } } func TestPrivateKeyExportImport(t *testing.T) { var buf [37]byte for i := 0; i < numIter; i++ { var prv1, prv2 PrivateKey GeneratePrivateKey(&prv1, rng) prv1.Export(buf[:]) prv2.Import(buf[:]) for i := 0; i < len(prv1.e); i++ { if prv1.e[i] != prv2.e[i] { t.Error("Error occurred when public key export/import") } } } } func TestValidateNegative(t *testing.T) { pk := PublicKey{a: p} pk.a[0]++ if Validate(&pk, rng) { t.Error("Public key > p has been validated") } pk = PublicKey{a: p} if Validate(&pk, rng) { t.Error("Public key == p has been validated") } pk = PublicKey{a: two} if Validate(&pk, rng) { t.Error("Public key == 2 has been validated") } pk = PublicKey{a: twoNeg} if Validate(&pk, rng) { t.Error("Public key == -2 has been validated") } } func TestPublicKeyExportImport(t *testing.T) { var buf [64]byte eq64 := func(x, y []uint64) bool { for i := range x { if x[i] != y[i] { return false } } return true } for i := 0; i < numIter; i++ { var prv PrivateKey var pub1, pub2 PublicKey GeneratePrivateKey(&prv, rng) GeneratePublicKey(&pub1, &prv, rng) pub1.Export(buf[:]) pub2.Import(buf[:]) if !eq64(pub1.a[:], pub2.a[:]) { t.Error("Error occurred when public key export/import") } } } // Test vectors generated by reference implementation func TestKAT(t *testing.T) { var tests TestVectors var testVectorFile string // Helper checks if e==true and reports an error if not. checkExpr := func(e bool, vec *TestVector, t *testing.T, msg string) { t.Helper() if !e { t.Errorf("[Test ID=%d] "+msg, vec.ID) } } if hasADXandBMI2 { testVectorFile = "testdata/csidh_testvectors.dat" } else { testVectorFile = "testdata/csidh_testvectors_small.dat" } // checkSharedSecret implements nominal case - imports asymmetric keys for // both parties, derives secret key and compares it to value in test vector. // Comparison must succeed in case status is "Valid" in any other case // it must fail. checkSharedSecret := func(vec *TestVector, t *testing.T, status int) { var prv1 PrivateKey var pub1, pub2 PublicKey var ss [SharedSecretSize]byte prBuf, err := hex.DecodeString(vec.Pr1) if err != nil { t.Fatal(err) } checkExpr( prv1.Import(prBuf[:]), vec, t, "PrivateKey wrong") pkBuf, err := hex.DecodeString(vec.Pk1) if err != nil { t.Fatal(err) } checkExpr( pub1.Import(pkBuf[:]), vec, t, "PublicKey 1 wrong") pkBuf, err = hex.DecodeString(vec.Pk2) if err != nil { t.Fatal(err) } checkExpr( pub2.Import(pkBuf[:]), vec, t, "PublicKey 2 wrong") checkExpr( DeriveSecret(&ss, &pub2, &prv1, rng), vec, t, "Error when deriving key") ssExp, err := hex.DecodeString(vec.Ss) if err != nil { t.Fatal(err) } checkExpr( bytes.Equal(ss[:], ssExp) == (status == Valid), vec, t, "Unexpected value of shared secret") } // checkPublicKey1 imports public and private key for one party A // and tries to generate public key for a private key. After that // it compares generated key to a key from test vector. Comparison // must fail. checkPublicKey1 := func(vec *TestVector, t *testing.T) { var prv PrivateKey var pub PublicKey var pubBytesGot [PublicKeySize]byte prBuf, err := hex.DecodeString(vec.Pr1) if err != nil { t.Fatal(err) } pubBytesExp, err := hex.DecodeString(vec.Pk1) if err != nil { t.Fatal(err) } checkExpr( prv.Import(prBuf[:]), vec, t, "PrivateKey wrong") // Generate public key GeneratePrivateKey(&prv, rng) pub.Export(pubBytesGot[:]) // pubBytesGot must be different than pubBytesExp checkExpr( !bytes.Equal(pubBytesGot[:], pubBytesExp), vec, t, "Public key generated is the same as public key from the test vector") } // checkPublicKey2 the goal is to test key validation. Test tries to // import public key for B and ensure that import succeeds in case // status is "Valid" and fails otherwise. checkPublicKey2 := func(vec *TestVector, t *testing.T, status int) { var pub PublicKey pubBytesExp, err := hex.DecodeString(vec.Pk2) if err != nil { t.Fatal(err) } // Import validates an input, so it must fail pub.Import(pubBytesExp[:]) checkExpr( Validate(&pub, rng) == (status == Valid || status == ValidPublicKey2), vec, t, "PublicKey has been validated correctly") } // Load test data file, err := os.Open(testVectorFile) if err != nil { t.Fatal(err.Error()) } err = json.NewDecoder(file).Decode(&tests) if err != nil { t.Fatal(err.Error()) } // Loop over all test cases for _, test := range tests.Vectors { switch test.Status { case StatusValues[Valid]: checkSharedSecret(&test, t, Valid) checkPublicKey2(&test, t, Valid) case StatusValues[InvalidSharedSecret]: checkSharedSecret(&test, t, InvalidSharedSecret) case StatusValues[InvalidPublicKey1]: checkPublicKey1(&test, t) case StatusValues[InvalidPublicKey2]: checkPublicKey2(&test, t, InvalidPublicKey2) case StatusValues[InvalidPublicKey2]: checkPublicKey2(&test, t, InvalidPublicKey2) case StatusValues[ValidPublicKey2]: checkPublicKey2(&test, t, ValidPublicKey2) } } } var prv1, prv2 PrivateKey var pub1, pub2 PublicKey // Private key generation func BenchmarkGeneratePrivate(b *testing.B) { for n := 0; n < b.N; n++ { GeneratePrivateKey(&prv1, rng) } } // Public key generation from private (group action on empty key) func BenchmarkGenerateKeyPair(b *testing.B) { for n := 0; n < b.N; n++ { var pub PublicKey GeneratePrivateKey(&prv1, rng) GeneratePublicKey(&pub, &prv1, rng) } } // Benchmark validation on same key multiple times func BenchmarkValidate(b *testing.B) { prvBytes := []byte{0xaa, 0x54, 0xe4, 0xd4, 0xd0, 0xbd, 0xee, 0xcb, 0xf4, 0xd0, 0xc2, 0xbc, 0x52, 0x44, 0x11, 0xee, 0xe1, 0x14, 0xd2, 0x24, 0xe5, 0x0, 0xcc, 0xf5, 0xc0, 0xe1, 0x1e, 0xb3, 0x43, 0x52, 0x45, 0xbe, 0xfb, 0x54, 0xc0, 0x55, 0xb2} prv1.Import(prvBytes) var pub PublicKey GeneratePublicKey(&pub, &prv1, rng) for n := 0; n < b.N; n++ { Validate(&pub, rng) } } // Benchmark validation on random (most probably wrong) key func BenchmarkValidateRandom(b *testing.B) { var tmp [64]byte var pub PublicKey // Initialize seed for n := 0; n < b.N; n++ { if _, err := rng.Read(tmp[:]); err != nil { b.FailNow() } pub.Import(tmp[:]) } } // Benchmark validation on different keys func BenchmarkValidateGenerated(b *testing.B) { for n := 0; n < b.N; n++ { GeneratePrivateKey(&prv1, rng) GeneratePublicKey(&pub1, &prv1, rng) Validate(&pub1, rng) } } // Generate some keys and benchmark derive func BenchmarkDerive(b *testing.B) { var ss [64]byte GeneratePrivateKey(&prv1, rng) GeneratePublicKey(&pub1, &prv1, rng) GeneratePrivateKey(&prv2, rng) GeneratePublicKey(&pub2, &prv2, rng) for n := 0; n < b.N; n++ { DeriveSecret(&ss, &pub2, &prv1, rng) } } // Benchmarks both - key generation and derivation func BenchmarkDeriveGenerated(b *testing.B) { var ss [64]byte for n := 0; n < b.N; n++ { GeneratePrivateKey(&prv1, rng) GeneratePublicKey(&pub1, &prv1, rng) GeneratePrivateKey(&prv2, rng) GeneratePublicKey(&pub2, &prv2, rng) DeriveSecret(&ss, &pub2, &prv1, rng) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/curve.go000066400000000000000000000116251365325520100247320ustar00rootroot00000000000000package csidh // Implements differential arithmetic in P^1 for montgomery // curves a mapping: x(P),x(Q),x(P-Q) -> x(P+Q) // PaQ = P + Q // This algorithms is correctly defined only for cases when // P!=inf, Q!=inf, P!=Q and P!=-Q func xAdd(PaQ, P, Q, PdQ *point) { var t0, t1, t2, t3 fp addRdc(&t0, &P.x, &P.z) subRdc(&t1, &P.x, &P.z) addRdc(&t2, &Q.x, &Q.z) subRdc(&t3, &Q.x, &Q.z) mulRdc(&t0, &t0, &t3) mulRdc(&t1, &t1, &t2) addRdc(&t2, &t0, &t1) subRdc(&t3, &t0, &t1) mulRdc(&t2, &t2, &t2) // sqr mulRdc(&t3, &t3, &t3) // sqr mulRdc(&PaQ.x, &PdQ.z, &t2) mulRdc(&PaQ.z, &PdQ.x, &t3) } // Q = 2*P on a montgomery curve E(x): x^3 + A*x^2 + x // It is correctly defined for all P != inf func xDbl(Q, P, A *point) { var t0, t1, t2 fp addRdc(&t0, &P.x, &P.z) mulRdc(&t0, &t0, &t0) // sqr subRdc(&t1, &P.x, &P.z) mulRdc(&t1, &t1, &t1) // sqr subRdc(&t2, &t0, &t1) mulRdc(&t1, &four, &t1) mulRdc(&t1, &t1, &A.z) mulRdc(&Q.x, &t0, &t1) addRdc(&t0, &A.z, &A.z) addRdc(&t0, &t0, &A.x) mulRdc(&t0, &t0, &t2) addRdc(&t0, &t0, &t1) mulRdc(&Q.z, &t0, &t2) } // PaP = 2*P; PaQ = P+Q // PaP can override P and PaQ can override Q func xDblAdd(PaP, PaQ, P, Q, PdQ *point, A24 *coeff) { var t0, t1, t2 fp addRdc(&t0, &P.x, &P.z) subRdc(&t1, &P.x, &P.z) mulRdc(&PaP.x, &t0, &t0) subRdc(&t2, &Q.x, &Q.z) addRdc(&PaQ.x, &Q.x, &Q.z) mulRdc(&t0, &t0, &t2) mulRdc(&PaP.z, &t1, &t1) mulRdc(&t1, &t1, &PaQ.x) subRdc(&t2, &PaP.x, &PaP.z) mulRdc(&PaP.z, &PaP.z, &A24.c) mulRdc(&PaP.x, &PaP.x, &PaP.z) mulRdc(&PaQ.x, &A24.a, &t2) subRdc(&PaQ.z, &t0, &t1) addRdc(&PaP.z, &PaP.z, &PaQ.x) addRdc(&PaQ.x, &t0, &t1) mulRdc(&PaP.z, &PaP.z, &t2) mulRdc(&PaQ.z, &PaQ.z, &PaQ.z) mulRdc(&PaQ.x, &PaQ.x, &PaQ.x) mulRdc(&PaQ.z, &PaQ.z, &PdQ.x) mulRdc(&PaQ.x, &PaQ.x, &PdQ.z) } // Swap P1 with P2 in constant time. The 'choice' // parameter must have a value of either 1 (results // in swap) or 0 (results in no-swap). func cswappoint(P1, P2 *point, choice uint8) { cswap512(&P1.x, &P2.x, choice) cswap512(&P1.z, &P2.z, choice) } // A uniform Montgomery ladder. co is A coefficient of // x^3 + A*x^2 + x curve. k MUST be > 0 // // kP = [k]P. xM=x(0 + k*P) // // non-constant time. func xMul512(kP, P *point, co *coeff, k *fp) { var A24 coeff var Q point var j uint var A = point{x: co.a, z: co.c} var R = *P // Precompyte A24 = (A+2C:4C) => (A24.x = A.x+2A.z; A24.z = 4*A.z) addRdc(&A24.a, &co.c, &co.c) addRdc(&A24.a, &A24.a, &co.a) mulRdc(&A24.c, &co.c, &four) // Skip initial 0 bits. for j = 511; j > 0; j-- { // performance hit from making it constant-time is actually // quite big, so... unsafe branch for now if uint8(k[j>>6]>>(j&63)&1) != 0 { break } } xDbl(&Q, P, &A) prevBit := uint8(1) for i := j; i > 0; { i-- bit := uint8(k[i>>6] >> (i & 63) & 1) swap := prevBit ^ bit prevBit = bit cswappoint(&Q, &R, swap) xDblAdd(&Q, &R, &Q, &R, P, &A24) } cswappoint(&Q, &R, uint8(k[0]&1)) *kP = Q } func isom(img *point, co *coeff, kern *point, order uint64) { var t0, t1, t2, S, D fp var Q, prod point var coEd coeff var M = [3]point{*kern} // Compute twisted Edwards coefficients // coEd.a = co.a + 2*co.c // coEd.c = co.a - 2*co.c // coEd.a*X^2 + Y^2 = 1 + coEd.c*X^2*Y^2 addRdc(&coEd.c, &co.c, &co.c) addRdc(&coEd.a, &co.a, &coEd.c) subRdc(&coEd.c, &co.a, &coEd.c) // Transfer point to twisted Edwards YZ-coordinates // (X:Z)->(Y:Z) = (X-Z : X+Z) addRdc(&S, &img.x, &img.z) subRdc(&D, &img.x, &img.z) subRdc(&prod.x, &kern.x, &kern.z) addRdc(&prod.z, &kern.x, &kern.z) mulRdc(&t1, &prod.x, &S) mulRdc(&t0, &prod.z, &D) addRdc(&Q.x, &t0, &t1) subRdc(&Q.z, &t0, &t1) xDbl(&M[1], kern, &point{x: co.a, z: co.c}) // TODO: Not constant time. for i := uint64(1); i < order>>1; i++ { if i >= 2 { xAdd(&M[i%3], &M[(i-1)%3], kern, &M[(i-2)%3]) } subRdc(&t1, &M[i%3].x, &M[i%3].z) addRdc(&t0, &M[i%3].x, &M[i%3].z) mulRdc(&prod.x, &prod.x, &t1) mulRdc(&prod.z, &prod.z, &t0) mulRdc(&t1, &t1, &S) mulRdc(&t0, &t0, &D) addRdc(&t2, &t0, &t1) mulRdc(&Q.x, &Q.x, &t2) subRdc(&t2, &t0, &t1) mulRdc(&Q.z, &Q.z, &t2) } mulRdc(&Q.x, &Q.x, &Q.x) mulRdc(&Q.z, &Q.z, &Q.z) mulRdc(&img.x, &img.x, &Q.x) mulRdc(&img.z, &img.z, &Q.z) // coEd.a^order and coEd.c^order modExpRdc64(&coEd.a, &coEd.a, order) modExpRdc64(&coEd.c, &coEd.c, order) // prod^8 mulRdc(&prod.x, &prod.x, &prod.x) mulRdc(&prod.x, &prod.x, &prod.x) mulRdc(&prod.x, &prod.x, &prod.x) mulRdc(&prod.z, &prod.z, &prod.z) mulRdc(&prod.z, &prod.z, &prod.z) mulRdc(&prod.z, &prod.z, &prod.z) // Compute image curve params mulRdc(&coEd.c, &coEd.c, &prod.x) mulRdc(&coEd.a, &coEd.a, &prod.z) // Convert curve coefficients back to Montgomery addRdc(&co.a, &coEd.a, &coEd.c) subRdc(&co.c, &coEd.a, &coEd.c) addRdc(&co.a, &co.a, &co.a) } // evaluates x^3 + Ax^2 + x func montEval(res, A, x *fp) { var t fp *res = *x mulRdc(res, res, res) mulRdc(&t, A, x) addRdc(res, res, &t) addRdc(res, res, &one) mulRdc(res, res, x) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/curve_test.go000066400000000000000000000417151365325520100257740ustar00rootroot00000000000000package csidh import ( "math/big" "testing" ) // Actual test implementation func TestXAdd(t *testing.T) { var P, Q, PdQ point var PaQ point var expPaQ big.Int // points from a Elliptic Curve defined in sage as follows: // A = 0x6055947AAFEBF773CE912680A6A32656073233D2FD6FDF4A143BE82D25B44ECC0431DE564C0F0D6591ACC62D6876E86F5D06B68C9EAF20D0DB0A6B99ED558512 // E = EllipticCurve(GF(p), [0, A, 0, 1, 0]) // where p is CSIDH's 511-bit prime checkXAdd := func() { xAdd(&PaQ, &P, &Q, &PdQ) ret := toNormX(&PaQ) if ret.Cmp(&expPaQ) != 0 { t.Errorf("\nExp: %s\nGot: %s", expPaQ.Text(16), ret.Text(16)) } } expPaQ.SetString("0x41C98C5D7FF118B1A3987733581FD69C0CC27D7B63BCCA525106B9945869C6DAEDAA3D5D9D2679237EF0D013BE68EF12731DBFB26E12576BAD1E824C67ABD125", 0) P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") P.z = toFp("1") Q.x = toFp("0x3C1A003C71436698B4A181CEB12BA4B4D1FF7BB14AAAF6FBDA6957C4EBA20AD8E3893DF6F64E67E81163E024C19C7E975F3EC61862F75502C3ED802370E75A3F") Q.z = toFp("1") PdQ.x = toFp("0x519B1928F752B0B2143C1C23EB247B370DBB5B9C29B9A3A064D7FBC1B67FAC34B6D3DDA0F3CB87C387B425B36F31B93A8E73252BA701927B767A9DE89D5A92AE") PdQ.z = toFp("1") checkXAdd() expPaQ.SetString("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD", 0) P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") P.z = toFp("1") Q.x = toFp("1") Q.z = toFp("0x0") PdQ.x = toFp(expPaQ.Text(10)) PdQ.z = toFp("1") checkXAdd() } func TestXDbl(t *testing.T) { var P, A point var PaP point var expPaP big.Int // points from a Elliptic Curve defined in sage as follows: // A = 0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138 // E = EllipticCurve(GF(p), [0, A, 0, 1, 0]) // where p is CSIDH's 511-bit prime expPaP.SetString("0x6115B5D8BB613D11BDFEA70D436D87C1515553F6A15061727B4001E0AF745AAA9F39EB9464982829D931F77DAB9D71B24FF0D1D34C347F2A51FD45821F2EA06F", 0) P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") P.z = toFp("1") A.x = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") A.z = toFp("1") xDbl(&PaP, &P, &A) ret := toNormX(&PaP) if ret.Cmp(&expPaP) != 0 { t.Errorf("\nExp: %s\nGot: %s", expPaP.Text(16), ret.Text(16)) } } func TestXDblAddNominal(t *testing.T) { var P, Q, PdQ point var PaP, PaQ point var expPaP, expPaQ big.Int var A coeff checkXDblAdd := func() { var A24 coeff // A24.a = 2*A.z + A.a addRdc(&A24.a, &A.c, &A.c) addRdc(&A24.a, &A24.a, &A.a) // A24.z = 4*A.z mulRdc(&A24.c, &A.c, &four) // Additionally will check if input can be same as output PaP = P PaQ = Q xDblAdd(&PaP, &PaQ, &PaP, &PaQ, &PdQ, &A24) retPaP := toNormX(&PaP) retPaQ := toNormX(&PaQ) if retPaP.Cmp(&expPaP) != 0 { t.Errorf("\nExp: %s\nGot: %s", expPaP.Text(16), retPaP.Text(16)) } if retPaQ.Cmp(&expPaQ) != 0 { t.Errorf("\nExp: %s\nGot: %s", expPaQ.Text(16), retPaQ.Text(16)) } } // 2*P expPaP.SetString("0x38F5B37271A3D8FA50107F88045D6F6B08355DD026C02E0306CE5875F47422736AD841B4122B2BD7DE6166BB6498F6A283378FF8250948E834F15CEA2D59A57B", 0) // P+Q expPaQ.SetString("0x53D9B44C5F61651612243CF7987F619FE6ACB5CF29538F96A63E7278E131F41A17D64388E31B028A5183EF9096AE82724BC34D8DDFD67AD68BD552A33C345B8C", 0) P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") P.z = toFp("1") Q.x = toFp("0x465047949CD6574FDBE00EA365CAF7A95DC9DEBE96A188823CA8C9DD9F527CF81290D49864F61DF0C08C1D6052139230735CA6CFDBDC1A8820610CCD71861176") Q.z = toFp("1") PdQ.x = toFp("0x49D3B999A0A020B34473568A8F75B5405F2D3BE5A006595015FC6DDC6BED8AB2A51A887B6DC62C64354466865FFD69E50AD37F6F4FBD74119EB65EBC9367B556") PdQ.z = toFp("1") A.a = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") A.c = toFp("1") checkXDblAdd() // Case P=value, Q=(x=1, z=0). In this case PaQ==P; PaP=2*P expPaP.SetString("0x38F5B37271A3D8FA50107F88045D6F6B08355DD026C02E0306CE5875F47422736AD841B4122B2BD7DE6166BB6498F6A283378FF8250948E834F15CEA2D59A57B", 0) expPaQ.SetString("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9", 0) P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") P.z = toFp("1") Q.x = toFp("1") Q.z = toFp("0") PdQ.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") PdQ.z = toFp("1") A.a = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") A.c = toFp("1") checkXDblAdd() } func TestXDblAddVSxDblxAdd(t *testing.T) { var P, Q, PdQ point var PaP1, PaQ1 point var PaP2, PaQ2 point var A point var A24 coeff P.x = toFp("0x4FE17B4CC66E85960F57033CD45996C99248DA09DF2E36F8840657B52F74ED8173E0D322FA57D7B4D0EE7F12967BBD59140B42F2626E29167D6419E851E5A4C9") P.z = toFp("1") Q.x = toFp("0x465047949CD6574FDBE00EA365CAF7A95DC9DEBE96A188823CA8C9DD9F527CF81290D49864F61DF0C08C1D6052139230735CA6CFDBDC1A8820610CCD71861176") Q.z = toFp("1") PdQ.x = toFp("0x49D3B999A0A020B34473568A8F75B5405F2D3BE5A006595015FC6DDC6BED8AB2A51A887B6DC62C64354466865FFD69E50AD37F6F4FBD74119EB65EBC9367B556") PdQ.z = toFp("1") A.x = toFp("0x118F955D498D902FD42E5B2926F297CC814CD7649EC5B070295622F97C4A0D9BD34058A7E0E00CB73ED32FCC237F9F6B7D2A15F5CC7C4EC61ECEF80ACBB0EFA4") A.z = toFp("1") // Precompute A24 for xDblAdd // (A+2C:4C) => (A24.x = A.x+2A.z; A24.z = 4*A.z) addRdc(&A24.a, &A.z, &A.z) addRdc(&A24.a, &A24.a, &A.x) mulRdc(&A24.c, &A.z, &four) for i := 0; i < numIter; i++ { xAdd(&PaQ2, &P, &Q, &PdQ) xDbl(&PaP2, &P, &A) xDblAdd(&PaP1, &PaQ1, &P, &Q, &PdQ, &A24) if !ceqpoint(&PaQ1, &PaQ2) { exp := toNormX(&PaQ1) got := toNormX(&PaQ2) t.Errorf("\nExp: \n\t%s\nGot from xAdd: \n\t%s", exp.Text(16), got.Text(16)) } if !ceqpoint(&PaP1, &PaP2) { exp := toNormX(&PaP1) got := toNormX(&PaP2) t.Errorf("\nExp: \n\t%s\nGot from xDbl: \n\t%s", exp.Text(16), got.Text(16)) } // Swap values for next operation PdQ = Q Q = P P = PaP1 } } func TestXMul(t *testing.T) { var P point var co coeff var expKP big.Int var k fp checkXMul := func() { var kP point xMul512(&kP, &P, &co, &k) retKP := toNormX(&kP) if expKP.Cmp(&retKP) != 0 { t.Errorf("\nExp: %s\nGot: %s", expKP.Text(16), retKP.Text(16)) } // Check if first and second argument can overlap xMul512(&P, &P, &co, &k) retKP = toNormX(&P) if expKP.Cmp(&retKP) != 0 { t.Errorf("\nExp: %s\nGot: %s", expKP.Text(16), retKP.Text(16)) } } // Case C=1 expKP.SetString("0x582B866603E6FBEBD21FE660FB34EF9466FDEC55FFBCE1073134CC557071147821BBAD225E30F7B2B6790B00ED9C39A29AA043F58AF995E440AFB13DA8E6D788", 0) P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") P.z = toFp("1") co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") co.c = toFp("1") k = fp{0x7A36C930A83EFBD5, 0xD0E80041ED0DDF9F, 0x5AA17134F1B8F877, 0x975711EC94168E51, 0xB3CAD962BED4BAC5, 0x3026DFDD7E4F5687, 0xE67F91AB8EC9C3AF, 0x34671D3FD8C317E7} checkXMul() // Check if algorithms works correctly with k=1 expKP.SetString("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE", 0) P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") P.z = toFp("1") co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") co.c = toFp("1") k = fp{1, 0, 0, 0, 0, 0, 0, 0} checkXMul() // Check if algorithms works correctly with value of k for which few small and high // order bits are 0 (test for odd number of cswaps in xMul) expKP.SetString("0x1925EDA0928C10F427B4E642E7E1481A670D1249956DED6A2292B9BAB841F6AA86A9F41459400845ED4A5E2531A14165F64FE4E43DBD85321B429C6DAE2E8987", 0) P.x = toFp("0x4CE8603817B9BB06515E921AA201D26B31F3CE181D1E18CD5CD704708CCAD47546CEEAB42B98EE67925A5259E0684A0489F574A999DE127F708B849ACAA12A63") P.z = toFp("1") co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") co.c = toFp("1") k = fp{0, 7, 0, 0, 0, 0, 0, 0} checkXMul() // Check if algorithms works correctly with value of k for which few small and high // order bits are 0 (test for even number of cswaps in xMul) expKP.SetString("0x30C02915C5967C3B6EB2196A934ADF38A183E9C7E814B54121F93048A8FC12D5036992FABF8D807581017A4C1F93D07352413F38F6A902FC76A8894FE8D94805", 0) P.x = toFp("0x2DDD15ED7C169BE6D9EC02CFE3DC507EC4A7A4D96DE3FAAB9BFCEA1B047807EA301E89830F2FDD0E7E642A85E7ACDE16BAD76DF140F719C4A7AB85153E7D69DC") P.z = toFp("1") co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") co.c = toFp("1") k = fp{0, 15, 0, 0, 0, 0, 0, 0} checkXMul() // xMul512 does NOT work correctly for k==0. In such case function will return 2*P. But // thanks to that fact we don't need to handle k==0 case, we get some speedup. expKP.SetString("0x6115B5D8BB613D11BDFEA70D436D87C1515553F6A15061727B4001E0AF745AAA9F39EB9464982829D931F77DAB9D71B24FF0D1D34C347F2A51FD45821F2EA06F", 0) P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") P.z = toFp("1") co.a = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") co.c = toFp("1") k = fp{0, 0, 0, 0, 0, 0, 0, 0} checkXMul() } func TestMappointHardcoded3(t *testing.T) { var P = point{ x: fp{0xca1a2fdec38c669b, 0xf2fe3678ebeb978b, 0xfda3e9a6f0c719d, 0x6f7bffa41772570b, 0x3d90cdd6283dc150, 0x21b55b738eb1ded9, 0x209515d0a9f41dd6, 0x5275cf397d154a12}, z: fp{0x1fff8309761576e, 0xef239cbeda7c2ba1, 0x6136ae2d76e95873, 0x1f8f6ac909570cec, 0x780fdf0cc7d676d8, 0x548098fe92ed04e1, 0xb39da564701ef35d, 0x5fec19626df41306}} var A = coeff{ a: fp{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, c: fp{0xc8fc8df598726f0a, 0x7b1bc81750a6af95, 0x5d319e67c1e961b4, 0xb0aa7275301955f1, 0x4a080672d9ba6c64, 0x97a5ef8a246ee77b, 0x6ea9e5d4383676a, 0x3496e2e117e0ec80}} var K = point{ x: fp{0x597616608e291c6f, 0xd14230b008736798, 0xa63099b1ace67e6e, 0xe37c13afd768bcfa, 0xc6ef718894f08135, 0x53a4fd09091f3522, 0xc9a1f9f670645fe1, 0x628c4a8efd83e5f0}, z: fp{0x8f18a654312ac1ad, 0xbc20a9b2472785c9, 0xdaf97c29bbf9e492, 0xf91a8c799e2f6119, 0xc8dc675cc8e528e6, 0x9a7b2c2f0df95171, 0x85629cd38cdd9fdb, 0x656d5253d3fd1a6e}} var k uint64 = 3 var expA = coeff{ a: fp{0x6fa92a66e77cfc1, 0x9efbfb7118f1832c, 0x441894cc5d1d24ae, 0x5a2f0fafa26761de, 0x8095c36d3a20a78a, 0xb22be0023612a135, 0x5eb844d06ef0f430, 0x52e53309d1c90cf8}, c: fp{0x98173d5664a23e5c, 0xd8fe1c6306bbc11a, 0xa774fbc502648059, 0x766a0d839aa62c83, 0x4b074f9b93d1633d, 0xf306019dbf87f505, 0x77c720ca059234b0, 0x3d47ab65269c5908}} var expP = point{ x: fp{0x91aba9b39f280495, 0xfbd8ea69d2990aeb, 0xb03e1b8ed7fe3dba, 0x3d30a41499f08998, 0xb15a42630de9c606, 0xa7dd487fef16f5c8, 0x8673948afed8e968, 0x57ecc8710004cd4d}, z: fp{0xce8819869a942526, 0xb98ca2ff79ef8969, 0xd49c9703743a1812, 0x21dbb090f9152e03, 0xbabdcac831b1adea, 0x8cee90762baa2ddd, 0xa0dd2ddcef809d96, 0x1de2a8887a32f19b}} isom(&P, &A, &K, k) if !ceqFp(&P.x, &expP.x) || !ceqFp(&P.z, &expP.z) { normP := toNormX(&P) normPExp := toNormX(&expP) t.Errorf("P != expP [\n %s != %s\n]", normP.Text(16), normPExp.Text(16)) } if !ceqFp(&A.a, &expA.a) || !ceqFp(&A.c, &expA.c) { t.Errorf("A != expA %X %X", A.a[0], expA.a[0]) } } func TestMappointHardcoded5(t *testing.T) { var P = point{ x: fp{0xca1a2fdec38c669b, 0xf2fe3678ebeb978b, 0xfda3e9a6f0c719d, 0x6f7bffa41772570b, 0x3d90cdd6283dc150, 0x21b55b738eb1ded9, 0x209515d0a9f41dd6, 0x5275cf397d154a12}, z: fp{0x1fff8309761576e, 0xef239cbeda7c2ba1, 0x6136ae2d76e95873, 0x1f8f6ac909570cec, 0x780fdf0cc7d676d8, 0x548098fe92ed04e1, 0xb39da564701ef35d, 0x5fec19626df41306}} var A = coeff{ a: fp{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, c: fp{0xc8fc8df598726f0a, 0x7b1bc81750a6af95, 0x5d319e67c1e961b4, 0xb0aa7275301955f1, 0x4a080672d9ba6c64, 0x97a5ef8a246ee77b, 0x6ea9e5d4383676a, 0x3496e2e117e0ec80}} var K = point{ x: fp{0x597616608e291c6f, 0xd14230b008736798, 0xa63099b1ace67e6e, 0xe37c13afd768bcfa, 0xc6ef718894f08135, 0x53a4fd09091f3522, 0xc9a1f9f670645fe1, 0x628c4a8efd83e5f0}, z: fp{0x8f18a654312ac1ad, 0xbc20a9b2472785c9, 0xdaf97c29bbf9e492, 0xf91a8c799e2f6119, 0xc8dc675cc8e528e6, 0x9a7b2c2f0df95171, 0x85629cd38cdd9fdb, 0x656d5253d3fd1a6e}} var k uint64 = 5 var expA = coeff{ a: fp{0x32076f58298ed474, 0x5094a1fc8696d307, 0x82e510594157944a, 0xb60ce760f88c83a9, 0xae8a28c325186983, 0xe31d2446a4ad2f18, 0xb266c612b5f141c1, 0x64283e618db5a705}, c: fp{0x4472b49b65272190, 0x2bd5919309778f56, 0x6132753691fe016c, 0x8f654849c09e6d34, 0xfa208dd9aea1ef12, 0xf7df0dd10071411a, 0x75afb7860500922c, 0x52fb7d34b129fb65}} var expP = point{ x: fp{0x3b75fc94b2a6df2d, 0x96d53dc9b0e867a0, 0x22e87202421d274e, 0x30a361440697ee1a, 0x8b52ee078bdbddcd, 0x64425d500e6b934d, 0xf47d1f568f6df391, 0x5d9d3607431395ab}, z: fp{0x746e02dafa040976, 0xcd408f2cddbf3a8e, 0xf643354e0e13a93f, 0x7c39ed96ce9a5e29, 0xfcdf26f1a1a550ca, 0x2fc8aafc4ca0a559, 0x5d204a2b14cf19ba, 0xbd2c3406762f05d}} isom(&P, &A, &K, k) if !ceqFp(&P.x, &expP.x) || !ceqFp(&P.z, &expP.z) { normP := toNormX(&P) normPExp := toNormX(&expP) t.Errorf("P != expP [\n %s != %s\n]", normP.Text(16), normPExp.Text(16)) } if !ceqFp(&A.a, &expA.a) || !ceqFp(&A.c, &expA.c) { t.Errorf("A != expA %X %X", A.a[0], expA.a[0]) } } func BenchmarkXMul(b *testing.B) { var kP, P point var co coeff var expKP big.Int var k fp // Case C=1 expKP.SetString("0x582B866603E6FBEBD21FE660FB34EF9466FDEC55FFBCE1073134CC557071147821BBAD225E30F7B2B6790B00ED9C39A29AA043F58AF995E440AFB13DA8E6D788", 0) P.x = toFp("0x1C5CA539C1D5B52DE4750C390C24C05251E8B1D33E48971FA86F5ADDED2D06C8CD31E94887541468BB2925EBD693C9DDFF5BD9508430F25FE28EE30C0760C0FE") P.z = toFp("1") co.a = toFp("0x538F785D52996919C8D5C73D842A0249669B5B6BB05338B74EAE8094AE5009A3BA2D73730F527D7403E8184D9B1FA11C0C4C40E7B328A84874A6DBCE99E1DF92") co.c = toFp("1") k = fp{0x7A36C930A83EFBD5, 0xD0E80041ED0DDF9F, 0x5AA17134F1B8F877, 0x975711EC94168E51, 0xB3CAD962BED4BAC5, 0x3026DFDD7E4F5687, 0xE67F91AB8EC9C3AF, 0x34671D3FD8C317E7} for n := 0; n < b.N; n++ { xMul512(&kP, &P, &co, &k) } } func BenchmarkXAdd(b *testing.B) { var P, Q, PdQ point var PaQ point P.x = toFp("0x5840FD8E0165F7F474260F99337461AF195233F791FABE735EC2634B74A95559568B4CEB23959C8A01C5C57E215D22639868ED840D74FE2BAC04830CF75047AD") P.z = toFp("1") Q.x = toFp("0x3C1A003C71436698B4A181CEB12BA4B4D1FF7BB14AAAF6FBDA6957C4EBA20AD8E3893DF6F64E67E81163E024C19C7E975F3EC61862F75502C3ED802370E75A3F") Q.z = toFp("1") PdQ.x = toFp("0x519B1928F752B0B2143C1C23EB247B370DBB5B9C29B9A3A064D7FBC1B67FAC34B6D3DDA0F3CB87C387B425B36F31B93A8E73252BA701927B767A9DE89D5A92AE") PdQ.z = toFp("1") for n := 0; n < b.N; n++ { xAdd(&PaQ, &P, &Q, &PdQ) } } func BenchmarkXDbl(b *testing.B) { var P, A point var PaP point P.x = toFp("0x6C5B4D4AB0765AAB23C10F8455BE522D3A5363324D7AD641CC67C0A52FC1FFE9F3F8EDFE641478CA93D4D0016D83F21487FD4AF4E02F8A2C237CF27C5604BCC") P.z = toFp("1") A.x = toFp("0x599841D7D1FCD92A85759B7A3D2D5E4C56EFB17F19F86EB70E121EA16305EDE45A55868BE069313F821F7D94069EC220A4AC3B85500376710538246E9B3BC138") A.z = toFp("1") for n := 0; n < b.N; n++ { xDbl(&PaP, &P, &A) } } func BenchmarkIsom(b *testing.B) { var P, kern point var expPhiP big.Int var co coeff var k = uint64(2) expPhiP.SetString("0x5FEBD68F795F9AEB732ECF0D1507904922F2B0736704E0751EF242B4E191E6F630D83778B5E5681161FD071CDEF7DF4C3A41D0ECEB30E90B119C5BF86C5AB51A", 0) P.x = toFp("0x5FD8D226C228FD6AA3CCDCAB931C5D3AA000A46B47041F59D9724E517594F696D38F2CB45C987ACF68BB1057D8D518F926D8F55171F337D05354E0022BC66B23") P.z = toFp("1") co.a = toFp("0x9E8DBC4914E3C4F080592642DD0B08B9564AB3ADF75EE9B58A685443BA6E39A1ACD1201B7F034077AF344123880AF9D8C77575E6E782E00186881ECE8B87CA3") co.c = toFp("1") kern.x = toFp("0x594F77A49EABBF2A12025BC00E1DBC119CDA674B9FE8A00791724B42FEB7D225C4C9940B01B09B8F00B30B0E961212FB63E42614814E38EC9E5E5B0FEBF98C58") kern.z = toFp("1") for n := 0; n < b.N; n++ { isom(&P, &co, &kern, k) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/fp511.go000066400000000000000000000200251365325520100244340ustar00rootroot00000000000000package csidh import ( "math/bits" "golang.org/x/sys/cpu" ) // CPU Capabilities. Those flags are referred by assembly code. According to // https://github.com/golang/go/issues/28230, variables referred from the // assembly must be in the same package. // We declare variables not constants, in order to facilitate testing. var ( // Signals support for BMI2 (MULX) hasBMI2 = cpu.X86.HasBMI2 // Signals support for ADX and BMI2 hasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX ) // Constant time select. // if pick == 0xFF..FF (out = in1) // if pick == 0 (out = in2) // else out is undefined func ctPick64(which uint64, in1, in2 uint64) uint64 { return (in1 & which) | (in2 & ^which) } // ctIsNonZero64 returns 0 in case i == 0, otherwise it returns 1. // Constant-time. func ctIsNonZero64(i uint64) int { // In case i==0 then i-1 will set MSB. Only in such case (i OR ~(i-1)) // will result in MSB being not set (logical implication: (i-1)=>i is // false iff (i-1)==0 and i==non-zero). In every other case MSB is // set and hence function returns 1. return int((i | (^(i - 1))) >> 63) } func mulGeneric(r, x, y *fp) { var s fp // keeps intermediate results var t1, t2 [9]uint64 var c, q uint64 for i := 0; i < numWords-1; i++ { q = ((x[i] * y[0]) + s[0]) * pNegInv[0] mul576(&t1, &p, q) mul576(&t2, y, x[i]) // x[i]*y + q_i*p t1[0], c = bits.Add64(t1[0], t2[0], 0) t1[1], c = bits.Add64(t1[1], t2[1], c) t1[2], c = bits.Add64(t1[2], t2[2], c) t1[3], c = bits.Add64(t1[3], t2[3], c) t1[4], c = bits.Add64(t1[4], t2[4], c) t1[5], c = bits.Add64(t1[5], t2[5], c) t1[6], c = bits.Add64(t1[6], t2[6], c) t1[7], c = bits.Add64(t1[7], t2[7], c) t1[8], _ = bits.Add64(t1[8], t2[8], c) // s = (s + x[i]*y + q_i * p) / R _, c = bits.Add64(t1[0], s[0], 0) s[0], c = bits.Add64(t1[1], s[1], c) s[1], c = bits.Add64(t1[2], s[2], c) s[2], c = bits.Add64(t1[3], s[3], c) s[3], c = bits.Add64(t1[4], s[4], c) s[4], c = bits.Add64(t1[5], s[5], c) s[5], c = bits.Add64(t1[6], s[6], c) s[6], c = bits.Add64(t1[7], s[7], c) s[7], _ = bits.Add64(t1[8], 0, c) } // last iteration stores result in r q = ((x[numWords-1] * y[0]) + s[0]) * pNegInv[0] mul576(&t1, &p, q) mul576(&t2, y, x[numWords-1]) t1[0], c = bits.Add64(t1[0], t2[0], c) t1[1], c = bits.Add64(t1[1], t2[1], c) t1[2], c = bits.Add64(t1[2], t2[2], c) t1[3], c = bits.Add64(t1[3], t2[3], c) t1[4], c = bits.Add64(t1[4], t2[4], c) t1[5], c = bits.Add64(t1[5], t2[5], c) t1[6], c = bits.Add64(t1[6], t2[6], c) t1[7], c = bits.Add64(t1[7], t2[7], c) t1[8], _ = bits.Add64(t1[8], t2[8], c) _, c = bits.Add64(t1[0], s[0], 0) r[0], c = bits.Add64(t1[1], s[1], c) r[1], c = bits.Add64(t1[2], s[2], c) r[2], c = bits.Add64(t1[3], s[3], c) r[3], c = bits.Add64(t1[4], s[4], c) r[4], c = bits.Add64(t1[5], s[5], c) r[5], c = bits.Add64(t1[6], s[6], c) r[6], c = bits.Add64(t1[7], s[7], c) r[7], _ = bits.Add64(t1[8], 0, c) } // Returns result of x= 0; i-- { v, c := bits.Sub64(y[i], x[i], 0) if c != 0 { return false } if v != 0 { return true } } // x == y return false } // r = x + y mod p. func addRdc(r, x, y *fp) { var c uint64 var t fp r[0], c = bits.Add64(x[0], y[0], 0) r[1], c = bits.Add64(x[1], y[1], c) r[2], c = bits.Add64(x[2], y[2], c) r[3], c = bits.Add64(x[3], y[3], c) r[4], c = bits.Add64(x[4], y[4], c) r[5], c = bits.Add64(x[5], y[5], c) r[6], c = bits.Add64(x[6], y[6], c) r[7], _ = bits.Add64(x[7], y[7], c) t[0], c = bits.Sub64(r[0], p[0], 0) t[1], c = bits.Sub64(r[1], p[1], c) t[2], c = bits.Sub64(r[2], p[2], c) t[3], c = bits.Sub64(r[3], p[3], c) t[4], c = bits.Sub64(r[4], p[4], c) t[5], c = bits.Sub64(r[5], p[5], c) t[6], c = bits.Sub64(r[6], p[6], c) t[7], c = bits.Sub64(r[7], p[7], c) var w = 0 - c r[0] = ctPick64(w, r[0], t[0]) r[1] = ctPick64(w, r[1], t[1]) r[2] = ctPick64(w, r[2], t[2]) r[3] = ctPick64(w, r[3], t[3]) r[4] = ctPick64(w, r[4], t[4]) r[5] = ctPick64(w, r[5], t[5]) r[6] = ctPick64(w, r[6], t[6]) r[7] = ctPick64(w, r[7], t[7]) } // r = x - y func sub512(r, x, y *fp) uint64 { var c uint64 r[0], c = bits.Sub64(x[0], y[0], 0) r[1], c = bits.Sub64(x[1], y[1], c) r[2], c = bits.Sub64(x[2], y[2], c) r[3], c = bits.Sub64(x[3], y[3], c) r[4], c = bits.Sub64(x[4], y[4], c) r[5], c = bits.Sub64(x[5], y[5], c) r[6], c = bits.Sub64(x[6], y[6], c) r[7], c = bits.Sub64(x[7], y[7], c) return c } // r = x - y mod p. func subRdc(r, x, y *fp) { var c uint64 // Same as sub512(r,x,y). Unfortunately // compiler is not able to inline it. r[0], c = bits.Sub64(x[0], y[0], 0) r[1], c = bits.Sub64(x[1], y[1], c) r[2], c = bits.Sub64(x[2], y[2], c) r[3], c = bits.Sub64(x[3], y[3], c) r[4], c = bits.Sub64(x[4], y[4], c) r[5], c = bits.Sub64(x[5], y[5], c) r[6], c = bits.Sub64(x[6], y[6], c) r[7], c = bits.Sub64(x[7], y[7], c) // if x r=x-y+p var w = 0 - c r[0], c = bits.Add64(r[0], ctPick64(w, p[0], 0), 0) r[1], c = bits.Add64(r[1], ctPick64(w, p[1], 0), c) r[2], c = bits.Add64(r[2], ctPick64(w, p[2], 0), c) r[3], c = bits.Add64(r[3], ctPick64(w, p[3], 0), c) r[4], c = bits.Add64(r[4], ctPick64(w, p[4], 0), c) r[5], c = bits.Add64(r[5], ctPick64(w, p[5], 0), c) r[6], c = bits.Add64(r[6], ctPick64(w, p[6], 0), c) r[7], _ = bits.Add64(r[7], ctPick64(w, p[7], 0), c) } // Fixed-window mod exp for fpBitLen bit value with 4 bit window. Returned // result is a number in montgomery domain. // r = b ^ e (mod p). // Constant time. func modExpRdcCommon(r, b, e *fp, fpBitLen int) { var precomp [16]fp var t fp var c uint64 // Precompute step, computes an array of small powers of 'b'. As this // algorithm implements 4-bit window, we need 2^4=16 of such values. // b^0 = 1, which is equal to R from REDC. precomp[0] = one // b ^ 0 precomp[1] = *b // b ^ 1 for i := 2; i < 16; i = i + 2 { // TODO: implement fast squering. Then interleaving fast squaring // with multiplication should improve performance. mulRdc(&precomp[i], &precomp[i/2], &precomp[i/2]) // sqr mulRdc(&precomp[i+1], &precomp[i], b) } *r = one for i := fpBitLen/4 - 1; i >= 0; i-- { for j := 0; j < 4; j++ { mulRdc(r, r, r) } // note: non resistant to cache SCA idx := (e[i/16] >> uint((i%16)*4)) & 15 mulRdc(r, r, &precomp[idx]) } // if p <= r < 2p then r = r-p t[0], c = bits.Sub64(r[0], p[0], 0) t[1], c = bits.Sub64(r[1], p[1], c) t[2], c = bits.Sub64(r[2], p[2], c) t[3], c = bits.Sub64(r[3], p[3], c) t[4], c = bits.Sub64(r[4], p[4], c) t[5], c = bits.Sub64(r[5], p[5], c) t[6], c = bits.Sub64(r[6], p[6], c) t[7], c = bits.Sub64(r[7], p[7], c) var w = 0 - c r[0] = ctPick64(w, r[0], t[0]) r[1] = ctPick64(w, r[1], t[1]) r[2] = ctPick64(w, r[2], t[2]) r[3] = ctPick64(w, r[3], t[3]) r[4] = ctPick64(w, r[4], t[4]) r[5] = ctPick64(w, r[5], t[5]) r[6] = ctPick64(w, r[6], t[6]) r[7] = ctPick64(w, r[7], t[7]) } // modExpRdc does modular exponentation of 512-bit number. // Constant-time. func modExpRdc512(r, b, e *fp) { modExpRdcCommon(r, b, e, 512) } // modExpRdc does modular exponentation of 64-bit number. // Constant-time. func modExpRdc64(r, b *fp, e uint64) { modExpRdcCommon(r, b, &fp{e}, 64) } // isNonQuadRes checks whether value v is quadratic residue. // Implementation uses Fermat's little theorem (or // Euler's criterion) // a^(p-1) == 1, hence // (a^2) ((p-1)/2) == 1 // Which means v is a quadratic residue iff v^((p-1)/2) == 1. // Caller provided v must be in montgomery domain. // Returns 0 in case v is quadratic residue or 1 in case // v is quadratic non-residue. func (v *fp) isNonQuadRes() int { var res fp var b uint64 modExpRdc512(&res, v, &pMin1By2) for i := range res { b |= res[i] ^ one[i] } return ctIsNonZero64(b) } // isZero returns false in case v is equal to 0, otherwise // true. Constant time. func (v *fp) isZero() bool { var r uint64 for i := 0; i < numWords; i++ { r |= v[i] } return ctIsNonZero64(r) == 0 } // equal checks if v is equal to in. Constant time func (v *fp) equal(in *fp) bool { var r uint64 for i := range v { r |= v[i] ^ in[i] } return ctIsNonZero64(r) == 0 } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/fp511_amd64.go000066400000000000000000000021411365325520100254260ustar00rootroot00000000000000// +build amd64,!noasm package csidh import "math/bits" //go:noescape func mul512(a, b *fp, c uint64) //go:noescape func mul576(a *[9]uint64, b *fp, c uint64) //go:noescape func cswap512(x, y *fp, choice uint8) //go:noescape func mulBmiAsm(res, x, y *fp) // mulRdc performs montgomery multiplication r = x * y mod P. // Returned result r is already reduced and in Montgomery domain. func mulRdc(r, x, y *fp) { var t fp var c uint64 if hasADXandBMI2 { mulBmiAsm(r, x, y) } else { mulGeneric(r, x, y) } // if p <= r < 2p then r = r-p t[0], c = bits.Sub64(r[0], p[0], 0) t[1], c = bits.Sub64(r[1], p[1], c) t[2], c = bits.Sub64(r[2], p[2], c) t[3], c = bits.Sub64(r[3], p[3], c) t[4], c = bits.Sub64(r[4], p[4], c) t[5], c = bits.Sub64(r[5], p[5], c) t[6], c = bits.Sub64(r[6], p[6], c) t[7], c = bits.Sub64(r[7], p[7], c) var w = 0 - c r[0] = ctPick64(w, r[0], t[0]) r[1] = ctPick64(w, r[1], t[1]) r[2] = ctPick64(w, r[2], t[2]) r[3] = ctPick64(w, r[3], t[3]) r[4] = ctPick64(w, r[4], t[4]) r[5] = ctPick64(w, r[5], t[5]) r[6] = ctPick64(w, r[6], t[6]) r[7] = ctPick64(w, r[7], t[7]) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/fp511_amd64.s000066400000000000000000000156171365325520100252770ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" // Multipies 512-bit value by 64-bit value. Uses MULQ instruction to // multiply 2 64-bit values. // // Result: x = (y * z) mod 2^512 // // Registers used: AX, CX, DX, SI, DI, R8 // // func mul512(a, b *Fp, c uint64) TEXT ·mul512(SB), NOSPLIT, $0-24 MOVQ a+0(FP), DI // result MOVQ b+8(FP), SI // multiplicand // Check wether to use optimized implementation CMPB ·hasBMI2(SB), $1 JE mul512_mulx MOVQ c+16(FP), R10 // 64 bit multiplier, used by MULQ MOVQ R10, AX; MULQ 0(SI); MOVQ DX, R11; MOVQ AX, 0(DI) //x[0] MOVQ R10, AX; MULQ 8(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 8(DI) //x[1] MOVQ R10, AX; MULQ 16(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 16(DI) //x[2] MOVQ R10, AX; MULQ 24(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 24(DI) //x[3] MOVQ R10, AX; MULQ 32(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 32(DI) //x[4] MOVQ R10, AX; MULQ 40(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 40(DI) //x[5] MOVQ R10, AX; MULQ 48(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 48(DI) //x[6] MOVQ R10, AX; MULQ 56(SI); ADDQ R11, AX; MOVQ AX, 56(DI) //x[7] RET // Optimized for CPUs with BMI2 mul512_mulx: MOVQ c+16(FP), DX // 64 bit multiplier, used by MULX MULXQ 0(SI), AX, R10; MOVQ AX, 0(DI) // x[0] MULXQ 8(SI), AX, R11; ADDQ R10, AX; MOVQ AX, 8(DI) // x[1] MULXQ 16(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 16(DI) // x[2] MULXQ 24(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 24(DI) // x[3] MULXQ 32(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 32(DI) // x[4] MULXQ 40(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 40(DI) // x[5] MULXQ 48(SI), AX, R10; ADCQ R11, AX; MOVQ AX, 48(DI) // x[6] MULXQ 56(SI), AX, R11; ADCQ R10, AX; MOVQ AX, 56(DI) // x[7] RET // Multipies 512-bit value by 64-bit value and returns 576-bit result. Uses MULQ instruction to // multiply 2 64-bit values. Returns 576-bit result. // // Result: x = (y * z) // // Registers used: AX, CX, DX, SI, DI, R8 // // func mul576(a, b *Fp, c uint64) TEXT ·mul576(SB), NOSPLIT, $0-24 MOVQ a+0(FP), DI // result MOVQ b+8(FP), SI // multiplicand MOVQ c+16(FP), R10 // 64 bit multiplier, used by MULQ MOVQ R10, AX; MULQ 0(SI); MOVQ DX, R11; MOVQ AX, 0(DI) //x[0] MOVQ R10, AX; MULQ 8(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 8(DI) //x[1] MOVQ R10, AX; MULQ 16(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 16(DI) //x[2] MOVQ R10, AX; MULQ 24(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 24(DI) //x[3] MOVQ R10, AX; MULQ 32(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 32(DI) //x[4] MOVQ R10, AX; MULQ 40(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 40(DI) //x[5] MOVQ R10, AX; MULQ 48(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ DX, R11; MOVQ AX, 48(DI) //x[6] MOVQ R10, AX; MULQ 56(SI); ADDQ R11, AX; ADCQ $0, DX; MOVQ AX, 56(DI) //x[7] MOVQ DX, 64(DI) //x[8] RET TEXT ·cswap512(SB),NOSPLIT,$0-17 MOVQ x+0(FP), DI MOVQ y+8(FP), SI MOVBLZX choice+16(FP), AX // AL = 0 or 1 // Make AX, so that either all bits are set or non // AX = 0 or 1 NEGQ AX // Fill xmm15. After this step first half of XMM15 is // just zeros and second half is whatever in AX MOVQ AX, X15 // Copy lower double word everywhere else. So that // XMM15=AL|AL|AL|AL. As AX has either all bits set // or non result will be that XMM15 has also either // all bits set or non of them. PSHUFD $0, X15, X15 #ifndef CSWAP_BLOCK #define CSWAP_BLOCK(idx) \ MOVOU (idx*16)(DI), X0 \ MOVOU (idx*16)(SI), X1 \ \ // X2 = mask & (X0 ^ X1) MOVO X1, X2 \ PXOR X0, X2 \ PAND X15, X2 \ \ PXOR X2, X0 \ PXOR X2, X1 \ \ MOVOU X0, (idx*16)(DI) \ MOVOU X1, (idx*16)(SI) #endif CSWAP_BLOCK(0) CSWAP_BLOCK(1) CSWAP_BLOCK(2) CSWAP_BLOCK(3) RET // mulAsm implements montgomery multiplication interleaved with // montgomery reduction. It uses MULX and ADCX/ADOX instructions. // Implementation specific to 511-bit prime 'p' // // func mulBmiAsm(res, x, y *fp) TEXT ·mulBmiAsm(SB),NOSPLIT,$8-24 MOVQ x+8(FP), DI // multiplicand MOVQ y+16(FP), SI // multiplier XORQ R8, R8 XORQ R9, R9 XORQ R10, R10 XORQ R11, R11 XORQ R12, R12 XORQ R13, R13 XORQ R14, R14 XORQ R15, R15 MOVQ BP, 0(SP) XORQ BP, BP // Uses BMI2 (MULX) #ifdef MULS_MULX_512 #undef MULS_MULX_512 #endif #define MULS_MULX_512(idx, r0, r1, r2, r3, r4, r5, r6, r7, r8) \ \ // Reduction step MOVQ ( 0)(SI), DX \ MULXQ ( 8*idx)(DI), DX, CX \ ADDQ r0, DX \ MULXQ ·pNegInv(SB), DX, CX \ \ XORQ AX, AX \ MULXQ ·p+ 0(SB), AX, BX; ; ADOXQ AX, r0 \ MULXQ ·p+ 8(SB), AX, CX; ADCXQ BX, r1; ADOXQ AX, r1 \ MULXQ ·p+16(SB), AX, BX; ADCXQ CX, r2; ADOXQ AX, r2 \ MULXQ ·p+24(SB), AX, CX; ADCXQ BX, r3; ADOXQ AX, r3 \ MULXQ ·p+32(SB), AX, BX; ADCXQ CX, r4; ADOXQ AX, r4 \ MULXQ ·p+40(SB), AX, CX; ADCXQ BX, r5; ADOXQ AX, r5 \ MULXQ ·p+48(SB), AX, BX; ADCXQ CX, r6; ADOXQ AX, r6 \ MULXQ ·p+56(SB), AX, CX; ADCXQ BX, r7; ADOXQ AX, r7 \ MOVQ $0, AX ; ADCXQ CX, r8; ADOXQ AX, r8 \ \ // Multiplication step MOVQ (8*idx)(DI), DX \ \ XORQ AX, AX \ MULXQ ( 0)(SI), AX, BX; ADOXQ AX, r0 \ MULXQ ( 8)(SI), AX, CX; ADCXQ BX, r1; ADOXQ AX, r1 \ MULXQ (16)(SI), AX, BX; ADCXQ CX, r2; ADOXQ AX, r2 \ MULXQ (24)(SI), AX, CX; ADCXQ BX, r3; ADOXQ AX, r3 \ MULXQ (32)(SI), AX, BX; ADCXQ CX, r4; ADOXQ AX, r4 \ MULXQ (40)(SI), AX, CX; ADCXQ BX, r5; ADOXQ AX, r5 \ MULXQ (48)(SI), AX, BX; ADCXQ CX, r6; ADOXQ AX, r6 \ MULXQ (56)(SI), AX, CX; ADCXQ BX, r7; ADOXQ AX, r7 \ MOVQ $0, AX ; ADCXQ CX, r8; ADOXQ AX, r8 MULS_MULX_512(0, R8, R9, R10, R11, R12, R13, R14, R15, BP) MULS_MULX_512(1, R9, R10, R11, R12, R13, R14, R15, BP, R8) MULS_MULX_512(2, R10, R11, R12, R13, R14, R15, BP, R8, R9) MULS_MULX_512(3, R11, R12, R13, R14, R15, BP, R8, R9, R10) MULS_MULX_512(4, R12, R13, R14, R15, BP, R8, R9, R10, R11) MULS_MULX_512(5, R13, R14, R15, BP, R8, R9, R10, R11, R12) MULS_MULX_512(6, R14, R15, BP, R8, R9, R10, R11, R12, R13) MULS_MULX_512(7, R15, BP, R8, R9, R10, R11, R12, R13, R14) #undef MULS_MULX_512 MOVQ res+0(FP), DI MOVQ BP, ( 0)(DI) MOVQ R8, ( 8)(DI) MOVQ R9, (16)(DI) MOVQ R10, (24)(DI) MOVQ R11, (32)(DI) MOVQ R12, (40)(DI) MOVQ R13, (48)(DI) MOVQ R14, (56)(DI) MOVQ 0(SP), BP // NOW DI needs to be reduced if > p RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/fp511_generic.go000066400000000000000000000044761365325520100261440ustar00rootroot00000000000000// +build noasm arm64 package csidh import "math/bits" func mul512(r, m1 *fp, m2 uint64) { var c, h, l uint64 c, r[0] = bits.Mul64(m2, m1[0]) h, l = bits.Mul64(m2, m1[1]) r[1], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[2]) r[2], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[3]) r[3], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[4]) r[4], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[5]) r[5], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[6]) r[6], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[7]) r[7], _ = bits.Add64(l, c, 0) } func mul576(r *[9]uint64, m1 *fp, m2 uint64) { var c, h, l uint64 c, r[0] = bits.Mul64(m2, m1[0]) h, l = bits.Mul64(m2, m1[1]) r[1], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[2]) r[2], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[3]) r[3], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[4]) r[4], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[5]) r[5], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[6]) r[6], c = bits.Add64(l, c, 0) c = h + c h, l = bits.Mul64(m2, m1[7]) r[7], c = bits.Add64(l, c, 0) r[8], c = bits.Add64(h, c, 0) r[8] += c } func cswap512(x, y *fp, choice uint8) { var tmp uint64 mask64 := 0 - uint64(choice) for i := 0; i < numWords; i++ { tmp = mask64 & (x[i] ^ y[i]) x[i] = tmp ^ x[i] y[i] = tmp ^ y[i] } } func mul(res, x, y *fp) { mulGeneric(res, x, y) } // mulRdc performs montgomery multiplication r = x * y mod P. // Returned result r is already reduced and in Montgomery domain. func mulRdc(r, x, y *fp) { var t fp var c uint64 mulGeneric(r, x, y) // if p <= r < 2p then r = r-p t[0], c = bits.Sub64(r[0], p[0], 0) t[1], c = bits.Sub64(r[1], p[1], c) t[2], c = bits.Sub64(r[2], p[2], c) t[3], c = bits.Sub64(r[3], p[3], c) t[4], c = bits.Sub64(r[4], p[4], c) t[5], c = bits.Sub64(r[5], p[5], c) t[6], c = bits.Sub64(r[6], p[6], c) t[7], c = bits.Sub64(r[7], p[7], c) var w = uint64(0 - uint64(c)) r[0] = ctPick64(w, r[0], t[0]) r[1] = ctPick64(w, r[1], t[1]) r[2] = ctPick64(w, r[2], t[2]) r[3] = ctPick64(w, r[3], t[3]) r[4] = ctPick64(w, r[4], t[4]) r[5] = ctPick64(w, r[5], t[5]) r[6] = ctPick64(w, r[6], t[6]) r[7] = ctPick64(w, r[7], t[7]) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/fp511_test.go000066400000000000000000000206471365325520100255050ustar00rootroot00000000000000package csidh import ( "math/big" "math/rand" "testing" "golang.org/x/sys/cpu" ) func resetCPUFeatures() { hasBMI2 = cpu.X86.HasBMI2 hasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX } func testFp512Mul3Nominal(t *testing.T) { var multiplier64 uint64 var mod big.Int // modulus: 2^512 mod.SetUint64(1).Lsh(&mod, 512) for i := 0; i < numIter; i++ { multiplier64 = rand.Uint64() fV := randomFp() exp, _ := new(big.Int).SetString(fp2S(fV), 16) exp.Mul(exp, new(big.Int).SetUint64(multiplier64)) // Truncate to 512 bits exp.Mod(exp, &mod) mul512(&fV, &fV, multiplier64) res, _ := new(big.Int).SetString(fp2S(fV), 16) if exp.Cmp(res) != 0 { t.Errorf("%X != %X", exp, res) } } } // Check if mul512 produces result // z = x*y mod 2^512 func TestFp512Mul3_Nominal(t *testing.T) { hasBMI2 = false testFp512Mul3Nominal(t) resetCPUFeatures() testFp512Mul3Nominal(t) } func TestAddRdcRandom(t *testing.T) { for i := 0; i < numIter; i++ { a := randomFp() bigA, _ := new(big.Int).SetString(fp2S(a), 16) bigA.Mod(bigA, modulus) copy(a[:], intGetU64(bigA)) b := randomFp() bigB, _ := new(big.Int).SetString(fp2S(b), 16) bigB.Mod(bigB, modulus) copy(b[:], intGetU64(bigB)) addRdc(&a, &a, &b) bigRet, _ := new(big.Int).SetString(fp2S(a), 16) bigA.Add(bigA, bigB) bigA.Mod(bigA, modulus) if bigRet.Cmp(bigA) != 0 { t.Errorf("%X != %X", bigRet, bigA) } } } func TestAddRdcNominal(t *testing.T) { var res fp tmp := oneFp512 addRdc(&res, &tmp, &p) if !ceq512(&res, &tmp) { t.Errorf("Wrong value\n%X", res) } tmp = zeroFp512 addRdc(&res, &p, &p) if !ceq512(&res, &p) { t.Errorf("Wrong value\n%X", res) } tmp = fp{1, 1, 1, 1, 1, 1, 1, 1} addRdc(&res, &p, &tmp) if !ceq512(&res, &tmp) { t.Errorf("Wrong value\n%X", res) } tmp = fp{1, 1, 1, 1, 1, 1, 1, 1} exp := fp{2, 2, 2, 2, 2, 2, 2, 2} addRdc(&res, &tmp, &tmp) if !ceq512(&res, &exp) { t.Errorf("Wrong value\n%X", res) } } func TestFp512Sub3_Nominal(t *testing.T) { var ret fp var mod big.Int // modulus: 2^512 mod.SetUint64(1).Lsh(&mod, 512) for i := 0; i < numIter; i++ { a := randomFp() bigA, _ := new(big.Int).SetString(fp2S(a), 16) b := randomFp() bigB, _ := new(big.Int).SetString(fp2S(b), 16) sub512(&ret, &a, &b) bigRet, _ := new(big.Int).SetString(fp2S(ret), 16) bigA.Sub(bigA, bigB) // Truncate to 512 bits bigA.Mod(bigA, &mod) if bigRet.Cmp(bigA) != 0 { t.Errorf("%X != %X", bigRet, bigA) } } } func TestFp512Sub3_DoesntReturnCarry(t *testing.T) { a := fp{} b := fp{ 0xFFFFFFFFFFFFFFFF, 1, 0, 0, 0, 0, 0, 0} c := fp{ 0xFFFFFFFFFFFFFFFF, 2, 0, 0, 0, 0, 0, 0} if sub512(&a, &b, &c) != 1 { t.Error("Carry not returned") } } func TestFp512Sub3_ReturnsCarry(t *testing.T) { a := fp{} b := fp{ 0xFFFFFFFFFFFFFFFF, 2, 0, 0, 0, 0, 0, 0} c := fp{ 0xFFFFFFFFFFFFFFFF, 1, 0, 0, 0, 0, 0, 0} if sub512(&a, &b, &c) != 0 { t.Error("Carry not returned") } } func TestCswap(t *testing.T) { arg1 := randomFp() arg2 := randomFp() arg1cpy := arg1 cswap512(&arg1, &arg2, 0) if !ceq512(&arg1, &arg1cpy) { t.Error("cswap swapped") } arg1cpy = arg1 cswap512(&arg1, &arg2, 1) if ceq512(&arg1, &arg1cpy) { t.Error("cswap didn't swapped") } arg1cpy = arg1 cswap512(&arg1, &arg2, 0xF2) if ceq512(&arg1, &arg1cpy) { t.Error("cswap didn't swapped") } } func TestSubRdc(t *testing.T) { var res fp // 1 - 1 mod P tmp := oneFp512 subRdc(&res, &tmp, &tmp) if !ceq512(&res, &zeroFp512) { t.Errorf("Wrong value\n%X", res) } zero(&res) // 0 - 1 mod P exp := p exp[0]-- subRdc(&res, &zeroFp512, &oneFp512) if !ceq512(&res, &exp) { t.Errorf("Wrong value\n%X\n%X", res, exp) } zero(&res) // P - (P-1) pMinusOne := p pMinusOne[0]-- subRdc(&res, &p, &pMinusOne) if !ceq512(&res, &oneFp512) { t.Errorf("Wrong value\n[%X != %X]", res, oneFp512) } zero(&res) subRdc(&res, &p, &oneFp512) if !ceq512(&res, &pMinusOne) { t.Errorf("Wrong value\n[%X != %X]", res, pMinusOne) } } func testMulRdc(t *testing.T) { var res fp var m1 = fp{ 0x85E2579C786882D0, 0x4E3433657E18DA95, 0x850AE5507965A0B3, 0xA15BC4E676475964} var m2 = fp{ 0x85E2579C786882CF, 0x4E3433657E18DA95, 0x850AE5507965A0B3, 0xA15BC4E676475964} // Expected var m1m1 = fp{ 0xAEBF46E92C88A4B4, 0xCFE857977B946347, 0xD3B264FF08493901, 0x6EEB3D23746B6C7C, 0xC0CA874A349D64B4, 0x7AD4A38B406F8504, 0x38B6B6CEB82472FB, 0x1587015FD7DDFC7D} var m1m2 = fp{ 0x51534771258C4624, 0x2BFEDE86504E2160, 0xE8127D5E9329670B, 0x0C84DBD584491D75, 0x656C73C68B16E38C, 0x01C0DA470B30B8DE, 0x2532E3903EAA950B, 0x3F2C28EA97FE6FEC} // 0*0 tmp := zeroFp512 mulRdc(&res, &tmp, &tmp) if !ceq512(&res, &tmp) { t.Errorf("Wrong value\n%X", res) } // 1*m1 == m1 zero(&res) mulRdc(&res, &m1, &one) if !ceq512(&res, &m1) { t.Errorf("Wrong value\n%X", res) } // m1*m2 < p zero(&res) mulRdc(&res, &m1, &m2) if !ceq512(&res, &m1m2) { t.Errorf("Wrong value\n%X", res) } // m1*m1 > p zero(&res) mulRdc(&res, &m1, &m1) if !ceq512(&res, &m1m1) { t.Errorf("Wrong value\n%X", res) } } func TestMulRdc(t *testing.T) { hasADXandBMI2 = false testMulRdc(t) resetCPUFeatures() testMulRdc(t) } func TestModExp(t *testing.T) { var resExp, base, exp big.Int var baseFp, expFp, resFp, resFpExp fp for i := 0; i < numIter; i++ { // Perform modexp with reference implementation // in Montgomery domain base.SetString(fp2S(randomFp()), 16) exp.SetString(fp2S(randomFp()), 16) resExp.Exp(&base, &exp, modulus) toMont(&base, true) toMont(&resExp, true) // Convert to fp copy(baseFp[:], intGetU64(&base)) copy(expFp[:], intGetU64(&exp)) copy(resFpExp[:], intGetU64(&resExp)) // Perform modexp with our implementation modExpRdc512(&resFp, &baseFp, &expFp) if !ceq512(&resFp, &resFpExp) { t.Errorf("Wrong value\n%X!=%X", resFp, intGetU64(&resExp)) } } } // Test uses Euler's Criterion func TestIsNonQuadRes(t *testing.T) { var n, nMont big.Int var pm1o2, rawP big.Int var nMontFp fp // (p-1)/2 pm1o2.SetString("0x32da4747ba07c4dffe455868af1f26255a16841d76e446212d7dfe63499164e6d3d56362b3f9aa83a8b398660f85a792e1390dfa2bd6541a8dc0dc8299e3643d", 0) // modulus value (not in montgomery) rawP.SetString("0x65b48e8f740f89bffc8ab0d15e3e4c4ab42d083aedc88c425afbfcc69322c9cda7aac6c567f35507516730cc1f0b4f25c2721bf457aca8351b81b90533c6c87b", 0) // There is 641 quadratic residues in this range for i := uint64(1); i < 1000; i++ { n.SetUint64(i) n.Exp(&n, &pm1o2, &rawP) // exp == 1 iff n is quadratic non-residue exp := n.Cmp(big.NewInt(1)) if exp < 0 { panic("Should never happen") } nMont.SetUint64(i) toMont(&nMont, true) copy(nMontFp[:], intGetU64(&nMont)) ret := nMontFp.isNonQuadRes() if ret != exp { toMont(&nMont, false) t.Errorf("Test failed for value %s", nMont.Text(10)) } } } func TestCheckSmaller(t *testing.T) { // p-1 var pMin1 = p pMin1[0]-- // p-1 < p => 1 if !isLess(&pMin1, &p) { t.Error("pMin1>p") } // p < p-1 => 0 if isLess(&p, &pMin1) { t.Error("p>pMin1") } // p == p => 0 if isLess(&p, &p) { t.Error("p==p") } } func BenchmarkFp512Sub(b *testing.B) { var arg1 fp arg2, arg3 := randomFp(), randomFp() for n := 0; n < b.N; n++ { sub512(&arg1, &arg2, &arg3) } } func BenchmarkFp512Mul(b *testing.B) { var arg1 = rand.Uint64() arg2, arg3 := randomFp(), randomFp() for n := 0; n < b.N; n++ { mul512(&arg2, &arg3, arg1) } } func BenchmarkCSwap(b *testing.B) { arg1 := randomFp() arg2 := randomFp() for n := 0; n < b.N; n++ { cswap512(&arg1, &arg2, uint8(n%2)) } } func BenchmarkAddRdc(b *testing.B) { var res fp arg1 := randomFp() arg2 := randomFp() for n := 0; n < b.N; n++ { addRdc(&res, &arg1, &arg2) } } func BenchmarkSubRdc(b *testing.B) { arg1 := randomFp() arg2 := randomFp() var res fp for n := 0; n < b.N; n++ { subRdc(&res, &arg1, &arg2) } } func BenchmarkModExpRdc(b *testing.B) { arg1 := randomFp() arg2 := randomFp() var res fp for n := 0; n < b.N; n++ { modExpRdc512(&res, &arg1, &arg2) } } func BenchmarkMulGeneric(b *testing.B) { arg1 := randomFp() arg2 := randomFp() var res fp for n := 0; n < b.N; n++ { mulGeneric(&res, &arg1, &arg2) } } func BenchmarkMulBmiAsm(b *testing.B) { arg1 := randomFp() arg2 := randomFp() var res fp for n := 0; n < b.N; n++ { mulRdc(&res, &arg1, &arg2) } } func BenchmarkMulGenAsm(b *testing.B) { arg1 := randomFp() arg2 := randomFp() var res fp hasADXandBMI2 = false for n := 0; n < b.N; n++ { mulRdc(&res, &arg1, &arg2) } resetCPUFeatures() } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/testdata/000077500000000000000000000000001365325520100250635ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/testdata/csidh_testvectors.dat000066400000000000000000005245371365325520100313340ustar00rootroot00000000000000{ "Vectors": [ { "Id": 0, "Pk1": "2fd62ea1798c0839387d17587a22dcbb89c5797531bb38eff0cd505575c91c440a70e88aa4e67ad267460e40235076dec6ea6f7b60b59aed2a199cc1eb12123c", "Pr1": "c4d4dccbfedd1b103c123ff2ed11345dfced1514decbc40cdee12e450fdb35fdb5b33ffb2d", "Pk2": "895ee9f9e96aebf244c20171133aa0c2601b89f98b9c1f2eff7a44bbfc646a4ff5468775dde42d75803d5298eb5b6d27212d49bf59238c0ddea0eeae8bded937", "Ss": "870ad67d9875cd535a8b4b5776c2eb59acaa872a5775231f75cef212449e40752ac557d12d556edcac68b1ee94a2a5ba6dce4f6bcb6e91c311d5759c83568e29", "status": "valid", "comment": "" }, { "Id": 1, "Pk1": "c017b2703feb1f429d7e101d34b52652a4dea6499c4731d494e1841c1d4333e8c3c6f986ea8e5a62b7943b61025fc273bce2e1c0430a69b78ec35141065de84e", "Pr1": "0c323ecd4fbbbbd12ccd5eb41d5c1f420ebf330e1521fc21c104cf0db0f0cb0dd5d10225fe", "Pk2": "9f189b6f09ec6ef686de1abc438e9708ceaac64cf01e9695c55e1997c5c13992f4e1c35e5c809af2d9be6ffad36e8966a94190f84962fd6e7f5fe9bbd7aee41f", "Ss": "755e8a3e344b0ef2accd8855ac292cdf1dd3d0f9e7403464f85a0784351f0317caae5455d4f8c2a1666adb364e9dc4aff578f02a4bb3da031a5e5e1e30f5dd30", "status": "valid", "comment": "" }, { "Id": 2, "Pk1": "758baaa1d991fce063ff29b4192dba6c8d9b6620ef858fefe2e5218c1902dc0d84c81877f0eba7ba3346dc6a67c292e2f3ee0567b5ad4a285fab92bd43441305", "Pr1": "3db1b323d054ec052201d02ff20103b250ceeeb243f40e5e24bf122ebfe30551e55ed0b1eb", "Pk2": "41d8d0a352cbdeb2ea16733e83b6a6e222abfc2afafd76451ee4231c47d527a58956b69abcccdc582706d4aababbedf26c242c7c1192f43f5d465feb77d72f63", "Ss": "b95b8b83f4fb3de618306608c5da7e774822f6e4e2f1e93eee0906f5a714c5d58d467cb9e5af617d0b9894dd5008f34fde855ac418b5460bc0109941b7f8151a", "status": "valid", "comment": "" }, { "Id": 3, "Pk1": "0cd103b51492be43c35c80523607142ae88f6896dc64e90bd710d6778688e2b3c2c6cd49d376d859d0ed84804d4584a1ac942cab87483c53bee22369aa0a0d65", "Pr1": "bfffb01ceb01e2544e1de44e30c21effee3212f5ee534b4b30fffebefbe3e400ebf13e0b2d", "Pk2": "5ec767260e61594ecf768cc0c3a381042184d58e4092c6c13eca657b2bceb1eb44275babf98741a64618b5c8998d18454c63e92ea0b7fdacdded1bedc44d4549", "Ss": "c962080c5170ecd996c904b363c9034c49472e177523247029a7d85fd3aa01eb589e17bbec73196fa3835f7460a0bdd75bebb3cd53467cd2d1eec5906d21761a", "status": "valid", "comment": "" }, { "Id": 4, "Pk1": "111fd8d9e336cad4578179638cf3d1e64a5ddc51c1f8a5fcc8bf321563c410e7e0ee7531ac7595b2eb13eddcb70df6919848edbafb941142ae9cce03e47e2d4c", "Pr1": "f00f025ec4feb142b2cd2e5d04ffc3b10ee4c1ec350ff41d553e1f0323efe305e24fc0f150", "Pk2": "87d6effecd8ee94b6f84521637187dd9fc4d29100e0ee4b07516c9889acf5fdebe9881dfeb902efd354b367a3ddba3773991cb1cd52ca4f25a7d18f739272462", "Ss": "20bfe627e1d0a6ff0ead98ab55049d190fb2a563f78b85b574d494c4760d8c567315f3ce7eec8852ae359f74d7b7f0c55ef24d72a285ab6b838f9b16d7cf8749", "status": "valid", "comment": "" }, { "Id": 5, "Pk1": "db8aa23c21ed69dd507048dd032050288f6330c97599d0b78f4091991d39f8b9ecc101d966d4049b38de7f21cb7dae42c02fb5f3d6323c74639f52cbcbf6553b", "Pr1": "4c23dc513b1ddcbdd5f2fc25bf540b1215ece4f244e1222f44c01515ec0bed1d4b2fcdf234", "Pk2": "d8d3bb64e2e354e0a4d209d05f39e7150f6dcd074cf5ac558706bc4428555e2c44dea6b036e5492cd5fe2e59e5bed9bde65aeccf8a47d6a28f8525283ec23a09", "Ss": "af726b0535a37777c3790db3ddf8118c7f795366d51c77d2decab720c799248e34c4417d825a1b3bf3de814bf27c8917ba16e8a83b7117709cb455f34fd37328", "status": "valid", "comment": "" }, { "Id": 6, "Pk1": "c170985f761b9742950f27256f6e5fe63564ace2bb1c1240c87f915b0fe3761295d3c0f8344d78872706124ba6c01b9f460d683801563c7f333404017b8c874d", "Pr1": "052dde3fcdfc0cd2efe2bd3512d1df32b304cbbbf4402e1cc55f00e3ec2cfdf4fc2c03cb0f", "Pk2": "096a2838cb794731790b102549905ceda31a94b6951038e6a73483e035045b75917fc8acf982b161418a9a667a8c2afc184feb48462520cc0e85f64a114f0438", "Ss": "80690d9623baf4e4881aa63f47f751ec88c9c099516a384f3c5d97179c8d33700679e28087f0318e51ed7839917c76dd0db74fc03e10fb1c539c92075368f85a", "status": "valid", "comment": "" }, { "Id": 7, "Pk1": "60270f86533c7394ba891009668d0c5f31dbdf22d6c74b8c1ffddc280d7a16a49797e14c9ae0b16cdaf337f718206d5dab380e345c2bcf9567e25c3eb757bd3f", "Pr1": "5b224f4dd4501cb0f15b045dd154cd50b25bf52234fbd1cb4db3e50f3b404eb3e4fc1ee530", "Pk2": "26dc974e40298a7a550d1d28f1eb9273bf16852327d2f2cfef768bda463b43346ec711bb3454bb5dd0a7778744bc6dab6de330f3024baaf249095ae916d87e43", "Ss": "46eaa33870b4be48fc84b4aafd3cb995852a5ab875cd75d46c40d8516988344a07ec30a4f4b1ff3b63f50a380ae409dabf805ad1af0d9cd4c66871c49aa2b613", "status": "valid", "comment": "" }, { "Id": 8, "Pk1": "007c8c48845b314d3d1cfc1376080e38ce3eb7ff8e876e91ecaa24ecd8778e7a5967930894afde516e585abb2252051e81281988a1f4f4b9fd3beeaaab76d42a", "Pr1": "b24131234103d5cf1c01543212bcc35bc334cd2ff202dccd04fc3ef5ff35352edce12cd431", "Pk2": "d4d8de755a9cf5e2c9df44770e1cd2561617cda5a469fa90ca0f3f3b78af682965e78ab05ddcc9618352c890e72f7cff35c218ca7185eaa2377e3ffc14774c51", "Ss": "14061ac3ea3ddd28a56387eacf9958cd7cbbdfc107b34b1c9c3de3b37db9417acfac5c53357d650e1bef3e5dec24891c6d8968851d6352aaea57aa2ed9a0f00a", "status": "valid", "comment": "" }, { "Id": 9, "Pk1": "43659c08a6d627d9cf4735c891aab0bf3ec481614910372fb5fc26e3742bdbe0ac352e5f9f210f8cdc7b005f353425cee6f5c962770447266bcc53267abd9e23", "Pr1": "1c5dfd3c25d5d42b1200b0f3ec443d0bebdff012eecd3cb2c1f4c4e32ef3bd0fe35bfe400e", "Pk2": "bd0c0009df67b0349efbebe675843ee0e730ca02c74305a49e4bc594cba5ea23ebbf422e88e4cbd233929c8f0cfd450f142323832025b3fe8ae9a963ef7f7105", "Ss": "0848e8785c4adc94057a07b0f4ba1c91eea3fff5f24f4af3ae39a92a4b724e85138c9622d484d350acd5191ac71ca6de6acef4715097e801fa57524de01edb01", "status": "valid", "comment": "" }, { "Id": 10, "Pk1": "8718af0c2f8d1934d36dabf98fd6dfc59b492c712966435da2a5b87ce7d8932d68b8133a8b67baa00ff2c153853e3f6455cb129e64ebcb8bb27da63cf03b9a32", "Pr1": "25dbdc2c5d133ee52d33f2cb5efdc14fd4d5334452bf3dff02451bc5e2c0c4031b5f432005", "Pk2": "2f51d9f132fd4dcd455b2824cb34bc3e40a1230fcb5806ac73b790f45ab424e3e1198fde46bfa3616d9ea774aec86b2bad6bc25fe1f69336b1165a6501df912c", "Ss": "3a01783110eb87f056dd74309eb930d88d04ed743957c49e3fc76cf0e8be519002b1df3f7a0fa25781341dff3903d455435e41d1470b60ba7480883e87185a44", "status": "valid", "comment": "" }, { "Id": 11, "Pk1": "c18552ebbc4c5eeae52527aaf836c85e118768183db8e806e1b8b62f4a41e20820f71e8e9e54fbdc6a23b8d1498a893683b6cad52f6c6e39e2e7a907bec9df2d", "Pr1": "d30105dd234510d550c5cd4fd5504b34b3dcdf1cb3f255fe104e2d4dd545b40d42ce2c15e1", "Pk2": "b1665e32f9d5109a6391ef6dc37805d417435c3bcd951c709723c793c5ead0f1b8ff6db0f832c3852017a86d44a1b99bd90a72ece5a16096cdec9ddf76294912", "Ss": "a510b28404fd18e5e09b86356c79a29f24bd510d6753bd76dd3559a4b6512282e9057fcb5d09a7c7ac7aae303254d979fe32963bae76daa38e440047f8a77a39", "status": "valid", "comment": "" }, { "Id": 12, "Pk1": "7350f4abf09ac07c06060eed93550f3a7e98d33aa8f27eb15b0d95be0464ac5bc076432ed72351b37aadb396b8cf508393b6ec69b21838e2cee8f0b78cbfa134", "Pr1": "be10bf10bb5b3ebbcceb11c4352b113400cbb411342b1cb21d443352b21203bee1e12fbebe", "Pk2": "b6e041a164df9c371ce0269edfc39d7a35b4912cdcee025f4cf94ed27d28e293c6aabdd12efbfe242cc3af779780dcf7989602d2040181053cb15e91af8cd218", "Ss": "f1839d3ee717d4e771ba98cb7d8f0876ef609d121cdb5242c08f024102880c54b70d8b736cd0619749b669c04a81e25f60a43d8de6ab0c99dd965fd04a55f61e", "status": "valid", "comment": "" }, { "Id": 13, "Pk1": "c75d4c97b1279fb71527e197cdb10187496847bec5f92d87aff488f94ed6e4af9106d90e138e9f76080fa3c2dc02bc53605729d61b44a713b73e55c0374aa419", "Pr1": "d1c4e5204ffc2efbc5fcbe4fc214e25f03d4c1bc52035d43c1ed34fec54535b2ceef40ff14", "Pk2": "555b2ee62bebf290ea165bc236b52dac676f2fc76035c7a932e5a7af124e765b01c2817f56ecc583becd812844b6900e65215d1f6d1fbf7702daac9b97ed7e55", "Ss": "907c30d6734023d0834d27a1217d2db171a18847fc23ac841950789e41e1b128e9530ff4adb6ee2a7696822a51860cdac102c88e6174bc36044942f843c40547", "status": "valid", "comment": "" }, { "Id": 14, "Pk1": "464384f617fae27179514b7b4231d24310c0125fa00889b3a301c7fbb2279d01f3d26693c0560d1da464d4d94f86a65c29b8a4a4621a75a51755c16f398bf533", "Pr1": "5dd0125dfd5c123d33be21e4fbbf13b0e13b00f5253cb151f3b22c02513042cc1c22f3e2bb", "Pk2": "c26c07be3dfacc0dd675a308be3eaad29c73af2e1fce1d2653e6c3773a9f49c2532206ba96c59c043f48f16ef133c5cb8f324633021171943a15c6bbb6629a61", "Ss": "54c51f9a31299a0985fae6d50cd7c74489533ddf8ec178f5e9af02e393b14e37fed7282ebeefa296e1279ba8f9f2ef0f2a62e45833d40ef54d49c80c4c758941", "status": "valid", "comment": "" }, { "Id": 15, "Pk1": "930dd66040ef7e32480a68ddbc9bfbf7b4469018652d9600121f25dc88ffb9ac9b15fb0f92a35cec66a258bfd0b7c3108c36ae2004bb88c9444a506a11d8cd36", "Pr1": "e4530435b302d0cc41c11fbf4bceb4c5cc11cc40bd55b1eb334f533edd1f554eb430f5efd1", "Pk2": "43d7531ecdedc868ee6f16172c22ee32d566b4c1a6951372ee10c43b6c6c08713308ea5b42b0c8217e1e9bee8971da9fa896012e06e29135850a2c138dbf043a", "Ss": "1e31b8f444a96180c65eaedb5392b75f177b5273f3c62393a415d0cf56f30d0f39542a661b4171716ccffcb6d6eefddeb19f8fffd682d8f7df5b4132e7c6e22c", "status": "valid", "comment": "" }, { "Id": 16, "Pk1": "abd38fd9948ca9a5de0d50e094e504fcf848c611f9ca0cc071b26bb5c39062892984c46a3d377f60cbfd7f1cbc9288dc4f2c072e31458a27ff97cc65f7e4252e", "Pr1": "ede0cfd2bb4c1333112ebd50ee01fe404b4cffe242e042ee5bc15fe3df2dfeb3cf255d23e4", "Pk2": "05fc229d372a5b7b00b8cb54c9cb4bad87b8a3627c06c00e10e4605281d4ba09b8bfde349c83eb45bb014d4f32e15be96c2520f55c6fd97f6a1b7e5582f64c3d", "Ss": "fb6af7aae48fb5778eaee3017454877b7ffd10609f17a3f85b58c7da6376812316631887c869a9eab534d8ed1be66dd2cf91243cb5b2b4022f225a93e9740616", "status": "valid", "comment": "" }, { "Id": 17, "Pk1": "4c0fd41c5d685da159648670760185bcc570e40719fd1a5418a03a70a44c9338ccce2e95657d9f63aa69d608736165a99858ccd070441848bf8e436271d41f34", "Pr1": "bec51245f5b2d411cdfd2bff4c504db225be510d523cf30dc1b233bbb5cc0eb120fbceeec4", "Pk2": "33751b312dc5fe9af5c996e01e0fb9d63577b78426a2a3a38116826879569dca360cd2e7dbfe0ec2a89678a3b1fb3c652d3abb4cc876a209654914a09991493d", "Ss": "3a03079a1d37263aace2b48db2a2ca3af1fe8a36cdbd575b1f3f4617b7d73c22009997cb54b77724835576e7b185eb3dc1e1ebfc265bb25f43e46091aa6dc71c", "status": "valid", "comment": "" }, { "Id": 18, "Pk1": "7082d57f25bbd7f0bce60613cdbfe5b4acb0f24ff390ff65ce2d7230f5a6e307165437c649001443d36cdaec3b5e5285e2f444ccb9b93803ae90bfdceb7e3e00", "Pr1": "24b5cbd420f3fb1b50f3c4ece53f101dd15fb402bd2b0524e5ec4cc2b0f45043f1fbe042f2", "Pk2": "cf36e7a48366a3eac28433d89b2cc5cdd993242ec3ac0d8e3757eed68d90370463aea9a1ee01c3e7ca5cc5a20d0a5aacc7e54145c37f03c84586d965fe334323", "Ss": "a3d488ae93d1190eef04df0bba02a818e9a0bbc5af95dedde4407a48b8b1b0d78130f1369dc95a256737ffe5fc1949712e69587b67f739d885c6b4c3f91c0246", "status": "valid", "comment": "" }, { "Id": 19, "Pk1": "5b5f18ed7ad6443a249a142be64dd0288b13adfe964fc0a731734161027076d2b4c21712b36d10a1c173b15f1d1bc3d046f81e29efc4d92cd180cec8ec7e3e57", "Pr1": "e5e5ce0efc0c405fb405c501fbc04cf1df2f04bee00eb5b10f1450323b2d10bdd1b212f302", "Pk2": "97d42a62862dbeeced990dbfeed7c916275f59d2899b02b21b08828f07852d7ac99145ad33442ad925d0d31c89ea1b6ddb8f79eeb9d07ecbb0a02154f82c4b2f", "Ss": "6919aa5d436a2e57109fa0ff5a840ea4c1385bb1f24b639f0ed88aa81778ca5f6ec6322f073daa2fa42bbeae472774bb54f485feccdf295abd278e7be7905d4a", "status": "valid", "comment": "" }, { "Id": 20, "Pk1": "ef89e02f02ba2086728ab37c85bcdb629493e8f5eb917dd1badc987fc3105675693d64eebc10c57c347a06075a60e8057894a0f73106dafd4b4d36775e014007", "Pr1": "d0d0cebf031c332353441c21db2ddc23fc0cde0ecf54df11e0ebcddd50edd0f3030ee344b1", "Pk2": "2025a26445023ea539c092944611033bf307612e4ce569c7b709b1f49536d4d102f39bbd5e2232dba3c69313983ef9f3884881d4505ceb1b5d018c1cd9235539", "Ss": "cb1a80a29435e16df8a5fabb216a72139ea8db7a1d28ec969dde48ff8aa8eb6f0ce5237053886334b67b834253f97ea586f338c2ba8c5762e4eec69af1b5e81c", "status": "valid", "comment": "" }, { "Id": 21, "Pk1": "47dcaf21b5cb31b22bf9afe9ce45d9faaf48f977d033822ad9cfbcaebd1c4c5a9fed3332ce51114b6b7739d441a84a6b4108d6dd53abf75d3e6b55fa6bd0a757", "Pr1": "04520143ee245dffccbcf25df202104ddc2c44413ff2cf0512d1c424b4b44dc2d3e34ee21f", "Pk2": "1f41827b4da85619b6138c03d22c8c911d85fd8ea5612555c177370dab839b9daab3b5338393a457135dc32616fb708de4a4e04807c3f9fed02fd01625b1d22c", "Ss": "fa7724a92848ad03b375e50ff89d904a544e0179fe16393630eccf76e73e3cff6cd05b9ff0bb712ae3fa6ef2e55c17bb07dab44cf479033ba92063b22a591f37", "status": "valid", "comment": "" }, { "Id": 22, "Pk1": "2b2c04c91b163176edfe1cd4fb2d822428719b794f18f8c35ec097b14703fef84bf0aa8096066d9af001e6988c34d52674117c73236914c0136f2b5f2650b432", "Pr1": "c5003bc21d3f350145ef0044310be0214ce44edfe4c3f5453d20e1bce032de33d23c4e130d", "Pk2": "65a20fb30974ff8752b0848e9a251cc133a031fc63b55b2212d646e499a425ca58007367ee199f77e7a53b1a1eae864d7ea7e2620141cd3221d98cd31c3c822d", "Ss": "9b7ddb26dad795100d77386ed4daac3e35ef0e6b04c839c5288f79f223f83feaca76a18e29f0d5e61a5890291e7ba267926d07d53fd7d5be56a2fec41233805c", "status": "valid", "comment": "" }, { "Id": 23, "Pk1": "4f9760895c572b8514b93347acd12501cf1d2edf58174d6837a2239b12895383fbd7f0c42f89a2e7c6b09abe4f449505a5296fc8ed237aefb5876cc8b2f32f04", "Pr1": "3f0ccf444ecd2e10b1e4f025f1ce155d54241db4cbc5e41dcb500213bbe3113ecf40f5d2ff", "Pk2": "8757d6e77b259fce0a579147e75f3cc08b8c8a8ecb01067639d191d5750996d8fa8debc57a6c547c5e32d735b28937c310e5c47968f2834527078a8b446d790d", "Ss": "57ac4a9298f3f8e8676edcbc1f0bdea1cc127d0d143948e45eefc40803aaf5901e53ee051e99b4ab186afda58c0c237ad38e9d167acdda99f3cd18c0b5f23945", "status": "valid", "comment": "" }, { "Id": 24, "Pk1": "70659900c5f57000c9527a0228131dce4ccc218592981a3deacc367230fca7b81b9687b3d940790adfb57140ce588cce5988c53ba91742fe20310d0fe9a46517", "Pr1": "b135c50d05cb3d2cbd11dfb4c2bd5dbb1f42fb4f1eb31bbd32bcef14ecc441e145b0540d33", "Pk2": "e8da19772ad7ce791bfa45fb22d6d0105ca8e2805b01f2cfa8e117452650ec7ff67313e278233aa01ad43673d9d9d14ef903e6024b86fb0bda1784405e7cd83a", "Ss": "739ca63d8782f001f710a5d0fd5064a831bbc514db47a0047e2676a7bf5d54e7687b4d8438b292762d5fd3738488136d319a8e1ad9147292c093868c12ef4220", "status": "valid", "comment": "" }, { "Id": 25, "Pk1": "890929d1150b17837afee4c516fe0af7a38195abc26132704c0ce9212fac8c438f24bc8e769d92983bae21e5a6a5946fb799b617cda21728fd60ff76abfdd725", "Pr1": "dcf05e0cccfe3424d1fd51d2d33fbde30b3bfc0f215103f13c2ebc3fde5ce11bdbb42f515e", "Pk2": "748c3d3b3dfc65f7166dde35cf7c3b4b326e82415adf9031c7fcd87143b28dd321f96b2c4dd2802134d697ceba98e690dbdf6ea071a687baec1bb68cb2b49e16", "Ss": "720d711510e5c99f1911d91f43e2d676975d379f94feab01ebfe5076517266fa3fa89afef2989320d84208c23af1b193cd2a7c1ba3a7532cc67c327efd0f3e4e", "status": "valid", "comment": "" }, { "Id": 26, "Pk1": "2adc8c8f6eadebf2612846bfb83c8db6b345f9f89a11dc98c9ace22c20affdf72095a7ea394b96b8d11b6d02a60ea669dd593149fc02aeafe1d8856d0597a642", "Pr1": "4125d215eb1b31b5dcedd24404dbb2beff3eb4cdccbc5d3c2b14cf3cc5cfcd204ccd34c041", "Pk2": "c1172412a00a3a81576e7620cf726d85c7643dcd79c1c557c0eaffd3cb9d5201ec56c2aef8b8ebfc3a0a3fb09e62cad9617c288d9e76937bc3991f80716a5763", "Ss": "d1dfe97b768efb205c6167cc408933cd0327e5daf17fc43282863cb7d09c4788922ca574b50c9659f8be279ac349a5d5a5de827c081b128714b20fc8c5d3e52d", "status": "valid", "comment": "" }, { "Id": 27, "Pk1": "7fc41e17e181b4baf7f6e6a2d8b387abe9fd608cd22f413b639ffaaaf1820eacf69fccd0e91e9d1a356fdd202f85fcb105aadcc0f86c7a8bb2a06085d2f0b408", "Pr1": "b3e4c40bbee53451cb5db00f350fb2d2e3bc40d30be2be02c5c3bfbbdb4303105cffe4512c", "Pk2": "3d3adfd18796a2a5669f5aabb931e06e440496f78a8b6d1bfff49a3f2e3d6fcea7263f00ce8837ba1d2ac1c45a37074211636f2f4ae17fd64d06093e55b25c0f", "Ss": "fe3b0d0b303cdd88be689762554e853c6de336c64d5baaa7239597966030d389dcce524f4653dcb5060bb9bdf80cdce9a4a0ed2a4ff7578fec77bb65d0281407", "status": "valid", "comment": "" }, { "Id": 28, "Pk1": "afb918fb5faec2538fd850a647b7dc668869f281c44a7def068ab68780db2c90eb82676fb5142ae276c4782622b52bc691671c19e8d00098076bae9ffe8b9930", "Pr1": "4b2cfe542423c5df50b15eb2c5f30f5ebdbb44b430340c5f2c54b14fee0dbd5e50d2301ff0", "Pk2": "476e6eb224d5ad012fc996f95ce42eb6fb6183a0e625c48b3f270c3930f2b12d8c5dd9a3ebdae3f652b9c1d05124cfb785021d7c37f0761aafb1a4cf6518d42a", "Ss": "835351fe9f2de9f2c26331c74bf5999e8b888970ea2e9f75cd8362108dba439c994765677cbb6cce1b057abbf029cba3faed7b2d2558d3015894fd9c59e17c39", "status": "valid", "comment": "" }, { "Id": 29, "Pk1": "70cbaebdaf19f32c1d28ed77281b0e17c12ec2fa3b275314eb6ad084126117d32f062f81eb2b9faeb536bf81666315769efd1d67c2bce29b1e480986449f720f", "Pr1": "2e12d34f3104513525ddfe323d45254de2d3fb3325bbb10ebeb4e2ce3234f33dc4ce3f4552", "Pk2": "aa04d17d74229b33ada74bf6058d9a10dbc745a4056a58f071571383e3a722794ef99a281fa3597e464b822d0d2a18ba26cd2cfb25ab6376e513913f62ffea1f", "Ss": "d6113b88f0bbd0aa87076d379fa476062ec3764a5d74c833186c0ca9bb9b5e188f403c95d005378240147615cf54fe34b6374a9f89c20df342c98ccedcf6621b", "status": "valid", "comment": "" }, { "Id": 30, "Pk1": "d14dda6b25180c7fcee5f0aa4c8be710d6e8c43cfd0c6e43f39a439f11330cd09d07ddb2ed54b747657d6e76dbf0e921de2c2bb60164b72e21ca0113737c4d01", "Pr1": "03c10eedc0c2bc1f5ef30e1fe25cc50fd45eebfde404c12320ccbf31224ecf15b05b4d15cc", "Pk2": "74090f2cd258bb81aef9a38c12217353bdea54880994bbd75c7eac6985cddb6d22085361fbc75a49a40548eb0089815d0100a125b0da28976f3d79366d90ed03", "Ss": "3c763b3e48abedd1bb5f1d1b449948eda6145e2e4920f22b8015bd4bb23a83840e555a5e2a39f08b1ecb03a977d613349758a26b3d1f3c75c5e845b1d002e151", "status": "valid", "comment": "" }, { "Id": 31, "Pk1": "1267f152cbed16976d9db447098f2a5c05461eb3b9644c4a650bade9f527f5fb2a96f733d25dd2732cb7f77dd0b72514437a13b7f755a530511f053cb7b6a23b", "Pr1": "5ccb1e0b042bf0f0f05e2fdb4f01420b5bc2bece542304b4b3d51d455204f33cbbb252becd", "Pk2": "4b76905ba1310f07642c3d840a84e6db34afdbd8337598a7d724f9190427c6e461d467f1d7cd6f61e7494fc7b4fb553eb3459a2d7676dffb0a83a1af4942cc4b", "Ss": "92309decb5b10af42279e53be3eb6dfa46bc36604967e881bae310d180b9de7478ec6f2d211117220624e1c25765f7420f6bce60f53e98a1d5738316a47f0e57", "status": "valid", "comment": "" }, { "Id": 32, "Pk1": "fa1ec13a0d40d99be1e6515bb8719628c3a65b7030a4602c44f083fd3921cf3ca1870a218c44b1857b325db3b7c5457882d7018950f045010b3ab64abdec2916", "Pr1": "ce1342b4d02cc443f24ec32cee4bb23e5c2d5f24bd0c0314d3013f1153e33e2b0fe523b21f", "Pk2": "9f271bc5699c3cbbbfe57946ab2a9d758ede0ebe1d2edd9a088ca26c84cbfd08557a415ad224a626df324433f81c8596622fde9f0103efae8cfb245014ab272f", "Ss": "88837b67f06c0e0dc938854631822c91555c4c5dfaf648590c172f59b0716ead23ae4f6574c89d606d8a755100e5358513f9f151fe2feb57cfd064a0fff8f509", "status": "valid", "comment": "" }, { "Id": 33, "Pk1": "70eda06453cb76b9c8c1cde06ebab000a38fb9d486fb93af84cf58c7e09fad682e74ceb5ac6a713626aa880b94500f09957f506c22d0a623980bc43f292e6a47", "Pr1": "3c412d55320e2030f5455e2bffe4dbce3edf4b45ee125dbdcd0d2d4ee24f201f0252ce3eb5", "Pk2": "74cc85aa1af4682f439259321f2dea0c1adee2ac490abac7a5dff6a11aa4e43f8dc9916b1186fb7f4b93a861e9d7409c9cb8c242e6ab8d5881743c2204affe2b", "Ss": "cdf438fc6d7f560c56ab746e3d6e85092441b6621173e4c0de53492c7c3ce42c5fb4e7a9a3db1defe7f58c570e842f7e5226cc1431e0e4a46e93702d91f4da26", "status": "valid", "comment": "" }, { "Id": 34, "Pk1": "369da9ab7eec0a7de1ac36813efc54eafcc0eb8e60498685012c5bd3ac61e898e70acd4cfd3189aa4778900c56e7f80e7dcae25eb1f813fb6c4d06e9acac913e", "Pr1": "034dcd34ff1d5c1f1ede2f2e2e20f5d5b123f533dfd445fde332520bcffb524413bfbdfd1b", "Pk2": "197ad46bc959a2cd0afb9753c2f6aad07a7d71308e857a0bf08fad242784e3fd26d9241e76b4e9957131883ba98e7915303a5b248495ed144fce91d0134db364", "Ss": "3a78a891e06a9b1629c8ff3cebf1b0e79de000c8ec9060d5080cf319327ec500de6ee2d1dd801419b8cb7e6012fb818c758f0b287faa5910991e913304bd6a51", "status": "valid", "comment": "" }, { "Id": 35, "Pk1": "e49d17ba5cf227d242e5c574be68e23d8dde67bc59e88c77d8e958100f1a4b9a03726d715f5e3d9fc9921ed2e9f3425eb6b48786899b921a1d3897c6279c0e4f", "Pr1": "e2c424d551eccd5cb5431dd05efdc1ecc2eedb21140bc4e23025d0e35f5f3fc0d0e0fc5015", "Pk2": "3f1c4e9cb8147446745ead96a417d11a54db5c43d2d5e8aa9deb0700e347cc3a62e2c68c1bb9a8165bc2c579861b95a5feef4098ab3741b321cb31a2cb5ea33b", "Ss": "a370f30b7e6deea5005223202259455c6beceff7ceb8af50c97f554ccb82ea4208efd2487bb1481d85797613180876a1660e5339ff9ee359dd3ca35f6eec054b", "status": "valid", "comment": "" }, { "Id": 36, "Pk1": "4f202bba6594ad47d932ab182aee5975820122b1993f3561dac7ef538edc1ac9eebb863bdee51b50c0ed0c27fbe4764c1e964d36b030b1087ed850f97104f00d", "Pr1": "e01350c2b011501533203ef0fdc2e0effb242d1541ffb0d4f233c2cccccecbe1e055cec212", "Pk2": "71caf68de3d4339e6762fe849edce1032f883f73d09597739ad2cc70193d1668f69b742a230731895a6a56aa14b87b07dd5d9734797f29a055155a15a076e404", "Ss": "c9d723b42ba662dab81aafd91a6779075257366214ffe8ce39f5b82c77053a95f3475969967ab36923f9bd4293a882d6f91c4184cc71f0c85cdbb7517fb71e49", "status": "valid", "comment": "" }, { "Id": 37, "Pk1": "bccfaf23b902b6f02ae3d48b7a7535743536db7a1ebe774c4f01551cac4131aed6b77f860602d436e7d6049641c96a44983c37e58c2c32ac3f7c7a44804f134d", "Pr1": "4f13db25d3f3e334b3df0bdf5c214c0dd44002bd4fcfb5b533cd12df523343e0c50f5bfe14", "Pk2": "37d16c998c7abcdaf694066d9eed5f8d1049aef9d8d7b325307aa663b417f1f3f54b72ffe95ea8bd71fda6fe1a329948d8fffc0a128422118e161a750d7d1a59", "Ss": "5a7301f06a19f19a2946366b58df37e57ff32ca0c4ea28c0c768d1a77e95f232cbb915958786202f9cd0643b359f60a06d5edeaeefeb7ab7abd8719e84bfa462", "status": "valid", "comment": "" }, { "Id": 38, "Pk1": "5fe3561faf0c0612f133ff3f8eb13b64d201de115162c9c3b7258b29aa4efdeb983da1f05cabe9cbc64e900e120ad92dc16a146fb65da04a0474e158e5e9073e", "Pr1": "45f5b112342310100240de55bdfe53c4fe22befe014f55cff30b4231f20bd525c2f4d4f4be", "Pk2": "e845b99f95e5cdd38e55d61f6022028142211486a82bf9b4404e2fa9d5bc2db2793a8bd1b450377b43e41d94bacb6533776bd649ebd74534186ccc0b334e7f0e", "Ss": "c22c91cda28bdd4953d34686a8485ee86d31176e595d1b81e0b26656dd7ffe03c2aa012e7e56683df1be043542f1d7610e21389428e7b04742a4e4083c3e2222", "status": "valid", "comment": "" }, { "Id": 39, "Pk1": "fc79f4f5db414f1305950808e861e09503bee01ca017b7e0c298a391f6d06d9493fdd644156ad7b185e796da1fbd721bdfe1fb2b250b371baf275dbded4dcb23", "Pr1": "104cc5bbd4c13db4b21fcb3b44dfce1bfe2bc1cf2b20553be5eede5033c05e5dff0d4ecfef", "Pk2": "43f105be4e1235724f0f523cce8e2c3136f070c175ac8a2ee9dbf810812bbdbde9c1a3988201d370a1da8806c0852bbe60c61e8e9d0edb9da2a3695c93103612", "Ss": "e0c03da892c667135aa8e24673a58d9cccfd1a4419a28eb65a32a16bb1ca07dfa0a0cd6078e8c6279137e9a77a1ecb3430233e4e6386149753bee4e6cacb5424", "status": "valid", "comment": "" }, { "Id": 40, "Pk1": "d8abedb0ab4f29d97aef42dd4d97fe37c9a6932dae1b09144e1a595cb123187e10c09c7eb698440d6597a4d6557d46ccd99d2d8a721fb60135c3273655a6ae43", "Pr1": "1552f2e0d5c32ee23d2be3cd2fcf1f0f0224dd20d040151beb310d2ec1f35deee3dd0e2f42", "Pk2": "db8b17863356eeeeb3e48da6e9bf01a69b0ccc19d5cb403ebd1156c6cd89ab8851b0b9d755d53fdff53630095ea3424aa4755e04d622054ec6702f11cb223905", "Ss": "96e482b0efb081cd5f989a8fab11c87af7676d97b9107540ea2b3be09ad82270cd31197dfd0c71f0a59cde9fe6ff36e8f3c6e79c682eeda0762df5efd11aea1b", "status": "valid", "comment": "" }, { "Id": 41, "Pk1": "e8a76e7d40ae28794cf8e43e80ce3a5faf69b669d75b10c002b6c1637ae133bf81f563f07ff03f5d3a3a7f484e0659a557f2cd2fd3b6706aa1a5e9516de28d29", "Pr1": "250e033c52233e50cde3e25be11d4fffe4e0c21def42bde01005dbbb0cd3b5e51305001c04", "Pk2": "4f7370bbc01a387dd880974b9187efa037dd2cef34c810822e25970b4fc650fab8d442e317238b68bf35d98f1e73e8dd71c95e17482c7f206fc25a4d12b09263", "Ss": "4a4f1ea87ba28fb104678e363dfb8d3349a42317cdca8c8478c2003cd5bf575b454c4934a4954880a64dc79126e260203d7ea982bcc500ed898a6fce9819bb33", "status": "valid", "comment": "" }, { "Id": 42, "Pk1": "f275d4f32774afe42adf0d874ab81998295c082fff979d570c41b13716a3b0e6bae24c754a5f43b16fa1cb4deef689a9182723162561dc8fda66f72193588c13", "Pr1": "cf50cc2df3ee54cfb31fe220fddb24fcecb22b1cee4b3c4c2f2200efcdbc5531c1f3bc024b", "Pk2": "e837cfea1222fd7940bc98382a9fb7cf08fd78484d3ab325c150668055f7ae8e033245a5df6e74e2c0478da6c35febbc08351d8f63b9d59ac914e343e8547319", "Ss": "ae9a68a489774ca1d06a6d0ebc3e47076de2f30125b18e23a0f97298ef4d14e62b04bdbf3dcb1213a3bc76cb11289a353c46ce8dd79bcfda8366f56956365607", "status": "valid", "comment": "" }, { "Id": 43, "Pk1": "636b5370cb6d8f56573820fc36208d0fc1da00c6bacd48576890d530e9bdf4ca800b1968847648b67d63d91dac71b2c8a201634b85c843d1715a9edbd104813c", "Pr1": "c303ff2355b3d240e2d03b4e5040bc5b34c4fd35dd3f230d434b3c3b0f5c30c5e13df2b32b", "Pk2": "2c3863bb4be34c327cd7dedd0810370fae37d66e17a1557ca15e3837259d682b055a097e1d31a0242ed32478b8dd1fff3c9ef7b932380ef1e3fe715391887232", "Ss": "f18e45f951e1b238e29b29e37da0eed2f3364a179e20abde79107a5aa2c09336ae9c69763f9f17e3c848df2561e4b445c00152547be08b2448bb06e64fe6ba0b", "status": "valid", "comment": "" }, { "Id": 44, "Pk1": "7ad45b5ccccc72b050a797150c3e47164059ac66c7da87b5cc93039b168c08de5892d2dc5ae0a7c0b0ad6411e8f1d7e5ad7f1ab5a0ac986de0dc1249e2832b4b", "Pr1": "1d34e3df2c40523cdeb24dd2544f35be5413ff03e0cf03f3f211bfe53bfbd4c2cdc3b522cb", "Pk2": "c8bc7b8237c985f3c4e45735066eb13e02521c32b8c119c799c7de7a79f905b3f344624b0c3e6b043cfc02d0774d32b263ceebaf09e03270994c1c41ed1e0d5b", "Ss": "ac7758560f8f9b625297b606367b0201da909cb72b78f51d5f97023224b84a4b3a0680893d272a0121430ab9ee2615b311b1b05fa92f3a57c86a462fa302a034", "status": "valid", "comment": "" }, { "Id": 45, "Pk1": "a5bba617cbdad45f33ea534db536a4f13e06474aea177aafbd5005c7d5cd7d80ef6b35c93ae99cf387f0f872d6d70d46dbee1534db09b712df1bc6953edf001e", "Pr1": "1ff54e053d3b35d1441f0cb205e12d0015c0041bec2ef2de0ce0bce41ebe2cce21250e54db", "Pk2": "cb7a5016bec4317bf2a81a5bb5db2c1f7451c2df673b6b6d27e3513eaae33932027d57e31b72d2bd201fc2a6df1b4310daf87dcba9062dd49114e19e510b5733", "Ss": "7a640ca814135f23f00bf417a59095c9a5502727ed25d0be73a603bd54860889ee097d68ac348067f6d2caf0e509f91cf34e825edd55d74db4eea4c4f68ab314", "status": "valid", "comment": "" }, { "Id": 46, "Pk1": "99b688d0c260b6b35dfbc7a27884321d5ad3cf23ce720778b2f235f651d33e2207e44bf04603af01517e42defb8b774e26d9d44b281fd0afb06d62638b1ca250", "Pr1": "bec5bcfdcf0d1cdc13e3e252451c053101345d3c5d24d24cd0c22b0cc1bc2e1143dffef034", "Pk2": "24821e9ce27b878d3151e50bcfe2dd81040efca6073aa0a849c21abdc5a71f1cc01daf809d44e868a3e99de67dab2d5a45fcd96156735f591391ea0a92d96a07", "Ss": "74c6668eb79366b9ff9edc6de1c262b64d3d9bd5f697088965d28e96a84f2070ca1ddc045303680f3e59d13d4cdc1f8221f71db54a9bee8ab4f478e67a8e3042", "status": "valid", "comment": "" }, { "Id": 47, "Pk1": "3f61538c510fd0030ccb79c0e327c5de59b6c25f9131a7569590411612b29c65cd42528c8a703f1013d6483112856732291808f8886b28d1a7123d464974704d", "Pr1": "2c0c04f1e12bb1dff5215fe44dcdbdc411451fe23fd541e221fec55103dd0e0cb20dee2bc4", "Pk2": "3b1cb52ede193da596088f5afebdcdff5d417964c83be1a06c2282d0910c1f6f17d52b87695dd99431e691062a6b087f24b7d0cc7ca8a8ac28e257678903224c", "Ss": "c31b8a0c318104a35330a8cf1ac3add99a0b0c75b87bd2dacbfe57546e4252f3ba69166f41aa0662fb4506105d6c9f712b0cda71694d90b81400127794e97c07", "status": "valid", "comment": "" }, { "Id": 48, "Pk1": "0d3b0ed8fab6eee63567f2aa566635b398eca2fe5593d8102232be0a6b1b190e1627d59bb3a47b558f14a2ed84bda5f35cb1a3a31efffdd1070387d93219b75b", "Pr1": "45bed3cd31efc005cf3530b1bf0dbf42e140e2e152323ec52e503e043b3cee3cbd12b31d21", "Pk2": "9c86913b71f55528991e18f555226a2491b2e10974606377787223a924300070e658360eb15405faf0b3944fc57591f5aa9ec4b69a9d36045de23db55b648c15", "Ss": "415f5bb404f0907ad74659da1794945385329ba2c167a2e1ddced1cfa5ae4b20e7503551abf705d374319999aa43f42631ffdf3b187ce2ec1d8e971d7bbfbe42", "status": "valid", "comment": "" }, { "Id": 49, "Pk1": "3c453793fbd1c784effa7d4247df1c4dee3740385af1fa530c33b74286d6514ccf20dfbb537cb007ce5b80747e11593109e7066043566e0f727b4c049538710d", "Pr1": "5eb3b32f1d23554bbc1f3343f13f33e5edbcd1ede511c40fb4e0252231db20bbbc5e2fde4e", "Pk2": "36e2bf1588840c835ed41cb82b84236ef5efeaa8974c9fcc5251d41c6f36c3963df48b45ae806d3d4628e6a5314ebcae8e3db65da25f80eeebb76c475e978f63", "Ss": "91130cb7684a96e67b3e7226ef59593f86c81817e62911d62b04b13b5138f68a8a020dccee37d6e1e98bed20d01f5df09fa8cc5c2750246f323d3fc29ee1e500", "status": "valid", "comment": "" }, { "Id": 50, "Pk1": "46db86ae790cc9890a9ebef1fba03c9c35fb7cd00c54bc8527464d996ebde41c7dd1fd2038c071dd2bf67dd7b5e497b5b64f6d549afa1d7f6615062a45b6410a", "Pr1": "bcbd2d3c2be423545e305cc403c3ebbf5221e5fd4cfd4110ccd50db102db330ded0b3d34cd", "Pk2": "a72d04d0735997dea4878e0b7d5a12f5915568b43c45f3331ba88d0b216decd300a5a05fe47474c6a9f50feebaa71a510802f6f2d08e1ed4f503b5c0aa755c3c", "Ss": "b08f2a53a4c741b5f2712aa7e46a498726e3d6409f2cc55b21f7818b0ab7ff55ee00c1f73d23e386287da1efb3f73ba3540805560f5acf2505a6bf3b60ec731b", "status": "valid", "comment": "" }, { "Id": 51, "Pk1": "2fc7c4cd8f9b44d9c7c865df2f80326371a15812910850291b15fdf9e85920238ff38b3bad5ae8cc07322dd9d1b5793baae5d6b6283d6315c6f11f54f6400f51", "Pr1": "b11b2215d1044f2ec4153e4fc52df55d452bcd5f13f313e400f13db0edc0231f5dfe3ecde5", "Pk2": "9390477587edbe5b1c4356d248b2b0f4c77a95e7bd5627d88a476f9052423793f249067f7777c24d3a88d0252a3b35c2ea7ac76040a1f333f119ed1cd3a8c927", "Ss": "649e08696dfd11047217dd6c4e409bc3dcde11bbde8e0464812d29709d4db4e200102269765a97dc7f38695b4ad62451c0599052a2aab9dc5a31bcf543ff143b", "status": "valid", "comment": "" }, { "Id": 52, "Pk1": "bbc27bdf00768dabdd533d3b8722f39a2af9eb055d38cf3a21683b078b5955971e3f1097792c60b7962c2f06b953229032cbbb00b9c2efd6ceec4b50df24b412", "Pr1": "20d1d0be02c201b45c33042f01d1d00c0502fb323cdf50fb41c1cd12ec1c0e0ef0d20e1fb3", "Pk2": "83d4b548581dd73aa9f06cd9e2a7500dbca8274c157f2f1f77aa1c42077427be8cbb58164db07baaabe283dc0e919a45a98401714cadba33f8ee5d704c9b184b", "Ss": "e7cfaafa34038e2e5aa6012123ec854d27d2d7041dfdbf7e69bb33af3cba804e1d64ab386e44891c335d3b3798a22f8c47ee9700da29cb804453903ccbfd164c", "status": "valid", "comment": "" }, { "Id": 53, "Pk1": "6db28fd002a175007ba9831c7fba6c22d90f92c5323afbeafd9dee6ffcf4ee6c603aff80da533deef379d4f42c51918df73be7044f1d7e0b8b9af26100c1e604", "Pr1": "e213022de303eb0c13ce2bbbc00ee53304f0bc30113cffd44242c2bccf0eb54f1bed0bb343", "Pk2": "38ca5c5cb8694576e86082b1e227184d700f67ce195cd2ec8e807678caedd59e5fd0ceb2409a88d10ebb30f2bd5d0b286d691731449470a554cdacc84044fc32", "Ss": "cf850621523aab821c3399536ee22436b345a2c045b80139bd4cd5305b8a1219082aa07eeb0e686b1249c8b879118d92071da5a60bfe1b029fa6fbad654fb604", "status": "valid", "comment": "" }, { "Id": 54, "Pk1": "f73bd42f21eba247af717186d3ecc842919df0c52149316152c5334865872fa3f82fae6c1cab00beb203fc63a4bd014bacfa7bb21617baff25eac6cb7b3b9848", "Pr1": "cbc345ff25c5c2ee0cb44f4bb24dccd400e2b2112f1bbbb4fe3febbeb1eefcb2b41c031ccb", "Pk2": "4452b65ed121f3bdcd6aea7591ca37e022bcae8e9a39273e9240549e51f0466c85f8004ef6f6dec161d452964fb719c2b1d2dec9be5622c81819c01579e07616", "Ss": "f672e5223d4a9d3cb7f875a06bb1c5b602d64901ef7d28f3d95c95e06abc9df1e33e3642f65ff86ba5833a6e51824985f2c2c705f2659e0f0c2aa65498d5a538", "status": "valid", "comment": "" }, { "Id": 55, "Pk1": "6940a6c1a053df71e7bf09f2434a6b1cbe01d20a39c4b2da294174bfaf1eb1c767eed10d36d5f9441a5487a7ebc2e9d64ad82fe1a84c643f5159c958f4a56c07", "Pr1": "25e120d55dcdfcb4ccbd3315d1d5c5134fb2b44ef15dbfbdc2b1f13120c51f01b22fcd5c43", "Pk2": "f6de8d789b1aeb2db75bda21955122beffbfb8092f78a2e76e3e4db9b73a5ee12454de1a5468bb4f00b6c460d8544f70ebb3b5c8a02abe1138db7e1a44d45344", "Ss": "5c39f9ce9f554f1432223724841f596424ac137c749174f6d3e52d9a826c2d59a55f308d77a48d32ccf1eed8ec9d3d25130d9260e4942600757cbb944efef814", "status": "valid", "comment": "" }, { "Id": 56, "Pk1": "cd5ffab4dfe6446b491fe9f217a44e5acc4ff093b820255b6b1389254f6e1796507f4c39f79caa42775585219815c7e05e62b52b44da4e4cf3fb38b2c38ee659", "Pr1": "55b54ff1e4cf01c40005352ee011455cce0fe45201b5e13ef44f334f22cef323111ccdb51c", "Pk2": "ea272adaf94f45677333d2aedae01205d2f171d357b6d9d39a7c0679fe889f44681c027e4dfd8a7ad370f994d9a16895bb26c5786d88865176f0216f0a9f830d", "Ss": "2c9cd79fa02c2c44d2970c71b159cb920476495d4a2e8120d9419c77d9c0750ef637b3ed90948e188b188706868c802fa1ea12ca0c346e45a1316ec915d2a820", "status": "valid", "comment": "" }, { "Id": 57, "Pk1": "d7ee92b73fcd9cb387d1f45cfc47b81695a2adfa7f90e600b2a1c8957362a77c74b7c64acc43204d0b1b2227e6df2f828dbed4dc92929704b28ef65df6b42226", "Pr1": "3bbfc0e0bbcbc054304450fc3d5311c2e5432ef032bbce4b31fdbb55eeb34d03ed4bf2c3f1", "Pk2": "2e13a1be1cbaf3a95379c4a8a7dfd33ed3211d83f4b67ab488e18f0ea49834b279bd294a4db7af6cf63cd2ac36ceb889c249e89c9636d5114c12a6c8fd86c131", "Ss": "d43274a41ad8a6d83c6bf234006e649cfb8b26bf0c089655e7c9f1726c6f047a66df2e55c5c6a81db5473d8289bd545504e99b98f458f16afafcf6c466a1240c", "status": "valid", "comment": "" }, { "Id": 58, "Pk1": "63b51a6b80e1479c4349b2a7a3557017f2e339d04cea7e901b495224a6423443906614894275ef128b8b4a391e63361a812a02d19114806de91de2a2d77ce21e", "Pr1": "53e1f1cb3bfe3455cc030d4e33344becff2ceed5c34fe5dbf02d405c2fe3c1f1bd422050ee", "Pk2": "ad89c4c7cffd8c7f26394e3dc5319a26d6b127aa11591fbc8f53ad6f6ab9f882eee3226f9275b4bb25866265c743d53a4e815c712929f74a6c33e30a50992b14", "Ss": "e5e0936407000a72ab3a3c5997737e1e8e0025edd2d61e803eab852d424232e73917bcdccd531acba4e63b0c659d0bd28a4b4365d3ccc637de7310facc900d59", "status": "valid", "comment": "" }, { "Id": 59, "Pk1": "cbcb6ca03df3c389e64ddb50771ca169119003c87edc75f786b5307d169f0db0439e12be5f7d8105b455a6f82b5b7a3609e65022466f07af397c3bff1d5a3b3d", "Pr1": "e5deb1140d24edf3ccef4db5eb2fb0cccbfbc5322d300d21b245cfb14c154b5fb55fb5cdb3", "Pk2": "423a6438c223561fb8f4db0937d4557a6225047dcceb3152c5f94ec7a27ffb5c93b7a63705b73f741a638c01b748737397164ac96ff9f9f28c7442fa422a1662", "Ss": "e0257a6e062476e12b0e625c86f800b8da50fe8f9a8aa57ca1127a827bd5f086aef9b083f6bde996beee9056ca5941697fd0f19243f2fb8cff36ec2e090a8f4a", "status": "valid", "comment": "" }, { "Id": 60, "Pk1": "d47e2b3f3d2455a0cddb1e43cc29eb487fcea4ae3a4d345d4cbed08340883a0be8164a45d871cba92d60485ca66c9754bdffdb8dd6a848c98f93ca5d1159173d", "Pr1": "3c4c00eeeb1ced25bcddfe0dd302f3dfb5204cb435d002b3e033b3f1bec110ccfeecf52d24", "Pk2": "0ca4cf66f1ff6a0a9ef9822fbffdc88c0ac44ab9b6709f848ee2f37578e5f52803282fc39380535618b5bd3ef2dff77709ac013e15296964f080e960fc7bd001", "Ss": "80060ed7fb1f77c71c3b7362a5b7e0f58ce76b08a55f59f46a7a394ea79bfe95e3b1fa7e11ec9adb5f186a4024b41885eafb703da332abc6ba113418f5c37e14", "status": "valid", "comment": "" }, { "Id": 61, "Pk1": "6854611abb5de14cc5ca915b0e32357bd4382999760bb87fdf5bed9ef5e1752970e5db22f4643c36bb2c03a34cf3a3558e2e496b6e1b6aceb3de9aa52f91bf04", "Pr1": "4dd2543f22b0540f410e1fbedbe2cddc2be100fbd14d52ee3322cd011df253bbf52d40ee54", "Pk2": "3c06e3ae85a38a57a190c24fda83f509903677e7edf18089f5928b90c15d6a0d0e8a511267f8d7560d89fdda7d8d93eceed51a2c7b420223e11aa95334aef826", "Ss": "6f05ec6d530fc5186c1bf71cf23b6997d931e4afe94c5c1d982a6eecee58e0a496c26af3e37d0117038f4b6ed5e7ea83798938e10e57301622ae0e7f463c433f", "status": "valid", "comment": "" }, { "Id": 62, "Pk1": "9df5fbd1c44c0ce9d5284f0fde51f2b53802904f86747ee519de3a636e228445d475436bd3f3780a44175c4b830e3ed7d055e729ebe4da42e5f333d3a8183c5f", "Pr1": "31bf552dcdf1b35020ff0f2fbebfb41532c2f2dbe3240bddddb2500dbbc0efb0fd4ebeb1f1", "Pk2": "beba0b3b0dfc61597e3586b50838dfdcb8df4f25539b20648427c43e84510f9fd301f4a2ed3e1e15d475c227efe757bb7b9f046875a5898656ef2fa9d20f6553", "Ss": "42706c0a6eb4c85b7cfe43cd68874db1dfd1b99bcd798400de34d5fda80f6dec8e1579ac015fbb16d716933455cbc563bbe837304c947d314572dc3e6887de2c", "status": "valid", "comment": "" }, { "Id": 63, "Pk1": "67b00bf2dda8505cb3bde15cf33510356e4009600c6ca4a50ce55a41833fe7d398076280c100e51c51523c5e1582b66ed5c0caa92afebfb082e8bfec0443501a", "Pr1": "e5d1fedb5511dc1b333202cc0f4fc5e221b04b21b3ceddec55e2d02d2bc4fd3f4feb5e2fbb", "Pk2": "0b856c7ddc7a31d6051006a6ce17a772e13acd68687af17ed7bdd3087df5b87049d32397a9656333f4d5632ec8b92431c976624fd7cdc00b563ebe59647f0b19", "Ss": "3babb725e9f2e8dc6e95d1ba4f57c64e91981773038da720560a18b7a1ee788e6dc6b8fe9a40271a842bbf3facb837e462e40838cfa9bc9e77a8b69ef2d9d646", "status": "valid", "comment": "" }, { "Id": 64, "Pk1": "b33baecc02ca5ad6fdb47b92a56d5bbd2b1e0e5d158b6f3930e45104fedadc0dcaba2073d7bb600c0ca8a4dbbd2489f59eb4497ec338477c1bb8140580318030", "Pr1": "cd3df3304e12e1cbce35b2f30135f2fd311f1c00fe5d04b31442cc00fff3c540e5fb3b234d", "Pk2": "90475986e65caac7cdeb7576c78bdcbc25e23969c4be1cf841cdec8ee3677035e707c3d68dcf5395b6b8625c6f4dec44c3b351b5a0e3d4e4020aaa54a1e0cb0f", "Ss": "c696baba64b9942e04f75b6a7146a5af2d8a847665f3ab0446137d61f598822a6109ce0f63be083dd88837dc89686364d67ccc3495ccd780f3975272da69831a", "status": "valid", "comment": "" }, { "Id": 65, "Pk1": "dd7e105f200034b3831651616adf527f20262ffd8dd5bda89c0e802c93815b259b87637d7308fef859e8672333aaf7cb13fd31622085bb5e209f4408ed6e4c26", "Pr1": "34fcd042e3b244240e1d2c14e3f5dee32e1bc2eb021551e13bf502122d3430c02f04de34f1", "Pk2": "5142ddf63810b623d11575f381c1490baf52f030d665f9d57d87d05130ff40b4407cef942a8541d9e62aac67d21ceb124e474d3af1389ee390e2faf7afac5440", "Ss": "ad48ca1e580627089db0dcc3c8fd6377b0d40d81181b856fcbe97198a17b215dcf163f9f0a5ff031fda62284b3d6b05960a49f4904a0e836fba969c41145173b", "status": "valid", "comment": "" }, { "Id": 66, "Pk1": "ce40e6378b7bff182ee77b74995bb41cbed6dc6baaa8bb0a731114c03a3f61bca8bcb722f38311dcad9e1d64935fc40a3de647910f9a9ec14381040935ff2f37", "Pr1": "0d42efecfff3b1fec0c2b1fc1f2d3cdef1be11441e34ed22ebfddcd1f1f250242bcbd2d5b5", "Pk2": "eb36ec62a9d654b08aa3a2f6cee96d2658f1e163505f06d89d7939a288e87aa6a9445e17d0e78cf7f4e85535b38260af99848ad9603d228d0e783669f2d02128", "Ss": "1ffa1cebe2c9cee36a35d5da3a22f703591b7f914e23a90275506182109736a4cf7c961740f1915c7dfae1c64e53b4e5b00dec087f8142800d2c90d777c6e50c", "status": "valid", "comment": "" }, { "Id": 67, "Pk1": "09c62765de93d6780dbcebf8751dbf70de0f4269dfd5dc4d8757bcc9e1b7c07d9ab14bb40a1cc10f13d3528d03e29d7b50591893a48e3682eedd6645a4392a13", "Pr1": "012c0bdf2d42c5050c0c55d1bce1bf022cdd044edc54c3b2114f5fccbdbb532de5d5bdb504", "Pk2": "3975feba807fa3df6b7635b7a3fd2b9c4a5d4e52a88260f494477c24023cf10ca34c2541ae6259406d530322a380d9d13df2295c82fc9f65756eaf1584c1c006", "Ss": "e5d6f01327ff93ac867844ba39d1a7a8a1368d02f09c26ccd5a9982d8e67a390f5d0d37377064a25e6af0779b418073dee34893d25784e016a0876f693da8018", "status": "valid", "comment": "" }, { "Id": 68, "Pk1": "045e096da730308eec31c22d70ccf034a48bdd2cef1ed9c4bdda17d699f893be5b75832de44690150d03454fcd430636485836b4ea743f5a9dfeaf2c542c5402", "Pr1": "4c0f4421255df4d0ed2b1240b4352b2fdbcf4d5420e11b4c00bfc25ebb3dfdd0c1c14cb34d", "Pk2": "36da7e23b110b1797997984dfe7833caa67eabb045d6beb72d9a444b57154ce94c1da216c97b64d14af5492af5254791240f4ee6406b8a2c0625070edf763737", "Ss": "880bd3d82df37e13196b10dc0765d7ba650b9b532a64949b673c869e31283c8714b3c6b86c0cdf8c0681996ab0b36fefca63fe97afd9a07facbf28aa56fffd31", "status": "valid", "comment": "" }, { "Id": 69, "Pk1": "875494ecbc1e72a02746b0ecf82fdca2358a9a2cb4c9227e99e0b3bea045e48d459cac988670b4a9244be03360f69d8db6f24ac136c6a63ee18d4403cf165e1b", "Pr1": "cb0355eeed5e425011cd4e32540ed511e01ccf34ef51b4fbfe4bb14e5d3db2ed003def4200", "Pk2": "de28cfa07234ffa225ba67908458c7f827ce02d67ae8adb8d6f5b8c417ee55477368a3807a046965e0e06693fc27abc55b5df1a5514942f777d48980ee963740", "Ss": "d6f733daf0eea9b80cf8a78d6e7821927a9ba457e07cd227afd8ddc1cff28a4d670da41189dcef4ab88e7c3942b011b60180d20f23eb3d1e540234796f2b013d", "status": "valid", "comment": "" }, { "Id": 70, "Pk1": "a80f49aef632349951e8166ba91a3aa32d4304ef74c641bdba162d6445920973172acb614bb680b768a4f2d156d9a09c57876e3b0d414dac6ef6f3cef451d046", "Pr1": "104edece5b43543b22f1155ce0b00fbf404eed044bbc4b31d330f153bfd1b4231141544225", "Pk2": "231b4add402f321043a90486ed5650ac98a78453bc3e2ac071f33b87582bbf8b7a4975e9a37df70eefd5690f57fe590ac5e6ff0c28c33d11e6045652684f6f3a", "Ss": "f855eb0d04132e7b1b3d8a908b85802c417281d3bcdabc75e7fd8cd41b1d379639def4d35d0ef326a9815f065e468fc0dfdd265e32af542b9936426aedb8233f", "status": "valid", "comment": "" }, { "Id": 71, "Pk1": "d60160745c1268730024f7179f4d2efb9732268a9feea990cc4bfd1b8d8b23d4f16b4a3cd430527b66b9fad135cf53bfe728669f289f9f9594fea0f1dfc28637", "Pr1": "425201441fde0fccddf4c3c1bf2c15fbdbe414d002f522d145fe1b1dcd43b5d500051c51e3", "Pk2": "1d111a27391da1b0797ffb9ddf6b55a85c71946407d815c883574a7ca38c23e423029d17185ac34dd5ea1e9c8cc6ed39b6292474e3be07ec93cd605ce541f15d", "Ss": "89e7dd2bdaff08fd41b7d1877c1356a59adcce99efbf58f136035bed2bf19da32d6c7007a0146876725e929980de5bf905c91c604a7458bce4d645f082cee35b", "status": "valid", "comment": "" }, { "Id": 72, "Pk1": "ccdd0f945dd4bc38453595275d68de16439461f4be45037fa5e930a1f2d4edee49a70da806f9c3658c5e9ddb13cf1190fea67fcb225615d4eaf71fe8d6fa4d13", "Pr1": "f000d12ff5bb02224354432d54042e20b0d3dfb5e522d51e321c5c001224bc0b0e5004fd25", "Pk2": "0651d2bafa844db0ee996b9ff06801d027c4c9df8e18174af314d23c4c77f89b58878208d1b0d1aa6966393cf43409bea3ebc01eed673b39678056e3c8a50a49", "Ss": "817dbdcec45d7efcc76e0a77d11acfd2f3f502d49f0d7536837e7a89f929b9d38fb2db4b86a951c60ddecba9d9469b6d410a4ca00117366c51b6718515c43946", "status": "valid", "comment": "" }, { "Id": 73, "Pk1": "805994fbf7891ab76ef31d2b7f5b074e8d1944acaed9e7184f270f0aebc7cc65c8989df661ed62c87679587e5ad88d4bd132edd2f1a6c2624bb481f59283ed01", "Pr1": "4c50e115d2ff0535db1452bbe1e5efdc4314ce14d4e2ec304ec3305dc5e2ef333cf514ff52", "Pk2": "62a1121ec51aae2b419b6e7b82a65e19b6083ff62f406ac3b0d29f99835e2e42b40c3988cff08b10ab31faee5f484f27907c0bb0041eae58fe205bdfda4f400e", "Ss": "7d935abf3a20d5be7d5cb4b67bb3ec1ce8a0dfbdfb5cad3c690b5db6ce13c5e698ed347772886574d31b91d167d971c2dce960dae08d306360c77653b49bf75a", "status": "valid", "comment": "" }, { "Id": 74, "Pk1": "4ad3aca0b2a86224129af953b7b55742e2ccfc48d0bc436794b4c84d9abf3b49b1374bb4ebcbed95378b1f81650207f7c8332731957b9d0311666f37cdd94d58", "Pr1": "dce3b54c54bfff5504fe3d3efdcf41fefdcb42f0324e15d303c5de4bdf32df24be0e3d2d03", "Pk2": "5f850610896bd8b61d3168dee8153b16ff620b114587aa42b7e66597c4fc5f727d80e365ea1c747c8ac73a36afe067829ff56cbcbd05147c45c9b3df22047018", "Ss": "09d7dd0ea26d957f11d4efa5fd995d89daa537e7c0e9219521b70b22a89dbf90689aac011f98db652fd189c5be815c3b4f5cccddc8ac08ac7bee5b37406d4d60", "status": "valid", "comment": "" }, { "Id": 75, "Pk1": "e3967589bcb77c3bacdd84f1ff51725eead898d98784dbbd74b8fee91acb78ad9d7b4f93aa0b1c03825df48ec8ea7a43280910e140cf1c276ed3f5426128c30f", "Pr1": "50e4ddde0f3df3dec0cfed545d40f3b23d5c5de54d2404ecbf25d5e45c1212e4eec55454f5", "Pk2": "de343101a690b48711bf5657e4a211991ea21452dd2bbdd10c512e5e3352acd30a43837faa62c4868caa7644fc9a890dcd8148926e8d224566b639d92140f433", "Ss": "ee5690b88b71cf58467496b9c05e5db74dce4963bbf10f01f9063e77cbfac8a270950a20f9cac8e005b20c9ece7a98d8ff3c0cb8244989dabf344408a9ca5516", "status": "valid", "comment": "" }, { "Id": 76, "Pk1": "b7f4f345758372206e52a2c19bb0d4efca54e1cc43147554d8cf93a2155ada60c7ef5b9bf9c8649079ceebf8a6255430f455a7808bbc23087b329bf6b158b712", "Pr1": "10e2cde1dec5d5f5def45eec3d0bcbd4c4c332f43541cd0fc3503bb23b5551dbfb3dcf0f22", "Pk2": "af47681be3eed32da8f9754caaf6d2326ebed999d8dd7033e83718ae95425868ed4756fbd4fbb6247015e08c91e648ef0cb77924c4461c2dfc88307e7c069b33", "Ss": "f0100153e1b97f895c29f29d9e6e4e4c37d2028b10656ff3f6fcab3ee03520a09295a43221c4cff870f002654683245ea99a0d795f6ee1c12f46d8fad66d4806", "status": "valid", "comment": "" }, { "Id": 77, "Pk1": "2c9b3a8f038227a20b65128a56913f0512aedac2d0242c6e7c38c53598f08bec9f43438547f83670721bb1dfaff15e2a47626716891544fb050620e5bb50771b", "Pr1": "1ebd03bbd0045cf0dc51d2fe051c003c1e405d1354b3deb1f1c1d5cf3c00cc54d0b2531d15", "Pk2": "7ccea6684531f438236383b71346e8da9721ece3955d72c479e647e4665628b7afd85824d75bc9330f74ef0f0cf88b997c0687d32a70bb48d2b29335a9813423", "Ss": "5ded89816d5f315e02538b8d4d0634284d86a46ad2113c0597bc3d24b5dd765f8b0531049df929a24ee231ccaf5f20cad17a64b18a6a539df751988c9fa17461", "status": "valid", "comment": "" }, { "Id": 78, "Pk1": "93d47558b820186c512e9bb21fff8d56c50dcd831b20b0c095952e73608e56757f5eefcf0c69809a857497ffc71f1d8648207fec9d0cf08da416769e3ba5d836", "Pr1": "3bc0524eed3dd5c420dc13f0b3bcbfebe2b5fb2ff2305b152c1cc2f243e2fbbcdc445fe02f", "Pk2": "995ccfe467a167cc7eb7a970b9948228200426bdac1cd2170e5b6088cf0c9d491a82ea2aca0b75332ae04992230320b71ce969b7b898d3b49247af79dba9bc61", "Ss": "9e41df988b1f9eb24c78af870e280d93a08516fdb8f94141c3ea284b13cc844563e715d9a9fc6b20f2bfc78b1a891ef0ec436aa2f9e12a43417e4479d8ae3939", "status": "valid", "comment": "" }, { "Id": 79, "Pk1": "f97ad1740f6af8a77c849dd994aa2cf9ec34d2333a2744d7d692c8f66ac73d8c324679cd7fe1393d1924e53767ddc818bca11c37132433476befb8f7380bb52b", "Pr1": "100d131c5f0edc2f5ddb5bbcb21fcc4dd140e5cf40c3d3e5e00cbb4e1fd243b22244f330fe", "Pk2": "3f977001536321456402fe9ef86de522ec444d8e67126d77b1e4abd87849432d35873a444e5bbc880f38046868797c2dec1e1b4b39973e3c3c3ce5c3a184134a", "Ss": "614d8a5618dfb8ce0ec85ce452710faf7936a9e6ffaf2be36c53841974fc3776f3ce1a48fb367237ab848235c047c2f0756615fb919a076b0bd83d6dbd356236", "status": "valid", "comment": "" }, { "Id": 80, "Pk1": "5cbf5857afc60fa21d258a65fe696c1a3568539aaeba34b9499e5730455493639789d7a1c32c44eef0b73af67f0ce463d5d17a2b8a4ecf3823a1352bd7862107", "Pr1": "43ce1dc03e4f451bb405d5ff140de0d2e0cef3c2054fc3c5d3bef1112bc33e11d453251d3d", "Pk2": "a001bdb19985d31707c00ff90e6de241ef29dc39be73c44e24986c011207198b4d3469e7a6b9dfa54ec383ae703c517a1676f4472556a7215b4b03f5b1fd0a36", "Ss": "15ad38ca3b3d930e68f84c0f0301e54e35b58d709bf7680d9abbdd5b02186481cb08168a53f3b06cbb54e11496f3727cf992ec42a9ffe90b65da3729ab20ec3b", "status": "valid", "comment": "" }, { "Id": 81, "Pk1": "f4c554c546f4a11bebd3249c637548be7b0a6efa500a5206c012d553ff6c02c1be2658755d519ceb5af0defb38c563f270a56b58f4927d5dd5782e1da640a13c", "Pr1": "3e2343e1134d55c52fceddec42343eec22cd35fc1fdf23cbbe11cde50f5544105e402252bb", "Pk2": "81b00297f19df6c5c3869dabff351d632c96b475fbd9bc696e650cc3771954124c4fa43b860c4a9bc49d229cd2c13c6574ebdab649accf92eee26ad4c465fd06", "Ss": "ab710ebb488508532adcbb5a66ce4e6c69bb9d7560a8bfae45517c67c1b7aff4e905178248308755b0f1700e76239dfd0fce38e256e9f024b98f9118cece0040", "status": "valid", "comment": "" }, { "Id": 82, "Pk1": "fc346c1bc35f2ebd94bc4476a847feb8913290d782697f362bb5de019609894c71c5e18f47e9736f6a5f2f8d0fd911d81a532f772a5b5b6d4f48af542c984850", "Pr1": "00c55e2fffeed0d3cbd0de4440344f5cf0fd03db1d00f21d34b31d05e1e205e2bdf4014443", "Pk2": "e67ded61f76e6eda6c74e0649ee7c069ad42e6d786fb0f406fee2b7d36d2eb2f85be49f5daadfedff736d1bfc22eb923bfa397d1b3e4fb37f23b51ec9e24d438", "Ss": "3d8be867826d18fb350f073d6bf2266cc1b6e816b39779e8799465d8bdfe5982878f2b1e516f158d05ebe637c909118bdf60c452a199f9a29618bdc4ecf18c48", "status": "valid", "comment": "" }, { "Id": 83, "Pk1": "f5b2d12cf715fc380d5d29cfbea2020181bdf0eda10b2b3446d67d79f976214b2ffd38b9514c51c87b180921094b752f50175afe440fedadf2e85816dba2761d", "Pr1": "d0404fbb41bbfb4bfcd4351c5cefce31fd0402d1334c4bb5cf3dbd030dc2eb3b0f5213ccfb", "Pk2": "8e02f72c4eebb44af9d91d8a75a7b1475473ddaac04ecb979977790998b8e32fc0a19711ed3ae97e3d45a50172e738441fc2bc4148687ce012d3730538263521", "Ss": "f5f68419a8f4c32aba8aa12d7472c198571534acb02e6115a7a274a7a1c400a00569e76e8a3aedfc3a35a0b98ef9a63cd62f5c861df4de1708bebf866654df4a", "status": "valid", "comment": "" }, { "Id": 84, "Pk1": "41a76cbe9616525bbbbc1dcc318748799389f8c08e7c0b987d1e055cf6b9f0a69588e0f3ee9967bdb245a21886c02d9299040883147a927af3d0351e20480346", "Pr1": "5340dcb35cb1b5b5b2015b3542c21b40b4eb0c1d4cb40b24d10dfc2f543f13cdcb154e0eef", "Pk2": "db63b854d0d5f8046b61024c1dbf1f92a611c1a5a8f585203139052f2e071129a30bc4a3ee0f646a599817e5070d83b36493c4fd72e06a57608f0d8868478c19", "Ss": "09f916f3970cf229733ce1c4e38a6249173dd5406a8368f5aacec3bc8737831bb95050dc5dcf6e08957f1a852d2ba23fe64b35e9b8574deef4942d89096c7108", "status": "valid", "comment": "" }, { "Id": 85, "Pk1": "311a1964f596f4d873729307e86b7c86e3d837975d92942ccb0a4a642057602d66e1aac1555edc1dcba95a2fbae7720d1489c3d9a620e45656a092080ebd295c", "Pr1": "e12bee0bf04f3152515250cb352dd2dfc1d50b45c5b41fb3b4042ee3015e5b10f42b5c1fff", "Pk2": "5179fa7efde7dfddab5be56d268b6a277d43504b4f5783e18d4c7b6d6912b5d4958c7b3e2496adab4bb2596406aa180fed4fcda7b016c139c9b88e4a68ba3846", "Ss": "cc4c1afd7ed81997a8339d7d9896bda15562aefc1592325d9bba503458355712db078d5aef517c3c514b5ea272c9b9c6c5320777fde39cad07e44d912762035f", "status": "valid", "comment": "" }, { "Id": 86, "Pk1": "6d460a246e43b562bb323a07338f74f8ba5a1f8e75e7b6b24611712dc76fbd07b9a2ff5b1e978c72d8b25e9c7560a60640410827d0fef8cd1f14c895d9e6894d", "Pr1": "fedf25200df0530310e1bd224c222e25d14f1d11345255524b1f0353504350f22df22f13fb", "Pk2": "d4a0f3a97a0cac2a8ae8d626fcabc5b97c494d9ee6fbfeb50c6efb08b92dd78cde20a7dbad266d87ffff5e920c8b8f5071de4afcac09371e8dcef9222bf5534f", "Ss": "0a13e839653d1654628480c80a798c016d795518dc95bb3a1483be2679f1b4b1b6474ad884daa80c85146023eead41d7b122dabd7861e0f2310a8a351e02dd21", "status": "valid", "comment": "" }, { "Id": 87, "Pk1": "031bcbfcbf8bf2442adfd2b5f2151777008dd5af8dc2390909980eab4066c87a3620b9ef2e3a53aec4965e76002a2b0444dcf9ee469aee87c80fdaf9a1399163", "Pr1": "bdbfeff1f30c20fcd31cc350b25111424ef4f43c2ebbb315cbd54fec4f520ef53eb5ee1e4f", "Pk2": "3d6f496878bbfe8e40020376d9d2590eea7c366abc0b817beb03caf66561823dfd37ff679b87c2c85f36195cb7b7df3e5d7a41ab8a271b8122c7a8018ecd4b4f", "Ss": "0df9e416ed1c6f6f98da5575cf851c6453ed4e2dfc17057cd3f0c88a0bcbbb394bace30e26609f25903816f54b6d68844e7c3858ba2522df1caf4b9c64410e4b", "status": "valid", "comment": "" }, { "Id": 88, "Pk1": "ac958d0643d3a23c6555d048a93ccee567ee32e15d3dbf4be2937bcec79858a2cc5aa05b52df697cd5e787ff021d199194c82f2fb27f28dbc87fde22a0ae3209", "Pr1": "1c2de3c14d1cd2dfb51335d2cc04fcff45f0311520d3ff03032f3b2cffd40c4fced2ee43fd", "Pk2": "a8abd7c09c8f3b1fd86b44ec26c62b0e81751f4f3bd82bcf965e6d243f603e0c9962cf043a4b38657d4d91287558cfd17debf862d9c4bbf8818147dc990df627", "Ss": "732361a224f8949ef5338b3a0e6d59982556a1ccc0361ae6368905ed5d20ffe3b266e057c21fae0d5843a432372f6856e5893b832fb85124528dd6864977f620", "status": "valid", "comment": "" }, { "Id": 89, "Pk1": "fa5c113490db118b97c559d364c9ecf57ff667db70644f22b82c0606ce5c8c6c0fc14cd61f55006782feb372c2d7df88cc01ae714a0e497aee49708b8a115a5c", "Pr1": "31bbffebf4f1c0501c34d2b04edd50df303dc1214e2d4b3b5b5cd2deb2301dcec3b243b340", "Pk2": "ad0c6d0b82db4e1bc042421b2a12a065e2b18902e9ccd6fc707362b6d755f2763a40bf17959922b7bc5a35e8c422bd8f55b86bb8690e5653d1b15f8e9034f903", "Ss": "608ab463db2c37215a892ee326c3112958774e0e1cdc583ce0dcd1a1c22711c5f0a18be55ded5fb9c10fcf01422911ef44245056d96f6bb8b959d136e648cf0d", "status": "valid", "comment": "" }, { "Id": 90, "Pk1": "0b564b8ef9f32fe2c5b23aa4e5721adf73fb27b8d1c9d0077f174f296ea3cc117d53a253db1b46b5b21c369dd99e5150d829140c88fb8acd9049f75a9dc8271c", "Pr1": "4f53b454ed001f3d1d04e1ffd4033b02f2f01b25c031bd3fe2315cfffdbbbeec4121034e01", "Pk2": "3b8ee85d183038a2f4104efd43d1760afc04ce5a72c7c55d3050b74d553aaaa1713f3c808c8f90bd69d5fa28a764978a88e3f36c4ef2fa3150a2db0c9577fe16", "Ss": "f7cbc304be604c2114702242795e92a7972fa4550d3f51cf63f3647012f30ae46c8a52c37c93ae84d4cd1fbcf1d914592200b83d11061002d4222db6cadf315e", "status": "valid", "comment": "" }, { "Id": 91, "Pk1": "6f81d423f62960cac0f2774ffbb90f3c39081098a32c3116729bd4b47449dfbbb184eb7d7429fd6b6bba3e70bdafdf1f90982adece88214f0c4556276eb1f24b", "Pr1": "43fcb2cbddd1dbc3c111e0c34412fe530f5d35cd50333d10442e13fd42b52fd1231c01e12d", "Pk2": "ceed92fa80fa0328e5e970f4c67139b15b3bdfd7092e8754fc8c18a5c7c8c176e37346c205b1be4b8e283e8b12edc3f090f1e0fd93867314d8b727486c86a70a", "Ss": "df7fcd3dc36e4de36989be99a9f41b535df636213aa010a4150d8074333437eca21a73e8d63ab6a57e0f1208da39c05e95b4fa059bf7fceb27c24fd11349143c", "status": "valid", "comment": "" }, { "Id": 92, "Pk1": "15d3e5df2a4e45f057757d42606a26be829c32df758eb8ddda5d96b22933e114209dd32dbb2bbda43f2527e233bd1f15ffa39c8f217a1105df44fba6c3e14c59", "Pr1": "d005f04214f2b212c52be24e10334f334bc4e151dfe251bbc2b5e4d5dfff344d040b00e2fe", "Pk2": "7aefc174f8f1a9a8ca10e4d567700e1f870792963cd3df0c48794633f485426390f3ad8e4b79785af798e9ee5456cc6ab8943401448600f3e785552e24ffac1b", "Ss": "5f252be6e66a490b715192fa1f93a4ed8afae764802eab700a86ca7b677b8acaeb332c88693f7124e15a9d8f92fda96147ccb558fa36c8ec1eabdbcef037863b", "status": "valid", "comment": "" }, { "Id": 93, "Pk1": "5c83f7f6bb5349ca78167a6e02f6cc911f78721150455b579b1e02966267bf800be2fed136ba6ff72104ddb2cca8974eafe5442a70c8259a9df27a58c2f33d37", "Pr1": "3314e5bebfeec0e20b11f3cfc3fe04bb3dcc3dedc2c0b331d3ffd05d3b434fe21b2ec1dfee", "Pk2": "fda0ead7832810277ed48d014175b53b7f1a49b8e946f39e74bcc4ec20ec9e93a05d8b0b4a89a3b87d6fd869b2bc6ef981958ec6b365f2d0b382bcfa8ea7e620", "Ss": "16469221559c9f75f9c0548d851c9710ba5e5b155d4c0fbfd5c0c84eeb66167231d88ba6c620139a14622f66e08f51048f75b5ad84a7515c0ec26673ac43713c", "status": "valid", "comment": "" }, { "Id": 94, "Pk1": "c49a795fdcf48657b57e90acaa36bc75d7eb10598d0ddd22ac413cac35338bf76463bfa5684c16c39c6b4acf4c56d5acab62fac491dfae420258fcf4f2505a12", "Pr1": "ce00b5c25012b5fd3f4d40d11f2415b45ec4dbbefbd4cfe5e52530cb111ef5e4d12b43b5f4", "Pk2": "dc3200d2882c424ac1f1e316fe6d6f0c056f159fa8bc2f4afefe91d62b934a3450999053132b2182bc17dea4e8313fefac0779cd82fee97f7a70bd90ae42c539", "Ss": "17280ef2f8fa6fc481ae68b792249cb1e79c3a789c4386b47a8370e533c4ce9d58f2f4002ac7df53be7023e3e3e63322533234086ed849abae70c3c712517821", "status": "valid", "comment": "" }, { "Id": 95, "Pk1": "b6c29789ae149992c947f6251c6be9d2ae6307b10c240b8e1297a810e9f08782b6b4e3e7f84438c577a1aa97af456c179e65d49f18d7f02d9d04fd50566b3921", "Pr1": "305c3c405ccf1ec3bf3de25f1202e4b34cec454121def41e0ccddb4cc340d212414d433b5c", "Pk2": "fadd06170cec73ff176fa00cd18a0be7660a1b356c25cad0c4a66b13ecccf73d75377e7eb805cb70a0d6aef4714a9c5f6b7c3f2b376cb5e27a40dfde82ce3d63", "Ss": "ef822a4c51de57534e03cec6f57102b513a14199716236fea18a5e437ce53025538b254cb269049c5c52ec8ec58490749b9aa4d5dda12a49da2cfec779723553", "status": "valid", "comment": "" }, { "Id": 96, "Pk1": "201966613776f8d963f6ed6499d9bacef5cb7de00ad5a2c64f19fd0c9592c1f69811efb4eca496433a650ade904b5b02e8bce7e25dfea0463d48c43873753b64", "Pr1": "312bf4012241b12500b150ee3d332fd22f0f0eb13efdcbe1fb1d05f0b53f3000e532fe4501", "Pk2": "5fd37af2c81be1c5decf2a7b2f8cbe03888cedd5f31c2b690f2b9bc729a58c4e4cdb0866a906bae24f4b25a40aecd77d180a04a0de35fb1e256934ea52b42231", "Ss": "9603d7daf17ec48e393a0b89e74d509466b9465c421c1c0e8028adaf82171e2063eb089d6beee7c2409b8bec3d667b00f8e17432d3e4c6fb82bcd1d0e71b2b41", "status": "valid", "comment": "" }, { "Id": 97, "Pk1": "52163344fd3d8ec0f85baa0010a070c9d81b2039d3d40aeccf395a5e06dccce44209cd3660f6820405d594643ed304d6fa5ee97515d2edacedfa82feec41ea17", "Pr1": "bdf2c24f341c4c22252c5e32c3bd00401001fdf41bb40f2ee2ef0b354dd2f25ed20240e00d", "Pk2": "f10aa3e45df841a335916a5a1539b34032fa00aa68625e8be440f40a66b3f44bcaf55a28861640bbbad2d9eec3d823de20a8b33e2d658d2b17d4dc38db249e64", "Ss": "fed4521b61885076d021cfb372e3c83fc00d6965cdf93d7ade1407eb4790a781e6fe02d632e75c7834ade691216a7eaa37557ba726de3c2fa201d7ff19db561a", "status": "valid", "comment": "" }, { "Id": 98, "Pk1": "23e850fbc204a053974d58e8bebaf85b05c302a0bc364ff15c6e88a716e56a6181334500f578b9841974119f56ee374ca2f2c92d07a67440355c268520c06d32", "Pr1": "55f4e1d3f030130134ef103ffd4b42de4d5b0d055c35edeffec4f34bd231bd401dddfbbced", "Pk2": "61f1ddcd2ab64cc584120a46c0b16dbeac25eafb1a8e8dbd5ab744c1c31ee772f1b7fbc2f9ad24aebdbdf45ff6cce0183a891d86a3de9cabb2d7eda1c6cda542", "Ss": "34af01472258220344e3e1ddfb15d2d893d01fa6fde20580db295f03b0e226a1cc1e52707e7f59b7c82f03d800ef00f0786436a7a235ad9a8da02dab9ef6713e", "status": "valid", "comment": "" }, { "Id": 99, "Pk1": "702002b04f749d4fd6caa2d0f47bf36fa63793cfe076734b96256f68ffc0334cb0c05c7f70cb44fd36d9ae2d5e954870b1141aa74f6b640a71bbf102df688914", "Pr1": "c2b515b14e1e5b252cec20df52cb222df1bb5bfb245fffcc4f2e4dcf23dbbd0dbd5e3232bf", "Pk2": "2968d81c1a5079533cc6df5938d52832221a7360fe91c2197329fa21829051d9b5c6f7646ceef4528eedeb1032d69204b978b311bcdec3eee7690c8581fcdb2b", "Ss": "94836115219538d31e4ef1ccdac43b5d336d16d12472ace5bc595bc85d8d4a40507c15e76936857718ffd4e191444f62370fe2403b12e6cd84e5e6129b0b003c", "status": "valid", "comment": "" }, { "Id": 100, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "87342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 101, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b31f2bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 102, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b334fad16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 103, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bb16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 104, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd15333a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 105, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16097a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 106, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033f155eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 107, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a4bbeec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 108, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a45527c95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 109, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455ee9d5498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 110, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec9cc98d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 111, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec9544dd564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 112, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498b164160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 113, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d572160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 114, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564170167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 115, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564166667a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 116, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d5641601c5a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 117, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d5641601678624273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 118, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a203273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 119, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224143376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 120, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224274576989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 121, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a2242733ee989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 122, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376019912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 123, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376988b12501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 124, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989942501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 125, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a2242733769899124d1d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 126, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a2242733769899125074698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 127, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501de78ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 128, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d697bf5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 129, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698e63960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 130, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5990fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 131, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef596aba495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 132, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960f3195607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 133, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa4f5607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 134, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa4951c7c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 135, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495605c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 136, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c2f0f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 137, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c20707f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 138, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f3e414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 139, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f0a4bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 140, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f41b1fafdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 141, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414b07fdeae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 142, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfa17eae1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 143, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafd0be1aef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 144, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdea4faef8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 145, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae156f8bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 146, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1ae46bea65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 147, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef818a65ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 148, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8befb5ddc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 149, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea681dc6c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 150, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65db06c87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 151, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddceb87cd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 152, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c4acd5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 153, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c879c5177eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 154, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd2677eb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 155, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd519ceb6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 156, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd51778b6008249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 157, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6808249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 158, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb602c249dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 159, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008b99dc8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 160, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb60082455c8363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 161, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dfe363a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 162, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc80c3a", "status": "invalid_shared_secret", "comment": "" }, { "Id": 163, "Pk1": "b3cf3b7426d896c620e32f33c1f64b4f1c603b4f7d8e8bddb9ff5adb717f643b5baef6f6e163bb1a66f98be4fbc0f3889c1678672e8878a5e9104e849736975f", "Pr1": "cc451444b023c55d1513dedb31dfd32b1bce3db35b34fd0241c2beec1bdfb5ddb1d2503ff5", "Pk2": "ba5171b1917d3e5d9bf03357ccd48b04007d024600046f20174a6047a9820212d00087633f16738497a12ab50d5aa9211a0c6b8c338e391e181589f74120e05d", "Ss": "b3342bd16033a455eec95498d564160167a224273376989912501d698ef5960fa495607c200f7f414bfafdeae1aef8bea65ddc6c87cd5177eb6008249dc83689", "status": "invalid_shared_secret", "comment": "" }, { "Id": 164, "Pk1": "6b4140305685c29d86de30d9b382450d5fd43300b8e6a7edbbfea96847537d210db4d88d9a10680d9d890b89b4c4b6da5fc83f794179d8eb640b9698b3848244", "Pr1": "24df3f2cc33ddebb31c2454eb35bffbd3ffc4ece54fd5de2f0405102b4c2cbeddf24fb0522", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 165, "Pk1": "da950e2107e9eb0445b54d5ba532ddf22dd7431789c359fb497a5a4e53dc72dce7ac43e32c1846df88815765e2dded89be782dfb4214dcdd6dc775a679b5454b", "Pr1": "b502d23cdce41d14bf14edc351441013f234fee3454c04e03004fed2d023b35dde1052f15b", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 166, "Pk1": "4e4c5e4aa760be57a55f4e2375f061f86dbb5b9245cad99a97c812e9355fd2df0207b6c6da83fbde67af32da7de0fd43d3c37345a01ad8bdb4f19b0223d4102d", "Pr1": "4d005cb30c51b311c345340ee2ec43f13cb2dbc4b0f0b04c5411eefdfb553ed1d21dcd311d", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 167, "Pk1": "7c8b1d840fb9a3b29c532e0432de176d44a5daa0a007473001e98aa18315ba1ab503a6952c32487f09efbef1cf0605c307d5e16061e29ff00211278ee5a87059", "Pr1": "0fb3505e44425cdeffe22dd24fdcecdbef242d2f330b4c4d52cff35d13f04135522b44bcf2", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 168, "Pk1": "922ccae1e9127340a97fc39a5d4f92f15cd6697fb97ffb416838b44786fc4cbab90c5c7b6c07dc126924e7c4bc3be22bfb809149e7d9f0c8c8219bf4127d0e1e", "Pr1": "150d3c5fb32e33fe2d003010b44232ce1bc1f20f3d1bed020e0bfe4e13ffff332ce5532b3f", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 169, "Pk1": "5d81d510d3d731bfc9866affa353f1b5eadba4e0f4233a5a82fee52ca07a9ad6a753cacfd5eb7a7cd7d5c761f8f227693e68d07c8e5d1850422a10fab671c464", "Pr1": "e2c455f11fd0ec0e5354b0cf5f3c4fbf114c20b4154fdb0c32535e12434401bb25021de0e5", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 170, "Pk1": "1e2a6205b9779a1b7ed45893aaf995ccb3be92280938a426433e17cdaf4f06b8c8e20e2574f8ac885fa0683a1cd545e21aa33079d6a1631d2b712e1cd5515725", "Pr1": "210dc4ccdbdd333f0d0e3cf4be3e4b3fdb50fcb0124ed5405b351fdb35ee441d202fd352db", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 171, "Pk1": "f1f34ddfbe3c59d765b44881a03ad41186730e6ea01ace20f7e1474a6455163e07443ff772659f88a113195e26480ca6ac35e9fd0c6f87056b8830b0342c7a11", "Pr1": "1251fb4e4d2d0c2ffe124f2eb1e2d3de143bd03141d4d5ce2b52c55d34c014c2b0bbcfd022", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 172, "Pk1": "52e36742b700181a2d353e34d50f67cda2fa33d17d56abcf7c8d0836e4717fd07e4600030bb38c8c9d9b89b36f95498466644e46c63154ee9ced2e773c323646", "Pr1": "f40d115eccc23c53444323c32d1ddd54fce344ee4252cd5d2b15eb1323e5223223e1552dbf", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 173, "Pk1": "c3f56ab8416a010c4ca472b4b33e4f0cde2afe682e7824bd14f375eeec69cd15909dedcac345b52fc68982e51ce8e4e72d1d124c99ebaee468efa846801ed546", "Pr1": "155420e35f5c233bbfb1c30efdf2ceefb0d1b1dce2d135fc0dc0542eee2c5c440d2cb124de", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 174, "Pk1": "55c3458eb170d217b2c498cec18a7707afab5f5d6d763ce9f30d12bc66ce8e8ebdfcf6f3771e95bb88f48de1ba3b0d2542f0e77a5418d85967dd53d17b01291c", "Pr1": "c4035bcd3db0f2133b01005ee3fc001c132124bcb204ddedeef40fbf30bfc25f4ffb22e3f0", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 175, "Pk1": "bfcca9e622eaecd61d93c6ae7fba009ef1394268455c4738d6e1b4e28b1c1a233c128ce2d7015139b19c09f61f2f98fca1a48b4a4fbef231e3f1e729c4ef115b", "Pr1": "3ed44404105f05c55eee2cb2d3fd332cddb4bc10ce442b4be4dfdd24d5eed31e144bb03dd3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 176, "Pk1": "1dc15056e70bb70eed57a1907e13267ee0c83622780f16bca3d11c91555dc4fa00ea5378e25508a3fc28e8bca38523c70ab5be9240f5962f12b37031b146753d", "Pr1": "cc05dc5b34ccbb14410f053324ec5ee3c5b4ec3e1cb3e0f3520b3ef3e5c03ef0f2ffdc1f40", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 177, "Pk1": "174ba5e6af61a9ba6105fba22d8e995ba07e644b98e321cf0673cc18ca5e628df0ce6e87d1e20afff5db66026cf842d91b7d8505bfb44bfe30890f7ac79db91b", "Pr1": "bb4f20cbee43c30ef3d01b12c3c51f133ef23c2b5cb250b4cedcff34e51e1d02cede1cb250", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 178, "Pk1": "68c2582da6e08511bd7514651adb3a47c56aa1ed7f42654fa250f3158a7f4b6da1841db24cca8545099a400eab1d9fe9b80ea3b40f7f720e26436d4170d71f14", "Pr1": "e2df515e4cb323500db2b3f3530110ed104c52efec2c2f0bf54b00c111ed50e31550ff1edb", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 179, "Pk1": "94b32b8aec3b4665e3abfeb3281af5c85af1fd145fa9ed334bd44ffbcbdbcc8a53aea7e46349970b7cb0cb3122404c87d196cb3516bae1e6e619a7000363c31d", "Pr1": "dc4b5bdc12402b145df335ffc03420d4eff51b4555c34d1edfc05202f410ed55d21c2ef454", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 180, "Pk1": "84016481af312e20b9445ed380be6ff948578726f0053958d9db542b1108cb10ba69beda4a52d29e9cb5847e8f19fc5008cb76047694c603e642aacc384af92a", "Pr1": "cc4b144333513dcb3c2e0135fffb524334efeed0b305d32dc333222ede14ee2e2220332ccd", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 181, "Pk1": "69732150f1cdd0072a26e5093fd1c363f12005e04857b3a1e98c276a5d428a302047bc4fa428ba8c2c69fd32a7faed387e7b4e5d3df0544a33a3af902697060c", "Pr1": "edf02d513c535d3ef0edf1f23e05b54e2f42c03f4ccfdccc5cf5b1ff00f3de23e11fcc5511", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 182, "Pk1": "1731dc1e76b1cd90a062db052ce8197dca418eb273cb2192b444464e3add116f5b7c5a034a91135a325da5a543161d31c5fe67e74538cc5e20e30b56e87ac327", "Pr1": "0d5c0545144023cf2ee533e01cdce15b02033223beb2e31414eb11deed220030b33551f144", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 183, "Pk1": "6ca297d3accf634d63a4fb62d66c7e0c7cc88de3a44eee12f42b2102688786229cdae325b83b895ddbe9f354b3522266fb3465bd76ecaf36a98873d3e7efee04", "Pr1": "2ecee33d243cf1e1e30c1ebf5db41db0cb5534bc302e23f0245ebcbecc3d051c0f5153031f", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 184, "Pk1": "4be7afbc1ca3aa8a15af1817479b10aa6ebee113b4fd24f1cf8c02d4bc423c5e54dffe8ca710e67eb423295db2ccf03e4aa6055d35e4c8195cb4d64629a4ce38", "Pr1": "04e1cdd35dfbfb54d5c2405dc2cecf0b152e333cdfb2de2eedcfef553dfceff4254cc252d1", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 185, "Pk1": "8e9d2d1b27b754e1543311b841d110ee69bf82a75d2640564e9af1fadd8477aecf05732d3e0cbc5dbe570a6c9cd9a9fef98eba3592973bd48e3a1ed31e568927", "Pr1": "0d0fc3c0efb51dfdff4ef0555f340ec5f4150ec4f3ed21111545dbfe301c25eb23c35c1bc3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 186, "Pk1": "f6fef2d5c976b2603a41206241b138b41f202d88aea7200b586832b090f09850c52652415ec247ec981f2918c2eee8e9203ce252d09e24c123321b91b8105507", "Pr1": "deeb4ed2f4bc133eb200e5fbf5e0e44f03cb4bbc5b4f0ebb4f525ec543d3033ecfcdc3ee0e", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 187, "Pk1": "56f705568e4cf736cbb0b63874ca334641bfd50874360d6ddad24800f10b4d18322f26f36da0d5c9fc10963c116877651cc0264f1da5561ec8d11fc1781ccf28", "Pr1": "cedf24bc2d503d2be4413eebd5d0c053435c5bdb20f51f03222cf005ecdf03b25b2b3ce54b", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 188, "Pk1": "b4169daa990e3b461b8e3607e58de16e3b4c1724cfc3f9adf9c44255bf3c74f269f76b142a551c499c9fe0cca394e4fd1f791ffa1a64fb8df73444baed4d0a4c", "Pr1": "c541130e4de3bb2544fdbe32f03515e0f514ccb1c54e3525e55323530b41ccc4d41fd23de3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 189, "Pk1": "d09bc2a0dfd72247b060bdc43d60f0147ed663eaefee2d95954da51e00021fb07f8a2e0a0b831f1a58f40c3cf8b4cf7e864e2de802b5ff9c1877be8c9fa9175e", "Pr1": "dd1e3e42cd4f024ec3c000dcb1ec5cee11d3bbcf203232e5b3eb1c14210fee1b41c2dcb411", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 190, "Pk1": "d7336afc4bff63d9bc2bf1b7e24db7566785376da89e8a6e9870d55b2ef536a9e5a21137a59f6dff08ff847cf6795e5db168162a6762f201fb52f714b80a2465", "Pr1": "2315dcdd002c341e30f25e3f15235ddf03de4515d3b02be10d44dd512252f2bb0fce3b3db0", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 191, "Pk1": "d4a120d742e98bc7976a5ca8279591cafed6b8fc60f1f1ec36f5b5059f2fb3ff03287390c0a8c86bc2dcb1858c25b10f489c08209106f53ec522254c772bc310", "Pr1": "5dc230b353d24bc42e2102d2ceb531f334ccb1e0e511fe21c501d5bfde12523f4c2e34b232", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 192, "Pk1": "0d73d048fe0a18f8bdff59397c8207eb4802b98566c7e43890f7b268f638288a4cf05327fe919246dffbfaa40710dbb7b328788ef8b201f2e438096754ac0308", "Pr1": "d54edc550334e125bcd4c3bdff3bcc03e2f1e1c4d20d14ef4c44fd5d405c2df1efdc21dd22", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 193, "Pk1": "9519b8840b09b2009b486502ac85bd8c8fa08e7ed4b8519a492d00d964a9cef757615a77d656e7f95d073f74679bbc0db9800938c2ffc21f5afa0ad2bae37242", "Pr1": "1b0cdb40ccee3dedde34ddef3f2f5dbef0035bfc24ffe224dbc354bed2e4c0ddfb5dbcdf3f", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 194, "Pk1": "63385f78e18861cbf0ff5bf93368959ed00ed0c85361a979a5a3584b1dd09f3522183e30255a56e25b7faf3a535ec088b24ff59dea0c68023222573d9ca6d94b", "Pr1": "01ffb0d5b255fb2544e55b0053d03ccdb2eb0f511ddb512bd3b0ddc0dc12f352d4fdfd24eb", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 195, "Pk1": "8373c288030c84cbc17142ed584c50cbc5b9b4a4aad7133e196c379b994caaaf6c21da204aa3c719f18c94af062fc293e2d7e8cbd157ae07ba02a6ed8e365c4b", "Pr1": "e42d5ecf1f2fe0051ff0c30dc0523d4bf44de41d3cdb3de5b15c0c0e1e3bc440ec4b23dbde", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 196, "Pk1": "3b7ad70c55a2884fc87174cde23d75142efbf4c528b6defa345ebb23e5575ea8c63a0e5ccd8391bf2ac4b3db8398fb2eaacedf78ff70ae7939115ca2d6485c38", "Pr1": "f1cfc100b2c0e24b5d4cdec1d5405f04e4fb05cecbe5d41b32b1b541fe00fc4e22030f21d5", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 197, "Pk1": "2429fd89eda2d24d048b37e0d30aa83e565213d9b1985fc126b211f6aff5ef9533652afa384971bd28757eb2cb62138f157039c498ab7f31b9e4ac51de417357", "Pr1": "f42d3bbb2f022f41de5bdb14c4002fb2f3044315fe43e11ce3cce0e2b0e21351ccf505011b", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 198, "Pk1": "8e475f011c702d6c6e5de954d167292d26a8d9fbc1d36d4814183710bcfe7adc26b3055057dd6fd079ee1f872fd4e535cce62aee294b2013dcc6a80ee45c2a40", "Pr1": "fc5c5effcffdeeeebf5d3dc4d0b0f224f15def0c52d21df02ec13bc5f50be1fbe3ec4c14d4", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 199, "Pk1": "eecad2a0089148d76a1d6ad82ba3e82012394001e7ffebf866136878e234c5fb2909385ec881811fd6dda0c349747652c2c91e32d6ca627fb3f8e4b965500127", "Pr1": "1d0c14fd422b1d53501d44becdd43fbf010c224c3e550025bc420f412b4fc0003ecd0fb31e", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 200, "Pk1": "763870d500bae73eeb0b44c912227920f225b5a54321caac7c42e8993e1b8c1a4a2d1e37532a0a605f11dd00fe548bb2a1be1b9409196c5be192e1dd66afee3e", "Pr1": "fe0145d520c4b353e110f0bd20edd2b04b00e3bfecf0cee5bdc1302b41d30cbc31e5501d4d", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 201, "Pk1": "94df8f8e0b129c65774ac25bf55b49240ac0b1340d67d71a5ad238497953072ced4614841d3b52acbfc679e8ce146630e3d087f4e0228745b6fe99fad1761d10", "Pr1": "532d32f31f103220c53b0b3c0d1c241d33b5e1ce42523d43ef233bf0b3f1b055e022c033b2", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 202, "Pk1": "7971ee208a233789f323a8d2520b578331615fc107f6aa99faba05f828d47d067ce4ed9604581278cb753eea1785c36cf1040996863b4ee574067ea394de804c", "Pr1": "5cdbdc55eff115cd1d52efbccc0f2f424c1e221124d0e23f5002fed523e22c0dfb1d3411d0", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 203, "Pk1": "618848bf97d4dbc619c7923d37fbfa8322fddae6a3b494a45769f12eb9ea30781ea204b6cc62511c0b51dd0bc564c116e193782c11d8d6887fc5738398975a44", "Pr1": "5dbde334f0fbcb1325f533154bc10fe1ee0232bcbb5520d50320ec2b3502d42334b0d13ebf", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 204, "Pk1": "70f524a12b2ad0c9d99b6ba146df08e95c6a36fc957e6e5e00af096ad33a0d9c0d1986c2ed40a39d71b84e2e641cbc544c429e9dfd2983f6a1f13d5a99a2c71b", "Pr1": "ef41de4e3d2c22d5f302ddbdd0c344f44d3cf1353cbb120424cd412ef2d2f44b334c2ced2f", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 205, "Pk1": "ecc8d5e06c63f6b6de4d4d5fff56e2b150bd6aa426b1242758fce90dd60c0584d518675bab957e91343b9910f3e92b5593a72f9a7cf861e6203672ea0e979a58", "Pr1": "d14330ce00d44bfd03fc21b12ef12cb25eef5213ffc11de54cfc5b522c103de54203db23ce", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 206, "Pk1": "206b45e818827582095a057bf8c2621f39f5f215fd4b038330ef1092203c1281e853c2f0a095a6518c2db9ed5620d1f775634dc144a33213f07f263ab0bc5721", "Pr1": "cb20ce440e3db40122fec2445dc2bb53be131edd1eeeb0e120212f0d51d20f20b2cc4c222c", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 207, "Pk1": "176d46ebfde017ddc4e28c8a755189ce6ad816f0ad10acc682283ce61bdfbb3895b8fe9cd87781b010101c1bad9e65b0eacf3032a7965e9c9c931b82308a322e", "Pr1": "e11bc51d43f1b502f2ed54db45205200f10fd33d0f33d541d30030fe3154e03431115cedfc", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 208, "Pk1": "c67601bfed1e055aeb1b22cc10a6aa26c163040ba3a44725087dfcd414a17bfae61a53e132f6d33c40b13b8a04a5b22068b86eab27d1d30f93fa1e7f4841ea56", "Pr1": "1f1d2d21f3ecbc2f50d31ce02cc1b5152d145dedb2f45ee45b52f53b51d505b40b4be3febc", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 209, "Pk1": "c20b442fe2d88fd9cbbbe72ebb924cb416d1e7705b04841028f36d74ca5c663f270de394e3b1a341f5f0b52cf7cd1030ef742a611109f76bf95dc19daedea954", "Pr1": "30e2c3cef4b315cd514fe22e2122c0f4132def405fdc4f01cd1ce5fecb0c204b2b244fe521", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 210, "Pk1": "0ad106e043e7a07348cfb02c95d7a78571d6dc6f31af93b93365409e0a15bf3cb6a7acf9c6473ab7940722a9448d4d15e308613ba90ebc46698962aec036fd18", "Pr1": "c3345ed34deb4414143ff3e1b44d352ef4b13ee31e344f5dbccefb41f2f14dff3044fc2103", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 211, "Pk1": "6d6587bf59394b649018b5c59fc028aec698014ce02b209a44fad53060726d26cc746dd4f58a578b6b447ad95c78dbebd34798d6e15589c252b89a1ad5aff72f", "Pr1": "d2542e3cdffcfd2f5f2bf04f1dfd2ee3fcf4eb24fc0b4f1df541fd0f415d0e1f3c4c315f25", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 212, "Pk1": "a68fcfa011c6b594a472a1b2d040f6f715979f6344c5d558c864e1b26228cd15a5b8de1b3fdd22964d9e2aaa229ae75d8469f49620375e3a5116030ed1530025", "Pr1": "1ed3ceecdc3f25f13fb412c230c34fedfde2e2bf4512dbf2febf5501f3d04114ccf30d0d33", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 213, "Pk1": "16f56c592c17d2a571adc137c78d3a317000bb7b736c1384ae88e5d0bb24d28a4070f24e5d6948658252d19231fcf691f730f038283b0e0f33a3092484a05262", "Pr1": "2c2bb5b43b3ee0f5e2fc4535e05ef53d102d5bd4022e34eec5ccb35cf4eb45b2f4efc31c23", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 214, "Pk1": "6e6271729b4c86c17848641efad9288f36fdb88edd0322ba05c7f2d5bb68fe8ac70cdd2fa711396f7c365747aadb8aa16d45b5fed058af5ec1e35041d0ed0442", "Pr1": "c434d0ef530d51b3de02f1dee02f01101c234e0ce25f3b0505b054110f51524deeee32c30e", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 215, "Pk1": "402631ca32fb662e1271795d230cc56fa4a26cd19ffc20d1ae939ac94be7ceadcdd3f3eb1d7d6f2bd2aff800f5a3254e0b754906ab1898030e92c96b677e143c", "Pr1": "3bc4e2e550d3d5fc0db4b4cb12bcccd30d10dcb3020c0e505cf20eb435ec2d3414340bdb4b", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 216, "Pk1": "e0ad2f812ef68f9e147d841c33614850b4ad36266c87f14a4c1f8a0d4f109fae67bb0283b56f5c68ce69f6ec57fcb5ef28d2efe92f3d97cf824260d24c516845", "Pr1": "cfc5dc343cc5cf2541bbbc004edce30f0bc05333e3cc0dd045cfd5d5bbfbd3043fb2cd55fe", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 217, "Pk1": "0699cd0ab2578bfa5a5c120163f3f6b207f09c9b2276a437dd5a719fe03032b4b4a216d9147a5ccde1c6886017a87859a3d09da84ac14c98677881092ddb995d", "Pr1": "e31e4e3fd4d11e2b34455050db4c2242b211e3cd2f13bffff424225403104effbd0f45f15f", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 218, "Pk1": "dc747fe9030e4ab49b00509a2ca61dbb548f1a5cb5f993ef3d33449e8b81b5fd6d190b6fa27610471f8bb7e2d845be0062dbe725764dc5dd8b256cfb9da81d35", "Pr1": "45f0c3cd44fd5c4f53c0c5bbe55fefef4530f5cb4cef01edf2200d5202f142e53b1b5b40c2", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 219, "Pk1": "441eb234333efabf9e2516106a72025ba58a0b5de154861030d99506f2f4231889e4405d2579895db1664f91845d159bd4c56fadcdd813817134bbbc23d8dc15", "Pr1": "0053fed25350cc134f5ef2100eb2d12420febb2ed0f401c11bd1dd43f05d41e243d3ef3344", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 220, "Pk1": "4fbde7fc513824217ff9c789f444e8b4996ec74fe28f2534198c47347238e4d6c6a7b72f5c06312c9993569f72e00ab479d689b71e0ec4010266b8b174d64658", "Pr1": "f04132c1e22f113001be43d11fbdefed3e0b3bd1ddc0c11fdfbc145f3fee20f5efcbec3102", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 221, "Pk1": "ab01b7d095a6a49d7a2687c3798e14529237863af8740b108d152c184368f441df695770b3af638f24e719768d65feaa40966825d0c3599ba2c51678da14294d", "Pr1": "f040cdfe30dd2cbffb150c4c224114fd5d04025c4bf4525b521f4425251e20c40541dde11e", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 222, "Pk1": "ada843e481d9161e852f15f5e98166ee93f05720b9bec5606801739f3acb18bd0191ced099a03ec380a694a1b898d58bab99886ce7bede66137b14944f6f1310", "Pr1": "41cf2c4f4ee02e20bedb2dcddecdced3113d00f325e041f245e4bd005eec2c5f500ee4f41c", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 223, "Pk1": "5676614b3a7a07b00a0711d7279751aabcccf95eb3b20cd782d892116397578c907824a4dd7af8e4d92638be8761dd0195003e3d65341a2bc845396eb9540b39", "Pr1": "cbe230c42312fb24c10feee2b311b511dd35cde53c411bc2fcde305fdf3104ff55e225f022", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 224, "Pk1": "bcc0e329fda0f912c83a17236cab9eccde09793241aab7ede452a7cb51dd55cffd272dcb9667c86720a8c56cc44c3b6619b63efae2b4675600bfa3e6143ff511", "Pr1": "b531d41ceeb4b2502112dd05bbfbcb02353c11e4fec2f1c430c1233d5d1352cc53dd0cbf24", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 225, "Pk1": "58d389b6fa9ae227e45afccac4f7e113d1b00d39d286a6ed2d8f9b69b78a93af73afbaf63590f9f3ecbbd837e3e6d9687ebe7eb9cbf54ca0fc72444fff081f5f", "Pr1": "05400f55cf334b5b5d352f0fc10fbed0fbddf5cbbd002023c2edc114dbdcf4145225311f21", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 226, "Pk1": "b1592db43c71a1cc98fc76630ec5867ea306404bd53e89b09edc454ce52c8acaea0b7dfa7e9dad55f8a73fac516a5e5f70ca864d782d57059561195f37e6cd43", "Pr1": "5ce31b22fbf345ec04bdb42112cbf351254cd4fcd43f221e53f4beffbc05e402515f4234e3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 227, "Pk1": "29601c971595b864ecd7f1c135f08ea9cbb9dba4ecd9e0be74258f9d1d4f241d0b85e758184d7b96951926e13e329a047f7d8147c04f97c9d249222af3d58b0b", "Pr1": "540e31ed5d53e05ed4d1f0be2ec0e15de1d4bc02e1e10e3f2fccc1efdef4305c20c5e12212", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 228, "Pk1": "633ad935e6a4c0ff4da99ec1d9c7a02d01688c6085cbbcb318f4d2f946f5490f21e116147a119d5c0150b5c63ced28aac143c6321a9e06619eb9750a52c8a614", "Pr1": "3f1f205521bf2e1b1b0c50f33dcbdccde15db1b3b5d15c3e5b2f5bc553f432ef3540f3b23c", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 229, "Pk1": "5cab3f391e30f5567226db323fab44610220f594f6050c9ffcc7402f03b56879d6ec293a5e60ba3e7f635ec08d02b2810c0ca7ae89a6accf1a753d2a98273e15", "Pr1": "c24233d53d0ff054d14d3e2fe32032fbbdc50bebf5534ddc44541ff1bc301db33c0015f4b4", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 230, "Pk1": "c83d7753fd0458e4f16bda3d18d7c3da09c6742100c066e36063dffdc757fd22b58b543bab71897621566e9bf346566eae5a1753ac2462bf0e5748c0c5931f52", "Pr1": "0e3cc3ec0dfbef3f00ddce30b4ec0b4303402fd140d00504ff313ef1ec2d00d53c5223b1d3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 231, "Pk1": "66f1886f2805b15d26dfe4224681eaf86f4186ca8166a3104897593a71339b10591174602db45856271f353f730f1a83b559d2023f05a7ca0149418003cbeb54", "Pr1": "05f1c52304cce123b040445ceb0e3e411e314fdc2d5ccf20c2cb3c2dd54bcbf0d2dfb2d5e3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 232, "Pk1": "82387e61efccce24c274983dba7b1d2be9ef4a68df4ce8ae3a6f100d255969ad2feac41ac2f487b8c30d6c2cff4f0cee8611f9d650afdeef329351b37d6a4445", "Pr1": "0fd5e1ccd02f4d0eb302efbec4ebd0ffc5cb3d2cdcc0be43edf502ee15513b214425cc0d11", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 233, "Pk1": "70f44a40f4e750b2c0081cc2c4cbbbe65ac06c824e3696a54672e9e902100d6bb31f50136cf4f3b805ead14b609a287ce5f9bf0d84bbea94977ee151898d270b", "Pr1": "fd04efdbdc534c2454b0eceed200eedcb25fbf1e3ef443feb4d035b22bd321e53543044323", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 234, "Pk1": "9dd38d9ffbf202075f3a15cc125d4484396a7c6be7fcaad381ac7e0d49d0b6265dbc3d61b1c73c356a9c5202cd7187450a330343fc7d31cb68b6a4080d2d323a", "Pr1": "d0e425110f0dc0c351533c411ccfd1ccb25d1335fddf0f21fc5eb0df25bdfffe2fd2501e55", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 235, "Pk1": "1317a79f3895f2e751dcc9e7f82fd222c819cad8d69a4a1195b14b8d1b984a31eaf9e85a3999e0f4c95d83b78d0884088e3a7c57bc0c12c7284dff867733704c", "Pr1": "2120eb5be01fc11053d501011df2f550c15434cd1112f3300bf112b4ccb34f2fe55d402435", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 236, "Pk1": "563f4f485231613d2138b4e5b11274e74fca45c8fb59307990156a11057482f21936e9822a633625e355d874ef457408a9805712babdf65152cfcb185e02de63", "Pr1": "fcc5d55133e321eb23bf51cd5ce40d42321505d25bdc2b544b2f13ed2cd0e4b4b554d22d40", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 237, "Pk1": "53d634c2b327d6e775d3dab7c78f307b08acd5d43b54a27309b855f6e68e4cc01ffb80121885494360863c8190dacee49a33fa88978b928f1118a359c1e7784a", "Pr1": "15b3c452cc5403f410e3b45fcbb51c0232f420c2cc2c0c3314debbfffe551cd55214eed3f1", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 238, "Pk1": "8a91af87f7df05924cc8de6f199f457fddd1af148c3f1ff3e65eb05c0b638778f09987989864c6ea3eb49f35e1f5716bad612ed8c0100dae2212105e06a51c52", "Pr1": "31d21c4e2ce3ef4c5be01c12ceee110302f3c35d5c34445042403bbcdc24c411fc32f422bc", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 239, "Pk1": "071194cd1414afce5383d46b15c8ef883a66e9db44a764c0cce27ddc816142b6b54ead1c711cd394f09b35155d78744218dbec82433835a0009cbf9eaccc2500", "Pr1": "01bc2d01dfff43cfc1f3dc2154fdffec2c331fc5d23e04dff3ed414e323defe5c3fd3ccce5", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 240, "Pk1": "85f420d416cd5a2304128a54ebef1783b07f65255e49f1535bc389d2d6886cdf5fe9d8165c085d10af4a414b2bb029136aeae687369cfbd184e7f17dea4a454d", "Pr1": "fcbf3f21b0f22cd24113c3d44e0d4b10e52dbb5bbf14bbbb053e3b0eef3b5f0db3553d0452", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 241, "Pk1": "c8b8477ff0d68a14eba2fd9dfefdea2d1c57da34e606e85ca3b6b0ee7b43320ee3addcd4695ebb2b3d56466f55b3c750e5ef84c872d4439f2a52cabb4c87f72c", "Pr1": "3235401d021e21f1430233fffff0b43b5e54d01f00153fd41345b3d0c4bb1d2de24e1fec22", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 242, "Pk1": "3019dd20e54ccbae0b95c0e37f3584850f1045612da31a2f9407a07ca55f6b19a2755e8352e6c03b6bdffdabafdc574b0d5cded4433c40819de0399bce7bba28", "Pr1": "1f14df3ef20f3d010135523d1545e45c50cee4bc54eb1dd2beb5cdc3301b3fd3dcb1434c23", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 243, "Pk1": "646828e7380d922a502257dd4b1f7a7402cdad3de7756e8ac566e59204a3b9a778a44a572646e93672fbca8381f7a6a76b860ec27bd64b569e481fdf117e2642", "Pr1": "e1e2efb3f30be0d51fec05142f04d0fffe3530d3c51bd53c1d5f15ee1140d2fb2f2ffbf2ef", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 244, "Pk1": "0897f74b03a2faf42e558f0e850ca7c6fe3b165d3a111f529b71daa8d17b3aa43384a9e959e325eca106fc1071fc164197f4c1427e919f9285f777ca91ba5659", "Pr1": "3133143f3c0eb1cbb241fb4355e54f4bc0beeebcec35f13131333d5eec2ebbe3d0d4f3cffb", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 245, "Pk1": "ce6750816957729e4f1eabb4072b6715139fe0d3dc6ab124eb1de61759eee52182b8a9487bdea70b82d3b1156fe19c73cbe50aa8c7a531d9bfa129bdcb051565", "Pr1": "5d1ce2155cd2035502bddc3c4e1ce4f5c34cb05d5d1551cf44240bbc5b144444febfe1ddff", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 246, "Pk1": "f9e2e52e76f6d67d13cda6599ee01ca80c0bcf46670a87d05a6e0a6ddda2aa7b2023e50f0b0e5bfccb6245183dd9be0c4bdb7f37db51baf7adae5d043a2c3e17", "Pr1": "240e1b5eb204eed3f0c4405c12043321ef32d25c4cf1b0ebe1d154f2ec1dded140fe0423d4", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 247, "Pk1": "c4c3dd7de2248a54c13bf297a1e4020fa7517aa2c59a92253552f80cfcbba78c1e948f4d6a50408c96dc21dbbf90ad45bc0182708e0614ed031282de079a913b", "Pr1": "1bbbce2555c2efb0151d33fdbece401fe0cfce5c5ccb3fff3f10cdf0215c532bd15f5eeb0b", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 248, "Pk1": "31648615561b37ad85629e1019081d5dfe149823c80ad330dce8752fd03aa2de4821cd2fe23453eaad63f4a6a8dbed104b2b30efe186fb390960087d19e47e2c", "Pr1": "3ee3ee040b04b25155002e241be21045fd1e510cc3e31c10dd353dcbefdd40c5eef40db0cd", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 249, "Pk1": "77e6662bf343444b19cde23392c48990a1ab79726dd2f76eeeac8df2977f22f2d08a8ff926a2b55ceacf311dacd842abc0ba9bdc437c6173621939232dea6906", "Pr1": "ffd40f23d1c3421eb4cf4220c32b04d3efb050c0de04c2355f1ee53d3b4e4b02533c0dd42e", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 250, "Pk1": "4a5fb5a7fbda148f1da927d836cfe01008e7b8b95eaf3e59640aacd7c8f0480d18a8f285f9abbbee0f4cecc219ef1b9373b389cd957f141e423065d19717462e", "Pr1": "10dc1cdc5eff5cfcdcccdb52efe3f5fee0e5d35520ce13ecee12c51e40e4434c2d23232fef", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 251, "Pk1": "94bc372d1194e0ffa6088f5dd02948dba136f706439237f4099c4490000771148321e4876790a3c9388a43749009deb7400d5ea05ee3c2eb2a3ea9a4e03eed0b", "Pr1": "31314f3c413b45311d2f1fc425d13edfbcc354dcdde03f5541d102ccc2034b5b3febb1d2ef", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 252, "Pk1": "1c04f8fcb44d3911e4426012294620a6ce9eb0253d376e0884ea2836e049d2ee3d983ec86e0f289d635a0bad62588f577118d7c0ab053f2979ee8bd7c986a548", "Pr1": "5e3cf004ed512f212cb5eccbb5bc0ddffd3414b4201bd025f14b5b245fffe0d3e515e51ebc", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 253, "Pk1": "8c4877a6549332ef9692edc77cc1860fb1fe4075fef47bf8f03b122d5bf1254e84f4a21a752a922206410e3e793b9a42524eaf0282a87f80d7024e010f13c627", "Pr1": "dd21c44b15233f0f5c4f145044b3415f103ed5be4455bf1530d3b53b2f0df435335f0df1bb", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 254, "Pk1": "1446a7bece7dcb372dd86e9ff4e9917f3ea810bb8e2c23c5fc03f3d21ac8860a9d0e9851f279be31a42f61b071d60c214952806947fbc4a216df12609389b05d", "Pr1": "f5c522ebdccf52f15c0ddedf1d01c21002ccc4050ce4ce5cfdf12cdd035c015b4b1fff5d40", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 255, "Pk1": "5b5881eac1d641a1ec6b4510da94bf557857a6e96ad8f7fcf9d07149b57c0539a874db99be7528c28ee86eb5b1e15eda3a9058feaef32ed0cedecb62e700d91b", "Pr1": "1ec4ce20fe2cbbdee31e1e3131552edebf43232225f3fd2012b324544232ccfde23bcf14dc", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 256, "Pk1": "8148dd31d3068da8e559d314dac138ee89b89d11e3f9a31f7b27e4e622f23de8fcef64552788bb079f8bafe0bef4e2ff6e513b241a8d4672fbd7a6942497715c", "Pr1": "d0e0b54523dc0cd330e5ebbe335df12bb1c54d5ec2cc2f0ff2cdd002454c0f0f41d1f03bcf", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 257, "Pk1": "e5c79857af6ad4601a9f01abc3318f9c603e5704858fa91997634d2589138f739b722c5c2679ec4f205ab467cad98b3576a25a893c1f00a6b2d7b97ab8c8942f", "Pr1": "4b54f542e54cc2cd4d21c0e140ff55bdb2f5e1ce31254e0435bec45b5230d114ffd1e0f031", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 258, "Pk1": "12bc7bfc455cc0fc9a8ecea941d586d4cc46fe0bd06fdeb76d812cb153cf32c81bd09535d19fae127fbaa6664451427ce9dcf8a7fedad716a6eaa7887345c33d", "Pr1": "1e53fd540e4ff140225f40c0f24bb32c5455f1e1f2b00d04120cf51eb202ee43503edcfb14", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 259, "Pk1": "28340cbbd3a507d03f7edec58812727cf4ff2cfb383f10ffe88c661e692aeb9df3770588c945e39e5082f2f55e2450ec62e4eadd27e79053ff47f5aed7be1743", "Pr1": "c2f02bbf2ccf022f2bcfd014d4f2cc1fe122bd0fe4b53d20f23cc23c1ddc1310e2ef234ccd", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 260, "Pk1": "c0342a101a9a88e4f9e2ecb806d1af15194dcafe66859570ba9ee1bca7ab7ce9d452cfce42552b6361e802d2f3b2e4152ee7f8bf9e91707e15608e7e41c72452", "Pr1": "42202be133e24e501cdc1cf3d321e4d5cbd002f4eb321efbf3014dbdbcfd0cd3e5db00bbc5", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 261, "Pk1": "7c41bf3992f7af3fc09d86d7e732f9ac2a0eaedcdabba9f99b403c4d45b1891215e7694feda6f14c1ab3dff8513f6943e6d092125f1f0c6e16d0f92657100f07", "Pr1": "dc0ccd43cb0cf112dd44d10f05d22f2bf4b1cb0c530e03de1bb2c05445d3f1230d010cf2b5", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 262, "Pk1": "b155a0480443c18bd2b77c9dd2e78c04d6fda40dd82d873b9a86359f6f3ce512e2e599c7f704c1da7cfe187d75058add6d23a18b9e7ab7d67666be7b4de6eb36", "Pr1": "e5f1cfc3e2221d11cb3c20c0b43f2f5e23db13fffe3014d45e505bcd1c5ec1dd50db102223", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 263, "Pk1": "ac050b70c6f17f9865b5cf3ccff84e069a1e40537a7f95b243ce970ba768013806d96c278981b6ce923cc3186746ce5e76f56dd09bdae548ebf0c2633cd92316", "Pr1": "4dd1fdbbfe2c33f2e4ebcc33eb2322bbdcb04bfb10f3f43e2ed414451b3c25e0cfdf2b3b31", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 264, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "c87e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 265, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b61a64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 266, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67ea3c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 267, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e6494535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 268, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7085b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 269, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c753643f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 270, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b536c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 271, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6a0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 272, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c3533c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 273, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c06f5c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 274, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633ea2c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 275, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c6537f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 276, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c413e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 277, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3b05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 278, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3eebeec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 279, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e0526c88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 280, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05ee498179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 281, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec8f879d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 282, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec881aad34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 283, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec881799f4cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 284, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d3bcf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 285, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34c1aeac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 286, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf02bc136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 287, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eaf736d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 288, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac1e3d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 289, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac13615c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 290, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d523e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 291, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c059bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 292, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e371cb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 293, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3ba905bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 294, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb8ed509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 295, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bdc09f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 296, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd5f0f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 297, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509fb028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 298, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9898bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 299, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9027af188099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 300, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028b7988099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 301, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf181099489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 302, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf1889d9489166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 303, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188091d89166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 304, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf18809949f166b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 305, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf1880994897d6b34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 306, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489165f34e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 307, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166bd5e118f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 308, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34f918f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 309, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e1e8f012f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 310, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118e212f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 311, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f0e7f580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 312, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f0127580562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 313, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f5d6562bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 314, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f5807d2bf2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 315, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f58056d9f2b8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 316, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562b4ab8f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 317, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf248f08701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 318, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8778701ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 319, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08601ef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 320, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f087eeef4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 321, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ad4245769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 322, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef0745769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 323, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4233769dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 324, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245eb9dc460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 325, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef42457659c460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 326, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769da460", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" }, { "Id": 327, "Pk1": "49986cb4962be33fa910c08d866cf938f3cc157e1c665a679d0fd5038cf7bcb458cf58b850799492a82608995337bbb4f3b3841c8b3120bb8e88c9991989b625", "Pr1": "c1331bb3d2d2e4de455344403edf143d01eccb5cd1edfc5fe0e1c0cc1edcfd43fccfd23110", "Pk2": "b67e64c7535b3f6c0633c62c7f3e05eec88179d34cf0eac136d5c0e3bacb5bd509f9028bf188099489166b34e118f012f580562bf2b8f08701ef4245769dc4d6", "Ss": "3954a50e07180680389550be867732f8284da03ab6f63d8bf22b2e225ac47fb973ee987b1a9db0d35d48c3267be0dfec2e5b136acdb8d6f58105a5961627ce52", "status": "invalid_public_key2", "comment": "" } ] }golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/testdata/csidh_testvectors_small.dat000066400000000000000000000461071365325520100325140ustar00rootroot00000000000000{ "Vectors": [ { "Id": 0, "Pk1": "6dab00640f2188d02bba6c44ae620716a27d318ff7d7165d0eae9d07fbfa92c9104164591abc45fa4aab00446c6c67a985ff1407abdb55957a309b00c5cc4e17", "Pr1": "31224d4b0d4fcbb44cddbd03e5f2bfc4b20132103bcde143130b351edd253ee12bddb4bf5c", "Pk2": "2e7019f96d032f7fd7de226c4aef299f85af61bfeb77212f1b91833cd7925ddaabbbddc06e5455305bd269e375bd1742201f513a36e33bfda248861b324a5f00", "Ss": "cd7cccb0015057914d3805bd820100e82373b20acd39c925eb154d8668f5422163fdb1fec9e88f65b060782d5d0d92235c3e0e894fe8cfb9ccba72769d784b23", "status": "valid", "comment": "" }, { "Id": 1, "Pk1": "5f6170b8794b019cf55d8b484acbe175bdca3296a19dce1f3426a45ef858a69dc95fadf96c9350708df681193048b07a9235c69dacbd2c02f1574abd7c599a2c", "Pr1": "3d421d2dc031dd5e0443541f424fb3031b5d015e521155ec5fd14052c0cb24c4fc4040df31", "Pk2": "7d77ea0fdd457dd95e4846dd47df04f0704a7e204cb291d0922dd0e12370e281ec1dcc41fe58501dc0377ebcb1385bf3be96ccd67348bd4e7335f5188f588b3a", "Ss": "d222fe01db50e2aab122e5493297a6d5e4f572d540ed0ae32683b2acdf3f36e7462a0acc8f0f6fc365ef306560699cf184432237df534e0219bbf284c7de3f48", "status": "valid", "comment": "" }, { "Id": 2, "Pk1": "494682a2e1a9923ea03a011e4c0766150435bd6dd6286c23c42bb39b894883fd12806db2b536975e80aa92bff3046cfae835f29e2d62f1c505e32cd6909d5612", "Pr1": "503eb0b02f4c2f30cc20522c0335551b0cebddefe023013c03d4e21cdee0bdf3d52ccb24d3", "Pk2": "1f08928cc0f380f8ac3c8b7727fcb0e8f7621688dbdae5b9cc46ba74cafc6a750b542d6918542587b10c4cc67850b8c202133c1ce09de7107b6401f0b975834a", "Ss": "c9dee98952c240c515f222bfadb9273c82f29084ae1a0a22003d0dc3e6639f31c107c86035b990163276a129b930e74a1411f0f68e130141dda9ca607898dc25", "status": "valid", "comment": "" }, { "Id": 3, "Pk1": "b46a93d93911445c78731cf155b8c8c9f289a04d680d05bca57607da77ced4ed9c9cded6115eaf4b3d7bd83d8f021a603247bfdd378cf4f39d5a3e8aa1f3c21f", "Pr1": "d00fb24cc43e34e3d034ccc011dbd25330d51dd0bce2b34b11c51ee5b4b142dc1d0b2e3223", "Pk2": "37d852a3468e940a21f46c2e0ffe5b532d94d75b17d67549d91d42b3ab70271322d58d880074de934b533a32ed4a946d8f34c23f50ca438c7c725077c23f5048", "Ss": "c31cbdb68fd2c41a2c69a272b45c925426f058a62c6c8f41fe704650c8669e8455c2e43837017d1a77521990c3becd7b400e3329f8860b1b6a1443f0cb0b222d", "status": "valid", "comment": "" }, { "Id": 4, "Pk1": "40b65f6d3b2697077b5ecbead5349281aa8ec13a994e43c0031738c09f6f0a8e7eac36f65aaa0e16e84b6a23056cc15edb6b505da48d034153df6e471b253047", "Pr1": "f5e00bd245e0c203ccf25b2cbbbb2314c41db22dcbbdb010b1423b3cf5bffddfbe312f11e5", "Pk2": "e3ef78ffa88dccdd5ff193b5b1e2e735dfdd2960d7f149595d9a0eb5504b17662a20968fce42800dc85d86501a19f3f63fd516a8a86f30ab59b4bfdf3592eb18", "Ss": "c1478f0595ea340737c0dd60a3006910e01e44edd6e814604851271a88f195ae1bec8c0dc4cee9fd00d5342b4b48051878776c688a52302a995f48d23fdbd560", "status": "valid", "comment": "" }, { "Id": 5, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "544cdd933d23db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 6, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "1891dd933d23db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 7, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184c4e933d23db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 8, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cddae3d23db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 9, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd931e23db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 10, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933df8db69c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 11, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23b269c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 12, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23dba0c9561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 13, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23db699f561008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 14, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23db69c9461008195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 15, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23db69c9561808195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 16, "Pk1": "a25f8365986dcf5148cb6c3e9cf70830c299d9109a60d41ea0546a3c0ad2b1543a26928b45641c1e895669f5531941ce29e1263c8f7fc9168659064b459b4344", "Pr1": "bde4301e1ef2d1c3cee30303f1c40420bed4bb21d1d4f1111012b003b3551deedd4eb301d5", "Pk2": "4ead6c7e11a20a8d024f88132e308af3c39905e7951d30f2da0b317a7955da60fb099a6020c4c5f7cfda5f562893988ac5b685b99507c5484bb4878d6116bf3d", "Ss": "184cdd933d23db69c9561011195a6ce59d9167d48be05704d16a14a7418bda56b83b72ade75b8eeeb7a274bcdc5b42267604c58e2ca1292b2957465758d79a55", "status": "invalid_shared_secret", "comment": "" }, { "Id": 17, "Pk1": "6deb7ef111841952a6d5795a67295140c2c7ad707a6d681a43beeeaea94655dab9a17e451ed664252cface4ab52d4d3129f091a24d1440598282709b0802910d", "Pr1": "cfe5e5cb244b2cee05c01bf0522244ed50d3cfd4ee142de2ccbe5c1c4dc024e3cd250d41bf", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 18, "Pk1": "f6d276b93ee1b8df1ecafd10e2e6740a2aaee2ce83c829ee848e0d4a0e02ce41873f49f8ee5e97e3256b97df74201e2116454bfa039f4035bc2443901949115d", "Pr1": "f0e02ce05cd1cfcf2f5dc2bb54d4c2d2534520f5d30e0fc51545b5ded555241211df3454d4", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 19, "Pk1": "67d02ac51d0bd87105df92931a0259cb0050b23018b99dd626c27e07a6db67595e449f239ff36c90af7207bf9c6c807deaeafefbeb3149b1494f0d273bdca009", "Pr1": "5ebf1155d2cee131d3452f04bbdc4fed12df2012bbe5ec4e3be30cfdb32eef15e320502120", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 20, "Pk1": "4a6012d9b25b31ccf884020c19b7839adf5af27ae30140257ef23920dc8461788fffc316ecbd92360183f0e087c6b6ec1faf4afd7c4231088348ad150731a22d", "Pr1": "5b02d5332c55ebed5ebce124bfd02db24c2252d13d133bd5d343f4b11d1f30e4f114f020db", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 21, "Pk1": "130c94af0b0c4552dfa7a0e8a8e31151fd12052e5a7840c21606f05c253ed971c4d324b36d4e6cd98f93635b16489cc62ed293b1716c4869658b85cc02011441", "Pr1": "3552e0e421250022012fb4e4e1d14cb2c53bbc1bcd010d30bff0c4d42fb1b333bb143b4fe3", "Pk2": "", "Ss": "", "status": "invalid_public_key1", "comment": "" }, { "Id": 22, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "95523424cd589421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 23, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7663424cd589421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 24, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7521024cd589421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 25, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c75234e9cd589421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 26, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c752342495589421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 27, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cdcc9421b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 28, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd58b521b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 29, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd589493b224d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 30, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd5894219624d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 31, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd589421b2f3d742b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 32, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd589421b2249542b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" }, { "Id": 33, "Pk1": "bfbd184a2e193b5c4535bceecfd8443cc562ff95bf7e351e9c3f0ae35d0c163239310156bc5584072cf19024d1dea7c7a40bb4af366b46465c3bce02f999654c", "Pr1": "ec34443ef230d3b1cbdfdb5c24cded13e2f1c13fddee442ffbb22bb1334e545ee100220e54", "Pk2": "c7523424cd589421b224d7f5b7d39ecb6229edd92f12e88f97aed80b20dd9caeca3e31bddcf96674396753a56226a5cd53e4481af8d8ee3ac17d558088c6d534", "Ss": "69196c279c5a7cbcbbf443509e422d363f0c2e0811b4a741869ee143f5d48117a54deea7c152e9371d1d190fcde44a6c32df27c859e2ed27981aa37f24feb73d", "status": "invalid_public_key2", "comment": "" } ] }golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/csidh/utils_test.go000066400000000000000000000054361365325520100260100ustar00rootroot00000000000000package csidh import ( "fmt" "math/big" mrand "math/rand" ) // Commonly used variables var ( // Number of interations numIter = 10 // Modulus modulus, _ = new(big.Int).SetString(fp2S(p), 16) // Zero in fp zeroFp512 = fp{} // One in fp oneFp512 = fp{1, 0, 0, 0, 0, 0, 0, 0} ) // Converts dst to Montgomery if "toMont==true" or from Montgomery domain otherwise. func toMont(dst *big.Int, toMont bool) { var bigP, bigR big.Int intSetU64(&bigP, p[:]) bigR.SetUint64(1) bigR.Lsh(&bigR, 512) if !toMont { bigR.ModInverse(&bigR, &bigP) } dst.Mul(dst, &bigR) dst.Mod(dst, &bigP) } func fp2S(v fp) string { var str string for i := 0; i < 8; i++ { str = fmt.Sprintf("%016x", v[i]) + str } return str } // zeroize fp func zero(v *fp) { for i := range *v { v[i] = 0 } } // returns random value in a range (0,p) func randomFp() fp { var u fp for i := 0; i < 8; i++ { u[i] = mrand.Uint64() } return u } // xy: >0 // x==y: 0 func cmp512(x, y *fp) int { if len(*x) == len(*y) { for i := len(*x) - 1; i >= 0; i-- { if x[i] < y[i] { return -1 } else if x[i] > y[i] { return 1 } } return 0 } return len(*x) - len(*y) } // return x==y for fp func ceqFp(l, r *fp) bool { for idx := range l { if l[idx] != r[idx] { return false } } return true } // return x==y for point func ceqpoint(l, r *point) bool { return ceqFp(&l.x, &r.x) && ceqFp(&l.z, &r.z) } // return x==y func ceq512(x, y *fp) bool { return cmp512(x, y) == 0 } // Converts src to big.Int. Function assumes that src is a slice of uint64 // values encoded in little-endian byte order. func intSetU64(dst *big.Int, src []uint64) *big.Int { var tmp big.Int dst.SetUint64(0) for i := range src { tmp.SetUint64(src[i]) tmp.Lsh(&tmp, uint(i*64)) dst.Add(dst, &tmp) } return dst } // Converts src to an array of uint64 values encoded in little-endian // byte order. func intGetU64(src *big.Int) []uint64 { var tmp, mod big.Int dst := make([]uint64, (src.BitLen()/64)+1) u64 := uint64(0) u64-- mod.SetUint64(u64) for i := 0; i < (src.BitLen()/64)+1; i++ { tmp.Set(src) tmp.Rsh(&tmp, uint(i)*64) tmp.And(&tmp, &mod) dst[i] = tmp.Uint64() } return dst } // Returns projective coordinate X of normalized EC 'point' (point.x / point.z). func toNormX(point *point) big.Int { var bigP, bigDnt, bigDor big.Int intSetU64(&bigP, p[:]) intSetU64(&bigDnt, point.x[:]) intSetU64(&bigDor, point.z[:]) bigDor.ModInverse(&bigDor, &bigP) bigDnt.Mul(&bigDnt, &bigDor) bigDnt.Mod(&bigDnt, &bigP) return bigDnt } // Converts string to fp element in Montgomery domain of cSIDH-512 func toFp(num string) fp { var tmp big.Int var ok bool var ret fp _, ok = tmp.SetString(num, 0) if !ok { panic("Can't parse a number") } toMont(&tmp, true) copy(ret[:], intGetU64(&tmp)) return ret } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/000077500000000000000000000000001365325520100231075ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/api.go000066400000000000000000000156231365325520100242160ustar00rootroot00000000000000package sidh import ( "errors" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "io" ) // I keep it bool in order to be able to apply logical NOT type KeyVariant uint // Id's correspond to bitlength of the prime field characteristic // Currently FP_751 is the only one supported by this implementation const ( FP_503 uint8 = iota FP_751 FP_964 maxPrimeFieldId ) const ( // First 2 bits identify SIDH variant third bit indicates // wether key is a SIKE variant (set) or SIDH (not set) // 001 - SIDH: corresponds to 2-torsion group KeyVariant_SIDH_A KeyVariant = 1 << 0 // 010 - SIDH: corresponds to 3-torsion group KeyVariant_SIDH_B = 1 << 1 // 110 - SIKE KeyVariant_SIKE = 1<<2 | KeyVariant_SIDH_B ) // Base type for public and private key. Used mainly to carry domain // parameters. type key struct { // Domain parameters of the algorithm to be used with a key params *SidhParams // Flag indicates wether corresponds to 2-, 3-torsion group or SIKE keyVariant KeyVariant } // Defines operations on public key type PublicKey struct { key affine_xP Fp2Element affine_xQ Fp2Element affine_xQmP Fp2Element } // Defines operations on private key type PrivateKey struct { key // Secret key Scalar []byte // Used only by KEM S []byte } // Accessor to the domain parameters func (key *key) Params() *SidhParams { return key.params } // Accessor to key variant func (key *key) Variant() KeyVariant { return key.keyVariant } // NewPrivateKey initializes private key. // Usage of this function guarantees that the object is correctly initialized. func NewPrivateKey(id uint8, v KeyVariant) *PrivateKey { prv := &PrivateKey{key: key{params: Params(id), keyVariant: v}} if (v & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { prv.Scalar = make([]byte, prv.params.A.SecretByteLen) } else { prv.Scalar = make([]byte, prv.params.B.SecretByteLen) } if v == KeyVariant_SIKE { prv.S = make([]byte, prv.params.MsgLen) } return prv } // NewPublicKey initializes public key. // Usage of this function guarantees that the object is correctly initialized. func NewPublicKey(id uint8, v KeyVariant) *PublicKey { return &PublicKey{key: key{params: Params(id), keyVariant: v}} } // Import clears content of the public key currently stored in the structure // and imports key stored in the byte string. Returns error in case byte string // size is wrong. Doesn't perform any validation. func (pub *PublicKey) Import(input []byte) error { if len(input) != pub.Size() { return errors.New("sidh: input to short") } op := CurveOperations{Params: pub.params} ssSz := pub.params.SharedSecretSize op.Fp2FromBytes(&pub.affine_xP, input[0:ssSz]) op.Fp2FromBytes(&pub.affine_xQ, input[ssSz:2*ssSz]) op.Fp2FromBytes(&pub.affine_xQmP, input[2*ssSz:3*ssSz]) return nil } // Exports currently stored key. In case structure hasn't been filled with key data // returned byte string is filled with zeros. func (pub *PublicKey) Export() []byte { output := make([]byte, pub.params.PublicKeySize) op := CurveOperations{Params: pub.params} ssSz := pub.params.SharedSecretSize op.Fp2ToBytes(output[0:ssSz], &pub.affine_xP) op.Fp2ToBytes(output[ssSz:2*ssSz], &pub.affine_xQ) op.Fp2ToBytes(output[2*ssSz:3*ssSz], &pub.affine_xQmP) return output } // Size returns size of the public key in bytes func (pub *PublicKey) Size() int { return pub.params.PublicKeySize } // Exports currently stored key. In case structure hasn't been filled with key data // returned byte string is filled with zeros. func (prv *PrivateKey) Export() []byte { ret := make([]byte, len(prv.Scalar)+len(prv.S)) copy(ret, prv.S) copy(ret[len(prv.S):], prv.Scalar) return ret } // Size returns size of the private key in bytes func (prv *PrivateKey) Size() int { tmp := len(prv.Scalar) if prv.Variant() == KeyVariant_SIKE { tmp += int(prv.params.MsgLen) } return tmp } // Import clears content of the private key currently stored in the structure // and imports key from octet string. In case of SIKE, the random value 'S' // must be prepended to the value of actual private key (see SIKE spec for details). // Function doesn't import public key value to PrivateKey object. func (prv *PrivateKey) Import(input []byte) error { if len(input) != prv.Size() { return errors.New("sidh: input to short") } copy(prv.S, input[:len(prv.S)]) copy(prv.Scalar, input[len(prv.S):]) return nil } // Generates random private key for SIDH or SIKE. Generated value is // formed as little-endian integer from key-space <2^(e2-1)..2^e2 - 1> // for KeyVariant_A or <2^(s-1)..2^s - 1>, where s = ceil(log_2(3^e3)), // for KeyVariant_B. // // Returns error in case user provided RNG fails. func (prv *PrivateKey) Generate(rand io.Reader) error { var err error var dp *DomainParams if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { dp = &prv.params.A } else { dp = &prv.params.B } //err = prv.generatePrivateKey(rand) if prv.keyVariant == KeyVariant_SIKE && err == nil { _, err = io.ReadFull(rand, prv.S) } // Private key generation takes advantage of the fact that keyspace for secret // key is (0, 2^x - 1), for some possitivite value of 'x' (see SIKE, 1.3.8). // It means that all bytes in the secret key, but the last one, can take any // value between <0x00,0xFF>. Similarily for the last byte, but generation // needs to chop off some bits, to make sure generated value is an element of // a key-space. _, err = io.ReadFull(rand, prv.Scalar) if err != nil { return err } prv.Scalar[len(prv.Scalar)-1] &= (1 << (dp.SecretBitLen % 8)) - 1 // Make sure scalar is SecretBitLen long. SIKE spec says that key // space starts from 0, but I'm not confortable with having low // value scalars used for private keys. It is still secrure as per // table 5.1 in [SIKE]. prv.Scalar[len(prv.Scalar)-1] |= 1 << ((dp.SecretBitLen % 8) - 1) return err } // Generates public key. // // Constant time. func (prv *PrivateKey) GeneratePublicKey() *PublicKey { if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { return publicKeyGenA(prv) } return publicKeyGenB(prv) } // Computes a shared secret which is a j-invariant. Function requires that pub has // different KeyVariant than prv. Length of returned output is 2*ceil(log_2 P)/8), // where P is a prime defining finite field. // // It's important to notice that each keypair must not be used more than once // to calculate shared secret. // // Function may return error. This happens only in case provided input is invalid. // Constant time for properly initialized private and public key. func DeriveSecret(prv *PrivateKey, pub *PublicKey) ([]byte, error) { if (pub == nil) || (prv == nil) { return nil, errors.New("sidh: invalid arguments") } if (pub.keyVariant == prv.keyVariant) || (pub.params.Id != prv.params.Id) { return nil, errors.New("sidh: public and private are incompatbile") } if (prv.keyVariant & KeyVariant_SIDH_A) == KeyVariant_SIDH_A { return deriveSecretA(prv, pub), nil } else { return deriveSecretB(prv, pub), nil } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/internal/000077500000000000000000000000001365325520100247235ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/internal/isogeny/000077500000000000000000000000001365325520100264005ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/internal/isogeny/curve_ops.go000066400000000000000000000360611365325520100307420ustar00rootroot00000000000000package internal type CurveOperations struct { Params *SidhParams } // Computes j-invariant for a curve y2=x3+A/Cx+x with A,C in F_(p^2). Result // is returned in jBytes buffer, encoded in little-endian format. Caller // provided jBytes buffer has to be big enough to j-invariant value. In case // of SIDH, buffer size must be at least size of shared secret. // Implementation corresponds to Algorithm 9 from SIKE. func (c *CurveOperations) Jinvariant(cparams *ProjectiveCurveParameters, jBytes []byte) { var j, t0, t1 Fp2Element op := c.Params.Op op.Square(&j, &cparams.A) // j = A^2 op.Square(&t1, &cparams.C) // t1 = C^2 op.Add(&t0, &t1, &t1) // t0 = t1 + t1 op.Sub(&t0, &j, &t0) // t0 = j - t0 op.Sub(&t0, &t0, &t1) // t0 = t0 - t1 op.Sub(&j, &t0, &t1) // t0 = t0 - t1 op.Square(&t1, &t1) // t1 = t1^2 op.Mul(&j, &j, &t1) // j = j * t1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Square(&t1, &t0) // t1 = t0^2 op.Mul(&t0, &t0, &t1) // t0 = t0 * t1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Inv(&j, &j) // j = 1/j op.Mul(&j, &t0, &j) // j = t0 * j c.Fp2ToBytes(jBytes, &j) } // Given affine points x(P), x(Q) and x(Q-P) in a extension field F_{p^2}, function // recorvers projective coordinate A of a curve. This is Algorithm 10 from SIKE. func (c *CurveOperations) RecoverCoordinateA(curve *ProjectiveCurveParameters, xp, xq, xr *Fp2Element) { var t0, t1 Fp2Element op := c.Params.Op op.Add(&t1, xp, xq) // t1 = Xp + Xq op.Mul(&t0, xp, xq) // t0 = Xp * Xq op.Mul(&curve.A, xr, &t1) // A = X(q-p) * t1 op.Add(&curve.A, &curve.A, &t0) // A = A + t0 op.Mul(&t0, &t0, xr) // t0 = t0 * X(q-p) op.Sub(&curve.A, &curve.A, &c.Params.OneFp2) // A = A - 1 op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Add(&t1, &t1, xr) // t1 = t1 + X(q-p) op.Add(&t0, &t0, &t0) // t0 = t0 + t0 op.Square(&curve.A, &curve.A) // A = A^2 op.Inv(&t0, &t0) // t0 = 1/t0 op.Mul(&curve.A, &curve.A, &t0) // A = A * t0 op.Sub(&curve.A, &curve.A, &t1) // A = A - t1 } // Computes equivalence (A:C) ~ (A+2C : A-2C) func (c *CurveOperations) CalcCurveParamsEquiv3(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { var coef CurveCoefficientsEquiv var c2 Fp2Element var op = c.Params.Op op.Add(&c2, &cparams.C, &cparams.C) // A24p = A+2*C op.Add(&coef.A, &cparams.A, &c2) // A24m = A-2*C op.Sub(&coef.C, &cparams.A, &c2) return coef } // Computes equivalence (A:C) ~ (A+2C : 4C) func (c *CurveOperations) CalcCurveParamsEquiv4(cparams *ProjectiveCurveParameters) CurveCoefficientsEquiv { var coefEq CurveCoefficientsEquiv var op = c.Params.Op op.Add(&coefEq.C, &cparams.C, &cparams.C) // A24p = A+2C op.Add(&coefEq.A, &cparams.A, &coefEq.C) // C24 = 4*C op.Add(&coefEq.C, &coefEq.C, &coefEq.C) return coefEq } // Helper function for ScalarMul3Pt(). Returns A+2C / 4. func (c *CurveOperations) CalcAplus2Over4(cparams *ProjectiveCurveParameters) (ret Fp2Element) { var tmp Fp2Element var op = c.Params.Op // 2C op.Add(&tmp, &cparams.C, &cparams.C) // A+2C op.Add(&ret, &cparams.A, &tmp) // 1/4C op.Add(&tmp, &tmp, &tmp) op.Inv(&tmp, &tmp) // A+2C/4C op.Mul(&ret, &ret, &tmp) return } // Recovers (A:C) curve parameters from projectively equivalent (A+2C:A-2C). func (c *CurveOperations) RecoverCurveCoefficients3(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { var op = c.Params.Op op.Add(&cparams.A, &coefEq.A, &coefEq.C) // cparams.A = 2*(A+2C+A-2C) = 4A op.Add(&cparams.A, &cparams.A, &cparams.A) // cparams.C = (A+2C-A+2C) = 4C op.Sub(&cparams.C, &coefEq.A, &coefEq.C) return } // Recovers (A:C) curve parameters from projectively equivalent (A+2C:4C). func (c *CurveOperations) RecoverCurveCoefficients4(cparams *ProjectiveCurveParameters, coefEq *CurveCoefficientsEquiv) { var op = c.Params.Op // cparams.C = (4C)*1/2=2C op.Mul(&cparams.C, &coefEq.C, &c.Params.HalfFp2) // cparams.A = A+2C - 2C = A op.Sub(&cparams.A, &coefEq.A, &cparams.C) // cparams.C = 2C * 1/2 = C op.Mul(&cparams.C, &cparams.C, &c.Params.HalfFp2) return } // Combined coordinate doubling and differential addition. Takes projective points // P,Q,Q-P and (A+2C)/4C curve E coefficient. Returns 2*P and P+Q calculated on E. // Function is used only by RightToLeftLadder. Corresponds to Algorithm 5 of SIKE func (c *CurveOperations) xDblAdd(P, Q, QmP *ProjectivePoint, a24 *Fp2Element) (dblP, PaQ ProjectivePoint) { var t0, t1, t2 Fp2Element var op = c.Params.Op xQmP, zQmP := &QmP.X, &QmP.Z xPaQ, zPaQ := &PaQ.X, &PaQ.Z x2P, z2P := &dblP.X, &dblP.Z xP, zP := &P.X, &P.Z xQ, zQ := &Q.X, &Q.Z op.Add(&t0, xP, zP) // t0 = Xp+Zp op.Sub(&t1, xP, zP) // t1 = Xp-Zp op.Square(x2P, &t0) // 2P.X = t0^2 op.Sub(&t2, xQ, zQ) // t2 = Xq-Zq op.Add(xPaQ, xQ, zQ) // Xp+q = Xq+Zq op.Mul(&t0, &t0, &t2) // t0 = t0 * t2 op.Mul(z2P, &t1, &t1) // 2P.Z = t1 * t1 op.Mul(&t1, &t1, xPaQ) // t1 = t1 * Xp+q op.Sub(&t2, x2P, z2P) // t2 = 2P.X - 2P.Z op.Mul(x2P, x2P, z2P) // 2P.X = 2P.X * 2P.Z op.Mul(xPaQ, a24, &t2) // Xp+q = A24 * t2 op.Sub(zPaQ, &t0, &t1) // Zp+q = t0 - t1 op.Add(z2P, xPaQ, z2P) // 2P.Z = Xp+q + 2P.Z op.Add(xPaQ, &t0, &t1) // Xp+q = t0 + t1 op.Mul(z2P, z2P, &t2) // 2P.Z = 2P.Z * t2 op.Square(zPaQ, zPaQ) // Zp+q = Zp+q ^ 2 op.Square(xPaQ, xPaQ) // Xp+q = Xp+q ^ 2 op.Mul(zPaQ, xQmP, zPaQ) // Zp+q = Xq-p * Zp+q op.Mul(xPaQ, zQmP, xPaQ) // Xp+q = Zq-p * Xp+q return } // Given the curve parameters, xP = x(P), computes xP = x([2^k]P) // Safe to overlap xP, x2P. func (c *CurveOperations) Pow2k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { var t0, t1 Fp2Element var op = c.Params.Op x, z := &xP.X, &xP.Z for i := uint32(0); i < k; i++ { op.Sub(&t0, x, z) // t0 = Xp - Zp op.Add(&t1, x, z) // t1 = Xp + Zp op.Square(&t0, &t0) // t0 = t0 ^ 2 op.Square(&t1, &t1) // t1 = t1 ^ 2 op.Mul(z, ¶ms.C, &t0) // Z2p = C24 * t0 op.Mul(x, z, &t1) // X2p = Z2p * t1 op.Sub(&t1, &t1, &t0) // t1 = t1 - t0 op.Mul(&t0, ¶ms.A, &t1) // t0 = A24+ * t1 op.Add(z, z, &t0) // Z2p = Z2p + t0 op.Mul(z, z, &t1) // Zp = Z2p * t1 } } // Given the curve parameters, xP = x(P), and k >= 0, compute xP = x([3^k]P). // // Safe to overlap xP, xR. func (c *CurveOperations) Pow3k(xP *ProjectivePoint, params *CurveCoefficientsEquiv, k uint32) { var t0, t1, t2, t3, t4, t5, t6 Fp2Element var op = c.Params.Op x, z := &xP.X, &xP.Z for i := uint32(0); i < k; i++ { op.Sub(&t0, x, z) // t0 = Xp - Zp op.Square(&t2, &t0) // t2 = t0^2 op.Add(&t1, x, z) // t1 = Xp + Zp op.Square(&t3, &t1) // t3 = t1^2 op.Add(&t4, &t1, &t0) // t4 = t1 + t0 op.Sub(&t0, &t1, &t0) // t0 = t1 - t0 op.Square(&t1, &t4) // t1 = t4^2 op.Sub(&t1, &t1, &t3) // t1 = t1 - t3 op.Sub(&t1, &t1, &t2) // t1 = t1 - t2 op.Mul(&t5, &t3, ¶ms.A) // t5 = t3 * A24+ op.Mul(&t3, &t3, &t5) // t3 = t5 * t3 op.Mul(&t6, &t2, ¶ms.C) // t6 = t2 * A24- op.Mul(&t2, &t2, &t6) // t2 = t2 * t6 op.Sub(&t3, &t2, &t3) // t3 = t2 - t3 op.Sub(&t2, &t5, &t6) // t2 = t5 - t6 op.Mul(&t1, &t2, &t1) // t1 = t2 * t1 op.Add(&t2, &t3, &t1) // t2 = t3 + t1 op.Square(&t2, &t2) // t2 = t2^2 op.Mul(x, &t2, &t4) // X3p = t2 * t4 op.Sub(&t1, &t3, &t1) // t1 = t3 - t1 op.Square(&t1, &t1) // t1 = t1^2 op.Mul(z, &t1, &t0) // Z3p = t1 * t0 } } // Set (y1, y2, y3) = (1/x1, 1/x2, 1/x3). // // All xi, yi must be distinct. func (c *CurveOperations) Fp2Batch3Inv(x1, x2, x3, y1, y2, y3 *Fp2Element) { var x1x2, t Fp2Element var op = c.Params.Op op.Mul(&x1x2, x1, x2) // x1*x2 op.Mul(&t, &x1x2, x3) // 1/(x1*x2*x3) op.Inv(&t, &t) op.Mul(y1, &t, x2) // 1/x1 op.Mul(y1, y1, x3) op.Mul(y2, &t, x1) // 1/x2 op.Mul(y2, y2, x3) op.Mul(y3, &t, &x1x2) // 1/x3 } // ScalarMul3Pt is a right-to-left point multiplication that given the // x-coordinate of P, Q and P-Q calculates the x-coordinate of R=Q+[scalar]P. // nbits must be smaller or equal to len(scalar). func (c *CurveOperations) ScalarMul3Pt(cparams *ProjectiveCurveParameters, P, Q, PmQ *ProjectivePoint, nbits uint, scalar []uint8) ProjectivePoint { var R0, R2, R1 ProjectivePoint var op = c.Params.Op aPlus2Over4 := c.CalcAplus2Over4(cparams) R1 = *P R2 = *PmQ R0 = *Q // Iterate over the bits of the scalar, bottom to top prevBit := uint8(0) for i := uint(0); i < nbits; i++ { bit := (scalar[i>>3] >> (i & 7) & 1) swap := prevBit ^ bit prevBit = bit op.CondSwap(&R1.X, &R1.Z, &R2.X, &R2.Z, swap) R0, R2 = c.xDblAdd(&R0, &R2, &R1, &aPlus2Over4) } op.CondSwap(&R1.X, &R1.Z, &R2.X, &R2.Z, prevBit) return R1 } // Convert the input to wire format. // // The output byte slice must be at least 2*bytelen(p) bytes long. func (c *CurveOperations) Fp2ToBytes(output []byte, fp2 *Fp2Element) { if len(output) < 2*c.Params.Bytelen { panic("output byte slice too short") } var a Fp2Element c.Params.Op.FromMontgomery(fp2, &a) // convert to bytes in little endian form for i := 0; i < c.Params.Bytelen; i++ { // set i = j*8 + k fp2 := i / 8 k := uint64(i % 8) output[i] = byte(a.A[fp2] >> (8 * k)) output[i+c.Params.Bytelen] = byte(a.B[fp2] >> (8 * k)) } } // Read 2*bytelen(p) bytes into the given ExtensionFieldElement. // // It is an error to call this function if the input byte slice is less than 2*bytelen(p) bytes long. func (c *CurveOperations) Fp2FromBytes(fp2 *Fp2Element, input []byte) { if len(input) < 2*c.Params.Bytelen { panic("input byte slice too short") } for i := 0; i < c.Params.Bytelen; i++ { j := i / 8 k := uint64(i % 8) fp2.A[j] |= uint64(input[i]) << (8 * k) fp2.B[j] |= uint64(input[i+c.Params.Bytelen]) << (8 * k) } c.Params.Op.ToMontgomery(fp2) } /* ------------------------------------------------------------------------- Mechnisms used for isogeny calculations -------------------------------------------------------------------------*/ // Constructs isogeny3 objects func Newisogeny3(op FieldOps) Isogeny { return &isogeny3{Field: op} } // Constructs isogeny4 objects func Newisogeny4(op FieldOps) Isogeny { return &isogeny4{isogeny3: isogeny3{Field: op}} } // Given a three-torsion point p = x(PB) on the curve E_(A:C), construct the // three-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). // // Input: (XP_3: ZP_3), where P_3 has exact order 3 on E_A/C // Output: * Curve coordinates (A' + 2C', A' - 2C') corresponding to E_A'/C' = A_E/C/ // * Isogeny phi with constants in F_p^2 func (phi *isogeny3) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { var t0, t1, t2, t3, t4 Fp2Element var coefEq CurveCoefficientsEquiv var K1, K2 = &phi.K1, &phi.K2 op := phi.Field op.Sub(K1, &p.X, &p.Z) // K1 = XP3 - ZP3 op.Square(&t0, K1) // t0 = K1^2 op.Add(K2, &p.X, &p.Z) // K2 = XP3 + ZP3 op.Square(&t1, K2) // t1 = K2^2 op.Add(&t2, &t0, &t1) // t2 = t0 + t1 op.Add(&t3, K1, K2) // t3 = K1 + K2 op.Square(&t3, &t3) // t3 = t3^2 op.Sub(&t3, &t3, &t2) // t3 = t3 - t2 op.Add(&t2, &t1, &t3) // t2 = t1 + t3 op.Add(&t3, &t3, &t0) // t3 = t3 + t0 op.Add(&t4, &t3, &t0) // t4 = t3 + t0 op.Add(&t4, &t4, &t4) // t4 = t4 + t4 op.Add(&t4, &t1, &t4) // t4 = t1 + t4 op.Mul(&coefEq.C, &t2, &t4) // A24m = t2 * t4 op.Add(&t4, &t1, &t2) // t4 = t1 + t2 op.Add(&t4, &t4, &t4) // t4 = t4 + t4 op.Add(&t4, &t0, &t4) // t4 = t0 + t4 op.Mul(&t4, &t3, &t4) // t4 = t3 * t4 op.Sub(&t0, &t4, &coefEq.C) // t0 = t4 - A24m op.Add(&coefEq.A, &coefEq.C, &t0) // A24p = A24m + t0 return coefEq } // Given a 3-isogeny phi and a point pB = x(PB), compute x(QB), the x-coordinate // of the image QB = phi(PB) of PB under phi : E_(A:C) -> E_(A':C'). // // The output xQ = x(Q) is then a point on the curve E_(A':C'); the curve // parameters are returned by the GenerateCurve function used to construct phi. func (phi *isogeny3) EvaluatePoint(p *ProjectivePoint) ProjectivePoint { var t0, t1, t2 Fp2Element var q ProjectivePoint var K1, K2 = &phi.K1, &phi.K2 var px, pz = &p.X, &p.Z op := phi.Field op.Add(&t0, px, pz) // t0 = XQ + ZQ op.Sub(&t1, px, pz) // t1 = XQ - ZQ op.Mul(&t0, K1, &t0) // t2 = K1 * t0 op.Mul(&t1, K2, &t1) // t1 = K2 * t1 op.Add(&t2, &t0, &t1) // t2 = t0 + t1 op.Sub(&t0, &t1, &t0) // t0 = t1 - t0 op.Square(&t2, &t2) // t2 = t2 ^ 2 op.Square(&t0, &t0) // t0 = t0 ^ 2 op.Mul(&q.X, px, &t2) // XQ'= XQ * t2 op.Mul(&q.Z, pz, &t0) // ZQ'= ZQ * t0 return q } // Given a four-torsion point p = x(PB) on the curve E_(A:C), construct the // four-isogeny phi : E_(A:C) -> E_(A:C)/ = E_(A':C'). // // Input: (XP_4: ZP_4), where P_4 has exact order 4 on E_A/C // Output: * Curve coordinates (A' + 2C', 4C') corresponding to E_A'/C' = A_E/C/ // * Isogeny phi with constants in F_p^2 func (phi *isogeny4) GenerateCurve(p *ProjectivePoint) CurveCoefficientsEquiv { var coefEq CurveCoefficientsEquiv var xp4, zp4 = &p.X, &p.Z var K1, K2, K3 = &phi.K1, &phi.K2, &phi.K3 op := phi.Field op.Sub(K2, xp4, zp4) op.Add(K3, xp4, zp4) op.Square(K1, zp4) op.Add(K1, K1, K1) op.Square(&coefEq.C, K1) op.Add(K1, K1, K1) op.Square(&coefEq.A, xp4) op.Add(&coefEq.A, &coefEq.A, &coefEq.A) op.Square(&coefEq.A, &coefEq.A) return coefEq } // Given a 4-isogeny phi and a point xP = x(P), compute x(Q), the x-coordinate // of the image Q = phi(P) of P under phi : E_(A:C) -> E_(A':C'). // // Input: Isogeny returned by GenerateCurve and point q=(Qx,Qz) from E0_A/C // Output: Corresponding point q from E1_A'/C', where E1 is 4-isogenous to E0 func (phi *isogeny4) EvaluatePoint(p *ProjectivePoint) ProjectivePoint { var t0, t1 Fp2Element var q = *p var xq, zq = &q.X, &q.Z var K1, K2, K3 = &phi.K1, &phi.K2, &phi.K3 op := phi.Field op.Add(&t0, xq, zq) op.Sub(&t1, xq, zq) op.Mul(xq, &t0, K2) op.Mul(zq, &t1, K3) op.Mul(&t0, &t0, &t1) op.Mul(&t0, &t0, K1) op.Add(&t1, xq, zq) op.Sub(zq, xq, zq) op.Square(&t1, &t1) op.Square(zq, zq) op.Add(xq, &t0, &t1) op.Sub(&t0, zq, &t0) op.Mul(xq, xq, &t1) op.Mul(zq, zq, &t0) return q } /* ------------------------------------------------------------------------- Utils -------------------------------------------------------------------------*/ func (point *ProjectivePoint) ToAffine(c *CurveOperations) *Fp2Element { var affine_x Fp2Element c.Params.Op.Inv(&affine_x, &point.Z) c.Params.Op.Mul(&affine_x, &affine_x, &point.X) return &affine_x } // Cleans data in fp func (fp *Fp2Element) Zeroize() { // Zeroizing in 2 seperated loops tells compiler to // use fast runtime.memclr() for i := range fp.A { fp.A[i] = 0 } for i := range fp.B { fp.B[i] = 0 } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/internal/isogeny/types.go000066400000000000000000000100501365325520100300670ustar00rootroot00000000000000package internal const ( FP_MAX_WORDS = 12 // Currently p751.NumWords ) // Representation of an element of the base field F_p. // // No particular meaning is assigned to the representation -- it could represent // an element in Montgomery form, or not. Tracking the meaning of the field // element is left to higher types. type FpElement [FP_MAX_WORDS]uint64 // Represents an intermediate product of two elements of the base field F_p. type FpElementX2 [2 * FP_MAX_WORDS]uint64 // Represents an element of the extended field Fp^2 = Fp(x+i) type Fp2Element struct { A FpElement B FpElement } type DomainParams struct { // P, Q and R=P-Q base points Affine_P, Affine_Q, Affine_R Fp2Element // Size of a compuatation strategy for x-torsion group IsogenyStrategy []uint32 // Max size of secret key for x-torsion group SecretBitLen uint // Max size of secret key for x-torsion group SecretByteLen uint } type SidhParams struct { Id uint8 // Bytelen of P Bytelen int // The public key size, in bytes. PublicKeySize int // The shared secret size, in bytes. SharedSecretSize uint // 2- and 3-torsion group parameter definitions A, B DomainParams // Sample rate to obtain a value in [0,3^238] SampleRate uint // Precomputed identity element in the Fp2 in Montgomery domain OneFp2 Fp2Element // Precomputed 1/2 in the Fp2 in Montgomery domain HalfFp2 Fp2Element // Length of SIKE secret message. Must be one of {24,32,40}, // depending on size of prime field used (see [SIKE], 1.4 and 5.1) MsgLen uint // Length of SIKE ephemeral KEM key (see [SIKE], 1.4 and 5.1) KemSize uint // Access to field arithmetic Op FieldOps } // Interface for working with isogenies. type Isogeny interface { // Given a torsion point on a curve computes isogenous curve. // Returns curve coefficients (A:C), so that E_(A/C) = E_(A/C)/

, // where P is a provided projective point. Sets also isogeny constants // that are needed for isogeny evaluation. GenerateCurve(*ProjectivePoint) CurveCoefficientsEquiv // Evaluates isogeny at caller provided point. Requires isogeny curve constants // to be earlier computed by GenerateCurve. EvaluatePoint(*ProjectivePoint) ProjectivePoint } // Stores curve projective parameters equivalent to A/C. Meaning of the // values depends on the context. When working with isogenies over // subgroup that are powers of: // * three then (A:C) ~ (A+2C:A-2C) // * four then (A:C) ~ (A+2C: 4C) // See Appendix A of SIKE for more details type CurveCoefficientsEquiv struct { A Fp2Element C Fp2Element } // A point on the projective line P^1(F_{p^2}). // // This represents a point on the Kummer line of a Montgomery curve. The // curve is specified by a ProjectiveCurveParameters struct. type ProjectivePoint struct { X Fp2Element Z Fp2Element } // A point on the projective line P^1(F_{p^2}). // // This is used to work projectively with the curve coefficients. type ProjectiveCurveParameters struct { A Fp2Element C Fp2Element } // Stores Isogeny 3 curve constants type isogeny3 struct { Field FieldOps K1 Fp2Element K2 Fp2Element } // Stores Isogeny 4 curve constants type isogeny4 struct { isogeny3 K3 Fp2Element } type FieldOps interface { // Set res = lhs + rhs. // // Allowed to overlap lhs or rhs with res. Add(res, lhs, rhs *Fp2Element) // Set res = lhs - rhs. // // Allowed to overlap lhs or rhs with res. Sub(res, lhs, rhs *Fp2Element) // Set res = lhs * rhs. // // Allowed to overlap lhs or rhs with res. Mul(res, lhs, rhs *Fp2Element) // Set res = x * x // // Allowed to overlap res with x. Square(res, x *Fp2Element) // Set res = 1/x // // Allowed to overlap res with x. Inv(res, x *Fp2Element) // In case choice == 1, performs following swap in constant time: // xPx <-> xQx // xPz <-> xQz // Otherwise returns xPx, xPz, xQx, xQz unchanged CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) // Converts Fp2Element to Montgomery domain (x*R mod p) ToMontgomery(x *Fp2Element) // Converts 'a' in montgomery domain to element from Fp2Element // and stores it in 'x' FromMontgomery(x *Fp2Element, a *Fp2Element) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/000077500000000000000000000000001365325520100235765ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_amd64.s000066400000000000000000001165701365325520100260760ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" // p503 #define P503_0 $0xFFFFFFFFFFFFFFFF #define P503_1 $0xFFFFFFFFFFFFFFFF #define P503_2 $0xFFFFFFFFFFFFFFFF #define P503_3 $0xABFFFFFFFFFFFFFF #define P503_4 $0x13085BDA2211E7A0 #define P503_5 $0x1B9BF6C87B7E7DAF #define P503_6 $0x6045C6BDDA77A4D0 #define P503_7 $0x004066F541811E1E // p503+1 #define P503P1_3 $0xAC00000000000000 #define P503P1_4 $0x13085BDA2211E7A0 #define P503P1_5 $0x1B9BF6C87B7E7DAF #define P503P1_6 $0x6045C6BDDA77A4D0 #define P503P1_7 $0x004066F541811E1E // p503x2 #define P503X2_0 $0xFFFFFFFFFFFFFFFE #define P503X2_1 $0xFFFFFFFFFFFFFFFF #define P503X2_2 $0xFFFFFFFFFFFFFFFF #define P503X2_3 $0x57FFFFFFFFFFFFFF #define P503X2_4 $0x2610B7B44423CF41 #define P503X2_5 $0x3737ED90F6FCFB5E #define P503X2_6 $0xC08B8D7BB4EF49A0 #define P503X2_7 $0x0080CDEA83023C3C #define REG_P1 DI #define REG_P2 SI #define REG_P3 DX // Performs schoolbook multiplication of 2 256-bit numbers. This optimized version // uses MULX instruction. Macro smashes value in DX. // Input: I0 and I1. // Output: O // All the other arguments are resgisters, used for storing temporary values #define MULS256_MULX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MOVQ I0, DX \ MULXQ I1, T1, T0 \ // T0:T1 = A0*B0 MOVQ T1, O \ // O[0] MULXQ 8+I1, T2, T1 \ // T1:T2 = U0*V1 ADDQ T2, T0 \ MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 ADCQ T3, T1 \ MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 ADCQ T4, T2 \ \ // Column U1 MOVQ 8+I0, DX \ ADCQ $0, T3 \ MULXQ 0+I1, T4, T5 \ // T5:T4 = U1*V0 MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 ADDQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 ADCQ T8, T6 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 ADCQ T9, T7 \ ADCQ $0, T8 \ ADDQ T0, T4 \ MOVQ T4, 8+O \ // O[1] ADCQ T1, T5 \ ADCQ T2, T6 \ ADCQ T3, T7 \ \ // Column U2 MOVQ 16+I0, DX \ ADCQ $0, T8 \ MULXQ 0+I1, T0, T1 \ // T1:T0 = U2*V0 MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 ADDQ T3, T1 \ MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 ADCQ T4, T2 \ MULXQ 24+I1, T9, T4 \ // T4:T9 = U2*V3 ADCQ T9, T3 \ \ // Column U3 MOVQ 24+I0, DX \ ADCQ $0, T4 \ ADDQ T5, T0 \ MOVQ T0, 16+O \ // O[2] ADCQ T6, T1 \ ADCQ T7, T2 \ ADCQ T8, T3 \ ADCQ $0, T4 \ MULXQ 0+I1, T0, T5 \ // T5:T0 = U3*V0 MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*V1 ADDQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 ADCQ T8, T6 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 ADCQ T9, T7 \ ADCQ $0, T8 \ \ // Add values in remaining columns ADDQ T0, T1 \ MOVQ T1, 24+O \ // O[3] ADCQ T5, T2 \ MOVQ T2, 32+O \ // O[4] ADCQ T6, T3 \ MOVQ T3, 40+O \ // O[5] ADCQ T7, T4 \ MOVQ T4, 48+O \ // O[6] ADCQ $0, T8 \ // O[7] MOVQ T8, 56+O // Performs schoolbook multiplication of 2 256-bit numbers. This optimized version // uses ADOX, ADCX and MULX instructions. Macro smashes values in AX and DX. // Input: I0 and I1. // Output: O // All the other arguments resgisters are used for storing temporary values #define MULS256_MULX_ADCX_ADOX(O, I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ \ // U0[0] MOVQ 0+I0, DX \ // MULX requires multiplayer in DX \ // T0:T1 = I1*DX MULXQ I1, T1, T0 \ // T0:T1 = U0*V0 (low:high) MOVQ T1, O \ // O0[0] MULXQ 8+I1, T2, T1 \ // T2:T1 = U0*V1 XORQ AX, AX \ ADOXQ T2, T0 \ MULXQ 16+I1, T3, T2 \ // T2:T3 = U0*V2 ADOXQ T3, T1 \ MULXQ 24+I1, T4, T3 \ // T3:T4 = U0*V3 ADOXQ T4, T2 \ \ // Column U1 MOVQ 8+I0, DX \ MULXQ I1, T4, T5 \ // T5:T4 = U1*V0 ADOXQ AX, T3 \ XORQ AX, AX \ MULXQ 8+I1, T7, T6 \ // T6:T7 = U1*V1 ADOXQ T0, T4 \ MOVQ T4, 8+O \ // O[1] ADCXQ T7, T5 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U1*V2 ADCXQ T8, T6 \ ADOXQ T1, T5 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U1*V3 ADCXQ T9, T7 \ ADCXQ AX, T8 \ ADOXQ T2, T6 \ \ // Column U2 MOVQ 16+I0, DX \ MULXQ I1, T0, T1 \ // T1:T0 = U2*V0 ADOXQ T3, T7 \ ADOXQ AX, T8 \ XORQ AX, AX \ MULXQ 8+I1, T3, T2 \ // T2:T3 = U2*V1 ADOXQ T5, T0 \ MOVQ T0, 16+O \ // O[2] ADCXQ T3, T1 \ MULXQ 16+I1, T4, T3 \ // T3:T4 = U2*V2 ADCXQ T4, T2 \ ADOXQ T6, T1 \ MULXQ 24+I1, T9, T4 \ // T9:T4 = U2*V3 ADCXQ T9, T3 \ MOVQ 24+I0, DX \ ADCXQ AX, T4 \ \ ADOXQ T7, T2 \ ADOXQ T8, T3 \ ADOXQ AX, T4 \ \ // Column U3 MULXQ I1, T0, T5 \ // T5:T0 = U3*B0 XORQ AX, AX \ MULXQ 8+I1, T7, T6 \ // T6:T7 = U3*B1 ADCXQ T7, T5 \ ADOXQ T0, T1 \ MULXQ 16+I1, T8, T7 \ // T7:T8 = U3*V2 ADCXQ T8, T6 \ ADOXQ T5, T2 \ MULXQ 24+I1, T9, T8 \ // T8:T9 = U3*V3 ADCXQ T9, T7 \ ADCXQ AX, T8 \ \ ADOXQ T6, T3 \ ADOXQ T7, T4 \ ADOXQ AX, T8 \ MOVQ T1, 24+O \ // O[3] MOVQ T2, 32+O \ // O[4] MOVQ T3, 40+O \ // O[5] MOVQ T4, 48+O \ // O[6] and O[7] below MOVQ T8, 56+O // Template of a macro that performs schoolbook multiplication of 128-bit with 320-bit // number. It uses MULX instruction This template must be customized with functions // performing ADD (add1, add2) and ADD-with-carry (adc1, adc2). addX/adcX may or may // not be instructions that use two independent carry chains. // Input: // * I0 128-bit number // * I1 320-bit number // * add1, add2: instruction performing integer addition and starting carry chain // * adc1, adc2: instruction performing integer addition with carry // Output: T[0-6] registers #define MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, add1, add2, adc1, adc2) \ \ // Column 0 MOVQ I0, DX \ MULXQ I1+24(SB), T0, T1 \ MULXQ I1+32(SB), T4, T2 \ XORQ AX, AX \ MULXQ I1+40(SB), T5, T3 \ add1 T4, T1 \ adc1 T5, T2 \ MULXQ I1+48(SB), T7, T4 \ adc1 T7, T3 \ MULXQ I1+56(SB), T6, T5 \ adc1 T6, T4 \ adc1 AX, T5 \ \ // Column 1 MOVQ 8+I0, DX \ MULXQ I1+24(SB), T6, T7 \ add2 T6, T1 \ adc2 T7, T2 \ MULXQ I1+32(SB), T8, T6 \ adc2 T6, T3 \ MULXQ I1+40(SB), T7, T9 \ adc2 T9, T4 \ MULXQ I1+48(SB), T9, T6 \ adc2 T6, T5 \ MULXQ I1+56(SB), DX, T6 \ adc2 AX, T6 \ \ // Output XORQ AX, AX \ add1 T8, T2 \ adc1 T7, T3 \ adc1 T9, T4 \ adc1 DX, T5 \ adc1 AX, T6 // Multiplies 128-bit with 320-bit integer. Optimized with MULX instruction. #define MULS_128x320_MULX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADDQ, ADDQ, ADCQ, ADCQ) // Multiplies 128-bit with 320-bit integer. Optimized with MULX, ADOX and ADCX instructions #define MULS_128x320_MULX_ADCX_ADOX(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ MULS_128x320(I0, I1, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, ADOXQ, ADCXQ, ADOXQ, ADCXQ) // Template of a macro performing multiplication of two 512-bit numbers. It uses one // level of Karatsuba and one level of schoolbook multiplication. Template must be // customized with macro performing schoolbook multiplication. // Input: // * I0, I1 - two 512-bit numbers // * MULS - either MULS256_MULX or MULS256_MULX_ADCX_ADOX // Output: OUT - 1024-bit long #define MUL(OUT, I0, I1, MULS) \ \ // R[8-11]: U1+U0 XORQ AX, AX \ MOVQ ( 0)(I0), R8 \ MOVQ ( 8)(I0), R9 \ MOVQ (16)(I0), R10 \ MOVQ (24)(I0), R11 \ ADDQ (32)(I0), R8 \ ADCQ (40)(I0), R9 \ ADCQ (48)(I0), R10 \ ADCQ (56)(I0), R11 \ SBBQ $0, AX \ // store mask MOVQ R8, ( 0)(SP) \ MOVQ R9, ( 8)(SP) \ MOVQ R10, (16)(SP) \ MOVQ R11, (24)(SP) \ \ \ // R[12-15]: V1+V0 XORQ BX, BX \ MOVQ ( 0)(I1), R12 \ MOVQ ( 8)(I1), R13 \ MOVQ (16)(I1), R14 \ MOVQ (24)(I1), R15 \ ADDQ (32)(I1), R12 \ ADCQ (40)(I1), R13 \ ADCQ (48)(I1), R14 \ ADCQ (56)(I1), R15 \ SBBQ $0, BX \ // store mask MOVQ R12, (32)(SP) \ MOVQ R13, (40)(SP) \ MOVQ R14, (48)(SP) \ MOVQ R15, (56)(SP) \ \ // Prepare mask for U0+U1 (U1+U0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) ANDQ AX, R12 \ ANDQ AX, R13 \ ANDQ AX, R14 \ ANDQ AX, R15 \ \ // Prepare mask for V0+V1 (V1+V0 mod 256^4 if U1+U0 sets carry flag, otherwise 0) ANDQ BX, R8 \ ANDQ BX, R9 \ ANDQ BX, R10 \ ANDQ BX, R11 \ \ // res = masked(U0+U1) + masked(V0 + V1) ADDQ R12, R8 \ ADCQ R13, R9 \ ADCQ R14, R10 \ ADCQ R15, R11 \ \ // SP[64-96] <- res MOVQ R8, (64)(SP) \ MOVQ R9, (72)(SP) \ MOVQ R10, (80)(SP) \ MOVQ R11, (88)(SP) \ \ // BP will be used for schoolbook multiplication below MOVQ BP, 96(SP) \ \ // (U1+U0)*(V1+V0) MULS((64)(OUT), 0(SP), 32(SP), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // U0 x V0 MULS(0(OUT), 0(I0), 0(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // U1 x V1 MULS(0(SP), 32(I0), 32(I1), R8, R9, R10, R11, R12, R13, R14, R15, BX, BP) \ \ // Recover BP MOVQ 96(SP), BP \ \ // Final part of schoolbook multiplication; R[8-11] = (U0+U1) x (V0+V1) MOVQ (64)(SP), R8 \ MOVQ (72)(SP), R9 \ MOVQ (80)(SP), R10 \ MOVQ (88)(SP), R11 \ MOVQ (96)(OUT), AX \ ADDQ AX, R8 \ MOVQ (104)(OUT), AX \ ADCQ AX, R9 \ MOVQ (112)(OUT), AX \ ADCQ AX, R10 \ MOVQ (120)(OUT), AX \ ADCQ AX, R11 \ \ // R[12-15, 8-11] = (U0+U1) x (V0+V1) - U0xV0 MOVQ (64)(OUT), R12 \ MOVQ (72)(OUT), R13 \ MOVQ (80)(OUT), R14 \ MOVQ (88)(OUT), R15 \ SUBQ ( 0)(OUT), R12 \ SBBQ ( 8)(OUT), R13 \ SBBQ (16)(OUT), R14 \ SBBQ (24)(OUT), R15 \ SBBQ (32)(OUT), R8 \ SBBQ (40)(OUT), R9 \ SBBQ (48)(OUT), R10 \ SBBQ (56)(OUT), R11 \ \ // r8-r15 <- (U0+U1) x (V0+V1) - U0xV0 - U1xV1 SUBQ ( 0)(SP), R12 \ SBBQ ( 8)(SP), R13 \ SBBQ (16)(SP), R14 \ SBBQ (24)(SP), R15 \ SBBQ (32)(SP), R8 \ SBBQ (40)(SP), R9 \ SBBQ (48)(SP), R10 \ SBBQ (56)(SP), R11 \ \ ; ADDQ (32)(OUT), R12; MOVQ R12, ( 32)(OUT) \ ; ADCQ (40)(OUT), R13; MOVQ R13, ( 40)(OUT) \ ; ADCQ (48)(OUT), R14; MOVQ R14, ( 48)(OUT) \ ; ADCQ (56)(OUT), R15; MOVQ R15, ( 56)(OUT) \ MOVQ ( 0)(SP), AX; ADCQ AX, R8; MOVQ R8, ( 64)(OUT) \ MOVQ ( 8)(SP), AX; ADCQ AX, R9; MOVQ R9, ( 72)(OUT) \ MOVQ (16)(SP), AX; ADCQ AX, R10; MOVQ R10, ( 80)(OUT) \ MOVQ (24)(SP), AX; ADCQ AX, R11; MOVQ R11, ( 88)(OUT) \ MOVQ (32)(SP), R12; ADCQ $0, R12; MOVQ R12, ( 96)(OUT) \ MOVQ (40)(SP), R13; ADCQ $0, R13; MOVQ R13, (104)(OUT) \ MOVQ (48)(SP), R14; ADCQ $0, R14; MOVQ R14, (112)(OUT) \ MOVQ (56)(SP), R15; ADCQ $0, R15; MOVQ R15, (120)(OUT) // Template for calculating the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be // customized with schoolbook multiplicaton for 128 x 320-bit number. // This macro reuses memory of IN value and *changes* it. Smashes registers // R[8-15], BX, CX // Input: // * IN: 1024-bit number to be reduced // * MULS: either MULS_128x320_MULX or MULS_128x320_MULX_ADCX_ADOX // Output: OUT 512-bit #define REDC(OUT, IN, MULS) \ MULS(0(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ ADDQ (24)(IN), R8 \ ADCQ (32)(IN), R9 \ ADCQ (40)(IN), R10 \ ADCQ (48)(IN), R11 \ ADCQ (56)(IN), R12 \ ADCQ (64)(IN), R13 \ ADCQ (72)(IN), R14 \ ADCQ (80)(IN), R15 \ MOVQ R8, (24)(IN) \ MOVQ R9, (32)(IN) \ MOVQ R10, (40)(IN) \ MOVQ R11, (48)(IN) \ MOVQ R12, (56)(IN) \ MOVQ R13, (64)(IN) \ MOVQ R14, (72)(IN) \ MOVQ R15, (80)(IN) \ MOVQ (88)(IN), R8 \ MOVQ (96)(IN), R9 \ MOVQ (104)(IN), R10 \ MOVQ (112)(IN), R11 \ MOVQ (120)(IN), R12 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ ADCQ $0, R11 \ ADCQ $0, R12 \ MOVQ R8, (88)(IN) \ MOVQ R9, (96)(IN) \ MOVQ R10, (104)(IN) \ MOVQ R11, (112)(IN) \ MOVQ R12, (120)(IN) \ \ MULS(16(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ ADDQ (40)(IN), R8 \ ADCQ (48)(IN), R9 \ ADCQ (56)(IN), R10 \ ADCQ (64)(IN), R11 \ ADCQ (72)(IN), R12 \ ADCQ (80)(IN), R13 \ ADCQ (88)(IN), R14 \ ADCQ (96)(IN), R15 \ MOVQ R8, (40)(IN) \ MOVQ R9, (48)(IN) \ MOVQ R10, (56)(IN) \ MOVQ R11, (64)(IN) \ MOVQ R12, (72)(IN) \ MOVQ R13, (80)(IN) \ MOVQ R14, (88)(IN) \ MOVQ R15, (96)(IN) \ MOVQ (104)(IN), R8 \ MOVQ (112)(IN), R9 \ MOVQ (120)(IN), R10 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ MOVQ R8, (104)(IN) \ MOVQ R9, (112)(IN) \ MOVQ R10, (120)(IN) \ \ MULS(32(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ XORQ R15, R15 \ XORQ BX, BX \ ADDQ ( 56)(IN), R8 \ ADCQ ( 64)(IN), R9 \ ADCQ ( 72)(IN), R10 \ ADCQ ( 80)(IN), R11 \ ADCQ ( 88)(IN), R12 \ ADCQ ( 96)(IN), R13 \ ADCQ (104)(IN), R14 \ ADCQ (112)(IN), R15 \ ADCQ (120)(IN), BX \ MOVQ R8, ( 56)(IN) \ MOVQ R10, ( 72)(IN) \ MOVQ R11, ( 80)(IN) \ MOVQ R12, ( 88)(IN) \ MOVQ R13, ( 96)(IN) \ MOVQ R14, (104)(IN) \ MOVQ R15, (112)(IN) \ MOVQ BX, (120)(IN) \ MOVQ R9, ( 0)(OUT) \ // Result: OUT[0] \ MULS(48(IN), ·p503p1, R8, R9, R10, R11, R12, R13, R14, BX, CX, R15) \ ADDQ ( 72)(IN), R8 \ ADCQ ( 80)(IN), R9 \ ADCQ ( 88)(IN), R10 \ ADCQ ( 96)(IN), R11 \ ADCQ (104)(IN), R12 \ ADCQ (112)(IN), R13 \ ADCQ (120)(IN), R14 \ MOVQ R8, ( 8)(OUT) \ // Result: OUT[1] MOVQ R9, (16)(OUT) \ // Result: OUT[2] MOVQ R10, (24)(OUT) \ // Result: OUT[3] MOVQ R11, (32)(OUT) \ // Result: OUT[4] MOVQ R12, (40)(OUT) \ // Result: OUT[5] MOVQ R13, (48)(OUT) \ // Result: OUT[6] and OUT[7] MOVQ R14, (56)(OUT) TEXT ·fp503StrongReduce(SB), NOSPLIT, $0-8 MOVQ x+0(FP), REG_P1 // Zero AX for later use: XORQ AX, AX // Load p into registers: MOVQ P503_0, R8 // P503_{1,2} = P503_0, so reuse R8 MOVQ P503_3, R9 MOVQ P503_4, R10 MOVQ P503_5, R11 MOVQ P503_6, R12 MOVQ P503_7, R13 // Set x <- x - p SUBQ R8, ( 0)(REG_P1) SBBQ R8, ( 8)(REG_P1) SBBQ R8, (16)(REG_P1) SBBQ R9, (24)(REG_P1) SBBQ R10, (32)(REG_P1) SBBQ R11, (40)(REG_P1) SBBQ R12, (48)(REG_P1) SBBQ R13, (56)(REG_P1) // Save carry flag indicating x-p < 0 as a mask SBBQ $0, AX // Conditionally add p to x if x-p < 0 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ADDQ R8, ( 0)(REG_P1) ADCQ R8, ( 8)(REG_P1) ADCQ R8, (16)(REG_P1) ADCQ R9, (24)(REG_P1) ADCQ R10,(32)(REG_P1) ADCQ R11,(40)(REG_P1) ADCQ R12,(48)(REG_P1) ADCQ R13,(56)(REG_P1) RET TEXT ·fp503ConditionalSwap(SB),NOSPLIT,$0-17 MOVQ x+0(FP), REG_P1 MOVQ y+8(FP), REG_P2 MOVBLZX choice+16(FP), AX // AL = 0 or 1 // Make AX, so that either all bits are set or non // AX = 0 or 1 NEGQ AX // Fill xmm15. After this step first half of XMM15 is // just zeros and second half is whatever in AX MOVQ AX, X15 // Copy lower double word everywhere else. So that // XMM15=AL|AL|AL|AL. As AX has either all bits set // or non result will be that XMM15 has also either // all bits set or non of them. PSHUFD $0, X15, X15 #ifndef CSWAP_BLOCK #define CSWAP_BLOCK(idx) \ MOVOU (idx*16)(REG_P1), X0 \ MOVOU (idx*16)(REG_P2), X1 \ \ // X2 = mask & (X0 ^ X1) MOVO X1, X2 \ PXOR X0, X2 \ PAND X15, X2 \ \ PXOR X2, X0 \ PXOR X2, X1 \ \ MOVOU X0, (idx*16)(REG_P1) \ MOVOU X1, (idx*16)(REG_P2) #endif CSWAP_BLOCK(0) CSWAP_BLOCK(1) CSWAP_BLOCK(2) CSWAP_BLOCK(3) #ifdef CSWAP_BLOCK #undef CSWAP_BLOCK #endif RET TEXT ·fp503AddReduced(SB),NOSPLIT,$0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to calculate a mask XORQ CX, CX // [R8-R15]: z = x + y MOVQ ( 0)(REG_P1), R8 MOVQ ( 8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 ADDQ ( 0)(REG_P2), R8 ADCQ ( 8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 MOVQ P503X2_0, AX SUBQ AX, R8 MOVQ P503X2_1, AX SBBQ AX, R9 SBBQ AX, R10 MOVQ P503X2_3, AX SBBQ AX, R11 MOVQ P503X2_4, AX SBBQ AX, R12 MOVQ P503X2_5, AX SBBQ AX, R13 MOVQ P503X2_6, AX SBBQ AX, R14 MOVQ P503X2_7, AX SBBQ AX, R15 // mask SBBQ $0, CX // move z to REG_P3 MOVQ R8, ( 0)(REG_P3) MOVQ R9, ( 8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) // if z<0 add p503x2 back MOVQ P503X2_0, R8 MOVQ P503X2_1, R9 MOVQ P503X2_3, R10 MOVQ P503X2_4, R11 MOVQ P503X2_5, R12 MOVQ P503X2_6, R13 MOVQ P503X2_7, R14 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 ANDQ CX, R14 MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) RET TEXT ·fp503SubReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to calculate a mask XORQ CX, CX MOVQ ( 0)(REG_P1), R8 MOVQ ( 8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 SUBQ ( 0)(REG_P2), R8 SBBQ ( 8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 // mask SBBQ $0, CX // store x-y in REG_P3 MOVQ R8, ( 0)(REG_P3) MOVQ R9, ( 8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) // if z<0 add p503x2 back MOVQ P503X2_0, R8 MOVQ P503X2_1, R9 MOVQ P503X2_3, R10 MOVQ P503X2_4, R11 MOVQ P503X2_5, R12 MOVQ P503X2_6, R13 MOVQ P503X2_7, R14 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 ANDQ CX, R14 MOVQ ( 0)(REG_P3), AX; ADDQ R8, AX; MOVQ AX, ( 0)(REG_P3) MOVQ ( 8)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, ( 8)(REG_P3) MOVQ (16)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX; ADCQ R14, AX; MOVQ AX, (56)(REG_P3) RET TEXT ·fp503Mul(SB), NOSPLIT, $104-24 MOVQ z+ 0(FP), CX MOVQ x+ 8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE mul_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE mul_with_mulx // Generic x86 implementation (below) uses variant of Karatsuba method. // // Here we store the destination in CX instead of in REG_P3 because the // multiplication instructions use DX as an implicit destination // operand: MULQ $REG sets DX:AX <-- AX * $REG. // RAX and RDX will be used for a mask (0-borrow) XORQ AX, AX // RCX[0-3]: U1+U0 MOVQ (32)(REG_P1), R8 MOVQ (40)(REG_P1), R9 MOVQ (48)(REG_P1), R10 MOVQ (56)(REG_P1), R11 ADDQ ( 0)(REG_P1), R8 ADCQ ( 8)(REG_P1), R9 ADCQ (16)(REG_P1), R10 ADCQ (24)(REG_P1), R11 MOVQ R8, ( 0)(CX) MOVQ R9, ( 8)(CX) MOVQ R10, (16)(CX) MOVQ R11, (24)(CX) SBBQ $0, AX // R12-R15: V1+V0 XORQ DX, DX MOVQ (32)(REG_P2), R12 MOVQ (40)(REG_P2), R13 MOVQ (48)(REG_P2), R14 MOVQ (56)(REG_P2), R15 ADDQ ( 0)(REG_P2), R12 ADCQ ( 8)(REG_P2), R13 ADCQ (16)(REG_P2), R14 ADCQ (24)(REG_P2), R15 SBBQ $0, DX // Store carries on stack MOVQ AX, (64)(SP) MOVQ DX, (72)(SP) // (SP[0-3],R8,R9,R10,R11) <- (U0+U1)*(V0+V1). // MUL using comba; In comments below U=U0+U1 V=V0+V1 // U0*V0 MOVQ (CX), AX MULQ R12 MOVQ AX, (SP) // C0 MOVQ DX, R8 // U0*V1 XORQ R9, R9 MOVQ (CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 // U1*V0 XORQ R10, R10 MOVQ (8)(CX), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(SP) // C1 ADCQ DX, R9 ADCQ $0, R10 // U0*V2 XORQ R8, R8 MOVQ (CX), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U2*V0 MOVQ (16)(CX), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U1*V1 MOVQ (8)(CX), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (16)(SP) // C2 ADCQ DX, R10 ADCQ $0, R8 // U0*V3 XORQ R9, R9 MOVQ (CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U3*V0 MOVQ (24)(CX), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U1*V2 MOVQ (8)(CX), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V1 MOVQ (16)(CX), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (24)(SP) // C3 ADCQ DX, R8 ADCQ $0, R9 // U1*V3 XORQ R10, R10 MOVQ (8)(CX), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U3*V1 MOVQ (24)(CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U2*V2 MOVQ (16)(CX), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (32)(SP) // C4 ADCQ DX, R9 ADCQ $0, R10 // U2*V3 XORQ R11, R11 MOVQ (16)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R11 // U3*V2 MOVQ (24)(CX), AX MULQ R14 ADDQ AX, R9 // C5 ADCQ DX, R10 ADCQ $0, R11 // U3*V3 MOVQ (24)(CX), AX MULQ R15 ADDQ AX, R10 // C6 ADCQ DX, R11 // C7 MOVQ (64)(SP), AX ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, R12 ADCQ R9, R13 ADCQ R10, R14 ADCQ R11, R15 MOVQ (72)(SP), AX MOVQ (CX), R8 MOVQ (8)(CX), R9 MOVQ (16)(CX), R10 MOVQ (24)(CX), R11 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ADDQ R12, R8 ADCQ R13, R9 ADCQ R14, R10 ADCQ R15, R11 MOVQ R8, (32)(SP) MOVQ R9, (40)(SP) MOVQ R10, (48)(SP) MOVQ R11, (56)(SP) // CX[0-7] <- AL*BL // U0*V0 MOVQ (REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (CX) // C0 MOVQ DX, R8 // U0*V1 MOVQ (16)(REG_P1), R14 MOVQ (8)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 // U1*V0 MOVQ (8)(REG_P1), R12 MOVQ (REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(CX) // C1 ADCQ DX, R9 ADCQ $0, R10 // U0*V2 XORQ R8, R8 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U2*V0 MOVQ (REG_P2), R13 MOVQ R14, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U1*V1 MOVQ (8)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(CX) // C2 ADCQ DX, R10 ADCQ $0, R8 // U0*V3 XORQ R9, R9 MOVQ (24)(REG_P2), AX MULQ R11 MOVQ (24)(REG_P1), R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U3*V1 MOVQ R15, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V2 MOVQ (16)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 // U2*V3 MOVQ (8)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (24)(CX) // C3 ADCQ DX, R8 ADCQ $0, R9 // U3*V2 XORQ R10, R10 MOVQ (24)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U3*V1 MOVQ (8)(REG_P2), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 // U2*V2 MOVQ (16)(REG_P2), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (32)(CX) // C4 ADCQ DX, R9 ADCQ $0, R10 // U2*V3 XORQ R8, R8 MOVQ (24)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 // U3*V2 MOVQ (16)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(CX) // C5 ADCQ DX, R10 ADCQ $0, R8 // U3*V3 MOVQ (24)(REG_P2), AX MULQ R15 ADDQ AX, R10 MOVQ R10, (48)(CX) // C6 ADCQ DX, R8 MOVQ R8, (56)(CX) // C7 // CX[8-15] <- U1*V1 MOVQ (32)(REG_P1), R11 MOVQ (32)(REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (64)(CX) // C0 MOVQ DX, R8 MOVQ (48)(REG_P1), R14 MOVQ (40)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (40)(REG_P1), R12 MOVQ (32)(REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (72)(CX) // C1 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (48)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), R13 MOVQ R14, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (80)(CX) // C2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (56)(REG_P2), AX MULQ R11 MOVQ (56)(REG_P1), R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ R15, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (88)(CX) // C3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (56)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (40)(REG_P2), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (48)(REG_P2), AX MULQ R14 ADDQ AX, R8 MOVQ R8, (96)(CX) // C4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (56)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (48)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (104)(CX) // C5 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R15 ADDQ AX, R10 MOVQ R10, (112)(CX) // C6 ADCQ DX, R8 MOVQ R8, (120)(CX) // C7 // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V1 MOVQ (SP), R8 SUBQ (CX), R8 MOVQ (8)(SP), R9 SBBQ (8)(CX), R9 MOVQ (16)(SP), R10 SBBQ (16)(CX), R10 MOVQ (24)(SP), R11 SBBQ (24)(CX), R11 MOVQ (32)(SP), R12 SBBQ (32)(CX), R12 MOVQ (40)(SP), R13 SBBQ (40)(CX), R13 MOVQ (48)(SP), R14 SBBQ (48)(CX), R14 MOVQ (56)(SP), R15 SBBQ (56)(CX), R15 // [R8-R15] <- (U0+U1)*(V0+V1) - U1*V0 - U0*U1 MOVQ ( 64)(CX), AX; SUBQ AX, R8 MOVQ ( 72)(CX), AX; SBBQ AX, R9 MOVQ ( 80)(CX), AX; SBBQ AX, R10 MOVQ ( 88)(CX), AX; SBBQ AX, R11 MOVQ ( 96)(CX), AX; SBBQ AX, R12 MOVQ (104)(CX), DX; SBBQ DX, R13 MOVQ (112)(CX), DI; SBBQ DI, R14 MOVQ (120)(CX), SI; SBBQ SI, R15 // Final result ADDQ (32)(CX), R8; MOVQ R8, (32)(CX) ADCQ (40)(CX), R9; MOVQ R9, (40)(CX) ADCQ (48)(CX), R10; MOVQ R10, (48)(CX) ADCQ (56)(CX), R11; MOVQ R11, (56)(CX) ADCQ (64)(CX), R12; MOVQ R12, (64)(CX) ADCQ (72)(CX), R13; MOVQ R13, (72)(CX) ADCQ (80)(CX), R14; MOVQ R14, (80)(CX) ADCQ (88)(CX), R15; MOVQ R15, (88)(CX) ADCQ $0, AX; MOVQ AX, (96)(CX) ADCQ $0, DX; MOVQ DX, (104)(CX) ADCQ $0, DI; MOVQ DI, (112)(CX) ADCQ $0, SI; MOVQ SI, (120)(CX) RET mul_with_mulx_adcx_adox: // Mul implementation for CPUs supporting two independent carry chain // (ADOX/ADCX) instructions and carry-less MULX multiplier MUL(CX, REG_P1, REG_P2, MULS256_MULX_ADCX_ADOX) RET mul_with_mulx: // Mul implementation for CPUs supporting carry-less MULX multiplier. MUL(CX, REG_P1, REG_P2, MULS256_MULX) RET TEXT ·fp503MontgomeryReduce(SB), $0-16 MOVQ z+0(FP), REG_P2 MOVQ x+8(FP), REG_P1 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE redc_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE redc_with_mulx MOVQ (REG_P1), R11 MOVQ P503P1_3, AX MULQ R11 XORQ R8, R8 ADDQ (24)(REG_P1), AX MOVQ AX, (24)(REG_P2) ADCQ DX, R8 XORQ R9, R9 MOVQ P503P1_4, AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ P503P1_3, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (32)(REG_P1), R8 MOVQ R8, (32)(REG_P2) // Z4 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_5, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P1), R13 MOVQ P503P1_3, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (40)(REG_P1), R9 MOVQ R9, (40)(REG_P2) // Z5 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_6, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_4, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P2), R14 MOVQ P503P1_3, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (48)(REG_P1), R10 MOVQ R10, (48)(REG_P2) // Z6 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_5, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_4, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P2), R15 MOVQ P503P1_3, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (56)(REG_P1), R8 MOVQ R8, (56)(REG_P2) // Z7 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_7, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_6, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_5, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), CX MOVQ P503P1_3, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (64)(REG_P1), R9 MOVQ R9, (REG_P2) // Z0 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_7, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_6, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_4, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), R13 MOVQ P503P1_3, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (72)(REG_P1), R10 MOVQ R10, (8)(REG_P2) // Z1 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_5, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_4, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (56)(REG_P2), R14 MOVQ P503P1_3, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (80)(REG_P1), R8 MOVQ R8, (16)(REG_P2) // Z2 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P503P1_7, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_6, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P503P1_4, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (88)(REG_P1), R9 MOVQ R9, (24)(REG_P2) // Z3 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P503P1_7, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P503P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (96)(REG_P1), R10 MOVQ R10, (32)(REG_P2) // Z4 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P503P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P503P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (104)(REG_P1), R8 // Z5 MOVQ R8, (40)(REG_P2) // Z5 ADCQ $0, R9 ADCQ $0, R10 MOVQ P503P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADDQ (112)(REG_P1), R9 // Z6 MOVQ R9, (48)(REG_P2) // Z6 ADCQ $0, R10 ADDQ (120)(REG_P1), R10 // Z7 MOVQ R10, (56)(REG_P2) // Z7 RET redc_with_mulx_adcx_adox: // Implementation of the Montgomery reduction for CPUs // supporting two independent carry chain (ADOX/ADCX) // instructions and carry-less MULX multiplier REDC(REG_P2, REG_P1, MULS_128x320_MULX_ADCX_ADOX) RET redc_with_mulx: // Implementation of the Montgomery reduction for CPUs // supporting carry-less MULX multiplier. REDC(REG_P2, REG_P1, MULS_128x320_MULX) RET TEXT ·fp503AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) RET TEXT ·fp503X2AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), R8 MOVQ (96)(REG_P1), R9 MOVQ (104)(REG_P1), R10 MOVQ (112)(REG_P1), R11 MOVQ (120)(REG_P1), R12 ADCQ (88)(REG_P2), R8 ADCQ (96)(REG_P2), R9 ADCQ (104)(REG_P2), R10 ADCQ (112)(REG_P2), R11 ADCQ (120)(REG_P2), R12 MOVQ R8, (88)(REG_P3) MOVQ R9, (96)(REG_P3) MOVQ R10, (104)(REG_P3) MOVQ R11, (112)(REG_P3) MOVQ R12, (120)(REG_P3) RET TEXT ·fp503X2SubLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 // Used later to store result of 0-borrow XORQ CX, CX // SUBC for first 11 limbs MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), AX SBBQ (72)(REG_P2), BX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) // SUBC for last 5 limbs MOVQ (80)(REG_P1), R8 MOVQ (88)(REG_P1), R9 MOVQ (96)(REG_P1), R10 MOVQ (104)(REG_P1), R11 MOVQ (112)(REG_P1), R12 MOVQ (120)(REG_P1), R13 SBBQ (80)(REG_P2), R8 SBBQ (88)(REG_P2), R9 SBBQ (96)(REG_P2), R10 SBBQ (104)(REG_P2), R11 SBBQ (112)(REG_P2), R12 SBBQ (120)(REG_P2), R13 MOVQ R8, (80)(REG_P3) MOVQ R9, (88)(REG_P3) MOVQ R10, (96)(REG_P3) MOVQ R11, (104)(REG_P3) MOVQ R12, (112)(REG_P3) MOVQ R13, (120)(REG_P3) // Now the carry flag is 1 if x-y < 0. If so, add p*2^512. SBBQ $0, CX // Load p into registers: MOVQ P503_0, R8 // P503_{1,2} = P503_0, so reuse R8 MOVQ P503_3, R9 MOVQ P503_4, R10 MOVQ P503_5, R11 MOVQ P503_6, R12 MOVQ P503_7, R13 ANDQ CX, R8 ANDQ CX, R9 ANDQ CX, R10 ANDQ CX, R11 ANDQ CX, R12 ANDQ CX, R13 MOVQ (64 )(REG_P3), AX; ADDQ R8, AX; MOVQ AX, (64 )(REG_P3) MOVQ (64+ 8)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+ 8)(REG_P3) MOVQ (64+16)(REG_P3), AX; ADCQ R8, AX; MOVQ AX, (64+16)(REG_P3) MOVQ (64+24)(REG_P3), AX; ADCQ R9, AX; MOVQ AX, (64+24)(REG_P3) MOVQ (64+32)(REG_P3), AX; ADCQ R10, AX; MOVQ AX, (64+32)(REG_P3) MOVQ (64+40)(REG_P3), AX; ADCQ R11, AX; MOVQ AX, (64+40)(REG_P3) MOVQ (64+48)(REG_P3), AX; ADCQ R12, AX; MOVQ AX, (64+48)(REG_P3) MOVQ (64+56)(REG_P3), AX; ADCQ R13, AX; MOVQ AX, (64+56)(REG_P3) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_amd64_test.go000066400000000000000000000076651365325520100273040ustar00rootroot00000000000000// +build amd64,!noasm package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" cpu "github.com/henrydcase/nobs/utils" "reflect" "testing" "testing/quick" ) type OptimFlag uint const ( // Indicates that optimisation which uses MUL instruction should be used kUse_MUL OptimFlag = 1 << 0 // Indicates that optimisation which uses MULX instruction should be used kUse_MULX = 1 << 1 // Indicates that optimisation which uses MULX, ADOX and ADCX instructions should be used kUse_MULXandADxX = 1 << 2 ) func resetCpuFeatures() { HasBMI2 = cpu.X86.HasBMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX } // Utility function used for testing Mul implementations. Tests caller provided // mulFunc against mul() func testMul(t *testing.T, f1, f2 OptimFlag) { doMulTest := func(multiplier, multiplicant FpElement) bool { defer resetCpuFeatures() var resMulRef, resMulOptim FpElementX2 // Compute multiplier*multiplicant with first implementation HasBMI2 = (kUse_MULX & f1) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX fp503Mul(&resMulOptim, &multiplier, &multiplicant) // Compute multiplier*multiplicant with second implementation HasBMI2 = (kUse_MULX & f2) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX fp503Mul(&resMulRef, &multiplier, &multiplicant) // Compare results return reflect.DeepEqual(resMulRef, resMulOptim) } if err := quick.Check(doMulTest, quickCheckConfig); err != nil { t.Error(err) } } // Utility function used for testing REDC implementations. Tests caller provided // redcFunc against redc() func testRedc(t *testing.T, f1, f2 OptimFlag) { doRedcTest := func(aRR FpElementX2) bool { defer resetCpuFeatures() var resRedcF1, resRedcF2 FpElement var aRRcpy = aRR // Compute redc with first implementation HasBMI2 = (kUse_MULX & f1) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f1) == kUse_MULXandADxX fp503MontgomeryReduce(&resRedcF1, &aRR) // Compute redc with second implementation HasBMI2 = (kUse_MULX & f2) == kUse_MULX HasADXandBMI2 = (kUse_MULXandADxX & f2) == kUse_MULXandADxX fp503MontgomeryReduce(&resRedcF2, &aRRcpy) // Compare results return reflect.DeepEqual(resRedcF2, resRedcF1) } if err := quick.Check(doRedcTest, quickCheckConfig); err != nil { t.Error(err) } } // Ensures correctness of implementation of mul operation which uses MULX func TestMulWithMULX(t *testing.T) { defer resetCpuFeatures() if !HasBMI2 { t.Skip("MULX not supported by the platform") } testMul(t, kUse_MULX, kUse_MUL) } // Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX func TestMulWithMULXADxX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testMul(t, kUse_MULXandADxX, kUse_MUL) } // Ensures correctness of implementation of mul operation which uses MULX and ADOX/ADCX func TestMulWithMULXADxXAgainstMULX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testMul(t, kUse_MULX, kUse_MULXandADxX) } // Ensures correctness of Montgomery reduction implementation which uses MULX func TestRedcWithMULX(t *testing.T) { defer resetCpuFeatures() if !HasBMI2 { t.Skip("MULX not supported by the platform") } testRedc(t, kUse_MULX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MUL) } // Ensures correctness of Montgomery reduction implementation which uses MULX // and ADCX/ADOX. func TestRedcWithMULXADxXAgainstMULX(t *testing.T) { defer resetCpuFeatures() if !HasADXandBMI2 { t.Skip("MULX, ADCX and ADOX not supported by the platform") } testRedc(t, kUse_MULXandADxX, kUse_MULX) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_arm64.s000066400000000000000000000357141365325520100261140ustar00rootroot00000000000000// +build arm64,!noasm #include "textflag.h" TEXT ·fp503ConditionalSwap(SB), NOSPLIT, $0-17 MOVD x+0(FP), R0 MOVD y+8(FP), R1 MOVB choice+16(FP), R2 // Set flags // If choice is not 0 or 1, this implementation will swap completely CMP $0, R2 LDP 0(R0), (R3, R4) LDP 0(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 0(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 0(R1) LDP 16(R0), (R3, R4) LDP 16(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 16(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 16(R1) LDP 32(R0), (R3, R4) LDP 32(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 32(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 32(R1) LDP 48(R0), (R3, R4) LDP 48(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 48(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 48(R1) RET TEXT ·fp503AddReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R10 // Add first summand and second summand and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 ADCS R13, R5 ADCS R14, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 ADCS R13, R9 ADC R14, R10 // Subtract 2 * p503 in R11-R17 from the result in R3-R10 LDP ·p503x2+0(SB), (R11, R12) LDP ·p503x2+24(SB), (R13, R14) SUBS R11, R3 SBCS R12, R4 LDP ·p503x2+40(SB), (R15, R16) SBCS R12, R5 SBCS R13, R6 MOVD ·p503x2+56(SB), R17 SBCS R14, R7 SBCS R15, R8 SBCS R16, R9 SBCS R17, R10 SBC ZR, ZR, R19 // If x + y - 2 * p503 < 0, R19 is 1 and 2 * p503 should be added AND R19, R11 AND R19, R12 AND R19, R13 AND R19, R14 AND R19, R15 AND R19, R16 AND R19, R17 ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R12, R5 ADCS R13, R6 STP (R5, R6), 16(R2) ADCS R14, R7 ADCS R15, R8 STP (R7, R8), 32(R2) ADCS R16, R9 ADC R17, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503SubReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load x into R3-R10 // Subtract y from x and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) SUBS R11, R3 SBCS R12, R4 SBCS R13, R5 SBCS R14, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 SBCS R13, R9 SBCS R14, R10 SBC ZR, ZR, R19 // If x - y < 0, R19 is 1 and 2 * p503 should be added LDP ·p503x2+0(SB), (R11, R12) LDP ·p503x2+24(SB), (R13, R14) AND R19, R11 AND R19, R12 LDP ·p503x2+40(SB), (R15, R16) AND R19, R13 AND R19, R14 MOVD ·p503x2+56(SB), R17 AND R19, R15 AND R19, R16 AND R19, R17 ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R12, R5 ADCS R13, R6 STP (R5, R6), 16(R2) ADCS R14, R7 ADCS R15, R8 STP (R7, R8), 32(R2) ADCS R16, R9 ADC R17, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R10 // Add first summand and second summand and store result in R3-R10 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 32(R2) ADCS R13, R9 ADC R14, R10 STP (R9, R10), 48(R2) RET TEXT ·fp503X2AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) ADDS R11, R3 ADCS R12, R4 STP (R3, R4), 0(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 32(R2) ADCS R13, R9 ADCS R14, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R3, R4) LDP 64(R1), (R11, R12) LDP 80(R0), (R5, R6) LDP 80(R1), (R13, R14) ADCS R11, R3 ADCS R12, R4 STP (R3, R4), 64(R2) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 80(R2) LDP 96(R0), (R7, R8) LDP 96(R1), (R11, R12) LDP 112(R0), (R9, R10) LDP 112(R1), (R13, R14) ADCS R11, R7 ADCS R12, R8 STP (R7, R8), 96(R2) ADCS R13, R9 ADC R14, R10 STP (R9, R10), 112(R2) RET TEXT ·fp503X2SubLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R11, R12) LDP 16(R0), (R5, R6) LDP 16(R1), (R13, R14) SUBS R11, R3 SBCS R12, R4 STP (R3, R4), 0(R2) SBCS R13, R5 SBCS R14, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R11, R12) LDP 48(R0), (R9, R10) LDP 48(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 STP (R7, R8), 32(R2) SBCS R13, R9 SBCS R14, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R3, R4) LDP 64(R1), (R11, R12) LDP 80(R0), (R5, R6) LDP 80(R1), (R13, R14) SBCS R11, R3 SBCS R12, R4 SBCS R13, R5 SBCS R14, R6 LDP 96(R0), (R7, R8) LDP 96(R1), (R11, R12) LDP 112(R0), (R9, R10) LDP 112(R1), (R13, R14) SBCS R11, R7 SBCS R12, R8 SBCS R13, R9 SBCS R14, R10 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and p503 should be added LDP ·p503+16(SB), (R16, R17) LDP ·p503+32(SB), (R19, R20) AND R15, R16 AND R15, R17 LDP ·p503+48(SB), (R21, R22) AND R15, R19 AND R15, R20 AND R15, R21 AND R15, R22 ADDS R16, R3 ADCS R16, R4 STP (R3, R4), 64(R2) ADCS R16, R5 ADCS R17, R6 STP (R5, R6), 80(R2) ADCS R19, R7 ADCS R20, R8 STP (R7, R8), 96(R2) ADCS R21, R9 ADC R22, R10 STP (R9, R10), 112(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X1) * (Y0-Y1) will be in Z0-Z3 // Inputs get overwritten, except for X1 #define mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, Z2, Z3, T0) \ MUL X1, Y0, X0 \ UMULH X1, Y0, Y0 \ ADDS Z3, Z1 \ ADC ZR, Z2 \ \ MUL Y1, X1, T0 \ UMULH Y1, X1, Y1 \ ADDS X0, Z1 \ ADCS Y0, Z2 \ ADC ZR, ZR, Z3 \ \ ADDS T0, Z2 \ ADC Y1, Z3 // Expects that X points to (X0-X1) // Result of (X0-X3) * (Y0-Y3) will be in Z0-Z7 // Inputs get overwritten, except X2-X3 and Y2-Y3 #define mul256x256karatsuba(X, X0, X1, X2, X3, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, Z6, Z7, T0, T1)\ ADDS X2, X0 \ // xH + xL, destroys xL ADCS X3, X1 \ ADCS ZR, ZR, T0 \ \ ADDS Y2, Y0, Z6 \ // yH + yL ADCS Y3, Y1, T1 \ ADC ZR, ZR, Z7 \ \ SUB T0, ZR, Z2 \ SUB Z7, ZR, Z3 \ AND Z7, T0 \ // combined carry \ AND Z2, Z6, Z0 \ // masked(yH + yL) AND Z2, T1, Z1 \ \ AND Z3, X0, Z4 \ // masked(xH + xL) AND Z3, X1, Z5 \ \ MUL Z6, X0, Z2 \ MUL T1, X0, Z3 \ \ ADDS Z4, Z0 \ UMULH T1, X0, Z4 \ ADCS Z5, Z1 \ UMULH Z6, X0, Z5 \ ADC ZR, T0 \ \ // (xH + xL) * (yH + yL) mul128x128comba(X0, X1, Z6, T1, Z2, Z3, Z4, Z5, Z7)\ \ LDP 0+X, (X0, X1) \ \ ADDS Z0, Z4 \ UMULH Y0, X0, Z7 \ UMULH Y1, X0, T1 \ ADCS Z1, Z5 \ MUL Y0, X0, Z0 \ MUL Y1, X0, Z1 \ ADC ZR, T0 \ \ // xL * yL mul128x128comba(X0, X1, Y0, Y1, Z0, Z1, T1, Z7, Z6)\ \ MUL Y2, X2, X0 \ UMULH Y2, X2, Y0 \ SUBS Z0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL SBCS Z1, Z3 \ SBCS T1, Z4 \ MUL Y3, X2, X1 \ UMULH Y3, X2, Z6 \ SBCS Z7, Z5 \ SBCS ZR, T0 \ \ // xH * yH mul128x128comba(X2, X3, Y2, Y3, X0, X1, Z6, Y0, Y1)\ \ SUBS X0, Z2 \ // (xH + xL) * (yH + yL) - xL * yL - xH * yH SBCS X1, Z3 \ SBCS Z6, Z4 \ SBCS Y0, Z5 \ SBCS ZR, T0 \ \ ADDS T1, Z2 \ // (xH * yH) * 2^256 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^128 + xL * yL ADCS Z7, Z3 \ ADCS X0, Z4 \ ADCS X1, Z5 \ ADCS T0, Z6 \ ADC Y0, ZR, Z7 // This implements two-level Karatsuba with a 128x128 Comba multiplier // at the bottom TEXT ·fp503Mul(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load xL in R3-R6, xH in R7-R10 // (xH + xL) in R25-R29 LDP 0(R0), (R3, R4) LDP 32(R0), (R7, R8) ADDS R3, R7, R25 ADCS R4, R8, R26 LDP 16(R0), (R5, R6) LDP 48(R0), (R9, R10) ADCS R5, R9, R27 ADCS R6, R10, R29 ADC ZR, ZR, R7 // Load yL in R11-R14, yH in R15-19 // (yH + yL) in R11-R14, destroys yL LDP 0(R1), (R11, R12) LDP 32(R1), (R15, R16) ADDS R15, R11 ADCS R16, R12 LDP 16(R1), (R13, R14) LDP 48(R1), (R17, R19) ADCS R17, R13 ADCS R19, R14 ADC ZR, ZR, R8 // Compute maskes and combined carry SUB R7, ZR, R9 SUB R8, ZR, R10 AND R8, R7 // masked(yH + yL) AND R9, R11, R15 AND R9, R12, R16 AND R9, R13, R17 AND R9, R14, R19 // masked(xH + xL) AND R10, R25, R20 AND R10, R26, R21 AND R10, R27, R22 AND R10, R29, R23 // masked(xH + xL) + masked(yH + yL) in R15-R19 ADDS R20, R15 ADCS R21, R16 ADCS R22, R17 ADCS R23, R19 ADC ZR, R7 // Use z as temporary storage STP (R25, R26), 0(R2) // (xH + xL) * (yH + yL) mul256x256karatsuba(0(R2), R25, R26, R27, R29, R11, R12, R13, R14, R8, R9, R10, R20, R21, R22, R23, R24, R0, R1) MOVD x+8(FP), R0 MOVD y+16(FP), R1 ADDS R21, R15 ADCS R22, R16 ADCS R23, R17 ADCS R24, R19 ADC ZR, R7 // Load yL in R11-R14 LDP 0(R1), (R11, R12) LDP 16(R1), (R13, R14) // xL * yL mul256x256karatsuba(0(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R1, R2) MOVD z+0(FP), R2 MOVD y+16(FP), R1 // (xH + xL) * (yH + yL) - xL * yL SUBS R21, R8 SBCS R22, R9 STP (R21, R22), 0(R2) SBCS R23, R10 SBCS R24, R20 STP (R23, R24), 16(R2) SBCS R25, R15 SBCS R26, R16 SBCS R27, R17 SBCS R29, R19 SBC ZR, R7 // Load xH in R3-R6, yH in R11-R14 LDP 32(R0), (R3, R4) LDP 48(R0), (R5, R6) LDP 32(R1), (R11, R12) LDP 48(R1), (R13, R14) ADDS R25, R8 ADCS R26, R9 ADCS R27, R10 ADCS R29, R20 ADC ZR, ZR, R1 MOVD R20, 32(R2) // xH * yH mul256x256karatsuba(32(R0), R3, R4, R5, R6, R11, R12, R13, R14, R21, R22, R23, R24, R25, R26, R27, R29, R2, R20) NEG R1, R1 MOVD z+0(FP), R2 MOVD 32(R2), R20 // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R8-R10,R20,R15-R19 // Store lower half in z, that's done SUBS R21, R8 SBCS R22, R9 STP (R8, R9), 32(R2) SBCS R23, R10 SBCS R24, R20 STP (R10, R20), 48(R2) SBCS R25, R15 SBCS R26, R16 SBCS R27, R17 SBCS R29, R19 SBC ZR, R7 // (xH * yH) * 2^512 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^256 + xL * yL // Store remaining limbs in z ADDS $1, R1 ADCS R21, R15 ADCS R22, R16 STP (R15, R16), 64(R2) ADCS R23, R17 ADCS R24, R19 STP (R17, R19), 80(R2) ADCS R7, R25 ADCS ZR, R26 STP (R25, R26), 96(R2) ADCS ZR, R27 ADC ZR, R29 STP (R27, R29), 112(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X1) * (Y0-Y3) will be in Z0-Z5 // Inputs remain intact #define mul128x256comba(X0, X1, Y0, Y1, Y2, Y3, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3)\ MUL X1, Y0, T0 \ UMULH X1, Y0, T1 \ ADDS Z3, Z1 \ ADC ZR, Z2 \ \ MUL X0, Y2, T2 \ UMULH X0, Y2, T3 \ ADDS T0, Z1 \ ADCS T1, Z2 \ ADC ZR, ZR, Z3 \ \ MUL X1, Y1, T0 \ UMULH X1, Y1, T1 \ ADDS T2, Z2 \ ADCS T3, Z3 \ ADC ZR, ZR, Z4 \ \ MUL X0, Y3, T2 \ UMULH X0, Y3, T3 \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, Z4 \ \ MUL X1, Y2, T0 \ UMULH X1, Y2, T1 \ ADDS T2, Z3 \ ADCS T3, Z4 \ ADC ZR, ZR, Z5 \ \ MUL X1, Y3, T2 \ UMULH X1, Y3, T3 \ ADDS T0, Z3 \ ADCS T1, Z4 \ ADC ZR, Z5 \ ADDS T2, Z4 \ ADC T3, Z5 // This implements the shifted 2^(B*w) Montgomery reduction from // https://eprint.iacr.org/2016/986.pdf with B = 4, w = 64 TEXT ·fp503MontgomeryReduce(SB), NOSPLIT, $0-16 MOVD x+8(FP), R0 // Load x0-x1 LDP 0(R0), (R2, R3) // Load the prime constant in R25-R29 LDP ·p503p1s8+32(SB), (R25, R26) LDP ·p503p1s8+48(SB), (R27, R29) // [x0,x1] * p503p1s8 to R4-R9 MUL R2, R25, R4 // x0 * p503p1s8[0] UMULH R2, R25, R7 MUL R2, R26, R5 // x0 * p503p1s8[1] UMULH R2, R26, R6 mul128x256comba(R2, R3, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13) LDP 16(R0), (R3, R11) // x2 LDP 32(R0), (R12, R13) LDP 48(R0), (R14, R15) // Left-shift result in R4-R9 by 56 to R4-R10 ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R11 // x3 ADCS R5, R12 // x4 ADCS R6, R13 ADCS R7, R14 ADCS R8, R15 LDP 64(R0), (R16, R17) LDP 80(R0), (R19, R20) MUL R3, R25, R4 // x2 * p503p1s8[0] UMULH R3, R25, R7 ADCS R9, R16 ADCS R10, R17 ADCS ZR, R19 ADCS ZR, R20 LDP 96(R0), (R21, R22) LDP 112(R0), (R23, R24) MUL R3, R26, R5 // x2 * p503p1s8[1] UMULH R3, R26, R6 ADCS ZR, R21 ADCS ZR, R22 ADCS ZR, R23 ADC ZR, R24 // [x2,x3] * p503p1s8 to R4-R9 mul128x256comba(R3, R11, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R13 // x5 ADCS R5, R14 // x6 ADCS R6, R15 ADCS R7, R16 MUL R12, R25, R4 // x4 * p503p1s8[0] UMULH R12, R25, R7 ADCS R8, R17 ADCS R9, R19 ADCS R10, R20 ADCS ZR, R21 MUL R12, R26, R5 // x4 * p503p1s8[1] UMULH R12, R26, R6 ADCS ZR, R22 ADCS ZR, R23 ADC ZR, R24 // [x4,x5] * p503p1s8 to R4-R9 mul128x256comba(R12, R13, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 ADDS R4, R15 // x7 ADCS R5, R16 // x8 ADCS R6, R17 ADCS R7, R19 MUL R14, R25, R4 // x6 * p503p1s8[0] UMULH R14, R25, R7 ADCS R8, R20 ADCS R9, R21 ADCS R10, R22 MUL R14, R26, R5 // x6 * p503p1s8[1] UMULH R14, R26, R6 ADCS ZR, R23 ADC ZR, R24 // [x6,x7] * p503p1s8 to R4-R9 mul128x256comba(R14, R15, R25, R26, R27, R29, R4, R5, R6, R7, R8, R9, R10, R0, R1, R2) ORR R9>>8, ZR, R10 LSL $56, R9 ORR R8>>8, R9 LSL $56, R8 ORR R7>>8, R8 LSL $56, R7 ORR R6>>8, R7 LSL $56, R6 ORR R5>>8, R6 LSL $56, R5 ORR R4>>8, R5 LSL $56, R4 MOVD z+0(FP), R0 ADDS R4, R17 ADCS R5, R19 STP (R16, R17), 0(R0) // Store final result to z ADCS R6, R20 ADCS R7, R21 STP (R19, R20), 16(R0) ADCS R8, R22 ADCS R9, R23 STP (R21, R22), 32(R0) ADC R10, R24 STP (R23, R24), 48(R0) RET TEXT ·fp503StrongReduce(SB), NOSPLIT, $0-8 MOVD x+0(FP), R0 // Keep x in R1-R8, p503 in R9-R14, subtract to R1-R8 LDP ·p503+16(SB), (R9, R10) LDP 0(R0), (R1, R2) LDP 16(R0), (R3, R4) SUBS R9, R1 SBCS R9, R2 LDP 32(R0), (R5, R6) LDP ·p503+32(SB), (R11, R12) SBCS R9, R3 SBCS R10, R4 LDP 48(R0), (R7, R8) LDP ·p503+48(SB), (R13, R14) SBCS R11, R5 SBCS R12, R6 SBCS R13, R7 SBCS R14, R8 SBC ZR, ZR, R15 // Mask with the borrow and add p503 AND R15, R9 AND R15, R10 AND R15, R11 AND R15, R12 AND R15, R13 AND R15, R14 ADDS R9, R1 ADCS R9, R2 STP (R1, R2), 0(R0) ADCS R9, R3 ADCS R10, R4 STP (R3, R4), 16(R0) ADCS R11, R5 ADCS R12, R6 STP (R5, R6), 32(R0) ADCS R13, R7 ADCS R14, R8 STP (R7, R8), 48(R0) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_decl.go000066400000000000000000000023101365325520100262170ustar00rootroot00000000000000// +build amd64,!noasm arm64,!noasm package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) // If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. // If choice is neither 0 nor 1 then behaviour is undefined. // This function executes in constant time. //go:noescape func fp503ConditionalSwap(x, y *FpElement, choice uint8) // Compute z = x + y (mod p). //go:noescape func fp503AddReduced(z, x, y *FpElement) // Compute z = x - y (mod p). //go:noescape func fp503SubReduced(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp503AddLazy(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp503X2AddLazy(z, x, y *FpElementX2) // Compute z = x - y, without reducing mod p. //go:noescape func fp503X2SubLazy(z, x, y *FpElementX2) // Reduce a field element in [0, 2*p) to one in [0,p). //go:noescape func fp503StrongReduce(x *FpElement) // Computes z = x * y. //go:noescape func fp503Mul(z *FpElementX2, x, y *FpElement) // Computes the Montgomery reduction z = x R^{-1} (mod 2*p). On return value // of x may be changed. z=x not allowed. //go:noescape func fp503MontgomeryReduce(z *FpElement, x *FpElementX2) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_generic.go000066400000000000000000000102471365325520100267340ustar00rootroot00000000000000// +build noasm !amd64,!arm64 package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/arith" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) // Compute z = x + y (mod p). func fp503AddReduced(z, x, y *FpElement) { var carry uint64 // z=x+y % p503 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } // z = z - p503x2 carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Subc64(carry, z[i], p503x2[i]) } // if z<0 add p503x2 back mask := uint64(0 - carry) carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, z[i], p503x2[i]&mask) } } // Compute z = x - y (mod p). func fp503SubReduced(z, x, y *FpElement) { var borrow uint64 // z = z - p503x2 for i := 0; i < NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // if z<0 add p503x2 back mask := uint64(0 - borrow) borrow = 0 for i := 0; i < NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p503x2[i]&mask) } } // Conditionally swaps bits in x and y in constant time. // mask indicates bits to be swapped (set bits are swapped) // For details see "Hackers Delight, 2.20" // // Implementation doesn't actually depend on a prime field. func fp503ConditionalSwap(x, y *FpElement, mask uint8) { var tmp, mask64 uint64 mask64 = 0 - uint64(mask) for i := 0; i < NumWords; i++ { tmp = mask64 & (x[i] ^ y[i]) x[i] = tmp ^ x[i] y[i] = tmp ^ y[i] } } // Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) // with R=2^512. Destroys the input value. func fp503MontgomeryReduce(z *FpElement, x *FpElementX2) { var carry, t, u, v uint64 var uv Uint128 var count int count = 3 // number of 0 digits in the least significat part of p503 + 1 for i := 0; i < NumWords; i++ { for j := 0; j < i; j++ { if j < (i - count + 1) { uv = Mul64(z[j], p503p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i] = v v = u u = t t = 0 } for i := NumWords; i < 2*NumWords-1; i++ { if count > 0 { count-- } for j := i - NumWords + 1; j < NumWords; j++ { if j < (NumWords - count) { uv = Mul64(z[j], p503p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i-NumWords] = v v = u u = t t = 0 } v, carry = Addc64(0, v, x[2*NumWords-1]) z[NumWords-1] = v } // Compute z = x * y. func fp503Mul(z *FpElementX2, x, y *FpElement) { var u, v, t uint64 var carry uint64 var uv Uint128 for i := uint64(0); i < NumWords; i++ { for j := uint64(0); j <= i; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } for i := NumWords; i < (2*NumWords)-1; i++ { for j := i - NumWords + 1; j < NumWords; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } z[2*NumWords-1] = v } // Compute z = x + y, without reducing mod p. func fp503AddLazy(z, x, y *FpElement) { var carry uint64 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Compute z = x + y, without reducing mod p. func fp503X2AddLazy(z, x, y *FpElementX2) { var carry uint64 for i := 0; i < 2*NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Reduce a field element in [0, 2*p) to one in [0,p). func fp503StrongReduce(x *FpElement) { var borrow, mask uint64 for i := 0; i < NumWords; i++ { x[i], borrow = Subc64(borrow, x[i], p503[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := 0; i < NumWords; i++ { x[i], borrow = Addc64(borrow, x[i], p503[i]&mask) } } // Compute z = x - y, without reducing mod p. func fp503X2SubLazy(z, x, y *FpElementX2) { var borrow, mask uint64 for i := 0; i < 2*NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := NumWords; i < 2*NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p503[i-NumWords]&mask) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/arith_test.go000066400000000000000000000206351365325520100263010ustar00rootroot00000000000000package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "math/big" "testing" "testing/quick" ) //------------------------------------------------------------------------------ // Extended Field //------------------------------------------------------------------------------ func TestOneFp2ToBytes(t *testing.T) { var x = P503OneFp2 var xBytes [2 * P503_Bytelen]byte kCurveOps.Fp2ToBytes(xBytes[:], &x) if xBytes[0] != 1 { t.Error("Expected 1, got", xBytes[0]) } for i := 1; i < 2*P503_Bytelen; i++ { if xBytes[i] != 0 { t.Error("Expected 0, got", xBytes[0]) } } } func TestFp2ElementToBytesRoundTrip(t *testing.T) { roundTrips := func(x GeneratedTestParams) bool { var xBytes [2 * P503_Bytelen]byte var xPrime Fp2Element kCurveOps.Fp2ToBytes(xBytes[:], &x.ExtElem) kCurveOps.Fp2FromBytes(&xPrime, xBytes[:]) return VartimeEqFp2(&xPrime, &x.ExtElem) } if err := quick.Check(roundTrips, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulDistributesOverAdd(t *testing.T) { mulDistributesOverAdd := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x+y)*z t1 := new(Fp2Element) kFieldOps.Add(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = x*z + y*z t2 := new(Fp2Element) t3 := new(Fp2Element) kFieldOps.Mul(t2, &x.ExtElem, &z.ExtElem) kFieldOps.Mul(t3, &y.ExtElem, &z.ExtElem) kFieldOps.Add(t2, t2, t3) return VartimeEqFp2(t1, t2) } if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulIsAssociative(t *testing.T) { isAssociative := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x*y)*z t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = (y*z)*x t2 := new(Fp2Element) kFieldOps.Mul(t2, &y.ExtElem, &z.ExtElem) kFieldOps.Mul(t2, t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(isAssociative, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementSquareMatchesMul(t *testing.T) { sqrMatchesMul := func(x GeneratedTestParams) bool { // Compute t1 = (x*x) t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &x.ExtElem) // Compute t2 = x^2 t2 := new(Fp2Element) kFieldOps.Square(t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementInv(t *testing.T) { inverseIsCorrect := func(x GeneratedTestParams) bool { z := new(Fp2Element) kFieldOps.Inv(z, &x.ExtElem) // Now z = (1/x), so (z * x) * x == x kFieldOps.Mul(z, z, &x.ExtElem) kFieldOps.Mul(z, z, &x.ExtElem) return VartimeEqFp2(z, &x.ExtElem) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(inverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementBatch3Inv(t *testing.T) { batchInverseIsCorrect := func(x1, x2, x3 GeneratedTestParams) bool { var x1Inv, x2Inv, x3Inv Fp2Element kFieldOps.Inv(&x1Inv, &x1.ExtElem) kFieldOps.Inv(&x2Inv, &x2.ExtElem) kFieldOps.Inv(&x3Inv, &x3.ExtElem) var y1, y2, y3 Fp2Element kCurveOps.Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) return (VartimeEqFp2(&x1Inv, &y1) && VartimeEqFp2(&x2Inv, &y2) && VartimeEqFp2(&x3Inv, &y3)) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (5 + quickCheckScaleFactor))} if err := quick.Check(batchInverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ func TestPrimeFieldElementMulVersusBigInt(t *testing.T) { mulMatchesBigInt := func(x, y primeFieldElement) bool { z := new(primeFieldElement) z.Mul(&x, &y) check := new(big.Int) check.Mul(toBigInt(&x.A), toBigInt(&y.A)) check.Mod(check, p503BigIntPrime) return check.Cmp(toBigInt(&z.A)) == 0 } if err := quick.Check(mulMatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementP34VersusBigInt(t *testing.T) { var p34, _ = new(big.Int).SetString("3293960789226779345209813229049836260623046691894590999611415869258960983005190308379728727886506087902151787597521914245745576582754898490288559357951", 10) p34MatchesBigInt := func(x primeFieldElement) bool { z := new(primeFieldElement) z.P34(&x) check := toBigInt(&x.A) check.Exp(check, p34, p503BigIntPrime) return check.Cmp(toBigInt(&z.A)) == 0 } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(p34MatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementToBigInt(t *testing.T) { // Chosen so that p < xR < 2p x := primeFieldElement{A: FpElement{ 1, 1, 1, 1, 1, 1, 1, 36028797018963968, }, } // Computed using Sage: // sage: p = 2^e2 * 3^e3 - 1 // sage: R = 2^512 // sage: from_radix_64 = lambda xs: sum((xi * (2**64)**i for i,xi in enumerate(xs))) // sage: xR = from_radix_64([1]*7 + [2^55]) // sage: assert(p < xR) // sage: assert(xR < 2*p) // sage: (xR / R) % p xBig, _ := new(big.Int).SetString("9018685569593152305590037326062904046918870374552508285127709347526265324701162612011653377441752634975109935373869185819144129719824212073345315986301", 10) if xBig.Cmp(toBigInt(&x.A)) != 0 { t.Error("Expected", xBig, "found", toBigInt(&x.A)) } } func TestFpElementConditionalSwap(t *testing.T) { var one = FpElement{1, 1, 1, 1, 1, 1, 1, 1} var two = FpElement{2, 2, 2, 2, 2, 2, 2, 2} var x = one var y = two fp503ConditionalSwap(&x, &y, 0) if !(x == one && y == two) { t.Error("Found", x, "expected", one) } fp503ConditionalSwap(&x, &y, 1) if !(x == two && y == one) { t.Error("Found", x, "expected", two) } } func BenchmarkFp2ElementMul(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Mul(w, z, z) } } func BenchmarkFp2ElementInv(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Inv(w, z) } } func BenchmarkFp2ElementSquare(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Square(w, z) } } func BenchmarkFp2ElementAdd(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Add(w, z, z) } } func BenchmarkFp2ElementSub(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Sub(w, z, z) } } func BenchmarkPrimeFieldElementMul(b *testing.B) { z := &primeFieldElement{A: bench_x} w := new(primeFieldElement) for n := 0; n < b.N; n++ { w.Mul(z, z) } } // --- field operation functions func BenchmarkFp503Multiply(b *testing.B) { for n := 0; n < b.N; n++ { fp503Mul(&benchmarkFpElementX2, &bench_x, &bench_y) } } func BenchmarkFp503MontgomeryReduce(b *testing.B) { z := bench_z // This benchmark actually computes garbage, because // fp503MontgomeryReduce mangles its input, but since it's // constant-time that shouldn't matter for the benchmarks. for n := 0; n < b.N; n++ { fp503MontgomeryReduce(&benchmarkFpElement, &z) } } func BenchmarkFp503AddReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp503AddReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp503SubReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp503SubReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp503ConditionalSwap(b *testing.B) { x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp503ConditionalSwap(&x, &y, 1) fp503ConditionalSwap(&x, &y, 0) } } func BenchmarkFp503StrongReduce(b *testing.B) { x := bench_x for n := 0; n < b.N; n++ { fp503StrongReduce(&x) } } func BenchmarkFp503AddLazy(b *testing.B) { var z FpElement x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp503AddLazy(&z, &x, &y) } } func BenchmarkFp503X2AddLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp503X2AddLazy(&x, &y, &z) } } func BenchmarkFp503X2SubLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp503X2SubLazy(&x, &y, &z) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/consts.go000066400000000000000000000160301365325520100254360ustar00rootroot00000000000000package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" cpu "github.com/henrydcase/nobs/utils" ) const ( // SIDH public key byte size P503_PublicKeySize = 378 // SIDH shared secret byte size. P503_SharedSecretSize = 126 // Max size of secret key for 2-torsion group, corresponds to 2^e2 - 1 P503_SecretBitLenA = 250 // Size of secret key for 3-torsion group, corresponds to log_2(3^e3) - 1 P503_SecretBitLenB = 252 // Size of a compuatation strategy for 2-torsion group strategySizeA = 124 // Size of a compuatation strategy for 3-torsion group strategySizeB = 158 // ceil(503+7/8) P503_Bytelen = 63 // Number of limbs for a field element NumWords = 8 ) // CPU Capabilities. Those flags are referred by assembly code. According to // https://github.com/golang/go/issues/28230, variables referred from the // assembly must be in the same package. // We declare them variables not constants in order to facilitate testing. var ( // Signals support for MULX which is in BMI2 HasBMI2 = cpu.X86.HasBMI2 // Signals support for ADX and BMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX ) // The x-coordinate of PA var P503_affine_PA = Fp2Element{ A: FpElement{ 0xE7EF4AA786D855AF, 0xED5758F03EB34D3B, 0x09AE172535A86AA9, 0x237B9CC07D622723, 0xE3A284CBA4E7932D, 0x27481D9176C5E63F, 0x6A323FF55C6E71BF, 0x002ECC31A6FB8773, }, B: FpElement{ 0x64D02E4E90A620B8, 0xDAB8128537D4B9F1, 0x4BADF77B8A228F98, 0x0F5DBDF9D1FB7D1B, 0xBEC4DB288E1A0DCC, 0xE76A8665E80675DB, 0x6D6F252E12929463, 0x003188BD1463FACC, }, } // The x-coordinate of QA var P503_affine_QA = Fp2Element{ A: FpElement{ 0xB79D41025DE85D56, 0x0B867DA9DF169686, 0x740E5368021C827D, 0x20615D72157BF25C, 0xFF1590013C9B9F5B, 0xC884DCADE8C16CEA, 0xEBD05E53BF724E01, 0x0032FEF8FDA5748C, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RA = PA-QA var P503_affine_RA = Fp2Element{ A: FpElement{ 0x12E2E849AA0A8006, 0x41CF47008635A1E8, 0x9CD720A70798AED7, 0x42A820B42FCF04CF, 0x7BF9BAD32AAE88B1, 0xF619127A54090BBE, 0x1CB10D8F56408EAA, 0x001D6B54C3C0EDEB, }, B: FpElement{ 0x34DB54931CBAAC36, 0x420A18CB8DD5F0C4, 0x32008C1A48C0F44D, 0x3B3BA772B1CFD44D, 0xA74B058FDAF13515, 0x095FC9CA7EEC17B4, 0x448E829D28F120F8, 0x00261EC3ED16A489, }, } // The x-coordinate of PB var P503_affine_PB = Fp2Element{ A: FpElement{ 0x7EDE37F4FA0BC727, 0xF7F8EC5C8598941C, 0xD15519B516B5F5C8, 0xF6D5AC9B87A36282, 0x7B19F105B30E952E, 0x13BD8B2025B4EBEE, 0x7B96D27F4EC579A2, 0x00140850CAB7E5DE, }, B: FpElement{ 0x7764909DAE7B7B2D, 0x578ABB16284911AB, 0x76E2BFD146A6BF4D, 0x4824044B23AA02F0, 0x1105048912A321F3, 0xB8A2E482CF0F10C1, 0x42FF7D0BE2152085, 0x0018E599C5223352, }, } // The x-coordinate of QB var P503_affine_QB = Fp2Element{ A: FpElement{ 0x4256C520FB388820, 0x744FD7C3BAAF0A13, 0x4B6A2DDDB12CBCB8, 0xE46826E27F427DF8, 0xFE4A663CD505A61B, 0xD6B3A1BAF025C695, 0x7C3BB62B8FCC00BD, 0x003AFDDE4A35746C, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RB = PB - QB var P503_affine_RB = Fp2Element{ A: FpElement{ 0x75601CD1E6C0DFCB, 0x1A9007239B58F93E, 0xC1F1BE80C62107AC, 0x7F513B898F29FF08, 0xEA0BEDFF43E1F7B2, 0x2C6D94018CBAE6D0, 0x3A430D31BCD84672, 0x000D26892ECCFE83, }, B: FpElement{ 0x1119D62AEA3007A1, 0xE3702AA4E04BAE1B, 0x9AB96F7D59F990E7, 0xF58440E8B43319C0, 0xAF8134BEE1489775, 0xE7F7774E905192AA, 0xF54AE09308E98039, 0x001EF7A041A86112, }, } // 2-torsion group computation strategy var P503_AliceIsogenyStrategy = [strategySizeA]uint32{ 0x3D, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1D, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01} // 3-torsion group computation strategy var P503_BobIsogenyStrategy = [strategySizeB]uint32{ 0x47, 0x26, 0x15, 0x0D, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x21, 0x11, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01} // Used internally by this package // ------------------------------- var p503 = FpElement{ 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xABFFFFFFFFFFFFFF, 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, } // 2*503 var p503x2 = FpElement{ 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x57FFFFFFFFFFFFFF, 0x2610B7B44423CF41, 0x3737ED90F6FCFB5E, 0xC08B8D7BB4EF49A0, 0x0080CDEA83023C3C, } // p503 + 1 var p503p1 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xAC00000000000000, 0x13085BDA2211E7A0, 0x1B9BF6C87B7E7DAF, 0x6045C6BDDA77A4D0, 0x004066F541811E1E, } // R^2=(2^512)^2 mod p var p503R2 = FpElement{ 0x5289A0CF641D011F, 0x9B88257189FED2B9, 0xA3B365D58DC8F17A, 0x5BC57AB6EFF168EC, 0x9E51998BD84D4423, 0xBF8999CBAC3B5695, 0x46E9127BCE14CDB6, 0x003F6CFCE8B81771, } // p503 + 1 left-shifted by 8, assuming little endianness var p503p1s8 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x085BDA2211E7A0AC, 0x9BF6C87B7E7DAF13, 0x45C6BDDA77A4D01B, 0x4066F541811E1E60, } // 1*R mod p var P503OneFp2 = Fp2Element{ A: FpElement{ 0x00000000000003F9, 0x0000000000000000, 0x0000000000000000, 0xB400000000000000, 0x63CB1A6EA6DED2B4, 0x51689D8D667EB37D, 0x8ACD77C71AB24142, 0x0026FBAEC60F5953}, } // 1/2 * R mod p var P503HalfFp2 = Fp2Element{ A: FpElement{ 0x00000000000001FC, 0x0000000000000000, 0x0000000000000000, 0xB000000000000000, 0x3B69BB2464785D2A, 0x36824A2AF0FE9896, 0xF5899F427A94F309, 0x0033B15203C83BB8}, } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/curve_test.go000066400000000000000000000117041365325520100263130ustar00rootroot00000000000000package p503 import ( "bytes" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "testing" "testing/quick" ) func TestOne(t *testing.T) { var tmp Fp2Element kFieldOps.Mul(&tmp, &P503OneFp2, &affine_xP) if !VartimeEqFp2(&tmp, &affine_xP) { t.Error("Not equal 1") } } // This test is here only to ensure that ScalarMult helper works correctly func TestScalarMultVersusSage(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} xP = ScalarMult(&curve, &xP, mScalarBytes[:]) // = x([m]P) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(&affine_xaP, affine_xQ) { t.Error("\nExpected\n", affine_xaP, "\nfound\n", affine_xQ) } } func Test_jInvariant(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var jbufRes [P503_SharedSecretSize]byte var jbufExp [P503_SharedSecretSize]byte // Computed using Sage // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845 var known_j = Fp2Element{ A: FpElement{0x2c441d03b72e27c, 0xf2c6748151dbf84, 0x3a774f6191070e, 0xa7c6212c9c800ba6, 0x23921b5cf09abc27, 0x9e1baefbb3cd4265, 0x8cd6a289f12e10dc, 0x3fa364128cf87e}, B: FpElement{0xe7497ac2bf6b0596, 0x629ee01ad23bd039, 0x95ee11587a119fa7, 0x572fb28a24772269, 0x3c00410b6c71567e, 0xe681e83a345f8a34, 0x65d21b1d96bd2d52, 0x7889a47e58901}, } kCurveOps.Jinvariant(&curve, jbufRes[:]) kCurveOps.Fp2ToBytes(jbufExp[:], &known_j) if !bytes.Equal(jbufRes[:], jbufExp[:]) { t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) } } func TestProjectivePointVartimeEq(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} xQ := xP // Scale xQ, which results in the same projective point kFieldOps.Mul(&xQ.X, &xQ.X, &curve_A) kFieldOps.Mul(&xQ.Z, &xQ.Z, &curve_A) if !VartimeEqProjFp2(&xP, &xQ) { t.Error("Expected the scaled point to be equal to the original") } } func TestPointDoubleVersusSage(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 1) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP2) { t.Error("\nExpected\n", affine_xP2, "\nfound\n", affine_xQ) } } func TestPointMul4VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP4) { t.Error("\nExpected\n", affine_xP4, "\nfound\n", affine_xQ) } } func TestPointMul9VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv3(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} kCurveOps.Pow3k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP9) { t.Error("\nExpected\n", affine_xP9, "\nfound\n", affine_xQ) } } func TestPointPow2kVersusScalarMult(t *testing.T) { var xP, xQ, xR ProjectivePoint var params = kCurveOps.CalcCurveParamsEquiv4(&curve) xP = ProjectivePoint{X: affine_xP, Z: P503OneFp2} xQ = xP kCurveOps.Pow2k(&xQ, ¶ms, 5) xR = ScalarMult(&curve, &xP, []byte{32}) affine_xQ := xQ.ToAffine(kCurveOps) // = x([32]P) affine_xR := xR.ToAffine(kCurveOps) // = x([32]P) if !VartimeEqFp2(affine_xQ, affine_xR) { t.Error("\nExpected\n", affine_xQ, "\nfound\n", affine_xR) } } func TestPointTripleVersusAddDouble(t *testing.T) { tripleEqualsAddDouble := func(params GeneratedTestParams) bool { var P2, P3, P2plusP ProjectivePoint eqivParams4 := kCurveOps.CalcCurveParamsEquiv4(¶ms.Cparam) eqivParams3 := kCurveOps.CalcCurveParamsEquiv3(¶ms.Cparam) P2 = params.Point P3 = params.Point kCurveOps.Pow2k(&P2, &eqivParams4, 1) // = x([2]P) kCurveOps.Pow3k(&P3, &eqivParams3, 1) // = x([3]P) P2plusP = AddProjFp2(&P2, ¶ms.Point, ¶ms.Point) // = x([2]P + P) return VartimeEqProjFp2(&P3, &P2plusP) } if err := quick.Check(tripleEqualsAddDouble, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkThreePointLadder255BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{203, 155, 185, 191, 131, 228, 50, 178, 207, 191, 61, 141, 174, 173, 207, 243, 159, 243, 46, 163, 19, 102, 69, 92, 36, 225, 0, 37, 114, 19, 191, 0} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], 255, mScalarBytes[:]) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/field_ops.go000066400000000000000000000170731365325520100261010ustar00rootroot00000000000000package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) type fp503Ops struct{} func FieldOperations() FieldOps { return &fp503Ops{} } func (fp503Ops) Add(dest, lhs, rhs *Fp2Element) { fp503AddReduced(&dest.A, &lhs.A, &rhs.A) fp503AddReduced(&dest.B, &lhs.B, &rhs.B) } func (fp503Ops) Sub(dest, lhs, rhs *Fp2Element) { fp503SubReduced(&dest.A, &lhs.A, &rhs.A) fp503SubReduced(&dest.B, &lhs.B, &rhs.B) } func (fp503Ops) Mul(dest, lhs, rhs *Fp2Element) { // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). a := &lhs.A b := &lhs.B c := &rhs.A d := &rhs.B // We want to compute // // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i // // Use Karatsuba's trick: note that // // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d // // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. var ac, bd FpElementX2 fp503Mul(&ac, a, c) // = a*c*R*R fp503Mul(&bd, b, d) // = b*d*R*R var b_minus_a, c_minus_d FpElement fp503SubReduced(&b_minus_a, b, a) // = (b-a)*R fp503SubReduced(&c_minus_d, c, d) // = (c-d)*R var ad_plus_bc FpElementX2 fp503Mul(&ad_plus_bc, &b_minus_a, &c_minus_d) // = (b-a)*(c-d)*R*R fp503X2AddLazy(&ad_plus_bc, &ad_plus_bc, &ac) // = ((b-a)*(c-d) + a*c)*R*R fp503X2AddLazy(&ad_plus_bc, &ad_plus_bc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R fp503MontgomeryReduce(&dest.B, &ad_plus_bc) // = (a*d + b*c)*R mod p var ac_minus_bd FpElementX2 fp503X2SubLazy(&ac_minus_bd, &ac, &bd) // = (a*c - b*d)*R*R fp503MontgomeryReduce(&dest.A, &ac_minus_bd) // = (a*c - b*d)*R mod p } // Set dest = 1/x // // Allowed to overlap dest with x. // // Returns dest to allow chaining operations. func (fp503Ops) Inv(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // 1 1 (a - bi) (a - bi) // -------- = -------- -------- = ----------- // (a + bi) (a + bi) (a - bi) (a^2 + b^2) // // Letting c = 1/(a^2 + b^2), this is // // 1/(a+bi) = a*c - b*ci. var asq_plus_bsq primeFieldElement var asq, bsq FpElementX2 fp503Mul(&asq, a, a) // = a*a*R*R fp503Mul(&bsq, b, b) // = b*b*R*R fp503X2AddLazy(&asq, &asq, &bsq) // = (a^2 + b^2)*R*R fp503MontgomeryReduce(&asq_plus_bsq.A, &asq) // = (a^2 + b^2)*R mod p // Now asq_plus_bsq = a^2 + b^2 inv := asq_plus_bsq inv.Mul(&asq_plus_bsq, &asq_plus_bsq) inv.P34(&inv) inv.Mul(&inv, &inv) inv.Mul(&inv, &asq_plus_bsq) var ac FpElementX2 fp503Mul(&ac, a, &inv.A) fp503MontgomeryReduce(&dest.A, &ac) var minus_b FpElement fp503SubReduced(&minus_b, &minus_b, b) var minus_bc FpElementX2 fp503Mul(&minus_bc, &minus_b, &inv.A) fp503MontgomeryReduce(&dest.B, &minus_bc) } func (fp503Ops) Square(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. var a2, a_plus_b, a_minus_b FpElement fp503AddReduced(&a2, a, a) // = a*R + a*R = 2*a*R fp503AddReduced(&a_plus_b, a, b) // = a*R + b*R = (a+b)*R fp503SubReduced(&a_minus_b, a, b) // = a*R - b*R = (a-b)*R var asq_minus_bsq, ab2 FpElementX2 fp503Mul(&asq_minus_bsq, &a_plus_b, &a_minus_b) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R fp503Mul(&ab2, &a2, b) // = 2*a*b*R*R fp503MontgomeryReduce(&dest.A, &asq_minus_bsq) // = (a^2 - b^2)*R mod p fp503MontgomeryReduce(&dest.B, &ab2) // = 2*a*b*R mod p } // In case choice == 1, performs following swap in constant time: // xPx <-> xQx // xPz <-> xQz // Otherwise returns xPx, xPz, xQx, xQz unchanged func (fp503Ops) CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) { fp503ConditionalSwap(&xPx.A, &xQx.A, choice) fp503ConditionalSwap(&xPx.B, &xQx.B, choice) fp503ConditionalSwap(&xPz.A, &xQz.A, choice) fp503ConditionalSwap(&xPz.B, &xQz.B, choice) } // Converts values in x.A and x.B to Montgomery domain // x.A = x.A * R mod p // x.B = x.B * R mod p // Performs v = v*R^2*R^(-1) mod p, for both x.A and x.B func (fp503Ops) ToMontgomery(x *Fp2Element) { var aRR FpElementX2 // convert to montgomery domain fp503Mul(&aRR, &x.A, &p503R2) // = a*R*R fp503MontgomeryReduce(&x.A, &aRR) // = a*R mod p fp503Mul(&aRR, &x.B, &p503R2) fp503MontgomeryReduce(&x.B, &aRR) } // Converts values in x.A and x.B from Montgomery domain // a = x.A mod p // b = x.B mod p // // After returning from the call x is not modified. func (fp503Ops) FromMontgomery(x *Fp2Element, out *Fp2Element) { var aR FpElementX2 // convert from montgomery domain // TODO: make fpXXXMontgomeryReduce use stack instead of reusing aR // so that we don't have do this copy here copy(aR[:], x.A[:]) fp503MontgomeryReduce(&out.A, &aR) // = a mod p in [0, 2p) fp503StrongReduce(&out.A) // = a mod p in [0, p) for i := range aR { aR[i] = 0 } copy(aR[:], x.B[:]) fp503MontgomeryReduce(&out.B, &aR) fp503StrongReduce(&out.B) } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ // Represents an element of the prime field F_p. type primeFieldElement struct { // This field element is in Montgomery form, so that the value `A` is // represented by `aR mod p`. A FpElement } // Set dest = lhs * rhs. // // Allowed to overlap lhs or rhs with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Mul(lhs, rhs *primeFieldElement) *primeFieldElement { a := &lhs.A // = a*R b := &rhs.A // = b*R var ab FpElementX2 fp503Mul(&ab, a, b) // = a*b*R*R fp503MontgomeryReduce(&dest.A, &ab) // = a*b*R mod p return dest } // Set dest = x^(2^k), for k >= 1, by repeated squarings. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Pow2k(x *primeFieldElement, k uint8) *primeFieldElement { dest.Mul(x, x) for i := uint8(1); i < k; i++ { dest.Mul(dest, dest) } return dest } // Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). // Uses variation of sliding-window algorithm from with window size // of 5 and least to most significant bit sliding (left-to-right) // See HAC 14.85 for general description. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) P34(x *primeFieldElement) *primeFieldElement { // Sliding-window strategy computed with etc/scripts/sliding_window_strat_calc.py // // This performs sum(powStrategy) + 1 squarings and len(lookup) + len(mulStrategy) // multiplications. powStrategy := []uint8{1, 12, 5, 5, 2, 7, 11, 3, 8, 4, 11, 4, 7, 5, 6, 3, 7, 5, 7, 2, 12, 5, 6, 4, 6, 8, 6, 4, 7, 5, 5, 8, 5, 8, 5, 5, 8, 9, 3, 6, 2, 10, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3} mulStrategy := []uint8{0, 12, 11, 10, 0, 1, 8, 3, 7, 1, 8, 3, 6, 7, 14, 2, 14, 14, 9, 0, 13, 9, 15, 5, 12, 7, 13, 7, 15, 6, 7, 9, 0, 5, 7, 6, 8, 8, 3, 7, 0, 10, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3} // Precompute lookup table of odd multiples of x for window // size k=5. lookup := [16]primeFieldElement{} xx := &primeFieldElement{} xx.Mul(x, x) lookup[0] = *x for i := 1; i < 16; i++ { lookup[i].Mul(&lookup[i-1], xx) } // Now lookup = {x, x^3, x^5, ... } // so that lookup[i] = x^{2*i + 1} // so that lookup[k/2] = x^k, for odd k *dest = lookup[mulStrategy[0]] for i := uint8(1); i < uint8(len(powStrategy)); i++ { dest.Pow2k(dest, powStrategy[i]) dest.Mul(dest, &lookup[mulStrategy[i]]) } return dest } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/isogeny_test.go000066400000000000000000000132371365325520100266470ustar00rootroot00000000000000package p503 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "testing" ) func TestFourIsogenyVersusSage(t *testing.T) { var xR, xP4, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny4(kFieldOps) // Given 4-torsion point on E, constructs a four-isogeny phi. Then evaluates // point xR on the isogeny and compares with expected result. // Values generated with reference implementation. xP4 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xD00E20EC32B0EC29, 0xB931E12F6B486A34, 0x96EFFCAEC541E83F, 0x415729120E95D243, 0xB15DADFFBC7986EB, 0x27E7697979D482AC, 0xB269E255C3C11421, 0x35DFF53EF1BDE4}, B: FpElement{0x691F8D69E98BBF40, 0xAB3894C2F436C73, 0x6CE884D45D785C50, 0xBCDE642D761476C0, 0x8023EF2FCF4C9506, 0x6E3914CFCA94C8A0, 0x8AFE4F1C54EB8744, 0x163227D8890C30}, }, Z: Fp2Element{ A: FpElement{0x38B48A08355253FD, 0x457A001F6F522A58, 0x1959F48231C94070, 0xDF3B4C55A3FF1202, 0x3835E8FB47E9B93F, 0x84320E41E65889B5, 0x6D4AA6D38651BE7E, 0xF50448746FF64}, B: FpElement{0xEBBCCCBB347E448C, 0xFBC721B5DB2103C9, 0x54FD31DF0C538F18, 0xDE7B3C6CBB60C5BD, 0x86B664DCF5F4B272, 0x705CFC301B13DCD6, 0xFD250579C9257778, 0x366F73666C6C92}, }, } xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x6F50E690932A1473, 0x3EC8EE10B576C790, 0x5CABB067D0648B46, 0x77EA840A4219753C, 0xBFEE6EAB2073A69A, 0x845637223AB3687B, 0x20294B44CBDC9F34, 0x59C58391A33D5C}, B: FpElement{0x68832275EA18BDDC, 0x90039FCD522B6CCF, 0x43A97285E71B711A, 0xBCBFC2C3BCCF6135, 0xDE13C2E410DCF1FE, 0xB9B1243C7E4FC515, 0x3CE1C024813A61D, 0x2BED536959B2D}, }, Z: Fp2Element{ A: FpElement{0x99C27A12675FD4CD, 0x856E300D657ADDE3, 0x156C170BB8983CD3, 0x6A366F8BA2FD7805, 0xE922609C4B80E4A4, 0xAC5A1D2EBE7F2A9A, 0x2E732DAF59AE4A03, 0x6AC91B99882D54}, B: FpElement{0x909A822C8536612D, 0xBF579BF499C34C2D, 0xE2FAD61D94E1E60F, 0x37CB4E1F0A819D5F, 0xDBD36EA4FC053430, 0x28F3805ECA4730D8, 0x33F47EAF9ED8CEA2, 0x24FC2437192954}, }, } expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2E2D7C96BB057AE9, 0x58FF5432A90EA157, 0x6EED2543FED809C7, 0xF721E3657B17C6D3, 0xC9F8EBED3E1430AF, 0xA94DAFEC2ED7275A, 0xFC8A869CF993A64D, 0x45C8B4291BC602}, B: FpElement{0xD5730CA5DA535196, 0x958D80511DCD695F, 0xCFDCAA016F0D6AF, 0x176FAA4414FC230B, 0x61A5CDD045B67365, 0x13AC43A5E7F0E446, 0x7BCABE9E555C2729, 0x2CA6A01B26BFEB}, }, Z: Fp2Element{ A: FpElement{0x684A5999FCD11607, 0x3D0057EA6B62FC92, 0x692895B2D37F8EAA, 0xF0BB08106CCF7FDF, 0x3A521D25A431C5CF, 0x8F8DCB43E0BD2475, 0x9CF6266E32D712D3, 0x3B98B6D5C0B377}, B: FpElement{0x8F4E4EA61ACA375, 0xE8DF168DA6349D03, 0x8DFD68ABA4AB08CC, 0x5352A227C5C6D59C, 0x45750EB03218D4D6, 0x71E2AD1F130DB05E, 0x64F35BBA642804EC, 0x26542493BF5F1C}, }, } phi.GenerateCurve(&xP4) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } func TestThreeIsogenyVersusSage(t *testing.T) { var xR, xP3, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny3(kFieldOps) // Given 3-torsion point on E, constructs a three-isogeny phi. Then evaluates // point xR on the isogeny and compares with expected result. // Values generated with reference implementation. xP3 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x43C64B1158DE7ED, 0xC522F8AB7DCC9247, 0xC5BFCC8EA95E9F4D, 0xA6DFCE67C53F63BC, 0x9C6329D65EBBBE44, 0x91949F2E9864BD5A, 0xC9AE7B8B0435B0AF, 0x1607E735F9E10}, B: FpElement{0x3EEFA1A8B5D59CD9, 0x1ED7264A82282E14, 0x253309D0531054E1, 0x7557CC9966B63AB1, 0xAAB3B77A0CF3D9C, 0xF9BE0DC1977358F4, 0xC5B7AE198CF22874, 0x3250464B34AAD1}, }, Z: Fp2Element{ A: FpElement{0xC06D37BCBBD98418, 0x1C7C9E348A880023, 0xB1F61CA46EA815FD, 0x7E0E5F01EAB9D7B6, 0xE8737A5EF457E188, 0xBD228FDA0BAF18D8, 0xAB7823AF7BAFD785, 0x2BCA7CCFFC1DDA}, B: FpElement{0xBC34D39B7CBF3EDC, 0x882C3AFC4011C8E8, 0x68A2D74B0FBA196E, 0x810E59E7DD937844, 0xE796B5D4BFC3982F, 0xC7D23388B8E91883, 0x552B783D3986109F, 0x1337962318DFC0}, }, } xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xBA300F2F1C010480, 0xE196ACEE08FEA8BA, 0xC1B8AB47C5D6D9A, 0x2CDFF1E375E5FAFC, 0x2D55CBA6472829AF, 0xE03ECA628015CA0E, 0xD1055B779C2DCC6C, 0x7F915F81CAF33}, B: FpElement{0x5179F86B4F63CA45, 0x8CF33AD2D0D7E409, 0xE9065B70EB5F8680, 0xFBA717809FF35FE, 0x8E31E6EF3CAD154C, 0x65907A2B38A0B673, 0x9E5A4FFCF1F7E74, 0x3170F0C18D5F96}, }, Z: Fp2Element{ A: FpElement{0x1F48F3A2DFB1C73B, 0x3E35C8CD0752F9A4, 0x88601205D0B6B8C0, 0xCFF48E40A9C200CD, 0x10E6964543C6195C, 0x6B8F141796914E13, 0xA7B5F96629DF495E, 0x6600DB36C90874}, B: FpElement{0xAB54D5B8247FE6CA, 0xD5EE5EAE7C19E9B4, 0x16CB352BA75CB7EF, 0x6D651A77FEB51C5E, 0x2D72F65AC9D39E8A, 0xE10F942CEAD9C7EA, 0x36A5A27BE681CE7A, 0x1C500AA0D9A62F}, }, } expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x61B04752330F7FFF, 0x67F7FADAE5093E06, 0xB665F1E8F70118C6, 0x4F529F9BB30AE6A0, 0xD38E0FC09717C6D1, 0xB7886970ADE8584B, 0x73D66E118BAA193C, 0x4604C634755CFB}, B: FpElement{0x65CCBE0938AB5A99, 0x1F23B14E1548E3BC, 0x2A565624008051D8, 0xC45D118553BEA2E5, 0x7E2C027737E386EA, 0xF8EC1668C4C09CFB, 0x24CBE8F9D424021D, 0x62E99144A24A6}, }, Z: Fp2Element{ A: FpElement{0x71D9A198BB845CCA, 0xB2D0A8D2168F4399, 0x9C85368AF08AC7E1, 0x76D71A16B7F4B966, 0x60821CCED03DE7DB, 0x80D404686B651216, 0x8489AF1E2E14BF8E, 0x370781CDE810FE}, B: FpElement{0xB12EE10B6B80F65B, 0xC4C1CD99C671118D, 0xB84A2C8B2C153F37, 0x9170BAE0CE11B7A8, 0xF38DE8F9AF1BF991, 0x88612A07E7F7015A, 0x9611B2C68B94BC68, 0x5BCFB00EC5DE0}, }, } phi.GenerateCurve(&xR) resPhiXr = phi.EvaluatePoint(&xP3) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p503/utils_test.go000066400000000000000000000372371365325520100263400ustar00rootroot00000000000000package p503 // Tools used for testing and debugging import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "math/big" "math/rand" "reflect" "testing/quick" ) /* ------------------------------------------------------------------------- Underlying field configuration -------------------------------------------------------------------------*/ var ( kFieldOps = FieldOperations() kParams = &SidhParams{ Op: kFieldOps, OneFp2: P503OneFp2, HalfFp2: P503HalfFp2, Bytelen: P503_Bytelen, } kCurveOps = &CurveOperations{Params: kParams} ) /* ------------------------------------------------------------------------- Configure testing/quick -------------------------------------------------------------------------*/ var ( quickCheckScaleFactor = uint8(3) quickCheckConfig = &quick.Config{MaxCount: (1 << (12 + quickCheckScaleFactor))} ) /* ------------------------------------------------------------------------- Structure used by tests -------------------------------------------------------------------------*/ type GeneratedTestParams struct { Point ProjectivePoint Cparam ProjectiveCurveParameters ExtElem Fp2Element } // A = 8752234765512331234913716743014562460822083005386252003333602919474238975785850965349950219277942402920758585086620525443539725921333735154674119646075*i + 6339624979889725406021454983012408976766782818694212228554611573314701271183857175866122275755278397694585249002282183018114967373119429936587424396917 var curve_A = Fp2Element{ A: FpElement{0xd9816986a543095f, 0xa78cb1d7217bec21, 0x9595dc97b74ea70, 0x9120a1da6b42797d, 0x59ef9d903f74e47c, 0x4c58a4cdc45b6d0b, 0x816d5213aaf7ee6d, 0x3892fee6bb7343}, B: FpElement{0x28c5288acbedf11b, 0x2143a438c86f6c68, 0x7cb5c4ae9c4c8e34, 0xb478aea445eed48b, 0x24d5c175776db478, 0x234582f8676c0ebe, 0x56234267b625fb08, 0x2c6e58d84b1192}} // C = 10458464853790890798085664692909194316288127038910691163573355876336993883402795907795767791362493831987298578966325154262747805705783782806176495638177*i + 7770984753616185271325854825309278833018655051139367603077592443785629339985729818288672809062782315510526648882226172896710704020683893684611137718845 var curve_C = Fp2Element{ A: FpElement{0xe05948236f2f913b, 0xc45da9ad1219a255, 0x7a568972a32fc1d0, 0x30f00bdd7071c3b1, 0x3b761b8dac2c98bc, 0x760f21b2179737b6, 0x13217e6656a13476, 0x2606b798e685aa}, B: FpElement{0x1c0171f78820052e, 0x440b7f7087e57140, 0xe0510c07b31b0e96, 0xd0cf489b2ac4aea9, 0x4fb328f1c1fdf783, 0xb3b4912342951cb7, 0x70a4b64e81961c42, 0x33eed63cf07181}} // x(P) = 9720237205826983370867050298878715935679372786589878620121159082290288918688002583435964840822877971257659901481591644347943354235932355923042390796255*i + 634577413124118560098123299804750904956499531431297942628887930019161512075536652691244843248133437326050395005054997679717801535474938466995392156605 var affine_xP = Fp2Element{ A: FpElement{0xb606d954d407faf2, 0x58a1ef6cd213a203, 0x9823b55033e62f7b, 0x59cafc060d5e25a1, 0x529685f1753526fc, 0xc2eac3d219989c7d, 0xc5e30c75dfd343a0, 0x378285adc968a0}, B: FpElement{0x6670f36db977b9da, 0xa07e2fdda5e1a7f0, 0xf367a7a722aed87d, 0x6c269e06d595cd10, 0x8379aa6092d87700, 0x57276ce3557ee7ae, 0xac8107bfbcd28993, 0x3d6f98869617a7}} // x(Q) = 613162677562606602867371958793876971530136728660199185642812914351735322828980793298955764087721218995329689800176835576008483782305021671417330230966*i + 12939479853552958669415184882894789433224467828463058020095712989798268661016843892597050485554155971441665589419365957826417334087966365414056706471602 var affine_xQ = Fp2Element{ A: FpElement{0xd3d14533cb0db45c, 0xdaf10b9f5fb037cf, 0x9562c31985823562, 0xb79b75e2bf5635a5, 0x83d38fb1669c2d9, 0x5e67117a35a57cbd, 0x4b94ed6c3cbf54a4, 0x3f47706b62778d}, B: FpElement{0x1c766c0e7ed612d6, 0x2f3b42979e8efd86, 0xd82bac0006415ee7, 0x20cfe3bec0970042, 0x8f6628807e862bf9, 0xac4f82d13fddd9c5, 0x70b756e4bac1fa85, 0x350c02508e50dc}} var affine_xPmQ = Fp2Element{ A: FpElement{0x7295ac0e8a5531c8, 0xc02afbef6cdf51a8, 0x84d0c1bb8d80624f, 0x26abbf06c61e814b, 0xada277883fbdae07, 0x63b6739db68df3a7, 0x3554670381bcfcc6, 0x33419be255bbc6}, B: FpElement{0xff9df35102da997a, 0xf9b920b2d8bd6210, 0x43d1514920e73bfb, 0x624c6fd6ef16da74, 0xeb535968ed0d1286, 0x9243e6ce29a636e6, 0x1849ed96cb7940e0, 0x1e4b495933b675}} var affine_xP2 = Fp2Element{ A: FpElement{0x4e1133c2b3855902, 0x875a775c67597fbb, 0xd17eb74254141abb, 0x1d5a464a4f3391f5, 0x24405c332811d007, 0x7e47e3eb489a7372, 0x65b130dfd9efe605, 0xfa69fac179803}, B: FpElement{0x329f5322e1be51ee, 0x9004dca8132ebd6f, 0x7cd87e447ca8a7b6, 0x10a6ec02c38ce69e, 0x8cef2ed7d112ac46, 0x5f385a9fc4b57cd7, 0x68a366354fe7a32e, 0x2223c1455486ac}} var affine_xP3 = Fp2Element{ A: FpElement{0x74a2894cccbe287d, 0xa50e3ec842e13fce, 0xd42ea4d3f1b7ad0b, 0xa4943d50d306f99e, 0xf83e9c0955b08c33, 0xffd8e313402b9380, 0x967b315db0b2e6e, 0x3a0945883df3b4}, B: FpElement{0xa9f610420a81c5ba, 0xbeb84b3ded2b4e75, 0x9fd6cea494470a70, 0x2fb0075e71900b0e, 0x63a0beb6abf3ca3d, 0xeb3e171798959f2e, 0x2209801eb702d40e, 0x36f8c4603e0fdb}} var affine_xP4 = Fp2Element{ A: FpElement{0x4eb695d34b46be8f, 0xfb5e76c58585f2d2, 0xa41f8aafa6dbb531, 0x4db82f5db5cfd144, 0x14dab0e3200cbba0, 0x430381706a279f81, 0xdf6707a57161f81, 0x44740f17197c3}, B: FpElement{0xa2473705cdb6d4e9, 0xfa3cd67b9c15502c, 0xf0928166d0c5cee1, 0x6150aba0c874faaa, 0x6c0b18d6d92f9034, 0xcff71d340fc1e72e, 0x19a47027af917587, 0x25ed4bad443b8f}} var affine_xP9 = Fp2Element{ A: FpElement{0x112da30e288217e0, 0x5b336d527320a5f7, 0xbbf4d9403b68e3c6, 0x55eccb31c40b359c, 0x8907129ab69b3203, 0x69cc8c750125a915, 0xa41a38e6f530c0e1, 0xbe68e23af1b8d}, B: FpElement{0x472c603765964213, 0xe4e64995b0769754, 0x4515583c74a6dd24, 0xff7c57f5818363a2, 0xbeaeb24662a92177, 0x8a54fa61fbf24c68, 0xa85542049eb45e12, 0x2b54caf655e285}} // m = 3904534670189250445536401319770569077681088033069864532895 var mScalarBytes = [...]uint8{0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f, 0x9f, 0x3b, 0xe7, 0xf9, 0xf4, 0x7c, 0xe6, 0xce, 0x79, 0x3e, 0x3d, 0x9f} var affine_xaP = Fp2Element{ A: FpElement{0x100a82c2be58e28b, 0x70ee7b57f40d9103, 0xb9f21d6327411cbb, 0x976b2a65166591cb, 0x35435bd4614ca404, 0x15f862a9c6f51469, 0x14d9ccfe634f374a, 0x31234988b0766c}, B: FpElement{0x323a3a13113b35f8, 0xc949dad174586c8f, 0x1c5ed3b1263143c, 0x13ba9870c9b5bab8, 0x79fb89a31cfe7f19, 0xa8af6d4b5d947ed2, 0xcff00f80d7b67a56, 0xfdfcb136bff75}} // Inputs for testing 3-point-ladder var threePointLadderInputs = []ProjectivePoint{ // x(P) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x43941FA9244C059E, 0xD1F337D076941189, 0x6B6A8B3A8763C96A, 0x6DF569708D6C9482, 0x487EE5707A52F4AA, 0xDE396F6E2559689E, 0xE5EE3895A8991469, 0x2B0946695790A8}, B: FpElement{0xAB552C0FDAED092E, 0x7DF895E43E7DCB1C, 0x35C700E761920C4B, 0xCC5807DD70DC117A, 0x0884039A5A8DB18A, 0xD04620B3D0738052, 0xA200835605138F10, 0x3FF2E59B2FDC6A}}, Z: P503OneFp2, }, // x(Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x77015826982BA1FD, 0x44024489673471E4, 0x1CAA2A5F4D5DA63B, 0xA183C07E50738C01, 0x8B97782D4E1A0DE6, 0x9B819522FBC38280, 0x0BDA46A937FB7B8A, 0x3B3614305914DF}, B: FpElement{0xBF0366E97B3168D9, 0xAA522AC3879CEF0F, 0x0AF5EC975BD035C8, 0x1F26FEE7BBAC165C, 0xA0EE6A637724A6AB, 0xFB52101E36BA3A38, 0xD29CF5E376E17376, 0x1374A50DF57071}}, Z: P503OneFp2, }, // x(P-Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0xD99279BBD41EA559, 0x35CF18E72F578214, 0x90473B1DC77F73E8, 0xBFFEA930B25D7F66, 0xFD558EA177B900B2, 0x7CFAD273A782A23E, 0x6B1F610822E0F611, 0x26D2D2EF9619B5}, B: FpElement{0x534F83651CBCC75D, 0x591FB4757AED5D08, 0x0B04353D40BED542, 0x829A94703AAC9139, 0x0F9C2E6D7663EB5B, 0x5D2D0F90C283F746, 0x34C872AA12A7676E, 0x0ECDB605FBFA16}}, Z: P503OneFp2, }, } var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} // prime p503 var p503BigIntPrime, _ = new(big.Int).SetString("13175843156907117380839252916199345042492186767578363998445663477035843932020761233518914911546024351608607150390087656982982306331019593961154237431807", 10) /* ------------------------------------------------------------------------- Values used by benchmarking tools -------------------------------------------------------------------------*/ // Package-level storage for this field element is intended to deter // compiler optimizations. var ( benchmarkFpElement FpElement benchmarkFpElementX2 FpElementX2 bench_x = FpElement{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} bench_y = FpElement{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} bench_z = FpElementX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} ) /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Given xP = x(P), xQ = x(Q), and xPmQ = x(P-Q), compute xR = x(P+Q). // // Returns xR to allow chaining. Safe to overlap xP, xQ, xR. func AddProjFp2(xP, xQ, xPmQ *ProjectivePoint) ProjectivePoint { // Algorithm 1 of Costello-Smith. var v0, v1, v2, v3, v4 Fp2Element var xR ProjectivePoint kFieldOps.Add(&v0, &xP.X, &xP.Z) // X_P + Z_P kFieldOps.Sub(&v1, &xQ.X, &xQ.Z) kFieldOps.Mul(&v1, &v1, &v0) // (X_Q - Z_Q)(X_P + Z_P) kFieldOps.Sub(&v0, &xP.X, &xP.Z) // X_P - Z_P kFieldOps.Add(&v2, &xQ.X, &xQ.Z) kFieldOps.Mul(&v2, &v2, &v0) // (X_Q + Z_Q)(X_P - Z_P) kFieldOps.Add(&v3, &v1, &v2) kFieldOps.Square(&v3, &v3) // 4(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Sub(&v4, &v1, &v2) kFieldOps.Square(&v4, &v4) // 4(X_Q Z_P - Z_Q X_P)^2 kFieldOps.Mul(&v0, &xPmQ.Z, &v3) // 4X_{P-Q}(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Mul(&xR.Z, &xPmQ.X, &v4) // 4Z_{P-Q}(X_Q Z_P - Z_Q X_P)^2 xR.X = v0 return xR } // Given xP = x(P) and cached curve parameters Aplus2C = A + 2*C, C4 = 4*C, // compute xQ = x([2]P). // // Returns xQ to allow chaining. Safe to overlap xP, xQ. func DoubleProjFp2(xP *ProjectivePoint, Aplus2C, C4 *Fp2Element) ProjectivePoint { // Algorithm 2 of Costello-Smith, amended to work with projective curve coefficients. var v1, v2, v3, xz4 Fp2Element var xQ ProjectivePoint kFieldOps.Add(&v1, &xP.X, &xP.Z) // (X+Z)^2 kFieldOps.Square(&v1, &v1) kFieldOps.Sub(&v2, &xP.X, &xP.Z) // (X-Z)^2 kFieldOps.Square(&v2, &v2) kFieldOps.Sub(&xz4, &v1, &v2) // 4XZ = (X+Z)^2 - (X-Z)^2 kFieldOps.Mul(&v2, &v2, C4) // 4C(X-Z)^2 kFieldOps.Mul(&xQ.X, &v1, &v2) // 4C(X+Z)^2(X-Z)^2 kFieldOps.Mul(&v3, &xz4, Aplus2C) // 4XZ(A + 2C) kFieldOps.Add(&v3, &v3, &v2) // 4XZ(A + 2C) + 4C(X-Z)^2 kFieldOps.Mul(&xQ.Z, &v3, &xz4) // (4XZ(A + 2C) + 4C(X-Z)^2)4XZ // Now (xQ.x : xQ.z) // = (4C(X+Z)^2(X-Z)^2 : (4XZ(A + 2C) + 4C(X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((A + 2C)/4C) + (X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((a + 2)/4) + (X-Z)^2)4XZ ) return xQ } // Given x(P) and a scalar m in little-endian bytes, compute x([m]P) using the // Montgomery ladder. This is described in Algorithm 8 of Costello-Smith. // // This function's execution time is dependent only on the byte-length of the // input scalar. All scalars of the same input length execute in uniform time. // The scalar can be padded with zero bytes to ensure a uniform length. // // Safe to overlap the source with the destination. func ScalarMult(curve *ProjectiveCurveParameters, xP *ProjectivePoint, scalar []uint8) ProjectivePoint { var x0, x1, tmp ProjectivePoint var Aplus2C, C4 Fp2Element kFieldOps.Add(&Aplus2C, &curve.C, &curve.C) // = 2*C kFieldOps.Add(&C4, &Aplus2C, &Aplus2C) // = 4*C kFieldOps.Add(&Aplus2C, &Aplus2C, &curve.A) // = 2*C + A x0.X = P503OneFp2 x1 = *xP // Iterate over the bits of the scalar, top to bottom prevBit := uint8(0) for i := len(scalar) - 1; i >= 0; i-- { scalarByte := scalar[i] for j := 7; j >= 0; j-- { bit := (scalarByte >> uint(j)) & 0x1 kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, (bit ^ prevBit)) //sProjectivePointConditionalSwap(&x0, &x1, (bit ^ prevBit)) tmp = DoubleProjFp2(&x0, &Aplus2C, &C4) x1 = AddProjFp2(&x0, &x1, xP) x0 = tmp prevBit = bit } } // now prevBit is the lowest bit of the scalar kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, prevBit) return x0 } // Returns true if lhs = rhs. Takes variable time. func VartimeEqFp2(lhs, rhs *Fp2Element) bool { a := *lhs b := *rhs fp503StrongReduce(&a.A) fp503StrongReduce(&a.B) fp503StrongReduce(&b.A) fp503StrongReduce(&b.B) eq := true for i := 0; i < len(a.A) && eq; i++ { eq = eq && (a.A[i] == b.A[i]) eq = eq && (a.B[i] == b.B[i]) } return eq } // Returns true if lhs = rhs. Takes variable time. func VartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { var t0, t1 Fp2Element kFieldOps.Mul(&t0, &lhs.X, &rhs.Z) kFieldOps.Mul(&t1, &lhs.Z, &rhs.X) return VartimeEqFp2(&t0, &t1) } func (GeneratedTestParams) generateFp2p503(rand *rand.Rand) Fp2Element { // Generation strategy: low limbs taken from [0,2^64); high limb // taken from smaller range // // Size hint is ignored since all elements are fixed size. // // Field elements taken in range [0,2p). Emulate this by capping // the high limb by the top digit of 2*p-1: // // sage: (2*p-1).digits(2^64)[-1] // 36255204122967100 // // This still allows generating values >= 2p, but hopefully that // excess is OK (and if it's not, we'll find out, because it's for // testing...) // highLimb := rand.Uint64() % 36255204122967100 fpElementGen := func() FpElement { return FpElement{ rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), highLimb, } } return Fp2Element{A: fpElementGen(), B: fpElementGen()} } func (c GeneratedTestParams) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf( GeneratedTestParams{ ProjectivePoint{ X: c.generateFp2p503(rand), Z: c.generateFp2p503(rand), }, ProjectiveCurveParameters{ A: c.generateFp2p503(rand), C: c.generateFp2p503(rand), }, c.generateFp2p503(rand), }) } func (x primeFieldElement) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf(primeFieldElement{A: new(GeneratedTestParams).generateFp2p503(rand).A}) } // Convert an FpElement to a big.Int for testing. Because this is only // for testing, no big.Int to FpElement conversion is provided. func radix64ToBigInt(x []uint64) *big.Int { radix := new(big.Int) // 2^64 radix.UnmarshalText(([]byte)("18446744073709551616")) base := new(big.Int).SetUint64(1) val := new(big.Int).SetUint64(0) tmp := new(big.Int) for _, xi := range x { tmp.SetUint64(xi) tmp.Mul(tmp, base) val.Add(val, tmp) base.Mul(base, radix) } return val } func toBigInt(x *FpElement) *big.Int { // Convert from Montgomery form return toBigIntFromMontgomeryForm(x) } func toBigIntFromMontgomeryForm(x *FpElement) *big.Int { // Convert from Montgomery form a := FpElement{} aR := FpElementX2{} copy(aR[:], x[:]) // = a*R fp503MontgomeryReduce(&a, &aR) // = a mod p in [0,2p) fp503StrongReduce(&a) // = a mod p in [0,p) return radix64ToBigInt(a[:]) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/000077500000000000000000000000001365325520100236035ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/arith_amd64.s000066400000000000000000001266221365325520100261020ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" // p751 + 1 #define P751P1_5 $0xEEB0000000000000 #define P751P1_6 $0xE3EC968549F878A8 #define P751P1_7 $0xDA959B1A13F7CC76 #define P751P1_8 $0x084E9867D6EBE876 #define P751P1_9 $0x8562B5045CB25748 #define P751P1_10 $0x0E12909F97BADC66 #define P751P1_11 $0x00006FE5D541F71C #define P751_0 $0xFFFFFFFFFFFFFFFF #define P751_5 $0xEEAFFFFFFFFFFFFF #define P751_6 $0xE3EC968549F878A8 #define P751_7 $0xDA959B1A13F7CC76 #define P751_8 $0x084E9867D6EBE876 #define P751_9 $0x8562B5045CB25748 #define P751_10 $0x0E12909F97BADC66 #define P751_11 $0x00006FE5D541F71C #define P751X2_0 $0xFFFFFFFFFFFFFFFE #define P751X2_1 $0xFFFFFFFFFFFFFFFF #define P751X2_5 $0xDD5FFFFFFFFFFFFF #define P751X2_6 $0xC7D92D0A93F0F151 #define P751X2_7 $0xB52B363427EF98ED #define P751X2_8 $0x109D30CFADD7D0ED #define P751X2_9 $0x0AC56A08B964AE90 #define P751X2_10 $0x1C25213F2F75B8CD #define P751X2_11 $0x0000DFCBAA83EE38 // The MSR code uses these registers for parameter passing. Keep using // them to avoid significant code changes. This means that when the Go // assembler does something strange, we can diff the machine code // against a different assembler to find out what Go did. #define REG_P1 DI #define REG_P2 SI #define REG_P3 DX TEXT ·fp751StrongReduce(SB), NOSPLIT, $0-8 MOVQ x+0(FP), REG_P1 // Zero AX for later use: XORQ AX, AX // Load p into registers: MOVQ P751_0, R8 // P751_{1,2,3,4} = P751_0, so reuse R8 MOVQ P751_5, R9 MOVQ P751_6, R10 MOVQ P751_7, R11 MOVQ P751_8, R12 MOVQ P751_9, R13 MOVQ P751_10, R14 MOVQ P751_11, R15 // Set x <- x - p SUBQ R8, (REG_P1) SBBQ R8, (8)(REG_P1) SBBQ R8, (16)(REG_P1) SBBQ R8, (24)(REG_P1) SBBQ R8, (32)(REG_P1) SBBQ R9, (40)(REG_P1) SBBQ R10, (48)(REG_P1) SBBQ R11, (56)(REG_P1) SBBQ R12, (64)(REG_P1) SBBQ R13, (72)(REG_P1) SBBQ R14, (80)(REG_P1) SBBQ R15, (88)(REG_P1) // Save carry flag indicating x-p < 0 as a mask in AX SBBQ $0, AX // Conditionally add p to x if x-p < 0 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, (REG_P1) ADCQ R8, (8)(REG_P1) ADCQ R8, (16)(REG_P1) ADCQ R8, (24)(REG_P1) ADCQ R8, (32)(REG_P1) ADCQ R9, (40)(REG_P1) ADCQ R10, (48)(REG_P1) ADCQ R11, (56)(REG_P1) ADCQ R12, (64)(REG_P1) ADCQ R13, (72)(REG_P1) ADCQ R14, (80)(REG_P1) ADCQ R15, (88)(REG_P1) RET TEXT ·fp751ConditionalSwap(SB), NOSPLIT, $0-17 MOVQ x+0(FP), REG_P1 MOVQ y+8(FP), REG_P2 MOVBLZX choice+16(FP), AX // AL = 0 or 1 // Make AX, so that either all bits are set or non // AX = 0 or 1 NEGQ AX // Fill xmm15. After this step first half of XMM15 is // just zeros and second half is whatever in AX MOVQ AX, X15 // Copy lower double word everywhere else. So that // XMM15=AL|AL|AL|AL. As AX has either all bits set // or non result will be that XMM15 has also either // all bits set or non of them. PSHUFD $0, X15, X15 #ifndef CSWAP_BLOCK #define CSWAP_BLOCK(idx) \ MOVOU (idx*16)(REG_P1), X0 \ MOVOU (idx*16)(REG_P2), X1 \ \ // X2 = mask & (X0 ^ X1) MOVO X1, X2 \ PXOR X0, X2 \ PAND X15, X2 \ \ PXOR X2, X0 \ PXOR X2, X1 \ \ MOVOU X0, (idx*16)(REG_P1) \ MOVOU X1, (idx*16)(REG_P2) #endif CSWAP_BLOCK(0) CSWAP_BLOCK(1) CSWAP_BLOCK(2) CSWAP_BLOCK(3) CSWAP_BLOCK(4) CSWAP_BLOCK(5) #ifdef CSWAP_BLOCK #undef CSWAP_BLOCK #endif RET TEXT ·fp751AddReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), CX MOVQ (72)(REG_P1), AX ADCQ (72)(REG_P2), AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P1), AX ADCQ (80)(REG_P2), AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P1), AX ADCQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ P751X2_0, AX SUBQ AX, R8 MOVQ P751X2_1, AX SBBQ AX, R9 SBBQ AX, R10 SBBQ AX, R11 SBBQ AX, R12 MOVQ P751X2_5, AX SBBQ AX, R13 MOVQ P751X2_6, AX SBBQ AX, R14 MOVQ P751X2_7, AX SBBQ AX, R15 MOVQ P751X2_8, AX SBBQ AX, CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ CX, (64)(REG_P3) MOVQ (72)(REG_P3), R8 MOVQ (80)(REG_P3), R9 MOVQ (88)(REG_P3), R10 MOVQ P751X2_9, AX SBBQ AX, R8 MOVQ P751X2_10, AX SBBQ AX, R9 MOVQ P751X2_11, AX SBBQ AX, R10 MOVQ R8, (72)(REG_P3) MOVQ R9, (80)(REG_P3) MOVQ R10, (88)(REG_P3) MOVQ $0, AX SBBQ $0, AX MOVQ P751X2_0, SI ANDQ AX, SI MOVQ P751X2_1, R8 ANDQ AX, R8 MOVQ P751X2_5, R9 ANDQ AX, R9 MOVQ P751X2_6, R10 ANDQ AX, R10 MOVQ P751X2_7, R11 ANDQ AX, R11 MOVQ P751X2_8, R12 ANDQ AX, R12 MOVQ P751X2_9, R13 ANDQ AX, R13 MOVQ P751X2_10, R14 ANDQ AX, R14 MOVQ P751X2_11, R15 ANDQ AX, R15 MOVQ (REG_P3), AX ADDQ SI, AX MOVQ AX, (REG_P3) MOVQ (8)(REG_P3), AX ADCQ R8, AX MOVQ AX, (8)(REG_P3) MOVQ (16)(REG_P3), AX ADCQ R8, AX MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX ADCQ R8, AX MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX ADCQ R8, AX MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX ADCQ R9, AX MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX ADCQ R10, AX MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX ADCQ R11, AX MOVQ AX, (56)(REG_P3) MOVQ (64)(REG_P3), AX ADCQ R12, AX MOVQ AX, (64)(REG_P3) MOVQ (72)(REG_P3), AX ADCQ R13, AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P3), AX ADCQ R14, AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P3), AX ADCQ R15, AX MOVQ AX, (88)(REG_P3) RET TEXT ·fp751SubReduced(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), CX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ CX, (64)(REG_P3) MOVQ (72)(REG_P1), AX SBBQ (72)(REG_P2), AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P1), AX SBBQ (80)(REG_P2), AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P1), AX SBBQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ $0, AX SBBQ $0, AX MOVQ P751X2_0, SI ANDQ AX, SI MOVQ P751X2_1, R8 ANDQ AX, R8 MOVQ P751X2_5, R9 ANDQ AX, R9 MOVQ P751X2_6, R10 ANDQ AX, R10 MOVQ P751X2_7, R11 ANDQ AX, R11 MOVQ P751X2_8, R12 ANDQ AX, R12 MOVQ P751X2_9, R13 ANDQ AX, R13 MOVQ P751X2_10, R14 ANDQ AX, R14 MOVQ P751X2_11, R15 ANDQ AX, R15 MOVQ (REG_P3), AX ADDQ SI, AX MOVQ AX, (REG_P3) MOVQ (8)(REG_P3), AX ADCQ R8, AX MOVQ AX, (8)(REG_P3) MOVQ (16)(REG_P3), AX ADCQ R8, AX MOVQ AX, (16)(REG_P3) MOVQ (24)(REG_P3), AX ADCQ R8, AX MOVQ AX, (24)(REG_P3) MOVQ (32)(REG_P3), AX ADCQ R8, AX MOVQ AX, (32)(REG_P3) MOVQ (40)(REG_P3), AX ADCQ R9, AX MOVQ AX, (40)(REG_P3) MOVQ (48)(REG_P3), AX ADCQ R10, AX MOVQ AX, (48)(REG_P3) MOVQ (56)(REG_P3), AX ADCQ R11, AX MOVQ AX, (56)(REG_P3) MOVQ (64)(REG_P3), AX ADCQ R12, AX MOVQ AX, (64)(REG_P3) MOVQ (72)(REG_P3), AX ADCQ R13, AX MOVQ AX, (72)(REG_P3) MOVQ (80)(REG_P3), AX ADCQ R14, AX MOVQ AX, (80)(REG_P3) MOVQ (88)(REG_P3), AX ADCQ R15, AX MOVQ AX, (88)(REG_P3) RET TEXT ·fp751Mul(SB), $96-24 // Here we store the destination in CX instead of in REG_P3 because the // multiplication instructions use DX as an implicit destination // operand: MULQ $REG sets DX:AX <-- AX * $REG. MOVQ z+0(FP), CX MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 XORQ AX, AX MOVQ (48)(REG_P1), R8 MOVQ (56)(REG_P1), R9 MOVQ (64)(REG_P1), R10 MOVQ (72)(REG_P1), R11 MOVQ (80)(REG_P1), R12 MOVQ (88)(REG_P1), R13 ADDQ (REG_P1), R8 ADCQ (8)(REG_P1), R9 ADCQ (16)(REG_P1), R10 ADCQ (24)(REG_P1), R11 ADCQ (32)(REG_P1), R12 ADCQ (40)(REG_P1), R13 MOVQ R8, (CX) MOVQ R9, (8)(CX) MOVQ R10, (16)(CX) MOVQ R11, (24)(CX) MOVQ R12, (32)(CX) MOVQ R13, (40)(CX) SBBQ $0, AX XORQ DX, DX MOVQ (48)(REG_P2), R8 MOVQ (56)(REG_P2), R9 MOVQ (64)(REG_P2), R10 MOVQ (72)(REG_P2), R11 MOVQ (80)(REG_P2), R12 MOVQ (88)(REG_P2), R13 ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 MOVQ R8, (48)(CX) MOVQ R9, (56)(CX) MOVQ R10, (64)(CX) MOVQ R11, (72)(CX) MOVQ R12, (80)(CX) MOVQ R13, (88)(CX) SBBQ $0, DX MOVQ AX, (80)(SP) MOVQ DX, (88)(SP) // (SP[0-8],R10,R8,R9) <- (AH+AL)*(BH+BL) MOVQ (CX), R11 MOVQ R8, AX MULQ R11 MOVQ AX, (SP) // c0 MOVQ DX, R14 XORQ R15, R15 MOVQ R9, AX MULQ R11 XORQ R9, R9 ADDQ AX, R14 ADCQ DX, R9 MOVQ (8)(CX), R12 MOVQ R8, AX MULQ R12 ADDQ AX, R14 MOVQ R14, (8)(SP) // c1 ADCQ DX, R9 ADCQ $0, R15 XORQ R8, R8 MOVQ R10, AX MULQ R11 ADDQ AX, R9 MOVQ (48)(CX), R13 ADCQ DX, R15 ADCQ $0, R8 MOVQ (16)(CX), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R15 MOVQ (56)(CX), AX ADCQ $0, R8 MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(SP) // c2 ADCQ DX, R15 ADCQ $0, R8 XORQ R9, R9 MOVQ (72)(CX), AX MULQ R11 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(CX), AX MULQ R13 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ R10, AX MULQ R12 ADDQ AX, R15 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(CX), R14 MOVQ (56)(CX), AX MULQ R14 ADDQ AX, R15 MOVQ R15, (24)(SP) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (80)(CX), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(CX), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (48)(CX), R15 MOVQ (32)(CX), AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(CX), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(CX), R13 MOVQ (56)(CX), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (32)(SP) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (88)(CX), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(CX), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (72)(CX), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(CX), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(CX), R15 MOVQ (56)(CX), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(SP) // c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (64)(CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(CX), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(CX), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(CX), R11 MOVQ (56)(CX), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(CX), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (48)(SP) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (88)(CX), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(CX), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(CX), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(CX), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (56)(SP) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (72)(CX), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(CX), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(CX), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (64)(SP) // c8 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (88)(CX), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(CX), AX MULQ R11 ADDQ AX, R10 // c9 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(CX), AX MULQ R11 ADDQ AX, R8 // c10 ADCQ DX, R9 // c11 MOVQ (88)(SP), AX MOVQ (CX), DX ANDQ AX, R12 ANDQ AX, R14 ANDQ AX, DX ANDQ AX, R13 ANDQ AX, R15 ANDQ AX, R11 MOVQ (48)(SP), AX ADDQ AX, DX MOVQ (56)(SP), AX ADCQ AX, R12 MOVQ (64)(SP), AX ADCQ AX, R14 ADCQ R10, R13 ADCQ R8, R15 ADCQ R9, R11 MOVQ (80)(SP), AX MOVQ DX, (48)(SP) MOVQ R12, (56)(SP) MOVQ R14, (64)(SP) MOVQ R13, (72)(SP) MOVQ R15, (80)(SP) MOVQ R11, (88)(SP) MOVQ (48)(CX), R8 MOVQ (56)(CX), R9 MOVQ (64)(CX), R10 MOVQ (72)(CX), R11 MOVQ (80)(CX), R12 MOVQ (88)(CX), R13 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 MOVQ (48)(SP), AX ADDQ AX, R8 MOVQ (56)(SP), AX ADCQ AX, R9 MOVQ (64)(SP), AX ADCQ AX, R10 MOVQ (72)(SP), AX ADCQ AX, R11 MOVQ (80)(SP), AX ADCQ AX, R12 MOVQ (88)(SP), AX ADCQ AX, R13 MOVQ R8, (48)(SP) MOVQ R9, (56)(SP) MOVQ R11, (72)(SP) // CX[0-11] <- AL*BL MOVQ (REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (CX) // c0 MOVQ R10, (64)(SP) MOVQ DX, R8 MOVQ (8)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 MOVQ R12, (80)(SP) ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ (REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (8)(CX) // c1 ADCQ DX, R9 MOVQ R13, (88)(SP) ADCQ $0, R10 XORQ R8, R8 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (REG_P2), R13 MOVQ (16)(REG_P1), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (8)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (16)(CX) // c2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (24)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P1), AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (16)(REG_P1), R14 MOVQ (8)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (24)(CX) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (32)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (16)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P1), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P1), R13 MOVQ (8)(REG_P2), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (32)(CX) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (40)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P2), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (24)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P1), R11 MOVQ (REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P1), R15 MOVQ (8)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (40)(CX) //c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (16)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (32)(REG_P2), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (8)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P2), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (48)(CX) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (40)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (16)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P2), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (24)(REG_P2), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (56)(CX) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (24)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (32)(REG_P2), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (64)(CX) // c8 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (40)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (32)(REG_P2), AX MULQ R11 ADDQ AX, R10 MOVQ R10, (72)(CX) // c9 ADCQ DX, R8 ADCQ $0, R9 MOVQ (40)(REG_P2), AX MULQ R11 ADDQ AX, R8 MOVQ R8, (80)(CX) // c10 ADCQ DX, R9 MOVQ R9, (88)(CX) // c11 // CX[12-23] <- AH*BH MOVQ (48)(REG_P1), R11 MOVQ (48)(REG_P2), AX MULQ R11 XORQ R9, R9 MOVQ AX, (96)(CX) // c0 MOVQ DX, R8 MOVQ (56)(REG_P2), AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (56)(REG_P1), R12 MOVQ (48)(REG_P2), AX MULQ R12 ADDQ AX, R8 MOVQ R8, (104)(CX) // c1 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (64)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (48)(REG_P2), R13 MOVQ (64)(REG_P1), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R12 ADDQ AX, R9 MOVQ R9, (112)(CX) // c2 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (72)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P1), AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (64)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (64)(REG_P1), R14 MOVQ (56)(REG_P2), AX MULQ R14 ADDQ AX, R10 MOVQ R10, (120)(CX) // c3 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (80)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P1), R15 MOVQ R13, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P2), AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P1), R13 MOVQ (56)(REG_P2), AX MULQ R13 ADDQ AX, R8 MOVQ R8, (128)(CX) // c4 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (88)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(REG_P2), AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (72)(REG_P2), AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P1), R11 MOVQ (48)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(REG_P2), AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (56)(REG_P2), AX MULQ R15 ADDQ AX, R9 MOVQ R9, (136)(CX) // c5 ADCQ DX, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ (64)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (88)(REG_P2), AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (80)(REG_P2), AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (56)(REG_P2), AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P2), AX MULQ R13 ADDQ AX, R10 MOVQ R10, (144)(CX) // c6 ADCQ DX, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ (88)(REG_P2), AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (64)(REG_P2), AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P2), AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (72)(REG_P2), AX MULQ R15 ADDQ AX, R8 MOVQ R8, (152)(CX) // c7 ADCQ DX, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ (72)(REG_P2), AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (80)(REG_P2), AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), AX MULQ R13 ADDQ AX, R9 MOVQ R9, (160)(CX) // c8 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 MOVQ (80)(REG_P2), AX MULQ R11 ADDQ AX, R10 MOVQ R10, (168)(CX) // c9 ADCQ DX, R8 MOVQ (88)(REG_P2), AX MULQ R11 ADDQ AX, R8 MOVQ R8, (176)(CX) // c10 ADCQ $0, DX MOVQ DX, (184)(CX) // c11 // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL)-AL*BL MOVQ (SP), R8 SUBQ (CX), R8 MOVQ (8)(SP), R9 SBBQ (8)(CX), R9 MOVQ (16)(SP), R10 SBBQ (16)(CX), R10 MOVQ (24)(SP), R11 SBBQ (24)(CX), R11 MOVQ (32)(SP), R12 SBBQ (32)(CX), R12 MOVQ (40)(SP), R13 SBBQ (40)(CX), R13 MOVQ (48)(SP), R14 SBBQ (48)(CX), R14 MOVQ (56)(SP), R15 SBBQ (56)(CX), R15 MOVQ (64)(SP), AX SBBQ (64)(CX), AX MOVQ (72)(SP), DX SBBQ (72)(CX), DX MOVQ (80)(SP), DI SBBQ (80)(CX), DI MOVQ (88)(SP), SI SBBQ (88)(CX), SI MOVQ SI, (SP) // [R8-R15,AX,DX,DI,(SP)] <- (AH+AL)*(BH+BL) - AL*BL - AH*BH MOVQ (96)(CX), SI SUBQ SI, R8 MOVQ (104)(CX), SI SBBQ SI, R9 MOVQ (112)(CX), SI SBBQ SI, R10 MOVQ (120)(CX), SI SBBQ SI, R11 MOVQ (128)(CX), SI SBBQ SI, R12 MOVQ (136)(CX), SI SBBQ SI, R13 MOVQ (144)(CX), SI SBBQ SI, R14 MOVQ (152)(CX), SI SBBQ SI, R15 MOVQ (160)(CX), SI SBBQ SI, AX MOVQ (168)(CX), SI SBBQ SI, DX MOVQ (176)(CX), SI SBBQ SI, DI MOVQ (SP), SI SBBQ (184)(CX), SI // FINAL RESULT ADDQ (48)(CX), R8 MOVQ R8, (48)(CX) ADCQ (56)(CX), R9 MOVQ R9, (56)(CX) ADCQ (64)(CX), R10 MOVQ R10, (64)(CX) ADCQ (72)(CX), R11 MOVQ R11, (72)(CX) ADCQ (80)(CX), R12 MOVQ R12, (80)(CX) ADCQ (88)(CX), R13 MOVQ R13, (88)(CX) ADCQ (96)(CX), R14 MOVQ R14, (96)(CX) ADCQ (104)(CX), R15 MOVQ R15, (104)(CX) ADCQ (112)(CX), AX MOVQ AX, (112)(CX) ADCQ (120)(CX), DX MOVQ DX, (120)(CX) ADCQ (128)(CX), DI MOVQ DI, (128)(CX) ADCQ (136)(CX), SI MOVQ SI, (136)(CX) MOVQ (144)(CX), AX ADCQ $0, AX MOVQ AX, (144)(CX) MOVQ (152)(CX), AX ADCQ $0, AX MOVQ AX, (152)(CX) MOVQ (160)(CX), AX ADCQ $0, AX MOVQ AX, (160)(CX) MOVQ (168)(CX), AX ADCQ $0, AX MOVQ AX, (168)(CX) MOVQ (176)(CX), AX ADCQ $0, AX MOVQ AX, (176)(CX) MOVQ (184)(CX), AX ADCQ $0, AX MOVQ AX, (184)(CX) RET // This multiplies a 256-bit number pointed to by M0 with p751+1. // It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. // C points to the place to store the result and should be at least 192 bits. // This should only be used when the BMI2 and ADX instruction set extensions // are available. #define mul256x448bmi2adx(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \ MOVQ 0+M0, DX \ MULXQ M1+40(SB), T1, T0 \ MULXQ M1+48(SB), T3, T2 \ MOVQ T1, 0+C \ // C0_final XORQ AX, AX \ MULXQ M1+56(SB), T5, T4 \ ADOXQ T3, T0 \ ADOXQ T5, T2 \ MULXQ M1+64(SB), T3, T1 \ ADOXQ T3, T4 \ MULXQ M1+72(SB), T6, T5 \ ADOXQ T6, T1 \ MULXQ M1+80(SB), T7, T3 \ ADOXQ T7, T5 \ MULXQ M1+88(SB), T8, T6 \ ADOXQ T8, T3 \ ADOXQ AX, T6 \ \ MOVQ 8+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T7, T0 \ MOVQ T0, 8+C \ // C1_final ADCXQ T8, T2 \ MULXQ M1+48(SB), T8, T7 \ ADOXQ T8, T2 \ ADCXQ T7, T4 \ MULXQ M1+56(SB), T8, T0 \ ADOXQ T8, T4 \ ADCXQ T1, T0 \ MULXQ M1+64(SB), T7, T1 \ ADCXQ T5, T1 \ MULXQ M1+72(SB), T8, T5 \ ADCXQ T5, T3 \ MULXQ M1+80(SB), T9, T5 \ ADCXQ T5, T6 \ MULXQ M1+88(SB), DX, T5 \ ADCXQ AX, T5 \ \ ADOXQ T7, T0 \ ADOXQ T8, T1 \ ADOXQ T9, T3 \ ADOXQ DX, T6 \ ADOXQ AX, T5 \ \ MOVQ 16+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T7, T2 \ MOVQ T2, 16+C \ // C2_final ADCXQ T8, T4 \ MULXQ M1+48(SB), T7, T8 \ ADOXQ T7, T4 \ ADCXQ T8, T0 \ MULXQ M1+56(SB), T8, T2 \ ADOXQ T8, T0 \ ADCXQ T2, T1 \ MULXQ M1+64(SB), T7, T2 \ ADCXQ T2, T3 \ MULXQ M1+72(SB), T8, T2 \ ADCXQ T2, T6 \ MULXQ M1+80(SB), T9, T2 \ ADCXQ T2, T5 \ MULXQ M1+88(SB), DX, T2 \ ADCXQ AX, T2 \ \ ADOXQ T7, T1 \ ADOXQ T8, T3 \ ADOXQ T9, T6 \ ADOXQ DX, T5 \ ADOXQ AX, T2 \ \ MOVQ 24+M0, DX \ MULXQ M1+40(SB), T7, T8 \ XORQ AX, AX \ ADCXQ T4, T7 \ ADCXQ T8, T0 \ MULXQ M1+48(SB), T10, T8 \ ADOXQ T10, T0 \ ADCXQ T8, T1 \ MULXQ M1+56(SB), T8, T4 \ ADOXQ T8, T1 \ ADCXQ T4, T3 \ MULXQ M1+64(SB), T10, T4 \ ADCXQ T4, T6 \ MULXQ M1+72(SB), T8, T4 \ ADCXQ T4, T5 \ MULXQ M1+80(SB), T9, T4 \ ADCXQ T4, T2 \ MULXQ M1+88(SB), DX, T4 \ ADCXQ AX, T4 \ \ ADOXQ T10, T3 \ ADOXQ T8, T6 \ ADOXQ T9, T5 \ ADOXQ DX, T2 \ ADOXQ AX, T4 // This multiplies a 256-bit number pointed to by M0 with p751+1. // It is assumed that M1 points to p751+1 stored as a 768-bit Fp751Element. // C points to the place to store the result and should be at least 192 bits. // This should only be used when the BMI2 instruction set extension is // available. #define mul256x448bmi2(M0, M1, C, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \ MOVQ 0+M0, DX \ MULXQ M1+40(SB), T1, T0 \ MULXQ M1+48(SB), T3, T2 \ MOVQ T1, 0+C \ // C0_final XORQ AX, AX \ MULXQ M1+56(SB), T5, T4 \ ADDQ T3, T0 \ ADCQ T5, T2 \ MULXQ M1+64(SB), T3, T1 \ ADCQ T3, T4 \ MULXQ M1+72(SB), T6, T5 \ ADCQ T6, T1 \ MULXQ M1+80(SB), T7, T3 \ ADCQ T7, T5 \ MULXQ M1+88(SB), T8, T6 \ ADCQ T8, T3 \ ADCQ AX, T6 \ \ MOVQ 8+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T7, T0 \ MOVQ T0, 8+C \ // C1_final ADCQ T8, T2 \ MULXQ M1+48(SB), T8, T7 \ MOVQ T8, 32+C \ ADCQ T7, T4 \ MULXQ M1+56(SB), T8, T0 \ MOVQ T8, 40+C \ ADCQ T1, T0 \ MULXQ M1+64(SB), T7, T1 \ ADCQ T5, T1 \ MULXQ M1+72(SB), T8, T5 \ ADCQ T5, T3 \ MULXQ M1+80(SB), T9, T5 \ ADCQ T5, T6 \ MULXQ M1+88(SB), DX, T5 \ ADCQ AX, T5 \ \ XORQ AX, AX \ ADDQ 32+C, T2 \ ADCQ 40+C, T4 \ ADCQ T7, T0 \ ADCQ T8, T1 \ ADCQ T9, T3 \ ADCQ DX, T6 \ ADCQ AX, T5 \ \ MOVQ 16+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T7, T2 \ MOVQ T2, 16+C \ // C2_final ADCQ T8, T4 \ MULXQ M1+48(SB), T7, T8 \ MOVQ T7, 32+C \ ADCQ T8, T0 \ MULXQ M1+56(SB), T8, T2 \ MOVQ T8, 40+C \ ADCQ T2, T1 \ MULXQ M1+64(SB), T7, T2 \ ADCQ T2, T3 \ MULXQ M1+72(SB), T8, T2 \ ADCQ T2, T6 \ MULXQ M1+80(SB), T9, T2 \ ADCQ T2, T5 \ MULXQ M1+88(SB), DX, T2 \ ADCQ AX, T2 \ \ XORQ AX, AX \ ADDQ 32+C, T4 \ ADCQ 40+C, T0 \ ADCQ T7, T1 \ ADCQ T8, T3 \ ADCQ T9, T6 \ ADCQ DX, T5 \ ADCQ AX, T2 \ \ MOVQ 24+M0, DX \ MULXQ M1+40(SB), T7, T8 \ ADDQ T4, T7 \ ADCQ T8, T0 \ MULXQ M1+48(SB), T10, T8 \ MOVQ T10, 32+C \ ADCQ T8, T1 \ MULXQ M1+56(SB), T8, T4 \ MOVQ T8, 40+C \ ADCQ T4, T3 \ MULXQ M1+64(SB), T10, T4 \ ADCQ T4, T6 \ MULXQ M1+72(SB), T8, T4 \ ADCQ T4, T5 \ MULXQ M1+80(SB), T9, T4 \ ADCQ T4, T2 \ MULXQ M1+88(SB), DX, T4 \ ADCQ AX, T4 \ \ XORQ AX, AX \ ADDQ 32+C, T0 \ ADCQ 40+C, T1 \ ADCQ T10, T3 \ ADCQ T8, T6 \ ADCQ T9, T5 \ ADCQ DX, T2 \ ADCQ AX, T4 // Template for calculating the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. Template must be // customized with schoolbook multiplicaton for 256 x 448-bit number. // This macro reuses memory of IN value and *changes* it. Smashes registers // R[8-15], AX, BX, CX, DX, BP. // Input: // * M0: 1536-bit number to be reduced // * C : either mul256x448bmi2 or mul256x448bmi2adx // Output: OUT 768-bit #define REDC(C, M0, MULS) \ \ // a[0-3] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ XORQ R15, R15 \ MOVQ 48+C, AX \ MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 40+M0, AX \ ADCQ 48+M0, DX \ ADCQ 56+M0, BX \ MOVQ AX, 40+M0 \ MOVQ DX, 48+M0 \ MOVQ BX, 56+M0 \ ADCQ 64+M0, BP \ ADCQ 72+M0, R8 \ ADCQ 80+M0, R9 \ ADCQ 88+M0, R10 \ ADCQ 96+M0, R11 \ ADCQ 104+M0, R12 \ ADCQ 112+M0, R13 \ ADCQ 120+M0, R14 \ ADCQ 128+M0, R15 \ MOVQ BP, 64+M0 \ MOVQ R8, 72+M0 \ MOVQ R9, 80+M0 \ MOVQ R10, 88+M0 \ MOVQ R11, 96+M0 \ MOVQ R12, 104+M0 \ MOVQ R13, 112+M0 \ MOVQ R14, 120+M0 \ MOVQ R15, 128+M0 \ MOVQ 136+M0, R8 \ MOVQ 144+M0, R9 \ MOVQ 152+M0, R10 \ MOVQ 160+M0, R11 \ MOVQ 168+M0, R12 \ MOVQ 176+M0, R13 \ MOVQ 184+M0, R14 \ ADCQ $0, R8 \ ADCQ $0, R9 \ ADCQ $0, R10 \ ADCQ $0, R11 \ ADCQ $0, R12 \ ADCQ $0, R13 \ ADCQ $0, R14 \ MOVQ R8, 136+M0 \ MOVQ R9, 144+M0 \ MOVQ R10, 152+M0 \ MOVQ R11, 160+M0 \ MOVQ R12, 168+M0 \ MOVQ R13, 176+M0 \ MOVQ R14, 184+M0 \ \ // a[4-7] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(32+M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ XORQ R15, R15 \ MOVQ 48+C, AX \ MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 72+M0, AX \ ADCQ 80+M0, DX \ ADCQ 88+M0, BX \ MOVQ AX, 72+M0 \ MOVQ DX, 80+M0 \ MOVQ BX, 88+M0 \ ADCQ 96+M0, BP \ ADCQ 104+M0, R8 \ ADCQ 112+M0, R9 \ ADCQ 120+M0, R10 \ ADCQ 128+M0, R11 \ ADCQ 136+M0, R12 \ ADCQ 144+M0, R13 \ ADCQ 152+M0, R14 \ ADCQ 160+M0, R15 \ MOVQ BP, 0+C \ // Final result c0 MOVQ R8, 104+M0 \ MOVQ R9, 112+M0 \ MOVQ R10, 120+M0 \ MOVQ R11, 128+M0 \ MOVQ R12, 136+M0 \ MOVQ R13, 144+M0 \ MOVQ R14, 152+M0 \ MOVQ R15, 160+M0 \ MOVQ 168+M0, R12 \ MOVQ 176+M0, R13 \ MOVQ 184+M0, R14 \ ADCQ $0, R12 \ ADCQ $0, R13 \ ADCQ $0, R14 \ MOVQ R12, 168+M0 \ MOVQ R13, 176+M0 \ MOVQ R14, 184+M0 \ \ // a[8-11] x p751p1_nz --> result: [reg_p2+48], [reg_p2+56], [reg_p2+64], and rbp, r8:r14 MULS(64+M0, ·p751p1, 48+C, R8, R9, R13, R10, R14, R12, R11, BP, BX, CX, R15) \ MOVQ 48+C, AX \ // Final result c1:c11 MOVQ 56+C, DX \ MOVQ 64+C, BX \ ADDQ 104+M0, AX \ ADCQ 112+M0, DX \ ADCQ 120+M0, BX \ MOVQ AX, 8+C \ MOVQ DX, 16+C \ MOVQ BX, 24+C \ ADCQ 128+M0, BP \ ADCQ 136+M0, R8 \ ADCQ 144+M0, R9 \ ADCQ 152+M0, R10 \ ADCQ 160+M0, R11 \ ADCQ 168+M0, R12 \ ADCQ 176+M0, R13 \ ADCQ 184+M0, R14 \ MOVQ BP, 32+C \ MOVQ R8, 40+C \ MOVQ R9, 48+C \ MOVQ R10, 56+C \ MOVQ R11, 64+C \ MOVQ R12, 72+C \ MOVQ R13, 80+C \ MOVQ R14, 88+C TEXT ·fp751MontgomeryReduce(SB), $0-16 MOVQ z+0(FP), REG_P2 MOVQ x+8(FP), REG_P1 // Check wether to use optimized implementation CMPB ·HasADXandBMI2(SB), $1 JE redc_with_mulx_adcx_adox CMPB ·HasBMI2(SB), $1 JE redc_with_mulx MOVQ (REG_P1), R11 MOVQ P751P1_5, AX MULQ R11 XORQ R8, R8 ADDQ (40)(REG_P1), AX MOVQ AX, (40)(REG_P2) // Z5 ADCQ DX, R8 XORQ R9, R9 MOVQ P751P1_6, AX MULQ R11 XORQ R10, R10 ADDQ AX, R8 ADCQ DX, R9 MOVQ (8)(REG_P1), R12 MOVQ P751P1_5, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (48)(REG_P1), R8 MOVQ R8, (48)(REG_P2) // Z6 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_7, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (16)(REG_P1), R13 MOVQ P751P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (56)(REG_P1), R9 MOVQ R9, (56)(REG_P2) // Z7 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_8, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (24)(REG_P1), R14 MOVQ P751P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (64)(REG_P1), R10 MOVQ R10, (64)(REG_P2) // Z8 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_9, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (32)(REG_P1), R15 MOVQ P751P1_5, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (72)(REG_P1), R8 MOVQ R8, (72)(REG_P2) // Z9 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_10, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (40)(REG_P2), CX MOVQ P751P1_5, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (80)(REG_P1), R9 MOVQ R9, (80)(REG_P2) // Z10 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (48)(REG_P2), R11 MOVQ P751P1_5, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (88)(REG_P1), R10 MOVQ R10, (88)(REG_P2) // Z11 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (56)(REG_P2), R12 MOVQ P751P1_5, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (96)(REG_P1), R8 MOVQ R8, (REG_P2) // Z0 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (64)(REG_P2), R13 MOVQ P751P1_5, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (104)(REG_P1), R9 MOVQ R9, (8)(REG_P2) // Z1 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ (72)(REG_P2), R14 MOVQ P751P1_5, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (112)(REG_P1), R10 MOVQ R10, (16)(REG_P2) // Z2 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R11 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_6, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ (80)(REG_P2), R15 MOVQ P751P1_5, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (120)(REG_P1), R8 MOVQ R8, (24)(REG_P2) // Z3 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R11 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R12 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_7, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_6, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ (88)(REG_P2), CX MOVQ P751P1_5, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (128)(REG_P1), R9 MOVQ R9, (32)(REG_P2) // Z4 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R11 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R12 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ R13 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_8, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_7, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_6, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (136)(REG_P1), R10 MOVQ R10, (40)(REG_P2) // Z5 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R12 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ R13 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_9, AX MULQ R14 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_8, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_7, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (144)(REG_P1), R8 MOVQ R8, (48)(REG_P2) // Z6 ADCQ $0, R9 ADCQ $0, R10 XORQ R8, R8 MOVQ P751P1_11, AX MULQ R13 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_10, AX MULQ R14 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_9, AX MULQ R15 ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 MOVQ P751P1_8, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADCQ $0, R8 ADDQ (152)(REG_P1), R9 MOVQ R9, (56)(REG_P2) // Z7 ADCQ $0, R10 ADCQ $0, R8 XORQ R9, R9 MOVQ P751P1_11, AX MULQ R14 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_10, AX MULQ R15 ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 MOVQ P751P1_9, AX MULQ CX ADDQ AX, R10 ADCQ DX, R8 ADCQ $0, R9 ADDQ (160)(REG_P1), R10 MOVQ R10, (64)(REG_P2) // Z8 ADCQ $0, R8 ADCQ $0, R9 XORQ R10, R10 MOVQ P751P1_11, AX MULQ R15 ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 MOVQ P751P1_10, AX MULQ CX ADDQ AX, R8 ADCQ DX, R9 ADCQ $0, R10 ADDQ (168)(REG_P1), R8 // Z9 MOVQ R8, (72)(REG_P2) // Z9 ADCQ $0, R9 ADCQ $0, R10 MOVQ P751P1_11, AX MULQ CX ADDQ AX, R9 ADCQ DX, R10 ADDQ (176)(REG_P1), R9 // Z10 MOVQ R9, (80)(REG_P2) // Z10 ADCQ $0, R10 ADDQ (184)(REG_P1), R10 // Z11 MOVQ R10, (88)(REG_P2) // Z11 RET redc_with_mulx_adcx_adox: // This implements the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. // This assumes that the BMI2 and ADX instruction set extensions are available. REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2adx) RET redc_with_mulx: // This implements the Montgomery reduction algorithm described in // section 5.2.3 of https://eprint.iacr.org/2017/1015.pdf. // This assumes that the BMI2 instruction set extension is available. REDC(0(REG_P2), 0(REG_P1), mul256x448bmi2) RET TEXT ·fp751AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX MOVQ (88)(REG_P1), DI ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX ADCQ (88)(REG_P2), DI MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ DI, (88)(REG_P3) RET TEXT ·fp751X2AddLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX ADDQ (REG_P2), R8 ADCQ (8)(REG_P2), R9 ADCQ (16)(REG_P2), R10 ADCQ (24)(REG_P2), R11 ADCQ (32)(REG_P2), R12 ADCQ (40)(REG_P2), R13 ADCQ (48)(REG_P2), R14 ADCQ (56)(REG_P2), R15 ADCQ (64)(REG_P2), AX ADCQ (72)(REG_P2), BX ADCQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), AX ADCQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ (96)(REG_P1), R8 MOVQ (104)(REG_P1), R9 MOVQ (112)(REG_P1), R10 MOVQ (120)(REG_P1), R11 MOVQ (128)(REG_P1), R12 MOVQ (136)(REG_P1), R13 MOVQ (144)(REG_P1), R14 MOVQ (152)(REG_P1), R15 MOVQ (160)(REG_P1), AX MOVQ (168)(REG_P1), BX MOVQ (176)(REG_P1), CX MOVQ (184)(REG_P1), DI ADCQ (96)(REG_P2), R8 ADCQ (104)(REG_P2), R9 ADCQ (112)(REG_P2), R10 ADCQ (120)(REG_P2), R11 ADCQ (128)(REG_P2), R12 ADCQ (136)(REG_P2), R13 ADCQ (144)(REG_P2), R14 ADCQ (152)(REG_P2), R15 ADCQ (160)(REG_P2), AX ADCQ (168)(REG_P2), BX ADCQ (176)(REG_P2), CX ADCQ (184)(REG_P2), DI MOVQ R8, (96)(REG_P3) MOVQ R9, (104)(REG_P3) MOVQ R10, (112)(REG_P3) MOVQ R11, (120)(REG_P3) MOVQ R12, (128)(REG_P3) MOVQ R13, (136)(REG_P3) MOVQ R14, (144)(REG_P3) MOVQ R15, (152)(REG_P3) MOVQ AX, (160)(REG_P3) MOVQ BX, (168)(REG_P3) MOVQ CX, (176)(REG_P3) MOVQ DI, (184)(REG_P3) RET TEXT ·fp751X2SubLazy(SB), NOSPLIT, $0-24 MOVQ z+0(FP), REG_P3 MOVQ x+8(FP), REG_P1 MOVQ y+16(FP), REG_P2 MOVQ (REG_P1), R8 MOVQ (8)(REG_P1), R9 MOVQ (16)(REG_P1), R10 MOVQ (24)(REG_P1), R11 MOVQ (32)(REG_P1), R12 MOVQ (40)(REG_P1), R13 MOVQ (48)(REG_P1), R14 MOVQ (56)(REG_P1), R15 MOVQ (64)(REG_P1), AX MOVQ (72)(REG_P1), BX MOVQ (80)(REG_P1), CX SUBQ (REG_P2), R8 SBBQ (8)(REG_P2), R9 SBBQ (16)(REG_P2), R10 SBBQ (24)(REG_P2), R11 SBBQ (32)(REG_P2), R12 SBBQ (40)(REG_P2), R13 SBBQ (48)(REG_P2), R14 SBBQ (56)(REG_P2), R15 SBBQ (64)(REG_P2), AX SBBQ (72)(REG_P2), BX SBBQ (80)(REG_P2), CX MOVQ R8, (REG_P3) MOVQ R9, (8)(REG_P3) MOVQ R10, (16)(REG_P3) MOVQ R11, (24)(REG_P3) MOVQ R12, (32)(REG_P3) MOVQ R13, (40)(REG_P3) MOVQ R14, (48)(REG_P3) MOVQ R15, (56)(REG_P3) MOVQ AX, (64)(REG_P3) MOVQ BX, (72)(REG_P3) MOVQ CX, (80)(REG_P3) MOVQ (88)(REG_P1), AX SBBQ (88)(REG_P2), AX MOVQ AX, (88)(REG_P3) MOVQ (96)(REG_P1), R8 MOVQ (104)(REG_P1), R9 MOVQ (112)(REG_P1), R10 MOVQ (120)(REG_P1), R11 MOVQ (128)(REG_P1), R12 MOVQ (136)(REG_P1), R13 MOVQ (144)(REG_P1), R14 MOVQ (152)(REG_P1), R15 MOVQ (160)(REG_P1), AX MOVQ (168)(REG_P1), BX MOVQ (176)(REG_P1), CX MOVQ (184)(REG_P1), DI SBBQ (96)(REG_P2), R8 SBBQ (104)(REG_P2), R9 SBBQ (112)(REG_P2), R10 SBBQ (120)(REG_P2), R11 SBBQ (128)(REG_P2), R12 SBBQ (136)(REG_P2), R13 SBBQ (144)(REG_P2), R14 SBBQ (152)(REG_P2), R15 SBBQ (160)(REG_P2), AX SBBQ (168)(REG_P2), BX SBBQ (176)(REG_P2), CX SBBQ (184)(REG_P2), DI MOVQ R8, (96)(REG_P3) MOVQ R9, (104)(REG_P3) MOVQ R10, (112)(REG_P3) MOVQ R11, (120)(REG_P3) MOVQ R12, (128)(REG_P3) MOVQ R13, (136)(REG_P3) MOVQ R14, (144)(REG_P3) MOVQ R15, (152)(REG_P3) MOVQ AX, (160)(REG_P3) MOVQ BX, (168)(REG_P3) MOVQ CX, (176)(REG_P3) MOVQ DI, (184)(REG_P3) // Now the carry flag is 1 if x-y < 0. If so, add p*2^768. MOVQ $0, AX SBBQ $0, AX // Load p into registers: MOVQ P751_0, R8 // P751_{1,2,3,4} = P751_0, so reuse R8 MOVQ P751_5, R9 MOVQ P751_6, R10 MOVQ P751_7, R11 MOVQ P751_8, R12 MOVQ P751_9, R13 MOVQ P751_10, R14 MOVQ P751_11, R15 ANDQ AX, R8 ANDQ AX, R9 ANDQ AX, R10 ANDQ AX, R11 ANDQ AX, R12 ANDQ AX, R13 ANDQ AX, R14 ANDQ AX, R15 ADDQ R8, (96 )(REG_P3) ADCQ R8, (96+ 8)(REG_P3) ADCQ R8, (96+16)(REG_P3) ADCQ R8, (96+24)(REG_P3) ADCQ R8, (96+32)(REG_P3) ADCQ R9, (96+40)(REG_P3) ADCQ R10, (96+48)(REG_P3) ADCQ R11, (96+56)(REG_P3) ADCQ R12, (96+64)(REG_P3) ADCQ R13, (96+72)(REG_P3) ADCQ R14, (96+80)(REG_P3) ADCQ R15, (96+88)(REG_P3) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/arith_arm64.s000066400000000000000000000631311365325520100261130ustar00rootroot00000000000000// +build arm64,!noasm #include "textflag.h" TEXT ·fp751ConditionalSwap(SB), NOSPLIT, $0-17 MOVD x+0(FP), R0 MOVD y+8(FP), R1 MOVB choice+16(FP), R2 // Set flags // If choice is not 0 or 1, this implementation will swap completely CMP $0, R2 LDP 0(R0), (R3, R4) LDP 0(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 0(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 0(R1) LDP 16(R0), (R3, R4) LDP 16(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 16(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 16(R1) LDP 32(R0), (R3, R4) LDP 32(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 32(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 32(R1) LDP 48(R0), (R3, R4) LDP 48(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 48(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 48(R1) LDP 64(R0), (R3, R4) LDP 64(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 64(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 64(R1) LDP 80(R0), (R3, R4) LDP 80(R1), (R5, R6) CSEL EQ, R3, R5, R7 CSEL EQ, R4, R6, R8 STP (R7, R8), 80(R0) CSEL NE, R3, R5, R9 CSEL NE, R4, R6, R10 STP (R9, R10), 80(R1) RET TEXT ·fp751AddReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R14 // Add first summand and second summand and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 ADCS R17, R5 ADCS R19, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 ADCS R17, R9 ADCS R19, R10 LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 ADCS R17, R13 ADC R19, R14 // Subtract 2 * p751 in R15-R24 from the result in R3-R14 LDP ·p751x2+0(SB), (R15, R16) SUBS R15, R3 SBCS R16, R4 LDP ·p751x2+40(SB), (R17, R19) SBCS R16, R5 SBCS R16, R6 SBCS R16, R7 LDP ·p751x2+56(SB), (R20, R21) SBCS R17, R8 SBCS R19, R9 LDP ·p751x2+72(SB), (R22, R23) SBCS R20, R10 SBCS R21, R11 MOVD ·p751x2+88(SB), R24 SBCS R22, R12 SBCS R23, R13 SBCS R24, R14 SBC ZR, ZR, R25 // If x + y - 2 * p751 < 0, R25 is 1 and 2 * p751 should be added AND R25, R15 AND R25, R16 AND R25, R17 AND R25, R19 AND R25, R20 AND R25, R21 AND R25, R22 AND R25, R23 AND R25, R24 ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R16, R5 ADCS R16, R6 STP (R5, R6), 16(R2) ADCS R16, R7 ADCS R17, R8 STP (R7, R8), 32(R2) ADCS R19, R9 ADCS R20, R10 STP (R9, R10), 48(R2) ADCS R21, R11 ADCS R22, R12 STP (R11, R12), 64(R2) ADCS R23, R13 ADC R24, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751SubReduced(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load x into R3-R14 // Subtract y from x and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) SUBS R15, R3 SBCS R16, R4 SBCS R17, R5 SBCS R19, R6 LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 SBCS R17, R9 SBCS R19, R10 LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 SBCS R17, R13 SBCS R19, R14 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and 2 * p751 should be added LDP ·p751x2+0(SB), (R16, R17) AND R15, R16 AND R15, R17 LDP ·p751x2+40(SB), (R19, R20) AND R15, R19 AND R15, R20 ADDS R16, R3 ADCS R17, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R17, R6 STP (R5, R6), 16(R2) ADCS R17, R7 ADCS R19, R8 STP (R7, R8), 32(R2) ADCS R20, R9 LDP ·p751x2+56(SB), (R16, R17) AND R15, R16 AND R15, R17 LDP ·p751x2+72(SB), (R19, R20) AND R15, R19 AND R15, R20 ADCS R16, R10 STP (R9, R10), 48(R2) ADCS R17, R11 ADCS R19, R12 STP (R11, R12), 64(R2) ADCS R20, R13 MOVD ·p751x2+88(SB), R16 AND R15, R16 ADC R16, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load first summand into R3-R14 // Add first summand and second summand and store result in R3-R14 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 32(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 64(R2) ADCS R17, R13 ADC R19, R14 STP (R13, R14), 80(R2) RET TEXT ·fp751X2AddLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) ADDS R15, R3 ADCS R16, R4 STP (R3, R4), 0(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 32(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 64(R2) ADCS R17, R13 ADCS R19, R14 STP (R13, R14), 80(R2) LDP 96(R0), (R3, R4) LDP 96(R1), (R15, R16) LDP 112(R0), (R5, R6) LDP 112(R1), (R17, R19) ADCS R15, R3 ADCS R16, R4 STP (R3, R4), 96(R2) ADCS R17, R5 ADCS R19, R6 STP (R5, R6), 112(R2) LDP 128(R0), (R7, R8) LDP 128(R1), (R15, R16) LDP 144(R0), (R9, R10) LDP 144(R1), (R17, R19) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 128(R2) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 144(R2) LDP 160(R0), (R11, R12) LDP 160(R1), (R15, R16) LDP 176(R0), (R13, R14) LDP 176(R1), (R17, R19) ADCS R15, R11 ADCS R16, R12 STP (R11, R12), 160(R2) ADCS R17, R13 ADC R19, R14 STP (R13, R14), 176(R2) RET TEXT ·fp751X2SubLazy(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 LDP 0(R0), (R3, R4) LDP 0(R1), (R15, R16) LDP 16(R0), (R5, R6) LDP 16(R1), (R17, R19) SUBS R15, R3 SBCS R16, R4 STP (R3, R4), 0(R2) SBCS R17, R5 SBCS R19, R6 STP (R5, R6), 16(R2) LDP 32(R0), (R7, R8) LDP 32(R1), (R15, R16) LDP 48(R0), (R9, R10) LDP 48(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 STP (R7, R8), 32(R2) SBCS R17, R9 SBCS R19, R10 STP (R9, R10), 48(R2) LDP 64(R0), (R11, R12) LDP 64(R1), (R15, R16) LDP 80(R0), (R13, R14) LDP 80(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 STP (R11, R12), 64(R2) SBCS R17, R13 SBCS R19, R14 STP (R13, R14), 80(R2) LDP 96(R0), (R3, R4) LDP 96(R1), (R15, R16) LDP 112(R0), (R5, R6) LDP 112(R1), (R17, R19) SBCS R15, R3 SBCS R16, R4 SBCS R17, R5 SBCS R19, R6 LDP 128(R0), (R7, R8) LDP 128(R1), (R15, R16) LDP 144(R0), (R9, R10) LDP 144(R1), (R17, R19) SBCS R15, R7 SBCS R16, R8 SBCS R17, R9 SBCS R19, R10 LDP 160(R0), (R11, R12) LDP 160(R1), (R15, R16) LDP 176(R0), (R13, R14) LDP 176(R1), (R17, R19) SBCS R15, R11 SBCS R16, R12 SBCS R17, R13 SBCS R19, R14 SBC ZR, ZR, R15 // If x - y < 0, R15 is 1 and p751 should be added MOVD ·p751+0(SB), R20 AND R15, R20 LDP ·p751+40(SB), (R16, R17) ADDS R20, R3 ADCS R20, R4 STP (R3, R4), 96(R2) ADCS R20, R5 ADCS R20, R6 STP (R5, R6), 112(R2) ADCS R20, R7 LDP ·p751+56(SB), (R19, R20) AND R15, R16 AND R15, R17 ADCS R16, R8 STP (R7, R8), 128(R2) ADCS R17, R9 LDP ·p751+72(SB), (R16, R17) AND R15, R19 AND R15, R20 ADCS R19, R10 STP (R9, R10), 144(R2) ADCS R20, R11 MOVD ·p751+88(SB), R19 AND R15, R16 AND R15, R17 ADCS R16, R12 STP (R11, R12), 160(R2) ADCS R17, R13 AND R15, R19 ADC R19, R14 STP (R13, R14), 176(R2) RET // Expects that X0*Y0 is already in Z0(low),Z3(high) and X0*Y1 in Z1(low),Z2(high) // Z0 is not actually touched // Result of (X0-X2) * (Y0-Y2) will be in Z0-Z5 // Inputs remain intact #define mul192x192comba(X0, X1, X2, Y0, Y1, Y2, Z0, Z1, Z2, Z3, Z4, Z5, T0, T1, T2, T3) \ MUL X1, Y0, T2 \ UMULH X1, Y0, T3 \ \ ADDS Z3, Z1 \ ADCS ZR, Z2 \ ADC ZR, ZR, Z3 \ \ MUL X0, Y2, T0 \ UMULH X0, Y2, T1 \ \ ADDS T2, Z1 \ ADCS T3, Z2 \ ADC ZR, Z3 \ \ MUL X1, Y1, T2 \ UMULH X1, Y1, T3 \ \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, ZR, Z4 \ \ MUL X2, Y0, T0 \ UMULH X2, Y0, T1 \ \ ADDS T2, Z2 \ ADCS T3, Z3 \ ADC ZR, Z4 \ \ MUL X1, Y2, T2 \ UMULH X1, Y2, T3 \ \ ADDS T0, Z2 \ ADCS T1, Z3 \ ADC ZR, Z4 \ \ MUL X2, Y1, T0 \ UMULH X2, Y1, T1 \ \ ADDS T2, Z3 \ ADCS T3, Z4 \ ADC ZR, ZR, Z5 \ \ MUL X2, Y2, T2 \ UMULH X2, Y2, T3 \ \ ADDS T0, Z3 \ ADCS T1, Z4 \ ADC ZR, Z5 \ \ ADDS T2, Z4 \ ADC T3, Z5 // Expects that X points to (X4-X6), Y to (Y4-Y6) // Result of (X0-X5) * (Y0-Y5) will be in (0(Z), 8(Z), 16(Z), T0-T8) // Inputs get overwritten #define mul384x384karatsuba(X, Y, Z, X0, X1, X2, X3, X4, X5, Y0, Y1, Y2, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)\ ADDS X0, X3 \ // xH + xL, destroys xH ADCS X1, X4 \ ADCS X2, X5 \ ADC ZR, ZR, T10 \ \ ADDS Y0, Y3 \ // yH + yL, destroys yH ADCS Y1, Y4 \ ADCS Y2, Y5 \ ADC ZR, ZR, T6 \ \ SUB T10, ZR, T7 \ SUB T6, ZR, T8 \ AND T6, T10 \ // combined carry \ AND T7, Y3, T0 \ // masked(yH + yL) AND T7, Y4, T1 \ AND T7, Y5, T2 \ \ AND T8, X3, T3 \ // masked(xH + xL) AND T8, X4, T4 \ AND T8, X5, T5 \ \ ADDS T3, T0 \ ADCS T4, T1 \ STP (T0, T1), 0+Z \ \ MUL X3, Y3, T0 \ MUL X3, Y4, T1 \ \ ADCS T5, T2 \ MOVD T2, 16+Z \ \ UMULH X3, Y4, T2 \ UMULH X3, Y3, T3 \ \ ADC ZR, T10 \ \ // (xH + xL) * (yH + yL) mul192x192comba(X3, X4, X5, Y3, Y4, Y5, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)\ \ MUL X0, Y0, X3 \ LDP 0+Z, (T6, T7) \ MOVD 16+Z, T8 \ \ UMULH X0, Y0, Y3 \ ADDS T6, T3 \ ADCS T7, T4 \ MUL X0, Y1, X4 \ ADCS T8, T5 \ ADC ZR, T10 \ UMULH X0, Y1, X5 \ \ // xL * yL mul192x192comba(X0, X1, X2, Y0, Y1, Y2, X3, X4, X5, Y3, Y4, Y5, T6, T7, T8, T9)\ \ STP (X3, X4), 0+Z \ MOVD X5, 16+Z \ \ SUBS X3, T0 \ // (xH + xL) * (yH + yL) - xL * yL SBCS X4, T1 \ LDP 0+X, (X3, X4) \ SBCS X5, T2 \ MOVD 16+X, X5 \ SBCS Y3, T3 \ SBCS Y4, T4 \ SBCS Y5, T5 \ SBC ZR, T10 \ \ ADDS Y3, T0 \ // ((xH + xL) * (yH + yL) - xL * yL) * 2^192 + xL * yL ADCS Y4, T1 \ LDP 0+Y, (Y3, Y4) \ MUL X3, Y3, X0 \ ADCS Y5, T2 \ UMULH X3, Y3, Y0 \ MOVD 16+Y, Y5 \ MUL X3, Y4, X1 \ ADCS ZR, T3 \ UMULH X3, Y4, X2 \ ADCS ZR, T4 \ ADCS ZR, T5 \ ADC ZR, T10 \ \ // xH * yH, overwrite xLow, yLow mul192x192comba(X3, X4, X5, Y3, Y4, Y5, X0, X1, X2, Y0, Y1, Y2, T6, T7, T8, T9)\ \ SUBS X0, T0 \ // ((xH + xL) * (yH + yL) - xL * yL - xH * yH) SBCS X1, T1 \ SBCS X2, T2 \ SBCS Y0, T3 \ SBCS Y1, T4 \ SBCS Y2, T5 \ SBC ZR, T10 \ \ ADDS X0, T3 \ ADCS X1, T4 \ ADCS X2, T5 \ ADCS T10, Y0, T6 \ ADCS ZR, Y1, T7 \ ADC ZR, Y2, T8 TEXT ·fp751Mul(SB), NOSPLIT, $0-24 MOVD z+0(FP), R2 MOVD x+8(FP), R0 MOVD y+16(FP), R1 // Load xL in R3-R8, xH in R9-R14 // (xH + xL) in R3-R8, destroys xH LDP 0(R0), (R3, R4) LDP 48(R0), (R9, R10) ADDS R9, R3 ADCS R10, R4 LDP 16(R0), (R5, R6) LDP 64(R0), (R11, R12) ADCS R11, R5 ADCS R12, R6 LDP 32(R0), (R7, R8) LDP 80(R0), (R13, R14) ADCS R13, R7 ADCS R14, R8 ADC ZR, ZR, R22 // Load yL in R9-R14, yH in R15-21 // (yH + yL) in R9-R14, destroys yH LDP 0(R1), (R9, R10) LDP 48(R1), (R15, R16) ADDS R15, R9 ADCS R16, R10 LDP 16(R1), (R11, R12) LDP 64(R1), (R17, R19) ADCS R17, R11 ADCS R19, R12 LDP 32(R1), (R13, R14) LDP 80(R1), (R20, R21) ADCS R20, R13 ADCS R21, R14 ADC ZR, ZR, R23 // Compute masks and combined carry SUB R22, ZR, R24 SUB R23, ZR, R25 AND R23, R22 // Store xH, yH in z so mul384x384karatsuba can retrieve them from memory // It doesn't have enough registers // Meanwhile computed masked(xH + xL) in R15-R21 STP (R6, R7), 0(R2) AND R25, R3, R15 AND R25, R4, R16 STP (R8, R12), 16(R2) AND R25, R5, R17 AND R25, R6, R19 STP (R13, R14), 32(R2) AND R25, R7, R20 AND R25, R8, R21 // Masked(xH + xL) + masked(yH + yL) in R15-R21 // Store intermediate values in z AND R24, R9, R25 AND R24, R10, R26 ADDS R25, R15 ADCS R26, R16 STP (R15, R16), 96(R2) AND R24, R11, R25 AND R24, R12, R26 ADCS R25, R17 ADCS R26, R19 STP (R17, R19), 112(R2) AND R24, R13, R25 AND R24, R14, R26 ADCS R25, R20 ADCS R26, R21 STP (R20, R21), 128(R2) // Store carry in R29 so it can remain there ADC ZR, R22, R29 // (xH + xL) * (yH + yL) mul384x384karatsuba(0(R2), 24(R2), 48(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) // Load masked(xH + xL) + masked(yH + yL) and add that to its top half // Store the result back in z STP (R15, R16), 72(R2) LDP 96(R2), (R3, R4) ADDS R3, R19 STP (R17, R19), 88(R2) ADCS R4, R20 LDP 112(R2), (R5, R6) ADCS R5, R21 STP (R20, R21), 104(R2) ADCS R6, R22 LDP 128(R2), (R7, R8) ADCS R7, R23 STP (R22, R23), 120(R2) ADCS R8, R24 MOVD R24, 136(R2) ADC ZR, R29 // Load xL, yL LDP 0(R0), (R3, R4) LDP 16(R0), (R5, R6) LDP 32(R0), (R7, R8) LDP 0(R1), (R9, R10) LDP 16(R1), (R11, R12) LDP 32(R1), (R13, R14) // xL * yL mul384x384karatsuba(24(R0), 24(R1), 0(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) // (xH + xL) * (yH + yL) - xL * yL in R3-R14 LDP 0(R2), (R12, R13) LDP 48(R2), (R3, R4) SUBS R12, R3 LDP 64(R2), (R5, R6) MOVD 16(R2), R14 SBCS R13, R4 SBCS R14, R5 LDP 80(R2), (R7, R8) SBCS R15, R6 SBCS R16, R7 LDP 96(R2), (R9, R10) SBCS R17, R8 SBCS R19, R9 LDP 112(R2), (R11, R12) SBCS R20, R10 SBCS R21, R11 LDP 128(R2), (R13, R14) SBCS R22, R12 SBCS R23, R13 SBCS R24, R14 SBC ZR, R29 STP (R15, R16), 24(R2) MOVD R17, 40(R2) // ((xH + xL) * (yH + yL) - xL * yL) * 2^384 + xL * yL and store back in z ADDS R19, R3 ADCS R20, R4 STP (R3, R4), 48(R2) ADCS R21, R5 ADCS R22, R6 STP (R5, R6), 64(R2) ADCS R23, R7 ADCS R24, R8 STP (R7, R8), 80(R2) ADCS ZR, R9 ADCS ZR, R10 STP (R9, R10), 96(R2) ADCS ZR, R11 ADCS ZR, R12 STP (R11, R12), 112(R2) ADCS ZR, R13 ADCS ZR, R14 STP (R13, R14), 128(R2) ADC ZR, R29 // Load xH, yH LDP 48(R0), (R3, R4) LDP 64(R0), (R5, R6) LDP 80(R0), (R7, R8) LDP 48(R1), (R9, R10) LDP 64(R1), (R11, R12) LDP 80(R1), (R13, R14) // xH * yH mul384x384karatsuba(72(R0), 72(R1), 144(R2), R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R19, R20, R21, R22, R23, R24, R25, R26) LDP 144(R2), (R12, R13) MOVD 160(R2), R14 // (xH + xL) * (yH + yL) - xL * yL - xH * yH in R3-R14 // Store lower half in z, that's done LDP 48(R2), (R3, R4) SUBS R12, R3 LDP 64(R2), (R5, R6) SBCS R13, R4 SBCS R14, R5 LDP 80(R2), (R7, R8) SBCS R15, R6 SBCS R16, R7 LDP 96(R2), (R9, R10) SBCS R17, R8 SBCS R19, R9 LDP 112(R2), (R11, R12) SBCS R20, R10 SBCS R21, R11 LDP 128(R2), (R13, R14) SBCS R22, R12 SBCS R23, R13 STP (R3, R4), 48(R2) SBCS R24, R14 STP (R5, R6), 64(R2) SBC ZR, R29 STP (R7, R8), 80(R2) // (xH * yH) * 2^768 + ((xH + xL) * (yH + yL) - xL * yL - xH * yH) * 2^384 + xL * yL // Store remaining limbs in z LDP 144(R2), (R3, R4) MOVD 160(R2), R5 ADDS R3, R9 ADCS R4, R10 STP (R9, R10), 96(R2) ADCS R5, R11 ADCS R15, R12 STP (R11, R12), 112(R2) ADCS R16, R13 ADCS R17, R14 STP (R13, R14), 128(R2) ADCS R29, R19 ADCS ZR, R20 STP (R19, R20), 144(R2) ADCS ZR, R21 ADCS ZR, R22 STP (R21, R22), 160(R2) ADCS ZR, R23 ADC ZR, R24 STP (R23, R24), 176(R2) RET TEXT ·fp751MontgomeryReduce(SB), NOSPLIT, $0-16 MOVD z+0(FP), R0 MOVD x+8(FP), R1 // Load p751+1 in R14-R17, R29, R19-R20, spread over arithmetic LDP ·p751p1+40(SB), (R14, R15) // z0-z11 will be R2-R13 // Load x0-x4 to z0-z4 and x5, spread over arithmetic LDP 0(R1), (R2, R3) // x5 iteration MUL R2, R14, R22 LDP 32(R1), (R6, R21) UMULH R2, R14, R23 ADDS R21, R22, R7 // Set z5 ADC ZR, R23, R25 // x6 iteration MUL R2, R15, R22 MOVD 48(R1), R21 UMULH R2, R15, R23 ADDS R22, R25 ADC R23, ZR, R26 MUL R3, R14, R22 LDP ·p751p1+56(SB), (R16, R17) UMULH R3, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 ADDS R21, R25, R8 // Set z6 ADCS ZR, R26 ADC ZR, R24 // x7 iteration MUL R2, R16, R22 MOVD 56(R1), R21 UMULH R2, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R3, R15, R22 LDP 16(R1), (R4, R5) UMULH R3, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R4, R14, R22 LDP ·p751p1+72(SB), (R29, R19) UMULH R4, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R9 // Set z7 ADCS ZR, R24 ADC ZR, R25 // x8 iteration MUL R2, R17, R22 MOVD 64(R1), R21 UMULH R2, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R3, R16, R22 MOVD ·p751p1+88(SB), R20 UMULH R3, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R4, R15, R22 UMULH R4, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R5, R14, R22 UMULH R5, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R24, R21, R10 // Set z8 ADCS ZR, R25 ADC ZR, R26 // x9 iteration MUL R2, R29, R22 MOVD 72(R1), R21 UMULH R2, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R3, R17, R22 UMULH R3, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R4, R16, R22 UMULH R4, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R5, R15, R22 UMULH R5, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R6, R14, R22 UMULH R6, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R11 // Set z9 ADCS ZR, R26 ADC ZR, R24 // x10 iteration MUL R2, R19, R22 MOVD 80(R1), R21 UMULH R2, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R3, R29, R22 UMULH R3, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R4, R17, R22 UMULH R4, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R5, R16, R22 UMULH R5, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R6, R15, R22 UMULH R6, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R7, R14, R22 UMULH R7, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R12 // Set z10 ADCS ZR, R24 ADC ZR, R25 // x11 iteration MUL R2, R20, R22 MOVD 88(R1), R21 UMULH R2, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R3, R19, R22 UMULH R3, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R4, R29, R22 UMULH R4, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R5, R17, R22 UMULH R5, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R6, R16, R22 UMULH R6, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R7, R15, R22 UMULH R7, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R8, R14, R22 UMULH R8, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R13 // Set z11 ADCS ZR, R25 ADC ZR, R26 // x12 iteration MUL R3, R20, R22 MOVD 96(R1), R21 UMULH R3, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R4, R19, R22 UMULH R4, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R5, R29, R22 UMULH R5, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R6, R17, R22 UMULH R6, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R7, R16, R22 UMULH R7, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R8, R15, R22 UMULH R8, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R9, R14, R22 UMULH R9, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R2 // Set z0 ADCS ZR, R26 ADC ZR, R24 // x13 iteration MUL R4, R20, R22 MOVD 104(R1), R21 UMULH R4, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R5, R19, R22 UMULH R5, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R6, R29, R22 UMULH R6, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R7, R17, R22 UMULH R7, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R8, R16, R22 UMULH R8, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R9, R15, R22 UMULH R9, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R10, R14, R22 UMULH R10, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R3 // Set z1 STP (R2, R3), 0(R0) ADCS ZR, R24 ADC ZR, R25 // x14 iteration MUL R5, R20, R22 MOVD 112(R1), R21 UMULH R5, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R6, R19, R22 UMULH R6, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R7, R29, R22 UMULH R7, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R8, R17, R22 UMULH R8, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R9, R16, R22 UMULH R9, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R10, R15, R22 UMULH R10, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R11, R14, R22 UMULH R11, R14, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R4 // Set z2 ADCS ZR, R25 ADC ZR, R26 // x15 iteration MUL R6, R20, R22 MOVD 120(R1), R21 UMULH R6, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R7, R19, R22 UMULH R7, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R8, R29, R22 UMULH R8, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R9, R17, R22 UMULH R9, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R10, R16, R22 UMULH R10, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R11, R15, R22 UMULH R11, R15, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R12, R14, R22 UMULH R12, R14, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R5 // Set z3 STP (R4, R5), 16(R0) ADCS ZR, R26 ADC ZR, R24 // x16 iteration MUL R7, R20, R22 MOVD 128(R1), R21 UMULH R7, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R8, R19, R22 UMULH R8, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R9, R29, R22 UMULH R9, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R10, R17, R22 UMULH R10, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R11, R16, R22 UMULH R11, R16, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R12, R15, R22 UMULH R12, R15, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R13, R14, R22 UMULH R13, R14, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R6 // Set z4 ADCS ZR, R24 ADC ZR, R25 // x17 iteration MUL R8, R20, R22 MOVD 136(R1), R21 UMULH R8, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R9, R19, R22 UMULH R9, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R10, R29, R22 UMULH R10, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R11, R17, R22 UMULH R11, R17, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R12, R16, R22 UMULH R12, R16, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R13, R15, R22 UMULH R13, R15, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R7 // Set z5 STP (R6, R7), 32(R0) ADCS ZR, R25 ADC ZR, R26 // x18 iteration MUL R9, R20, R22 MOVD 144(R1), R21 UMULH R9, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R10, R19, R22 UMULH R10, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R11, R29, R22 UMULH R11, R29, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R12, R17, R22 UMULH R12, R17, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 MUL R13, R16, R22 UMULH R13, R16, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R8 // Set z6 ADCS ZR, R26 ADC ZR, R24 // x19 iteration MUL R10, R20, R22 MOVD 152(R1), R21 UMULH R10, R20, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, ZR, R25 MUL R11, R19, R22 UMULH R11, R19, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R12, R29, R22 UMULH R12, R29, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 MUL R13, R17, R22 UMULH R13, R17, R23 ADDS R22, R26 ADCS R23, R24 ADC ZR, R25 ADDS R21, R26, R9 // Set z7 STP (R8, R9), 48(R0) ADCS ZR, R24 ADC ZR, R25 // x20 iteration MUL R11, R20, R22 MOVD 160(R1), R21 UMULH R11, R20, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, ZR, R26 MUL R12, R19, R22 UMULH R12, R19, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 MUL R13, R29, R22 UMULH R13, R29, R23 ADDS R22, R24 ADCS R23, R25 ADC ZR, R26 ADDS R21, R24, R10 // Set z8 ADCS ZR, R25 ADC ZR, R26 // x21 iteration MUL R12, R20, R22 MOVD 168(R1), R21 UMULH R12, R20, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, ZR, R24 MUL R13, R19, R22 UMULH R13, R19, R23 ADDS R22, R25 ADCS R23, R26 ADC ZR, R24 ADDS R21, R25, R11 // Set z9 STP (R10, R11), 64(R0) ADCS ZR, R26 ADC ZR, R24 // x22 iteration MUL R13, R20, R22 MOVD 176(R1), R21 UMULH R13, R20, R23 ADDS R22, R26 ADC R23, R24 ADDS R21, R26, R12 // Set z10 MOVD 184(R1), R21 ADC R21, R24, R13 // Set z11 STP (R12, R13), 80(R0) RET TEXT ·fp751StrongReduce(SB), NOSPLIT, $0-8 MOVD x+0(FP), R0 // Keep x in R1-R12, p751 in R13-R21, subtract to R1-R12 MOVD ·p751+0(SB), R13 LDP 0(R0), (R1, R2) LDP 16(R0), (R3, R4) SUBS R13, R1 SBCS R13, R2 LDP 32(R0), (R5, R6) LDP ·p751+40(SB), (R14, R15) SBCS R13, R3 SBCS R13, R4 LDP 48(R0), (R7, R8) LDP ·p751+56(SB), (R16, R17) SBCS R13, R5 SBCS R14, R6 LDP 64(R0), (R9, R10) LDP ·p751+72(SB), (R19, R20) SBCS R15, R7 SBCS R16, R8 LDP 80(R0), (R11, R12) MOVD ·p751+88(SB), R21 SBCS R17, R9 SBCS R19, R10 SBCS R20, R11 SBCS R21, R12 SBC ZR, ZR, R22 // Mask with the borrow and add p751 AND R22, R13 AND R22, R14 AND R22, R15 AND R22, R16 AND R22, R17 AND R22, R19 AND R22, R20 AND R22, R21 ADDS R13, R1 ADCS R13, R2 STP (R1, R2), 0(R0) ADCS R13, R3 ADCS R13, R4 STP (R3, R4), 16(R0) ADCS R13, R5 ADCS R14, R6 STP (R5, R6), 32(R0) ADCS R15, R7 ADCS R16, R8 STP (R7, R8), 48(R0) ADCS R17, R9 ADCS R19, R10 STP (R9, R10), 64(R0) ADCS R20, R11 ADC R21, R12 STP (R11, R12), 80(R0) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/arith_decl.go000066400000000000000000000022561365325520100262350ustar00rootroot00000000000000// +build amd64,!noasm arm64,!noasm package p751 import . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" // If choice = 0, leave x,y unchanged. If choice = 1, set x,y = y,x. // If choice is neither 0 nor 1 then behaviour is undefined. // This function executes in constant time. //go:noescape func fp751ConditionalSwap(x, y *FpElement, choice uint8) // Compute z = x + y (mod p). //go:noescape func fp751AddReduced(z, x, y *FpElement) // Compute z = x - y (mod p). //go:noescape func fp751SubReduced(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp751AddLazy(z, x, y *FpElement) // Compute z = x + y, without reducing mod p. //go:noescape func fp751X2AddLazy(z, x, y *FpElementX2) // Compute z = x - y, without reducing mod p. //go:noescape func fp751X2SubLazy(z, x, y *FpElementX2) // Compute z = x * y. //go:noescape func fp751Mul(z *FpElementX2, x, y *FpElement) // Compute Montgomery reduction: set z = x * R^{-1} (mod 2*p). // It may destroy the input value. //go:noescape func fp751MontgomeryReduce(z *FpElement, x *FpElementX2) // Reduce a field element in [0, 2*p) to one in [0,p). //go:noescape func fp751StrongReduce(x *FpElement) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/arith_generic.go000066400000000000000000000101471365325520100267400ustar00rootroot00000000000000// +build noasm !amd64,!arm64 package p751 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/arith" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) // Compute z = x + y (mod p). func fp751AddReduced(z, x, y *FpElement) { var carry uint64 // z=x+y % p751 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } // z = z - p751x2 carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Subc64(carry, z[i], p751x2[i]) } // z = z + p751x2 mask := uint64(0 - carry) carry = 0 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, z[i], p751x2[i]&mask) } } // Compute z = x - y (mod p). func fp751SubReduced(z, x, y *FpElement) { var borrow uint64 for i := 0; i < NumWords; i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } mask := uint64(0 - borrow) borrow = 0 for i := 0; i < NumWords; i++ { z[i], borrow = Addc64(borrow, z[i], p751x2[i]&mask) } } // Conditionally swaps bits in x and y in constant time. // mask indicates bits to be swaped (set bits are swapped) // For details see "Hackers Delight, 2.20" // // Implementation doesn't actually depend on a prime field. func fp751ConditionalSwap(x, y *FpElement, mask uint8) { var tmp, mask64 uint64 mask64 = 0 - uint64(mask) for i := 0; i < len(x); i++ { tmp = mask64 & (x[i] ^ y[i]) x[i] = tmp ^ x[i] y[i] = tmp ^ y[i] } } // Perform Montgomery reduction: set z = x R^{-1} (mod 2*p) // with R=2^768. Destroys the input value. func fp751MontgomeryReduce(z *FpElement, x *FpElementX2) { var carry, t, u, v uint64 var uv Uint128 var count int count = 5 // number of 0 digits in the least significat part of p751 + 1 for i := 0; i < NumWords; i++ { for j := 0; j < i; j++ { if j < (i - count + 1) { uv = Mul64(z[j], p751p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i] = v v = u u = t t = 0 } for i := NumWords; i < 2*NumWords-1; i++ { if count > 0 { count-- } for j := i - NumWords + 1; j < NumWords; j++ { if j < (NumWords - count) { uv = Mul64(z[j], p751p1[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } } v, carry = Addc64(0, v, x[i]) u, carry = Addc64(carry, u, 0) t += carry z[i-NumWords] = v v = u u = t t = 0 } v, carry = Addc64(0, v, x[2*NumWords-1]) z[NumWords-1] = v } // Compute z = x * y. func fp751Mul(z *FpElementX2, x, y *FpElement) { var u, v, t uint64 var carry uint64 var uv Uint128 for i := uint64(0); i < NumWords; i++ { for j := uint64(0); j <= i; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } for i := NumWords; i < (2*NumWords)-1; i++ { for j := i - NumWords + 1; j < NumWords; j++ { uv = Mul64(x[j], y[i-j]) v, carry = Addc64(0, uv.L, v) u, carry = Addc64(carry, uv.H, u) t += carry } z[i] = v v = u u = t t = 0 } z[2*NumWords-1] = v } // Compute z = x + y, without reducing mod p. func fp751AddLazy(z, x, y *FpElement) { var carry uint64 for i := 0; i < NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Compute z = x + y, without reducing mod p. func fp751X2AddLazy(z, x, y *FpElementX2) { var carry uint64 for i := 0; i < 2*NumWords; i++ { z[i], carry = Addc64(carry, x[i], y[i]) } } // Reduce a field element in [0, 2*p) to one in [0,p). func fp751StrongReduce(x *FpElement) { var borrow, mask uint64 for i := 0; i < NumWords; i++ { x[i], borrow = Subc64(borrow, x[i], p751[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := 0; i < NumWords; i++ { x[i], borrow = Addc64(borrow, x[i], p751[i]&mask) } } // Compute z = x - y, without reducing mod p. func fp751X2SubLazy(z, x, y *FpElementX2) { var borrow, mask uint64 for i := 0; i < len(z); i++ { z[i], borrow = Subc64(borrow, x[i], y[i]) } // Sets all bits if borrow = 1 mask = 0 - borrow borrow = 0 for i := NumWords; i < len(z); i++ { z[i], borrow = Addc64(borrow, z[i], p751[i-NumWords]&mask) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/arith_test.go000066400000000000000000000202201365325520100262740ustar00rootroot00000000000000package p751 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "math/big" "testing" "testing/quick" ) func TestPrimeFieldElementToBigInt(t *testing.T) { // Chosen so that p < xR < 2p x := primeFieldElement{A: FpElement{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 140737488355328, }} // Computed using Sage: // sage: p = 2^372 * 3^239 - 1 // sage: R = 2^768 // sage: from_radix_64 = lambda xs: sum((xi * (2**64)**i for i,xi in enumerate(xs))) // sage: xR = from_radix_64([1]*11 + [2^47]) // sage: assert(p < xR) // sage: assert(xR < 2*p) // sage: (xR / R) % p xBig, _ := new(big.Int).SetString("4469946751055876387821312289373600189787971305258234719850789711074696941114031433609871105823930699680637820852699269802003300352597419024286385747737509380032982821081644521634652750355306547718505685107272222083450567982240", 10) if xBig.Cmp(toBigInt(&x.A)) != 0 { t.Error("Expected", xBig, "found", toBigInt(&x.A)) } } //------------------------------------------------------------------------------ // Extended Field //------------------------------------------------------------------------------ func TestOneFp2ToBytes(t *testing.T) { var x = P751OneFp2 var xBytes [188]byte kCurveOps.Fp2ToBytes(xBytes[:], &x) if xBytes[0] != 1 { t.Error("Expected 1, got", xBytes[0]) } for i := 1; i < 188; i++ { if xBytes[i] != 0 { t.Error("Expected 0, got", xBytes[0]) } } } func TestFp2ElementToBytesRoundTrip(t *testing.T) { roundTrips := func(x GeneratedTestParams) bool { var xBytes [188]byte var xPrime Fp2Element kCurveOps.Fp2ToBytes(xBytes[:], &x.ExtElem) kCurveOps.Fp2FromBytes(&xPrime, xBytes[:]) return VartimeEqFp2(&xPrime, &x.ExtElem) } if err := quick.Check(roundTrips, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulDistributesOverAdd(t *testing.T) { mulDistributesOverAdd := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x+y)*z t1 := new(Fp2Element) kFieldOps.Add(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = x*z + y*z t2 := new(Fp2Element) t3 := new(Fp2Element) kFieldOps.Mul(t2, &x.ExtElem, &z.ExtElem) kFieldOps.Mul(t3, &y.ExtElem, &z.ExtElem) kFieldOps.Add(t2, t2, t3) return VartimeEqFp2(t1, t2) } if err := quick.Check(mulDistributesOverAdd, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementMulIsAssociative(t *testing.T) { isAssociative := func(x, y, z GeneratedTestParams) bool { // Compute t1 = (x*y)*z t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &y.ExtElem) kFieldOps.Mul(t1, t1, &z.ExtElem) // Compute t2 = (y*z)*x t2 := new(Fp2Element) kFieldOps.Mul(t2, &y.ExtElem, &z.ExtElem) kFieldOps.Mul(t2, t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(isAssociative, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementSquareMatchesMul(t *testing.T) { sqrMatchesMul := func(x GeneratedTestParams) bool { // Compute t1 = (x*x) t1 := new(Fp2Element) kFieldOps.Mul(t1, &x.ExtElem, &x.ExtElem) // Compute t2 = x^2 t2 := new(Fp2Element) kFieldOps.Square(t2, &x.ExtElem) return VartimeEqFp2(t1, t2) } if err := quick.Check(sqrMatchesMul, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementInv(t *testing.T) { inverseIsCorrect := func(x GeneratedTestParams) bool { z := new(Fp2Element) kFieldOps.Inv(z, &x.ExtElem) // Now z = (1/x), so (z * x) * x == x kFieldOps.Mul(z, z, &x.ExtElem) kFieldOps.Mul(z, z, &x.ExtElem) return VartimeEqFp2(z, &x.ExtElem) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(inverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } func TestFp2ElementBatch3Inv(t *testing.T) { batchInverseIsCorrect := func(x1, x2, x3 GeneratedTestParams) bool { var x1Inv, x2Inv, x3Inv Fp2Element kFieldOps.Inv(&x1Inv, &x1.ExtElem) kFieldOps.Inv(&x2Inv, &x2.ExtElem) kFieldOps.Inv(&x3Inv, &x3.ExtElem) var y1, y2, y3 Fp2Element kCurveOps.Fp2Batch3Inv(&x1.ExtElem, &x2.ExtElem, &x3.ExtElem, &y1, &y2, &y3) return (VartimeEqFp2(&x1Inv, &y1) && VartimeEqFp2(&x2Inv, &y2) && VartimeEqFp2(&x3Inv, &y3)) } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (5 + quickCheckScaleFactor))} if err := quick.Check(batchInverseIsCorrect, quickCheckConfig); err != nil { t.Error(err) } } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ func TestPrimeFieldElementMulVersusBigInt(t *testing.T) { mulMatchesBigInt := func(x, y primeFieldElement) bool { z := new(primeFieldElement) z.Mul(&x, &y) check := new(big.Int) check.Mul(toBigInt(&x.A), toBigInt(&y.A)) check.Mod(check, cln16prime) return check.Cmp(toBigInt(&z.A)) == 0 } if err := quick.Check(mulMatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func TestPrimeFieldElementP34VersusBigInt(t *testing.T) { var p34, _ = new(big.Int).SetString("2588679435442326313244442059466701330356847411387267792529047419763669735170619711625720724140266678406138302904710050596300977994130638598261040117192787954244176710019728333589599932738193731745058771712747875468166412894207", 10) p34MatchesBigInt := func(x primeFieldElement) bool { z := new(primeFieldElement) z.P34(&x) check := toBigInt(&x.A) check.Exp(check, p34, cln16prime) return check.Cmp(toBigInt(&z.A)) == 0 } // This is more expensive; run fewer tests var quickCheckConfig = &quick.Config{MaxCount: (1 << (8 + quickCheckScaleFactor))} if err := quick.Check(p34MatchesBigInt, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkFp2ElementMul(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Mul(w, z, z) } } func BenchmarkFp2ElementInv(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Inv(w, z) } } func BenchmarkFp2ElementSquare(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Square(w, z) } } func BenchmarkFp2ElementAdd(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Add(w, z, z) } } func BenchmarkFp2ElementSub(b *testing.B) { z := &Fp2Element{A: bench_x, B: bench_y} w := new(Fp2Element) for n := 0; n < b.N; n++ { kFieldOps.Sub(w, z, z) } } func BenchmarkPrimeFieldElementMul(b *testing.B) { z := &primeFieldElement{A: bench_x} w := new(primeFieldElement) for n := 0; n < b.N; n++ { w.Mul(z, z) } } // --- field operation functions func BenchmarkFp751Multiply(b *testing.B) { for n := 0; n < b.N; n++ { fp751Mul(&benchmarkFpElementX2, &bench_x, &bench_y) } } func BenchmarkFp751MontgomeryReduce(b *testing.B) { z := bench_z // This benchmark actually computes garbage, because // fp751MontgomeryReduce mangles its input, but since it's // constant-time that shouldn't matter for the benchmarks. for n := 0; n < b.N; n++ { fp751MontgomeryReduce(&benchmarkFpElement, &z) } } func BenchmarkFp751AddReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp751AddReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp751SubReduced(b *testing.B) { for n := 0; n < b.N; n++ { fp751SubReduced(&benchmarkFpElement, &bench_x, &bench_y) } } func BenchmarkFp751ConditionalSwap(b *testing.B) { x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp751ConditionalSwap(&x, &y, 1) fp751ConditionalSwap(&x, &y, 0) } } func BenchmarkFp751StrongReduce(b *testing.B) { x := bench_x for n := 0; n < b.N; n++ { fp751StrongReduce(&x) } } func BenchmarkFp751AddLazy(b *testing.B) { var z FpElement x, y := bench_x, bench_y for n := 0; n < b.N; n++ { fp751AddLazy(&z, &x, &y) } } func BenchmarkFp751X2AddLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp751X2AddLazy(&x, &y, &z) } } func BenchmarkFp751X2SubLazy(b *testing.B) { x, y, z := bench_z, bench_z, bench_z for n := 0; n < b.N; n++ { fp751X2SubLazy(&x, &y, &z) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/consts.go000066400000000000000000000221551365325520100254500ustar00rootroot00000000000000package p751 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" cpu "github.com/henrydcase/nobs/utils" ) const ( // SIDH public key byte size P751_PublicKeySize = 564 // SIDH shared secret byte size. P751_SharedSecretSize = 188 // Max size of secret key for 2-torsion group, corresponds to 2^e2 P751_SecretBitLenA = 372 // Size of secret key for 3-torsion group, corresponds to floor(log_2(3^e3)) P751_SecretBitLenB = 378 // P751 bytelen ceil(751/8) P751_Bytelen = 94 // Size of a compuatation strategy for 2-torsion group strategySizeA = 185 // Size of a compuatation strategy for 3-torsion group strategySizeB = 238 // Number of 64-bit limbs used to store Fp element NumWords = 12 ) // CPU Capabilities. Those flags are referred by assembly code. According to // https://github.com/golang/go/issues/28230, variables referred from the // assembly must be in the same package. // We declare them variables not constants in order to facilitate testing. var ( // Signals support for MULX which is in BMI2 HasBMI2 = cpu.X86.HasBMI2 // Signals support for ADX and BMI2 HasADXandBMI2 = cpu.X86.HasBMI2 && cpu.X86.HasADX ) // The x-coordinate of PA var P751_affine_PA = Fp2Element{ A: FpElement{ 0xC2FC08CEAB50AD8B, 0x1D7D710F55E457B1, 0xE8738D92953DCD6E, 0xBAA7EBEE8A3418AA, 0xC9A288345F03F46F, 0xC8D18D167CFE2616, 0x02043761F6B1C045, 0xAA1975E13180E7E9, 0x9E13D3FDC6690DE6, 0x3A024640A3A3BB4F, 0x4E5AD44E6ACBBDAE, 0x0000544BEB561DAD, }, B: FpElement{ 0xE6CC41D21582E411, 0x07C2ECB7C5DF400A, 0xE8E34B521432AEC4, 0x50761E2AB085167D, 0x032CFBCAA6094B3C, 0x6C522F5FDF9DDD71, 0x1319217DC3A1887D, 0xDC4FB25803353A86, 0x362C8D7B63A6AB09, 0x39DCDFBCE47EA488, 0x4C27C99A2C28D409, 0x00003CB0075527C4, }, } // The x-coordinate of QA var P751_affine_QA = Fp2Element{ A: FpElement{ 0xD56FE52627914862, 0x1FAD60DC96B5BAEA, 0x01E137D0BF07AB91, 0x404D3E9252161964, 0x3C5385E4CD09A337, 0x4476426769E4AF73, 0x9790C6DB989DFE33, 0xE06E1C04D2AA8B5E, 0x38C08185EDEA73B9, 0xAA41F678A4396CA6, 0x92B9259B2229E9A0, 0x00002F9326818BE0, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RA = PA-QA var P751_affine_RA = Fp2Element{ A: FpElement{ 0x0BB84441DFFD19B3, 0x84B4DEA99B48C18E, 0x692DE648AD313805, 0xE6D72761B6DFAEE0, 0x223975C672C3058D, 0xA0FDE0C3CBA26FDC, 0xA5326132A922A3CA, 0xCA5E7F5D5EA96FA4, 0x127C7EFE33FFA8C6, 0x4749B1567E2A23C4, 0x2B7DF5B4AF413BFA, 0x0000656595B9623C, }, B: FpElement{ 0xED78C17F1EC71BE8, 0xF824D6DF753859B1, 0x33A10839B2A8529F, 0xFC03E9E25FDEA796, 0xC4708A8054DF1762, 0x4034F2EC034C6467, 0xABFB70FBF06ECC79, 0xDABE96636EC108B7, 0x49CBCFB090605FD3, 0x20B89711819A45A7, 0xFB8E1590B2B0F63E, 0x0000556A5F964AB2, }, } // The x-coordinate of PB var P751_affine_PB = Fp2Element{ A: FpElement{ 0xCFB6D71EF867AB0B, 0x4A5FDD76E9A45C76, 0x38B1EE69194B1F03, 0xF6E7B18A7761F3F0, 0xFCF01A486A52C84C, 0xCBE2F63F5AA75466, 0x6487BCE837B5E4D6, 0x7747F5A8C622E9B8, 0x4CBFE1E4EE6AEBBA, 0x8A8616A13FA91512, 0x53DB980E1579E0A5, 0x000058FEBFF3BE69, }, B: FpElement{ 0xA492034E7C075CC3, 0x677BAF00B04AA430, 0x3AAE0C9A755C94C8, 0x1DC4B064E9EBB08B, 0x3684EDD04E826C66, 0x9BAA6CB661F01B22, 0x20285A00AD2EFE35, 0xDCE95ABD0497065F, 0x16C7FBB3778E3794, 0x26B3AC29CEF25AAF, 0xFB3C28A31A30AC1D, 0x000046ED190624EE, }, } // The x-coordinate of QB var P751_affine_QB = Fp2Element{ A: FpElement{ 0xF1A8C9ED7B96C4AB, 0x299429DA5178486E, 0xEF4926F20CD5C2F4, 0x683B2E2858B4716A, 0xDDA2FBCC3CAC3EEB, 0xEC055F9F3A600460, 0xD5A5A17A58C3848B, 0x4652D836F42EAED5, 0x2F2E71ED78B3A3B3, 0xA771C057180ADD1D, 0xC780A5D2D835F512, 0x0000114EA3B55AC1, }, B: FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, }, } // The x-coordinate of RB = PB - QB var P751_affine_RB = Fp2Element{ A: FpElement{ 0x1C0D6733769D0F31, 0xF084C3086E2659D1, 0xE23D5DA27BCBD133, 0xF38EC9A8D5864025, 0x6426DC781B3B645B, 0x4B24E8E3C9FB03EE, 0x6432792F9D2CEA30, 0x7CC8E8B1AE76E857, 0x7F32BFB626BB8963, 0xB9F05995B48D7B74, 0x4D71200A7D67E042, 0x0000228457AF0637, }, B: FpElement{ 0x4AE37E7D8F72BD95, 0xDD2D504B3E993488, 0x5D14E7FA1ECB3C3E, 0x127610CEB75D6350, 0x255B4B4CAC446B11, 0x9EA12336C1F70CAF, 0x79FA68A2147BC2F8, 0x11E895CFDADBBC49, 0xE4B9D3C4D6356C18, 0x44B25856A67F951C, 0x5851541F61308D0B, 0x00002FFD994F7E4C, }, } // 2-torsion group computation strategy var P751_AliceIsogenyStrategy = [strategySizeA]uint32{ 0x50, 0x30, 0x1B, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x15, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x21, 0x14, 0x0C, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x08, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01} // 3-torsion group computation strategy var P751_BobIsogenyStrategy = [strategySizeB]uint32{ 0x70, 0x3F, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x31, 0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x15, 0x0C, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x09, 0x05, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01} // Used internally by this package. Not consts as Go doesn't allow arrays to be consts // ------------------------------- // p751 var p751 = FpElement{ 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xeeafffffffffffff, 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c} // 2*p751 var p751x2 = FpElement{ 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xDD5FFFFFFFFFFFFF, 0xC7D92D0A93F0F151, 0xB52B363427EF98ED, 0x109D30CFADD7D0ED, 0x0AC56A08B964AE90, 0x1C25213F2F75B8CD, 0x0000DFCBAA83EE38} // p751 + 1 var p751p1 = FpElement{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xeeb0000000000000, 0xe3ec968549f878a8, 0xda959b1a13f7cc76, 0x084e9867d6ebe876, 0x8562b5045cb25748, 0x0e12909f97badc66, 0x00006fe5d541f71c} // R^2 = (2^768)^2 mod p var p751R2 = FpElement{ 2535603850726686808, 15780896088201250090, 6788776303855402382, 17585428585582356230, 5274503137951975249, 2266259624764636289, 11695651972693921304, 13072885652150159301, 4908312795585420432, 6229583484603254826, 488927695601805643, 72213483953973} // 1*R mod p var P751OneFp2 = Fp2Element{ A: FpElement{ 0x249ad, 0x0, 0x0, 0x0, 0x0, 0x8310000000000000, 0x5527b1e4375c6c66, 0x697797bf3f4f24d0, 0xc89db7b2ac5c4e2e, 0x4ca4b439d2076956, 0x10f7926c7512c7e9, 0x2d5b24bce5e2}, } // 1/2 * R mod p var P751HalfFp2 = Fp2Element{ A: FpElement{ 0x00000000000124D6, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xB8E0000000000000, 0x9C8A2434C0AA7287, 0xA206996CA9A378A3, 0x6876280D41A41B52, 0xE903B49F175CE04F, 0x0F8511860666D227, 0x00004EA07CFF6E7F}, } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/curve_test.go000066400000000000000000000221741365325520100263230ustar00rootroot00000000000000package p751 import ( "bytes" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "testing" "testing/quick" ) func TestOne(t *testing.T) { var tmp Fp2Element kFieldOps.Mul(&tmp, &P751OneFp2, &affine_xP) if !VartimeEqFp2(&tmp, &affine_xP) { t.Error("Not equal 1") } } // This test is here only to ensure that ScalarMult helper works correctly func TestScalarMultVersusSage(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} xP = ScalarMult(&curve, &xP, mScalarBytes[:]) // = x([m]P) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(&affine_xaP, affine_xQ) { t.Error("\nExpected\n", affine_xaP, "\nfound\n", affine_xQ) } } func Test_jInvariant(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var jbufRes [P751_SharedSecretSize]byte var jbufExp [P751_SharedSecretSize]byte // Computed using Sage // j = 3674553797500778604587777859668542828244523188705960771798425843588160903687122861541242595678107095655647237100722594066610650373491179241544334443939077738732728884873568393760629500307797547379838602108296735640313894560419*i + 3127495302417548295242630557836520229396092255080675419212556702820583041296798857582303163183558315662015469648040494128968509467224910895884358424271180055990446576645240058960358037224785786494172548090318531038910933793845 var known_j = Fp2Element{ A: FpElement{0xc7a8921c1fb23993, 0xa20aea321327620b, 0xf1caa17ed9676fa8, 0x61b780e6b1a04037, 0x47784af4c24acc7a, 0x83926e2e300b9adf, 0xcd891d56fae5b66, 0x49b66985beb733bc, 0xd4bcd2a473d518f, 0xe242239991abe224, 0xa8af5b20f98672f8, 0x139e4d4e4d98}, B: FpElement{0xb5b52a21f81f359, 0x715e3a865db6d920, 0x9bac2f9d8911978b, 0xef14acd8ac4c1e3d, 0xe81aacd90cfb09c8, 0xaf898288de4a09d9, 0xb85a7fb88c5c4601, 0x2c37c3f1dd303387, 0x7ad3277fe332367c, 0xd4cbee7f25a8e6f8, 0x36eacbe979eaeffa, 0x59eb5a13ac33}, } kCurveOps.Jinvariant(&curve, jbufRes[:]) kCurveOps.Fp2ToBytes(jbufExp[:], &known_j) if !bytes.Equal(jbufRes[:], jbufExp[:]) { t.Error("Computed incorrect j-invariant: found\n", jbufRes, "\nexpected\n", jbufExp) } } func TestProjectivePointVartimeEq(t *testing.T) { var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} xQ := xP // Scale xQ, which results in the same projective point kFieldOps.Mul(&xQ.X, &xQ.X, &curve_A) kFieldOps.Mul(&xQ.Z, &xQ.Z, &curve_A) if !VartimeEqProjFp2(&xP, &xQ) { t.Error("Expected the scaled point to be equal to the original") } } func TestPointDoubleVersusSage(t *testing.T) { var curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 1) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP2) { t.Error("\nExpected\n", affine_xP2, "\nfound\n", affine_xQ) } } func TestPointMul4VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv4(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} kCurveOps.Pow2k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP4) { t.Error("\nExpected\n", affine_xP4, "\nfound\n", affine_xQ) } } func TestPointMul9VersusSage(t *testing.T) { var params = kCurveOps.CalcCurveParamsEquiv3(&curve) var xP ProjectivePoint xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} kCurveOps.Pow3k(&xP, ¶ms, 2) affine_xQ := xP.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xQ, &affine_xP9) { t.Error("\nExpected\n", affine_xP9, "\nfound\n", affine_xQ) } } func TestPointPow2kVersusScalarMult(t *testing.T) { var xP, xQ, xR ProjectivePoint var params = kCurveOps.CalcCurveParamsEquiv4(&curve) xP = ProjectivePoint{X: affine_xP, Z: P751OneFp2} xQ = xP kCurveOps.Pow2k(&xQ, ¶ms, 5) xR = ScalarMult(&curve, &xP, []byte{32}) affine_xQ := xQ.ToAffine(kCurveOps) // = x([32]P) affine_xR := xR.ToAffine(kCurveOps) // = x([32]P) if !VartimeEqFp2(affine_xQ, affine_xR) { t.Error("\nExpected\n", affine_xQ, "\nfound\n", affine_xR) } } func TestRecoverCoordinateA(t *testing.T) { var cparam ProjectiveCurveParameters // Vectors generated with SIKE reference implementation var a = Fp2Element{ A: FpElement{0x9331D9C5AAF59EA4, 0xB32B702BE4046931, 0xCEBB333912ED4D34, 0x5628CE37CD29C7A2, 0x0BEAC5ED48B7F58E, 0x1FB9D3E281D65B07, 0x9C0CFACC1E195662, 0xAE4BCE0F6B70F7D9, 0x59E4E63D43FE71A0, 0xEF7CE57560CC8615, 0xE44A8FB7901E74E8, 0x000069D13C8366D1}, B: FpElement{0xF6DA1070279AB966, 0xA78FB0CE7268C762, 0x19B40F044A57ABFA, 0x7AC8EE6160C0C233, 0x93D4993442947072, 0x757D2B3FA4E44860, 0x073A920F8C4D5257, 0x2031F1B054734037, 0xDEFAA1D2406555CD, 0x26F9C70E1496BE3D, 0x5B3F335A0A4D0976, 0x000013628B2E9C59}} var affine_xP = Fp2Element{ A: FpElement{0xea6b2d1e2aebb250, 0x35d0b205dc4f6386, 0xb198e93cb1830b8d, 0x3b5b456b496ddcc6, 0x5be3f0d41132c260, 0xce5f188807516a00, 0x54f3e7469ea8866d, 0x33809ef47f36286, 0x6fa45f83eabe1edb, 0x1b3391ae5d19fd86, 0x1e66daf48584af3f, 0xb430c14aaa87}, B: FpElement{0x97b41ebc61dcb2ad, 0x80ead31cb932f641, 0x40a940099948b642, 0x2a22fd16cdc7fe84, 0xaabf35b17579667f, 0x76c1d0139feb4032, 0x71467e1e7b1949be, 0x678ca8dadd0d6d81, 0x14445daea9064c66, 0x92d161eab4fa4691, 0x8dfbb01b6b238d36, 0x2e3718434e4e}} var affine_xQ = Fp2Element{ A: FpElement{0xb055cf0ca1943439, 0xa9ff5de2fa6c69ed, 0x4f2761f934e5730a, 0x61a1dcaa1f94aa4b, 0xce3c8fadfd058543, 0xeac432aaa6701b8e, 0x8491d523093aea8b, 0xba273f9bd92b9b7f, 0xd8f59fd34439bb5a, 0xdc0350261c1fe600, 0x99375ab1eb151311, 0x14d175bbdbc5}, B: FpElement{0xffb0ef8c2111a107, 0x55ceca3825991829, 0xdbf8a1ccc075d34b, 0xb8e9187bd85d8494, 0x670aa2d5c34a03b0, 0xef9fe2ed2b064953, 0xc911f5311d645aee, 0xf4411f409e410507, 0x934a0a852d03e1a8, 0xe6274e67ae1ad544, 0x9f4bc563c69a87bc, 0x6f316019681e}} var affine_xQmP = Fp2Element{ A: FpElement{0x6ffb44306a153779, 0xc0ffef21f2f918f3, 0x196c46d35d77f778, 0x4a73f80452edcfe6, 0x9b00836bce61c67f, 0x387879418d84219e, 0x20700cf9fc1ec5d1, 0x1dfe2356ec64155e, 0xf8b9e33038256b1c, 0xd2aaf2e14bada0f0, 0xb33b226e79a4e313, 0x6be576fad4e5}, B: FpElement{0x7db5dbc88e00de34, 0x75cc8cb9f8b6e11e, 0x8c8001c04ebc52ac, 0x67ef6c981a0b5a94, 0xc3654fbe73230738, 0xc6a46ee82983ceca, 0xed1aa61a27ef49f0, 0x17fe5a13b0858fe0, 0x9ae0ca945a4c6b3c, 0x234104a218ad8878, 0xa619627166104394, 0x556a01ff2e7e}} cparam.C = P751OneFp2 kCurveOps.RecoverCoordinateA(&cparam, &affine_xP, &affine_xQ, &affine_xQmP) // Check A is correct if !VartimeEqFp2(&cparam.A, &a) { t.Error("\nExpected\n", a, "\nfound\n", cparam.A) } // Check C is not changed if !VartimeEqFp2(&cparam.C, &P751OneFp2) { t.Error("\nExpected\n", cparam.C, "\nfound\n", P751OneFp2) } } func TestR2LVersusSage(t *testing.T) { var xR ProjectivePoint sageAffine_xR := Fp2Element{ A: FpElement{0x729465ba800d4fd5, 0x9398015b59e514a1, 0x1a59dd6be76c748e, 0x1a7db94eb28dd55c, 0x444686e680b1b8ec, 0xcc3d4ace2a2454ff, 0x51d3dab4ec95a419, 0xc3b0f33594acac6a, 0x9598a74e7fd44f8a, 0x4fbf8c638f1c2e37, 0x844e347033052f51, 0x6cd6de3eafcf}, B: FpElement{0x85da145412d73430, 0xd83c0e3b66eb3232, 0xd08ff2d453ec1369, 0xa64aaacfdb395b13, 0xe9cba211a20e806e, 0xa4f80b175d937cfc, 0x556ce5c64b1f7937, 0xb59b39ea2b3fdf7a, 0xc2526b869a4196b3, 0x8dad90bca9371750, 0xdfb4a30c9d9147a2, 0x346d2130629b}} xR = kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) affine_xR := xR.ToAffine(kCurveOps) if !VartimeEqFp2(affine_xR, &sageAffine_xR) { t.Error("\nExpected\n", sageAffine_xR, "\nfound\n", affine_xR) } } func TestPointTripleVersusAddDouble(t *testing.T) { tripleEqualsAddDouble := func(params GeneratedTestParams) bool { var P2, P3, P2plusP ProjectivePoint eqivParams4 := kCurveOps.CalcCurveParamsEquiv4(¶ms.Cparam) eqivParams3 := kCurveOps.CalcCurveParamsEquiv3(¶ms.Cparam) P2 = params.Point P3 = params.Point kCurveOps.Pow2k(&P2, &eqivParams4, 1) // = x([2]P) kCurveOps.Pow3k(&P3, &eqivParams3, 1) // = x([3]P) P2plusP = AddProjFp2(&P2, ¶ms.Point, ¶ms.Point) // = x([2]P + P) return VartimeEqProjFp2(&P3, &P2plusP) } if err := quick.Check(tripleEqualsAddDouble, quickCheckConfig); err != nil { t.Error(err) } } func BenchmarkThreePointLadder379BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) } } func BenchmarkR2L379BitScalar(b *testing.B) { var mScalarBytes = [...]uint8{84, 222, 146, 63, 85, 18, 173, 162, 167, 38, 10, 8, 143, 176, 93, 228, 247, 128, 50, 128, 205, 42, 15, 137, 119, 67, 43, 3, 61, 91, 237, 24, 235, 12, 53, 96, 186, 164, 232, 223, 197, 224, 64, 109, 137, 63, 246, 4} for n := 0; n < b.N; n++ { kCurveOps.ScalarMul3Pt(&curve, &threePointLadderInputs[0], &threePointLadderInputs[1], &threePointLadderInputs[2], uint(len(mScalarBytes)*8), mScalarBytes[:]) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/field_ops.go000066400000000000000000000177211365325520100261060ustar00rootroot00000000000000package p751 import . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" // 2*p751 //------------------------------------------------------------------------------ // Implementtaion of FieldOperations //------------------------------------------------------------------------------ // Implements FieldOps type fp751Ops struct{} func FieldOperations() FieldOps { return fp751Ops{} } func (fp751Ops) Add(dest, lhs, rhs *Fp2Element) { fp751AddReduced(&dest.A, &lhs.A, &rhs.A) fp751AddReduced(&dest.B, &lhs.B, &rhs.B) } func (fp751Ops) Sub(dest, lhs, rhs *Fp2Element) { fp751SubReduced(&dest.A, &lhs.A, &rhs.A) fp751SubReduced(&dest.B, &lhs.B, &rhs.B) } func (fp751Ops) Mul(dest, lhs, rhs *Fp2Element) { // Let (a,b,c,d) = (lhs.a,lhs.b,rhs.a,rhs.b). a := &lhs.A b := &lhs.B c := &rhs.A d := &rhs.B // We want to compute // // (a + bi)*(c + di) = (a*c - b*d) + (a*d + b*c)i // // Use Karatsuba's trick: note that // // (b - a)*(c - d) = (b*c + a*d) - a*c - b*d // // so (a*d + b*c) = (b-a)*(c-d) + a*c + b*d. var ac, bd FpElementX2 fp751Mul(&ac, a, c) // = a*c*R*R fp751Mul(&bd, b, d) // = b*d*R*R var b_minus_a, c_minus_d FpElement fp751SubReduced(&b_minus_a, b, a) // = (b-a)*R fp751SubReduced(&c_minus_d, c, d) // = (c-d)*R var ad_plus_bc FpElementX2 fp751Mul(&ad_plus_bc, &b_minus_a, &c_minus_d) // = (b-a)*(c-d)*R*R fp751X2AddLazy(&ad_plus_bc, &ad_plus_bc, &ac) // = ((b-a)*(c-d) + a*c)*R*R fp751X2AddLazy(&ad_plus_bc, &ad_plus_bc, &bd) // = ((b-a)*(c-d) + a*c + b*d)*R*R fp751MontgomeryReduce(&dest.B, &ad_plus_bc) // = (a*d + b*c)*R mod p var ac_minus_bd FpElementX2 fp751X2SubLazy(&ac_minus_bd, &ac, &bd) // = (a*c - b*d)*R*R fp751MontgomeryReduce(&dest.A, &ac_minus_bd) // = (a*c - b*d)*R mod p } func (fp751Ops) Square(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // (a + bi)*(a + bi) = (a^2 - b^2) + 2abi. var a2, a_plus_b, a_minus_b FpElement fp751AddReduced(&a2, a, a) // = a*R + a*R = 2*a*R fp751AddReduced(&a_plus_b, a, b) // = a*R + b*R = (a+b)*R fp751SubReduced(&a_minus_b, a, b) // = a*R - b*R = (a-b)*R var asq_minus_bsq, ab2 FpElementX2 fp751Mul(&asq_minus_bsq, &a_plus_b, &a_minus_b) // = (a+b)*(a-b)*R*R = (a^2 - b^2)*R*R fp751Mul(&ab2, &a2, b) // = 2*a*b*R*R fp751MontgomeryReduce(&dest.A, &asq_minus_bsq) // = (a^2 - b^2)*R mod p fp751MontgomeryReduce(&dest.B, &ab2) // = 2*a*b*R mod p } // Set dest = 1/x // // Allowed to overlap dest with x. // // Returns dest to allow chaining operations. func (fp751Ops) Inv(dest, x *Fp2Element) { a := &x.A b := &x.B // We want to compute // // 1 1 (a - bi) (a - bi) // -------- = -------- -------- = ----------- // (a + bi) (a + bi) (a - bi) (a^2 + b^2) // // Letting c = 1/(a^2 + b^2), this is // // 1/(a+bi) = a*c - b*ci. var asq_plus_bsq primeFieldElement var asq, bsq FpElementX2 fp751Mul(&asq, a, a) // = a*a*R*R fp751Mul(&bsq, b, b) // = b*b*R*R fp751X2AddLazy(&asq, &asq, &bsq) // = (a^2 + b^2)*R*R fp751MontgomeryReduce(&asq_plus_bsq.A, &asq) // = (a^2 + b^2)*R mod p // Now asq_plus_bsq = a^2 + b^2 // Invert asq_plus_bsq inv := asq_plus_bsq inv.Mul(&asq_plus_bsq, &asq_plus_bsq) inv.P34(&inv) inv.Mul(&inv, &inv) inv.Mul(&inv, &asq_plus_bsq) var ac FpElementX2 fp751Mul(&ac, a, &inv.A) fp751MontgomeryReduce(&dest.A, &ac) var minus_b FpElement fp751SubReduced(&minus_b, &minus_b, b) var minus_bc FpElementX2 fp751Mul(&minus_bc, &minus_b, &inv.A) fp751MontgomeryReduce(&dest.B, &minus_bc) } // In case choice == 1, performs following swap in constant time: // xPx <-> xQx // xPz <-> xQz // Otherwise returns xPx, xPz, xQx, xQz unchanged func (fp751Ops) CondSwap(xPx, xPz, xQx, xQz *Fp2Element, choice uint8) { fp751ConditionalSwap(&xPx.A, &xQx.A, choice) fp751ConditionalSwap(&xPx.B, &xQx.B, choice) fp751ConditionalSwap(&xPz.A, &xQz.A, choice) fp751ConditionalSwap(&xPz.B, &xQz.B, choice) } // Converts values in x.A and x.B to Montgomery domain // x.A = x.A * R mod p // x.B = x.B * R mod p func (fp751Ops) ToMontgomery(x *Fp2Element) { var aRR FpElementX2 // convert to montgomery domain fp751Mul(&aRR, &x.A, &p751R2) // = a*R*R fp751MontgomeryReduce(&x.A, &aRR) // = a*R mod p fp751Mul(&aRR, &x.B, &p751R2) fp751MontgomeryReduce(&x.B, &aRR) } // Converts values in x.A and x.B from Montgomery domain // a = x.A mod p // b = x.B mod p // // After returning from the call x is not modified. func (fp751Ops) FromMontgomery(x *Fp2Element, out *Fp2Element) { var aR FpElementX2 // convert from montgomery domain copy(aR[:], x.A[:]) fp751MontgomeryReduce(&out.A, &aR) // = a mod p in [0, 2p) fp751StrongReduce(&out.A) // = a mod p in [0, p) for i := range aR { aR[i] = 0 } copy(aR[:], x.B[:]) fp751MontgomeryReduce(&out.B, &aR) fp751StrongReduce(&out.B) } //------------------------------------------------------------------------------ // Prime Field //------------------------------------------------------------------------------ // Represents an element of the prime field F_p in Montgomery domain type primeFieldElement struct { // The value `A`is represented by `aR mod p`. A FpElement } // Set dest = lhs * rhs. // // Allowed to overlap lhs or rhs with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Mul(lhs, rhs *primeFieldElement) *primeFieldElement { a := &lhs.A // = a*R b := &rhs.A // = b*R var ab FpElementX2 fp751Mul(&ab, a, b) // = a*b*R*R fp751MontgomeryReduce(&dest.A, &ab) // = a*b*R mod p return dest } // Set dest = x^(2^k), for k >= 1, by repeated squarings. // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) Pow2k(x *primeFieldElement, k uint8) *primeFieldElement { dest.Mul(x, x) for i := uint8(1); i < k; i++ { dest.Mul(dest, dest) } return dest } // Set dest = x^((p-3)/4). If x is square, this is 1/sqrt(x). // // Allowed to overlap x with dest. // // Returns dest to allow chaining operations. func (dest *primeFieldElement) P34(x *primeFieldElement) *primeFieldElement { // Sliding-window strategy computed with Sage, awk, sed, and tr. // // This performs sum(powStrategy) = 744 squarings and len(mulStrategy) // = 137 multiplications, in addition to 1 squaring and 15 // multiplications to build a lookup table. // // In total this is 745 squarings, 152 multiplications. Since squaring // is not implemented for the prime field, this is 897 multiplications // in total. powStrategy := [137]uint8{5, 7, 6, 2, 10, 4, 6, 9, 8, 5, 9, 4, 7, 5, 5, 4, 8, 3, 9, 5, 5, 4, 10, 4, 6, 6, 6, 5, 8, 9, 3, 4, 9, 4, 5, 6, 6, 2, 9, 4, 5, 5, 5, 7, 7, 9, 4, 6, 4, 8, 5, 8, 6, 6, 2, 9, 7, 4, 8, 8, 8, 4, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2} mulStrategy := [137]uint8{31, 23, 21, 1, 31, 7, 7, 7, 9, 9, 19, 15, 23, 23, 11, 7, 25, 5, 21, 17, 11, 5, 17, 7, 11, 9, 23, 9, 1, 19, 5, 3, 25, 15, 11, 29, 31, 1, 29, 11, 13, 9, 11, 27, 13, 19, 15, 31, 3, 29, 23, 31, 25, 11, 1, 21, 19, 15, 15, 21, 29, 13, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 3} initialMul := uint8(27) // Build a lookup table of odd multiples of x. lookup := [16]primeFieldElement{} xx := &primeFieldElement{} xx.Mul(x, x) // Set xx = x^2 lookup[0] = *x for i := 1; i < 16; i++ { lookup[i].Mul(&lookup[i-1], xx) } // Now lookup = {x, x^3, x^5, ... } // so that lookup[i] = x^{2*i + 1} // so that lookup[k/2] = x^k, for odd k *dest = lookup[initialMul/2] for i := uint8(0); i < 137; i++ { dest.Pow2k(dest, powStrategy[i]) dest.Mul(dest, &lookup[mulStrategy[i]/2]) } return dest } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/isogeny_test.go000066400000000000000000000150151365325520100266500ustar00rootroot00000000000000package p751 import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "testing" ) func TestFourIsogenyVersusSage(t *testing.T) { var xR, xP4, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny4(kFieldOps) // TODO: The sage code needs to be aligned to SIDHv3 // sage: p = 2^372 * 3^239 - 1; Fp = GF(p) // sage: R. = Fp[] // sage: Fp2 = Fp.extension(x^2 + 1, 'i') // sage: i = Fp2.gen() // sage: E0Fp = EllipticCurve(Fp, [0,0,0,1,0]) // sage: E0Fp2 = EllipticCurve(Fp2, [0,0,0,1,0]) // sage: x_PA = 11 // sage: y_PA = -Fp(11^3 + 11).sqrt() // sage: x_PB = 6 // sage: y_PB = -Fp(6^3 + 6).sqrt() // sage: P_A = 3^239 * E0Fp((x_PA,y_PA)) // sage: P_B = 2^372 * E0Fp((x_PB,y_PB)) // sage: def tau(P): // ....: return E0Fp2( (-P.xy()[0], i*P.xy()[1])) // ....: // sage: m_B = 3*randint(0,3^238) // sage: m_A = 2*randint(0,2^371) // sage: R_A = E0Fp2(P_A) + m_A*tau(P_A) // sage: def y_recover(x, a): // ....: return (x**3 + a*x**2 + x).sqrt() // ....: // sage: first_4_torsion_point = E0Fp2(1, y_recover(Fp2(1),0)) // sage: sage_first_4_isogeny = E0Fp2.isogeny(first_4_torsion_point) // sage: a = Fp2(0) // sage: E1A = EllipticCurve(Fp2, [0,(2*(a+6))/(a-2),0,1,0]) // sage: sage_isomorphism = sage_first_4_isogeny.codomain().isomorphism_to(E1A) // sage: isogenized_R_A = sage_isomorphism(sage_first_4_isogeny(R_A)) // sage: P_4 = (2**(372-4))*isogenized_R_A // sage: P_4._order = 4 #otherwise falls back to generic group methods for order // sage: X4, Z4 = P_4.xy()[0], 1 // sage: phi4 = EllipticCurveIsogeny(E1A, P_4, None, 4) // sage: E2A_sage = phi4.codomain() # not in monty form // sage: Aprime, Cprime = 2*(2*X4^4 - Z4^4), Z4^4 // sage: E2A = EllipticCurve(Fp2, [0,Aprime/Cprime,0,1,0]) // sage: sage_iso = E2A_sage.isomorphism_to(E2A) // sage: isogenized2_R_A = sage_iso(phi4(isogenized_R_A)) xP4 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2afd75a913f3d5e7, 0x2918fba06f88c9ab, 0xa4ac4dc7cb526f05, 0x2d19e9391a607300, 0x7a79e2b34091b54, 0x3ad809dcb42f1792, 0xd46179328bd6402a, 0x1afa73541e2c4f3f, 0xf602d73ace9bdbd8, 0xd77ac58f6bab7004, 0x4689d97f6793b3b3, 0x4f26b00e42b7}, B: FpElement{0x6cdf918dafdcb890, 0x666f273cc29cfae2, 0xad00fcd31ba618e2, 0x5fbcf62bef2f6a33, 0xf408bb88318e5098, 0x84ab97849453d175, 0x501bbfcdcfb8e1ac, 0xf2370098e6b5542c, 0xc7dc73f5f0f6bd32, 0xdd76dcd86729d1cf, 0xca22c905029996e4, 0x5cf4a9373de3}}, Z: P751OneFp2} xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xff99e76f78da1e05, 0xdaa36bd2bb8d97c4, 0xb4328cee0a409daf, 0xc28b099980c5da3f, 0xf2d7cd15cfebb852, 0x1935103dded6cdef, 0xade81528de1429c3, 0x6775b0fa90a64319, 0x25f89817ee52485d, 0x706e2d00848e697, 0xc4958ec4216d65c0, 0xc519681417f}, B: FpElement{0x742fe7dde60e1fb9, 0x801a3c78466a456b, 0xa9f945b786f48c35, 0x20ce89e1b144348f, 0xf633970b7776217e, 0x4c6077a9b38976e5, 0x34a513fc766c7825, 0xacccba359b9cd65, 0xd0ca8383f0fd0125, 0x77350437196287a, 0x9fe1ad7706d4ea21, 0x4d26129ee42d}}, Z: P751OneFp2} expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x111efd8bd0b7a01e, 0x6ab75a4f3789ca9b, 0x939dbe518564cac4, 0xf9eeaba1601d0434, 0x8d41f8ba6edac998, 0xfcd2557efe9aa170, 0xb3c3549c098b7844, 0x52874fef6f81127c, 0xb2b9ac82aa518bb3, 0xee70820230520a86, 0xd4012b7f5efb184a, 0x573e4536329b}, B: FpElement{0xa99952281e932902, 0x569a89a571f2c7b1, 0x6150143846ba3f6b, 0x11fd204441e91430, 0x7f469bd55c9b07b, 0xb72db8b9de35b161, 0x455a9a37a940512a, 0xb0cff7670abaf906, 0x18c785b7583375fe, 0x603ab9ca403c9148, 0xab54ba3a6e6c62c1, 0x2726d7d57c4f}}, Z: P751OneFp2} phi.GenerateCurve(&xP4) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } func TestThreeIsogenyVersusSage(t *testing.T) { var xR, xP3, resPhiXr, expPhiXr ProjectivePoint var phi = Newisogeny3(kFieldOps) // sage: %colors Linux // sage: p = 2^372 * 3^239 - 1; Fp = GF(p) // sage: R. = Fp[] // sage: Fp2 = Fp.extension(x^2 + 1, 'i') // sage: i = Fp2.gen() // sage: E0Fp = EllipticCurve(Fp, [0,0,0,1,0]) // sage: E0Fp2 = EllipticCurve(Fp2, [0,0,0,1,0]) // sage: x_PA = 11 // sage: y_PA = -Fp(11^3 + 11).sqrt() // sage: x_PB = 6 // sage: y_PB = -Fp(6^3 + 6).sqrt() // sage: P_A = 3^239 * E0Fp((x_PA,y_PA)) // sage: P_B = 2^372 * E0Fp((x_PB,y_PB)) // sage: def tau(P): // ....: return E0Fp2( (-P.xy()[0], i*P.xy()[1])) // ....: // sage: m_B = 3*randint(0,3^238) // sage: R_B = E0Fp2(P_B) + m_B*tau(P_B) // sage: P_3 = (3^238)*R_B // sage: def three_isog(P_3, P): // ....: X3, Z3 = P_3.xy()[0], 1 // ....: XP, ZP = P.xy()[0], 1 // ....: x = (XP*(X3*XP - Z3*ZP)^2)/(ZP*(Z3*XP - X3*ZP)^2) // ....: A3, C3 = (Z3^4 + 9*X3^2*(2*Z3^2 - 3*X3^2)), 4*X3*Z3^3 // ....: cod = EllipticCurve(Fp2, [0,A3/C3,0,1,0]) // ....: return cod.lift_x(x) // ....: // sage: isogenized_R_B = three_isog(P_3, R_B) xR = ProjectivePoint{ X: Fp2Element{ A: FpElement{0xbd0737ed5cc9a3d7, 0x45ae6d476517c101, 0x6f228e9e7364fdb2, 0xbba4871225b3dbd, 0x6299ccd2e5da1a07, 0x38488fe4af5f2d0e, 0xec23cae5a86e980c, 0x26c804ba3f1edffa, 0xfbbed81932df60e5, 0x7e00e9d182ae9187, 0xc7654abb66d05f4b, 0x262d0567237b}, B: FpElement{0x3a3b5b6ad0b2ac33, 0x246602b5179127d3, 0x502ae0e9ad65077d, 0x10a3a37237e1bf70, 0x4a1ab9294dd05610, 0xb0f3adac30fe1fa6, 0x341995267faf70cb, 0xa14dd94d39cf4ec1, 0xce4b7527d1bf5568, 0xe0410423ed45c7e4, 0x38011809b6425686, 0x28f52472ebed}}, Z: P751OneFp2} xP3 = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x7bb7a4a07b0788dc, 0xdc36a3f6607b21b0, 0x4750e18ee74cf2f0, 0x464e319d0b7ab806, 0xc25aa44c04f758ff, 0x392e8521a46e0a68, 0xfc4e76b63eff37df, 0x1f3566d892e67dd8, 0xf8d2eb0f73295e65, 0x457b13ebc470bccb, 0xfda1cc9efef5be33, 0x5dbf3d92cc02}, B: FpElement{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, Z: P751OneFp2} expPhiXr = ProjectivePoint{ X: Fp2Element{ A: FpElement{0x286db7d75913c5b1, 0xcb2049ad50189220, 0xccee90ef765fa9f4, 0x65e52ce2730e7d88, 0xa6b6b553bd0d06e7, 0xb561ecec14591590, 0x17b7a66d8c64d959, 0x77778cecbe1461e, 0x9405c9c0c41a57ce, 0x8f6b4847e8ca7d3d, 0xf625eb987b366937, 0x421b3590e345}, B: FpElement{0x566b893803e7d8d6, 0xe8c71a04d527e696, 0x5a1d8f87bf5eb51, 0x42ae08ae098724f, 0x4ee3d7c7af40ca2e, 0xd9f9ab9067bb10a7, 0xecd53d69edd6328c, 0xa581e9202dea107d, 0x8bcdfb6c8ecf9257, 0xe7cbbc2e5cbcf2af, 0x5f031a8701f0e53e, 0x18312d93e3cb}}, Z: P751OneFp2} phi.GenerateCurve(&xP3) resPhiXr = phi.EvaluatePoint(&xR) if !VartimeEqProjFp2(&expPhiXr, &resPhiXr) { t.Error("\nExpected\n", expPhiXr.ToAffine(kCurveOps), "\nfound\n", resPhiXr.ToAffine(kCurveOps)) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/p751/utils_test.go000066400000000000000000000465301365325520100263410ustar00rootroot00000000000000package p751 // Tools used for testing and debugging import ( "fmt" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" "math/big" "math/rand" "reflect" "testing/quick" ) /* ------------------------------------------------------------------------- Underlying field configuration -------------------------------------------------------------------------*/ var ( kFieldOps = FieldOperations() kParams = &SidhParams{ Op: kFieldOps, OneFp2: P751OneFp2, HalfFp2: P751HalfFp2, Bytelen: P751_Bytelen, } kCurveOps = &CurveOperations{Params: kParams} ) /* ------------------------------------------------------------------------- Configure testing/quick -------------------------------------------------------------------------*/ var ( quickCheckScaleFactor = uint8(3) quickCheckConfig = &quick.Config{MaxCount: (1 << (12 + quickCheckScaleFactor))} ) /* ------------------------------------------------------------------------- Structure used by tests -------------------------------------------------------------------------*/ type GeneratedTestParams struct { Point ProjectivePoint Cparam ProjectiveCurveParameters ExtElem Fp2Element } /* ------------------------------------------------------------------------- Test values -------------------------------------------------------------------------*/ // A = 4385300808024233870220415655826946795549183378139271271040522089756750951667981765872679172832050962894122367066234419550072004266298327417513857609747116903999863022476533671840646615759860564818837299058134292387429068536219*i + 1408083354499944307008104531475821995920666351413327060806684084512082259107262519686546161682384352696826343970108773343853651664489352092568012759783386151707999371397181344707721407830640876552312524779901115054295865393760 var ( curve_A = Fp2Element{ A: FpElement{0x8319eb18ca2c435e, 0x3a93beae72cd0267, 0x5e465e1f72fd5a84, 0x8617fa4150aa7272, 0x887da24799d62a13, 0xb079b31b3c7667fe, 0xc4661b150fa14f2e, 0xd4d2b2967bc6efd6, 0x854215a8b7239003, 0x61c5302ccba656c2, 0xf93194a27d6f97a2, 0x1ed9532bca75}, B: FpElement{0xb6f541040e8c7db6, 0x99403e7365342e15, 0x457e9cee7c29cced, 0x8ece72dc073b1d67, 0x6e73cef17ad28d28, 0x7aed836ca317472, 0x89e1de9454263b54, 0x745329277aa0071b, 0xf623dfc73bc86b9b, 0xb8e3c1d8a9245882, 0x6ad0b3d317770bec, 0x5b406e8d502b}} // C = 933177602672972392833143808100058748100491911694554386487433154761658932801917030685312352302083870852688835968069519091048283111836766101703759957146191882367397129269726925521881467635358356591977198680477382414690421049768*i + 9088894745865170214288643088620446862479558967886622582768682946704447519087179261631044546285104919696820250567182021319063155067584445633834024992188567423889559216759336548208016316396859149888322907914724065641454773776307 curve_C = Fp2Element{ A: FpElement{0x4fb2358bbf723107, 0x3a791521ac79e240, 0x283e24ef7c4c922f, 0xc89baa1205e33cc, 0x3031be81cff6fee1, 0xaf7a494a2f6a95c4, 0x248d251eaac83a1d, 0xc122fca1e2550c88, 0xbc0451b11b6cfd3d, 0x9c0a114ab046222c, 0x43b957b32f21f6ea, 0x5b9c87fa61de}, B: FpElement{0xacf142afaac15ec6, 0xfd1322a504a071d5, 0x56bb205e10f6c5c6, 0xe204d2849a97b9bd, 0x40b0122202fe7f2e, 0xecf72c6fafacf2cb, 0x45dfc681f869f60a, 0x11814c9aff4af66c, 0x9278b0c4eea54fe7, 0x9a633d5baf7f2e2e, 0x69a329e6f1a05112, 0x1d874ace23e4}} // x(P) = 8172151271761071554796221948801462094972242987811852753144865524899433583596839357223411088919388342364651632180452081960511516040935428737829624206426287774255114241789158000915683252363913079335550843837650671094705509470594*i + 9326574858039944121604015439381720195556183422719505497448541073272720545047742235526963773359004021838961919129020087515274115525812121436661025030481584576474033630899768377131534320053412545346268645085054880212827284581557 affine_xP = Fp2Element{ A: FpElement{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, B: FpElement{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}} // x([2]P) = 1476586462090705633631615225226507185986710728845281579274759750260315746890216330325246185232948298241128541272709769576682305216876843626191069809810990267291824247158062860010264352034514805065784938198193493333201179504845*i + 3623708673253635214546781153561465284135688791018117615357700171724097420944592557655719832228709144190233454198555848137097153934561706150196041331832421059972652530564323645509890008896574678228045006354394485640545367112224 affine_xP2 = Fp2Element{ A: FpElement{0x2a77afa8576ce979, 0xab1360e69b0aeba0, 0xd79e3e3cbffad660, 0x5fd0175aa10f106b, 0x1800ebafce9fbdbc, 0x228fc9142bdd6166, 0x867cf907314e34c3, 0xa58d18c94c13c31c, 0x699a5bc78b11499f, 0xa29fc29a01f7ccf1, 0x6c69c0c5347eebce, 0x38ecee0cc57}, B: FpElement{0x43607fd5f4837da0, 0x560bad4ce27f8f4a, 0x2164927f8495b4dd, 0x621103fdb831a997, 0xad740c4eea7db2db, 0x2cde0442205096cd, 0x2af51a70ede8324e, 0x41a4e680b9f3466, 0x5481f74660b8f476, 0xfcb2f3e656ff4d18, 0x42e3ce0837171acc, 0x44238c30530c}} // x([3]P) = 9351941061182433396254169746041546943662317734130813745868897924918150043217746763025923323891372857734564353401396667570940585840576256269386471444236630417779544535291208627646172485976486155620044292287052393847140181703665*i + 9010417309438761934687053906541862978676948345305618417255296028956221117900864204687119686555681136336037659036201780543527957809743092793196559099050594959988453765829339642265399496041485088089691808244290286521100323250273 affine_xP3 = Fp2Element{ A: FpElement{0x2096e3f23feca947, 0xf36f635aa4ad8634, 0xdae3b1c6983c5e9a, 0xe08df6c262cb74b4, 0xd2ca4edc37452d3d, 0xfb5f3fe42f500c79, 0x73740aa3abc2b21f, 0xd535fd869f914cca, 0x4a558466823fb67f, 0x3e50a7a0e3bfc715, 0xf43c6da9183a132f, 0x61aca1e1b8b9}, B: FpElement{0x1e54ec26ea5077bd, 0x61380572d8769f9a, 0xc615170684f59818, 0x6309c3b93e84ef6e, 0x33c74b1318c3fcd0, 0xfe8d7956835afb14, 0x2d5a7b55423c1ecc, 0x869db67edfafea68, 0x1292632394f0a628, 0x10bba48225bfd141, 0x6466c28b408daba, 0x63cacfdb7c43}} // x([2^2]P) = 441719501189485559222919502512761433931671682884872259563221427434901842337947564993718830905758163254463901652874331063768876314142359813382575876106725244985607032091781306919778265250690045578695338669105227100119314831452*i + 6961734028200975729170216310486458180126343885294922940439352055937945948015840788921225114530454649744697857047401608073256634790353321931728699534700109268264491160589480994022419317695690866764726967221310990488404411684053 affine_xP4 = Fp2Element{ A: FpElement{0x6f9dbe4c39175153, 0xf2fec757eb99e88, 0x43d7361a93733d91, 0x3abd10ed19c85a3d, 0xc4de9ab9c5ef7181, 0x53e375901684c900, 0x68ffc3e7d71c41ff, 0x47adab62c8d942fe, 0x226a33fd6fbb381d, 0x87ef4c8fdd83309a, 0xaca1cf44c5fa8799, 0x6cbae86c755f}, B: FpElement{0x4c80c37fe68282a7, 0xbd8b9d7248bf553a, 0x1fb0e8e74d5e1762, 0xb63fa0e4e5f91482, 0xc675ab8a45a1439, 0xdfa6772deace7820, 0xf0d813d71d9a9255, 0x53a1a58c634534bd, 0x4ebfc6485fdfd888, 0x6991fe4358bcf169, 0xc0547bdaca85b6fd, 0xf461548d632}} // x([3^2]P) = 3957171963425208493644602380039721164492341594850197356580248639045894821895524981729970650520936632013218950972842867220898274664982599375786979902471523505057611521217523103474682939638645404445093536997296151472632038973463*i + 1357869545269286021642168835877253886774707209614159162748874474269328421720121175566245719916322684751967981171882659798149072149161259103020057556362998810229937432814792024248155991141511691087135859252304684633946087474060 affine_xP9 = Fp2Element{ A: FpElement{0x7c0daa0f04ded4e0, 0x52dc4f883d85e065, 0x91afbdc2c1714d0b, 0xb7b3db8e658cfeba, 0x43d4e72a692882f3, 0x535c56d83753da30, 0xc8a58724433cbf5d, 0x351153c0a5e74219, 0x2c81827d19f93dd5, 0x26ef8aca3370ea1a, 0x1cf939a6dd225dec, 0x3403cb28ad41}, B: FpElement{0x93e7bc373a9ff7b, 0x57b8cc47635ebc0f, 0x92eab55689106cf3, 0x93643111d421f24c, 0x1c58b519506f6b7a, 0xebd409fb998faa13, 0x5c86ed799d09d80e, 0xd9a1d764d6363562, 0xf95e87f92fb0c4cc, 0x6b2bbaf5632a5609, 0x2d9b6a809dfaff7f, 0x29c0460348b}} // m = 96550223052359874398280314003345143371473380422728857598463622014420884224892 mScalarBytes = [...]uint8{0x7c, 0x7b, 0x95, 0xfa, 0xb4, 0x75, 0x6c, 0x48, 0x8c, 0x17, 0x55, 0xb4, 0x49, 0xf5, 0x1e, 0xa3, 0xb, 0x31, 0xf0, 0xa4, 0xa6, 0x81, 0xad, 0x94, 0x51, 0x11, 0xe7, 0xf5, 0x5b, 0x7d, 0x75, 0xd5} // x([m]P) = 7893578558852400052689739833699289348717964559651707250677393044951777272628231794999463214496545377542328262828965953246725804301238040891993859185944339366910592967840967752138115122568615081881937109746463885908097382992642*i + 8293895847098220389503562888233557012043261770526854885191188476280014204211818299871679993460086974249554528517413590157845430186202704783785316202196966198176323445986064452630594623103149383929503089342736311904030571524837 affine_xaP = Fp2Element{ A: FpElement{0x2112f3c7d7f938bb, 0x704a677f0a4df08f, 0x825370e31fb4ef00, 0xddbf79b7469f902, 0x27640c899ea739fd, 0xfb7b8b19f244108e, 0x546a6679dd3baebc, 0xe9f0ecf398d5265f, 0x223d2b350e75e461, 0x84b322a0b6aff016, 0xfabe426f539f8b39, 0x4507a0604f50}, B: FpElement{0xac77737e5618a5fe, 0xf91c0e08c436ca52, 0xd124037bc323533c, 0xc9a772bf52c58b63, 0x3b30c8f38ef6af4d, 0xb9eed160e134f36e, 0x24e3836393b25017, 0xc828be1b11baf1d9, 0x7b7dab585df50e93, 0x1ca3852c618bd8e0, 0x4efa73bcb359fa00, 0x50b6a923c2d4}} // Inputs for testing 3-point-ladder threePointLadderInputs = []ProjectivePoint{ // x(P) ProjectivePoint{ X: Fp2Element{ A: FpElement{0xe8d05f30aac47247, 0x576ec00c55441de7, 0xbf1a8ec5fe558518, 0xd77cb17f77515881, 0x8e9852837ee73ec4, 0x8159634ad4f44a6b, 0x2e4eb5533a798c5, 0x9be8c4354d5bc849, 0xf47dc61806496b84, 0x25d0e130295120e0, 0xdbef54095f8139e3, 0x5a724f20862c}, B: FpElement{0x3ca30d7623602e30, 0xfb281eddf45f07b7, 0xd2bf62d5901a45bc, 0xc67c9baf86306dd2, 0x4e2bd93093f538ca, 0xcfd92075c25b9cbe, 0xceafe9a3095bcbab, 0x7d928ad380c85414, 0x37c5f38b2afdc095, 0x75325899a7b779f4, 0xf130568249f20fdd, 0x178f264767d1}}, Z: P751OneFp2, }, // x(Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x2b71a2a93ad1e10e, 0xf0b9842a92cfb333, 0xae17373615a27f5c, 0x3039239f428330c4, 0xa0c4b735ed7dcf98, 0x6e359771ddf6af6a, 0xe986e4cac4584651, 0x8233a2b622d5518, 0xbfd67bf5f06b818b, 0xdffe38d0f5b966a6, 0xa86b36a3272ee00a, 0x193e2ea4f68f}, B: FpElement{0x5a0f396459d9d998, 0x479f42250b1b7dda, 0x4016b57e2a15bf75, 0xc59f915203fa3749, 0xd5f90257399cf8da, 0x1fb2dadfd86dcef4, 0x600f20e6429021dc, 0x17e347d380c57581, 0xc1b0d5fa8fe3e440, 0xbcf035330ac20e8, 0x50c2eb5f6a4f03e6, 0x86b7c4571}}, Z: P751OneFp2, }, // x(P-Q) ProjectivePoint{ X: Fp2Element{ A: FpElement{0x4aafa9f378f7b5ff, 0x1172a683aa8eee0, 0xea518d8cbec2c1de, 0xe191bcbb63674557, 0x97bc19637b259011, 0xdbeae5c9f4a2e454, 0x78f64d1b72a42f95, 0xe71cb4ea7e181e54, 0xe4169d4c48543994, 0x6198c2286a98730f, 0xd21d675bbab1afa5, 0x2e7269fce391}, B: FpElement{0x23355783ce1d0450, 0x683164cf4ce3d93f, 0xae6d1c4d25970fd8, 0x7807007fb80b48cf, 0xa005a62ec2bbb8a2, 0x6b5649bd016004cb, 0xbb1a13fa1330176b, 0xbf38e51087660461, 0xe577fddc5dd7b930, 0x5f38116f56947cd3, 0x3124f30b98c36fde, 0x4ca9b6e6db37}}, Z: P751OneFp2, }, } curve = ProjectiveCurveParameters{A: curve_A, C: curve_C} cln16prime, _ = new(big.Int).SetString("10354717741769305252977768237866805321427389645549071170116189679054678940682478846502882896561066713624553211618840202385203911976522554393044160468771151816976706840078913334358399730952774926980235086850991501872665651576831", 10) ) /* ------------------------------------------------------------------------- Values used by benchmarking tools -------------------------------------------------------------------------*/ // Package-level storage for this field element is intended to deter // compiler optimizations. var ( benchmarkFpElement FpElement benchmarkFpElementX2 FpElementX2 bench_x = FpElement{17026702066521327207, 5108203422050077993, 10225396685796065916, 11153620995215874678, 6531160855165088358, 15302925148404145445, 1248821577836769963, 9789766903037985294, 7493111552032041328, 10838999828319306046, 18103257655515297935, 27403304611634} bench_y = FpElement{4227467157325093378, 10699492810770426363, 13500940151395637365, 12966403950118934952, 16517692605450415877, 13647111148905630666, 14223628886152717087, 7167843152346903316, 15855377759596736571, 4300673881383687338, 6635288001920617779, 30486099554235} bench_z = FpElementX2{1595347748594595712, 10854920567160033970, 16877102267020034574, 12435724995376660096, 3757940912203224231, 8251999420280413600, 3648859773438820227, 17622716832674727914, 11029567000887241528, 11216190007549447055, 17606662790980286987, 4720707159513626555, 12887743598335030915, 14954645239176589309, 14178817688915225254, 1191346797768989683, 12629157932334713723, 6348851952904485603, 16444232588597434895, 7809979927681678066, 14642637672942531613, 3092657597757640067, 10160361564485285723, 240071237} ) // Helpers func (primeElement primeFieldElement) String() string { b := toBigInt(&primeElement.A) return fmt.Sprintf("%X", b.String()) } /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Given xP = x(P), xQ = x(Q), and xPmQ = x(P-Q), compute xR = x(P+Q). // // Returns xR to allow chaining. Safe to overlap xP, xQ, xR. func AddProjFp2(xP, xQ, xPmQ *ProjectivePoint) ProjectivePoint { // Algorithm 1 of Costello-Smith. var v0, v1, v2, v3, v4 Fp2Element var xR ProjectivePoint kFieldOps.Add(&v0, &xP.X, &xP.Z) // X_P + Z_P kFieldOps.Sub(&v1, &xQ.X, &xQ.Z) kFieldOps.Mul(&v1, &v1, &v0) // (X_Q - Z_Q)(X_P + Z_P) kFieldOps.Sub(&v0, &xP.X, &xP.Z) // X_P - Z_P kFieldOps.Add(&v2, &xQ.X, &xQ.Z) kFieldOps.Mul(&v2, &v2, &v0) // (X_Q + Z_Q)(X_P - Z_P) kFieldOps.Add(&v3, &v1, &v2) kFieldOps.Square(&v3, &v3) // 4(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Sub(&v4, &v1, &v2) kFieldOps.Square(&v4, &v4) // 4(X_Q Z_P - Z_Q X_P)^2 kFieldOps.Mul(&v0, &xPmQ.Z, &v3) // 4X_{P-Q}(X_Q X_P - Z_Q Z_P)^2 kFieldOps.Mul(&xR.Z, &xPmQ.X, &v4) // 4Z_{P-Q}(X_Q Z_P - Z_Q X_P)^2 xR.X = v0 return xR } // Given xP = x(P) and cached curve parameters Aplus2C = A + 2*C, C4 = 4*C, // compute xQ = x([2]P). // // Returns xQ to allow chaining. Safe to overlap xP, xQ. func DoubleProjFp2(xP *ProjectivePoint, Aplus2C, C4 *Fp2Element) ProjectivePoint { // Algorithm 2 of Costello-Smith, amended to work with projective curve coefficients. var v1, v2, v3, xz4 Fp2Element var xQ ProjectivePoint kFieldOps.Add(&v1, &xP.X, &xP.Z) // (X+Z)^2 kFieldOps.Square(&v1, &v1) kFieldOps.Sub(&v2, &xP.X, &xP.Z) // (X-Z)^2 kFieldOps.Square(&v2, &v2) kFieldOps.Sub(&xz4, &v1, &v2) // 4XZ = (X+Z)^2 - (X-Z)^2 kFieldOps.Mul(&v2, &v2, C4) // 4C(X-Z)^2 kFieldOps.Mul(&xQ.X, &v1, &v2) // 4C(X+Z)^2(X-Z)^2 kFieldOps.Mul(&v3, &xz4, Aplus2C) // 4XZ(A + 2C) kFieldOps.Add(&v3, &v3, &v2) // 4XZ(A + 2C) + 4C(X-Z)^2 kFieldOps.Mul(&xQ.Z, &v3, &xz4) // (4XZ(A + 2C) + 4C(X-Z)^2)4XZ // Now (xQ.x : xQ.z) // = (4C(X+Z)^2(X-Z)^2 : (4XZ(A + 2C) + 4C(X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((A + 2C)/4C) + (X-Z)^2)4XZ ) // = ((X+Z)^2(X-Z)^2 : (4XZ((a + 2)/4) + (X-Z)^2)4XZ ) return xQ } // Given x(P) and a scalar m in little-endian bytes, compute x([m]P) using the // Montgomery ladder. This is described in Algorithm 8 of Costello-Smith. // // This function's execution time is dependent only on the byte-length of the // input scalar. All scalars of the same input length execute in uniform time. // The scalar can be padded with zero bytes to ensure a uniform length. // // Safe to overlap the source with the destination. func ScalarMult(curve *ProjectiveCurveParameters, xP *ProjectivePoint, scalar []uint8) ProjectivePoint { var x0, x1, tmp ProjectivePoint var Aplus2C, C4 Fp2Element kFieldOps.Add(&Aplus2C, &curve.C, &curve.C) // = 2*C kFieldOps.Add(&C4, &Aplus2C, &Aplus2C) // = 4*C kFieldOps.Add(&Aplus2C, &Aplus2C, &curve.A) // = 2*C + A x0.X = P751OneFp2 x1 = *xP // Iterate over the bits of the scalar, top to bottom prevBit := uint8(0) for i := len(scalar) - 1; i >= 0; i-- { scalarByte := scalar[i] for j := 7; j >= 0; j-- { bit := (scalarByte >> uint(j)) & 0x1 kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, (bit ^ prevBit)) //sProjectivePointConditionalSwap(&x0, &x1, (bit ^ prevBit)) tmp = DoubleProjFp2(&x0, &Aplus2C, &C4) x1 = AddProjFp2(&x0, &x1, xP) x0 = tmp prevBit = bit } } // now prevBit is the lowest bit of the scalar kCurveOps.Params.Op.CondSwap(&x0.X, &x0.Z, &x1.X, &x1.Z, prevBit) return x0 } // Returns true if lhs = rhs. Takes variable time. func VartimeEqFp2(lhs, rhs *Fp2Element) bool { a := *lhs b := *rhs fp751StrongReduce(&a.A) fp751StrongReduce(&a.B) fp751StrongReduce(&b.A) fp751StrongReduce(&b.B) eq := true for i := 0; i < len(a.A) && eq; i++ { eq = eq && (a.A[i] == b.A[i]) eq = eq && (a.B[i] == b.B[i]) } return eq } // Returns true if lhs = rhs. Takes variable time. func VartimeEqProjFp2(lhs, rhs *ProjectivePoint) bool { var t0, t1 Fp2Element kFieldOps.Mul(&t0, &lhs.X, &rhs.Z) kFieldOps.Mul(&t1, &lhs.Z, &rhs.X) return VartimeEqFp2(&t0, &t1) } func (GeneratedTestParams) generateFp2p751(rand *rand.Rand) Fp2Element { // Generation strategy: low limbs taken from [0,2^64); high limb // taken from smaller range // // Size hint is ignored since all elements are fixed size. // // Field elements taken in range [0,2p). Emulate this by capping // the high limb by the top digit of 2*p-1: // // sage: (2*p-1).digits(2^64)[-1] // 246065832128056 // // This still allows generating values >= 2p, but hopefully that // excess is OK (and if it's not, we'll find out, because it's for // testing...) // highLimb := rand.Uint64() % 246065832128056 fpElementGen := func() FpElement { return FpElement{ rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), rand.Uint64(), highLimb, } } return Fp2Element{A: fpElementGen(), B: fpElementGen()} } func (c GeneratedTestParams) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf( GeneratedTestParams{ ProjectivePoint{ X: c.generateFp2p751(rand), Z: c.generateFp2p751(rand), }, ProjectiveCurveParameters{ A: c.generateFp2p751(rand), C: c.generateFp2p751(rand), }, c.generateFp2p751(rand), }) } func (x primeFieldElement) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf(primeFieldElement{ A: new(GeneratedTestParams).generateFp2p751(rand).A}) } // Convert an FpElement to a big.Int for testing. Because this is only // for testing, no big.Int to FpElement conversion is provided. func radix64ToBigInt(x []uint64) *big.Int { radix := new(big.Int) // 2^64 radix.UnmarshalText(([]byte)("18446744073709551616")) base := new(big.Int).SetUint64(1) val := new(big.Int).SetUint64(0) tmp := new(big.Int) for _, xi := range x { tmp.SetUint64(xi) tmp.Mul(tmp, base) val.Add(val, tmp) base.Mul(base, radix) } return val } // Converts number from Montgomery domain and returns big.Int func toBigInt(x *FpElement) *big.Int { var fp Fp2Element var in = Fp2Element{A: *x} kFieldOps.FromMontgomery(&in, &fp) return radix64ToBigInt(fp.A[:]) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/params.go000066400000000000000000000050741365325520100247270ustar00rootroot00000000000000package sidh import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" p503 "github.com/henrydcase/nobs/dh/sidh/p503" p751 "github.com/henrydcase/nobs/dh/sidh/p751" ) // Keeps mapping: SIDH prime field ID to domain parameters var sidhParams = make(map[uint8]SidhParams) // Params returns domain parameters corresponding to finite field and identified by // `id` provieded by the caller. Function panics in case `id` wasn't registered earlier. func Params(id uint8) *SidhParams { if val, ok := sidhParams[id]; ok { return &val } panic("sidh: SIDH Params ID unregistered") } func init() { p503 := SidhParams{ Id: FP_503, PublicKeySize: p503.P503_PublicKeySize, SharedSecretSize: p503.P503_SharedSecretSize, A: DomainParams{ Affine_P: p503.P503_affine_PA, Affine_Q: p503.P503_affine_QA, Affine_R: p503.P503_affine_RA, SecretBitLen: p503.P503_SecretBitLenA, SecretByteLen: uint((p503.P503_SecretBitLenA + 7) / 8), IsogenyStrategy: p503.P503_AliceIsogenyStrategy[:], }, B: DomainParams{ Affine_P: p503.P503_affine_PB, Affine_Q: p503.P503_affine_QB, Affine_R: p503.P503_affine_RB, SecretBitLen: p503.P503_SecretBitLenB, SecretByteLen: uint((p503.P503_SecretBitLenB + 7) / 8), IsogenyStrategy: p503.P503_BobIsogenyStrategy[:], }, OneFp2: p503.P503OneFp2, HalfFp2: p503.P503HalfFp2, MsgLen: 24, // SIKEp503 provides 128 bit of classical security ([SIKE], 5.1) KemSize: 16, Bytelen: p503.P503_Bytelen, Op: p503.FieldOperations(), } p751 := SidhParams{ Id: FP_751, PublicKeySize: p751.P751_PublicKeySize, SharedSecretSize: p751.P751_SharedSecretSize, A: DomainParams{ Affine_P: p751.P751_affine_PA, Affine_Q: p751.P751_affine_QA, Affine_R: p751.P751_affine_RA, IsogenyStrategy: p751.P751_AliceIsogenyStrategy[:], SecretBitLen: p751.P751_SecretBitLenA, SecretByteLen: uint((p751.P751_SecretBitLenA + 7) / 8), }, B: DomainParams{ Affine_P: p751.P751_affine_PB, Affine_Q: p751.P751_affine_QB, Affine_R: p751.P751_affine_RB, IsogenyStrategy: p751.P751_BobIsogenyStrategy[:], SecretBitLen: p751.P751_SecretBitLenB, SecretByteLen: uint((p751.P751_SecretBitLenB + 7) / 8), }, OneFp2: p751.P751OneFp2, HalfFp2: p751.P751HalfFp2, MsgLen: 32, // SIKEp751 provides 192 bit of classical security ([SIKE], 5.1) KemSize: 24, Bytelen: p751.P751_Bytelen, Op: p751.FieldOperations(), } sidhParams[FP_503] = p503 sidhParams[FP_751] = p751 } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/sidh.go000066400000000000000000000224301365325520100243660ustar00rootroot00000000000000package sidh import ( . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) // ----------------------------------------------------------------------------- // Functions for traversing isogeny trees acoording to strategy. Key type 'A' is // // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreePublicKeyA(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv4(curve) phi := Newisogeny4(op.Params.Op) strat := pub.params.A.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow2k(xR, &cparam, 2*k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } *phiP = phi.EvaluatePoint(phiP) *phiQ = phi.EvaluatePoint(phiQ) *phiR = phi.EvaluatePoint(phiR) // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR needed // for public key generation. func traverseTreeSharedKeyA(curve *ProjectiveCurveParameters, xR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv4(curve) phi := Newisogeny4(op.Params.Op) strat := pub.params.A.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow2k(xR, &cparam, 2*k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreePublicKeyB(curve *ProjectiveCurveParameters, xR, phiP, phiQ, phiR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv3(curve) phi := Newisogeny3(op.Params.Op) strat := pub.params.B.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow3k(xR, &cparam, k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } *phiP = phi.EvaluatePoint(phiP) *phiQ = phi.EvaluatePoint(phiQ) *phiR = phi.EvaluatePoint(phiR) // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Traverses isogeny tree in order to compute xR, xP, xQ and xQmP needed // for public key generation. func traverseTreeSharedKeyB(curve *ProjectiveCurveParameters, xR *ProjectivePoint, pub *PublicKey) { var points = make([]ProjectivePoint, 0, 8) var indices = make([]int, 0, 8) var i, sidx int var op = CurveOperations{Params: pub.params} cparam := op.CalcCurveParamsEquiv3(curve) phi := Newisogeny3(op.Params.Op) strat := pub.params.B.IsogenyStrategy stratSz := len(strat) for j := 1; j <= stratSz; j++ { for i <= stratSz-j { points = append(points, *xR) indices = append(indices, i) k := strat[sidx] sidx++ op.Pow3k(xR, &cparam, k) i += int(k) } cparam = phi.GenerateCurve(xR) for k := 0; k < len(points); k++ { points[k] = phi.EvaluatePoint(&points[k]) } // pop xR from points *xR, points = points[len(points)-1], points[:len(points)-1] i, indices = int(indices[len(indices)-1]), indices[:len(indices)-1] } } // Generate a public key in the 2-torsion group func publicKeyGenA(prv *PrivateKey) (pub *PublicKey) { var xPA, xQA, xRA ProjectivePoint var xPB, xQB, xRB, xR ProjectivePoint var invZP, invZQ, invZR Fp2Element var tmp ProjectiveCurveParameters pub = NewPublicKey(prv.params.Id, KeyVariant_SIDH_A) var op = CurveOperations{Params: pub.params} var phi = Newisogeny4(op.Params.Op) // Load points for A xPA = ProjectivePoint{X: prv.params.A.Affine_P, Z: prv.params.OneFp2} xQA = ProjectivePoint{X: prv.params.A.Affine_Q, Z: prv.params.OneFp2} xRA = ProjectivePoint{X: prv.params.A.Affine_R, Z: prv.params.OneFp2} // Load points for B xRB = ProjectivePoint{X: prv.params.B.Affine_R, Z: prv.params.OneFp2} xQB = ProjectivePoint{X: prv.params.B.Affine_Q, Z: prv.params.OneFp2} xPB = ProjectivePoint{X: prv.params.B.Affine_P, Z: prv.params.OneFp2} // Find isogeny kernel tmp.C = pub.params.OneFp2 xR = op.ScalarMul3Pt(&tmp, &xPA, &xQA, &xRA, prv.params.A.SecretBitLen, prv.Scalar) // Reset params object and travers isogeny tree tmp.C = pub.params.OneFp2 tmp.A.Zeroize() traverseTreePublicKeyA(&tmp, &xR, &xPB, &xQB, &xRB, pub) // Secret isogeny phi.GenerateCurve(&xR) xPA = phi.EvaluatePoint(&xPB) xQA = phi.EvaluatePoint(&xQB) xRA = phi.EvaluatePoint(&xRB) op.Fp2Batch3Inv(&xPA.Z, &xQA.Z, &xRA.Z, &invZP, &invZQ, &invZR) op.Params.Op.Mul(&pub.affine_xP, &xPA.X, &invZP) op.Params.Op.Mul(&pub.affine_xQ, &xQA.X, &invZQ) op.Params.Op.Mul(&pub.affine_xQmP, &xRA.X, &invZR) return } // Generate a public key in the 3-torsion group func publicKeyGenB(prv *PrivateKey) (pub *PublicKey) { var xPB, xQB, xRB, xR ProjectivePoint var xPA, xQA, xRA ProjectivePoint var invZP, invZQ, invZR Fp2Element var tmp ProjectiveCurveParameters pub = NewPublicKey(prv.params.Id, prv.keyVariant) var op = CurveOperations{Params: pub.params} var phi = Newisogeny3(op.Params.Op) // Load points for B xRB = ProjectivePoint{X: prv.params.B.Affine_R, Z: prv.params.OneFp2} xQB = ProjectivePoint{X: prv.params.B.Affine_Q, Z: prv.params.OneFp2} xPB = ProjectivePoint{X: prv.params.B.Affine_P, Z: prv.params.OneFp2} // Load points for A xPA = ProjectivePoint{X: prv.params.A.Affine_P, Z: prv.params.OneFp2} xQA = ProjectivePoint{X: prv.params.A.Affine_Q, Z: prv.params.OneFp2} xRA = ProjectivePoint{X: prv.params.A.Affine_R, Z: prv.params.OneFp2} tmp.C = pub.params.OneFp2 xR = op.ScalarMul3Pt(&tmp, &xPB, &xQB, &xRB, prv.params.B.SecretBitLen, prv.Scalar) tmp.C = pub.params.OneFp2 tmp.A.Zeroize() traverseTreePublicKeyB(&tmp, &xR, &xPA, &xQA, &xRA, pub) phi.GenerateCurve(&xR) xPB = phi.EvaluatePoint(&xPA) xQB = phi.EvaluatePoint(&xQA) xRB = phi.EvaluatePoint(&xRA) op.Fp2Batch3Inv(&xPB.Z, &xQB.Z, &xRB.Z, &invZP, &invZQ, &invZR) op.Params.Op.Mul(&pub.affine_xP, &xPB.X, &invZP) op.Params.Op.Mul(&pub.affine_xQ, &xQB.X, &invZQ) op.Params.Op.Mul(&pub.affine_xQmP, &xRB.X, &invZR) return } // ----------------------------------------------------------------------------- // Key agreement functions // // Establishing shared keys in in 2-torsion group func deriveSecretA(prv *PrivateKey, pub *PublicKey) []byte { var sharedSecret = make([]byte, pub.params.SharedSecretSize) var cparam ProjectiveCurveParameters var xP, xQ, xQmP ProjectivePoint var xR ProjectivePoint var op = CurveOperations{Params: prv.params} var phi = Newisogeny4(op.Params.Op) // Recover curve coefficients cparam.C = pub.params.OneFp2 op.RecoverCoordinateA(&cparam, &pub.affine_xP, &pub.affine_xQ, &pub.affine_xQmP) // Find kernel of the morphism xP = ProjectivePoint{X: pub.affine_xP, Z: pub.params.OneFp2} xQ = ProjectivePoint{X: pub.affine_xQ, Z: pub.params.OneFp2} xQmP = ProjectivePoint{X: pub.affine_xQmP, Z: pub.params.OneFp2} xR = op.ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, pub.params.A.SecretBitLen, prv.Scalar) // Traverse isogeny tree traverseTreeSharedKeyA(&cparam, &xR, pub) // Calculate j-invariant on isogeneus curve c := phi.GenerateCurve(&xR) op.RecoverCurveCoefficients4(&cparam, &c) op.Jinvariant(&cparam, sharedSecret) return sharedSecret } // Establishing shared keys in in 3-torsion group func deriveSecretB(prv *PrivateKey, pub *PublicKey) []byte { var sharedSecret = make([]byte, pub.params.SharedSecretSize) var xP, xQ, xQmP ProjectivePoint var xR ProjectivePoint var cparam ProjectiveCurveParameters var op = CurveOperations{Params: prv.params} var phi = Newisogeny3(op.Params.Op) // Recover curve coefficients cparam.C = pub.params.OneFp2 op.RecoverCoordinateA(&cparam, &pub.affine_xP, &pub.affine_xQ, &pub.affine_xQmP) // Find kernel of the morphism xP = ProjectivePoint{X: pub.affine_xP, Z: pub.params.OneFp2} xQ = ProjectivePoint{X: pub.affine_xQ, Z: pub.params.OneFp2} xQmP = ProjectivePoint{X: pub.affine_xQmP, Z: pub.params.OneFp2} xR = op.ScalarMul3Pt(&cparam, &xP, &xQ, &xQmP, pub.params.B.SecretBitLen, prv.Scalar) // Traverse isogeny tree traverseTreeSharedKeyB(&cparam, &xR, pub) // Calculate j-invariant on isogeneus curve c := phi.GenerateCurve(&xR) op.RecoverCurveCoefficients3(&cparam, &c) op.Jinvariant(&cparam, sharedSecret) return sharedSecret } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/dh/sidh/sidh_test.go000066400000000000000000000402201365325520100254220ustar00rootroot00000000000000package sidh import ( "bytes" "crypto/rand" "encoding/hex" "fmt" "math/big" "testing" . "github.com/henrydcase/nobs/dh/sidh/internal/isogeny" ) /* ------------------------------------------------------------------------- Test data -------------------------------------------------------------------------*/ var tdata = map[uint8]struct { name string KatFile string PkA string PrA string PkB string PrB string }{ FP_503: { name: "P-503", PrA: "B0AD510708F4ABCF3E0D97DC2F2FF112D9D2AAE49D97FFD1E4267F21C6E71C03", PrB: "A885A8B889520A6DBAD9FB33365E5B77FDED629440A16A533F259A510F63A822", PkA: "A6BADBA04518A924B20046B59AC197DCDF0EA48014C9E228C4994CCA432F360E" + "2D527AFB06CA7C96EE5CEE19BAD53BF9218A3961CAD7EC092BD8D9EBB22A3D51" + "33008895A3F1F6A023F91E0FE06A00A622FD6335DAC107F8EC4283DC2632F080" + "4E64B390DAD8A2572F1947C67FDF4F8787D140CE2C6B24E752DA9A195040EDFA" + "C27333FAE97DBDEB41DA9EEB2DB067AE7DA8C58C0EF57AEFC18A3D6BD0576FF2" + "F1CFCAEC50C958331BF631F3D2E769790C7B6DF282B74BBC02998AD10F291D47" + "C5A762FF84253D3B3278BDF20C8D4D4AA317BE401B884E26A1F02C7308AADB68" + "20EBDB0D339F5A63346F3B40CACED72F544DAF51566C6E807D0E6E1E38514342" + "432661DC9564DA07548570E256688CD9E8060D8775F95D501886D958588CACA0" + "9F2D2AE1913F996E76AF63E31A179A7A7D2A46EDA03B2BCCF9020A5AA15F9A28" + "9340B33F3AE7F97360D45F8AE1B9DD48779A57E8C45B50A02C00349CD1C58C55" + "1D68BC2A75EAFED944E8C599C288037181E997471352E24C952B", PkB: "244AF1F367C2C33912750A98497CC8214BC195BD52BD76513D32ACE4B75E31F0" + "281755C265F5565C74E3C04182B9C244071859C8588CC7F09547CEFF8F7705D2" + "60CE87D6BFF914EE7DBE4B9AF051CA420062EEBDF043AF58184495026949B068" + "98A47046BFAE8DF3B447746184AF550553BB5D266D6E1967ACA33CAC5F399F90" + "360D70867F2C71EF6F94FF915C7DA8BC9549FB7656E691DAEFC93CF56876E482" + "CA2F8BE2D6CDCC374C31AD8833CABE997CC92305F38497BEC4DFD1821B004FEC" + "E16448F9A24F965EFE409A8939EEA671633D9FFCF961283E59B8834BDF7EDDB3" + "05D6275B61DA6692325432A0BAA074FC7C1F51E76208AB193A57520D40A76334" + "EE5712BDC3E1EFB6103966F2329EDFF63082C4DFCDF6BE1C5A048630B81871B8" + "83B735748A8FD4E2D9530C272163AB18105B10015CA7456202FE1C9B92CEB167" + "5EAE1132E582C88E47ED87B363D45F05BEA714D5E9933D7AF4071CBB5D49008F" + "3E3DAD7DFF935EE509D5DE561842B678CCEB133D62E270E9AC3E", }, FP_751: { name: "P-751", // PrA - Alice's Private Key: 2*randint(0,2^371) PrA: "C09957CC83045FB4C3726384D784476ACB6FFD92E5B15B3C2D451BA063F1BD4CED8FBCF682A98DD0954D3" + "7BCAF730E", // PrB - Bob's Private Key: 3*randint(0,3^238) PrB: "393E8510E78A16D2DC1AACA9C9D17E7E78DB630881D8599C7040D05BB5557ECAE8165C45D5366ECB37B00" + "969740AF201", PkA: "74D8EF08CB74EC99BF08B6FBE4FB3D048873B67F018E44988B9D70C564D058401D20E093C7DF0C66F022C" + "823E5139D2EA0EE137804B4820E950B046A90B0597759A0B6A197C56270128EA089FA1A2007DDE3430B37" + "A3E6350BD47B7F513863741C125FA63DEDAFC475C13DB59E533055B7CBE4B2F32672DF2DF97E03E29617B" + "0E9B6A35B58ABB26527A721142701EB147C7050E1D9125DA577B08CD51C8BB50627B8B47FACFC9C7C07DD" + "00DD75115DD83719FD5F96115DED23ECAA50B1044C6BF3F27442DA284BA4A272D850F414FB185801BF2EF" + "7E628EDB5643E35694B992CF30A2C5120CAF9434F09ACFCA3645B3FFC3A308901FAC7B8955FD5C98576AE" + "FD03F5806CB7430F75B3431B75BEC080596ABCA26E637E6E8D4C25175A8C052C9CBE77900A863F83FAB00" + "95B32D9C3858EF8A35B9F163D429E71DBA47539EB4791D117FE39DDE94EA7801A42DB12D84DE4740ACF51" + "CD7C32BB854569D7D94E11E69D9663CC7ED02E78CF48F4069DF3D3E86198B307095C6B11D46C0DC849F9D" + "94C7693209E5B3848AFAA6DA6A8D73362D779CBC43515902ED2BCE3A748C537DE2FCF092FD3E91B790AF5" + "4E1092C5E5B89BE5BE23B955A52F769D97277EF69F820109042F28C316AC90AE69EB374C9280300B816E6" + "2494B2E01072D1CA96E4B284D2BE1368D6969744B614FACBC8C165864E26E33481D4FDC47B6E523954A25" + "C1A096A37CD23FB81AE64FB11BD0A439609F1CE40673B06DD96F698A910E935219D840F3D411EDFB00D98" + "065AB9868C32D3DA05FF415", PkB: "F6C260C4141E418457CB442E11F0F5558375437576E55D211D19EF83E2839E51D07A82765D8E7B6366FA7" + "0B56CDE3AD3B629ACF542A433369496EDA51EDFBE16EFA1B8DEE1CE46B37820ECBD0CD674AACD4F21FABC" + "2436651E3AF604356FF3EB2CA87976890E34A56FAEC9A2ACD9559B1BB67B69AC1A521342E1E787DA5D709" + "32B0F5842ECA1C99B269DB6C2ED8397F0FC49F114CF8B5AF327A698C0251575CDD1D67732668109A91A3B" + "FA5B47D413C7FAB8817FCBEBFE9BDD9C0B1F3B1934A7028A65233E8B58A92E7E9F66B68B2057ECBF7E44A" + "0EF6EFCC3C8AA5414E100FA0C24F7545324AD17062FC11377A2A4749DEE27E192460E099DBDA8E840EA11" + "AD9D5C83DF065AF77030E7FE18CE24CFC71D356B9B9601811B93676C12CB6B41747133D5259E7A20CC065" + "FAB99DF944FDB34ABB9A374F9E9CC8F9C186BD2181DC2771F69C02629C3E4801A7E7C21F6F3CFF7D257E2" + "257C88C015F0CC8DC0E7FB3373CF4ED6A786AB329E7F16895CA147AD91F6EAE1DFE38116580DF52381599" + "E4246278CB1848FE4A56ABF98652E9E7C2E681551A3D78FA033D932087D8B6567D779A56B726B153033D7" + "2231A1B5C16ED7DC4458308D6B64AF6723CC0F52C94E04C58FCA9739E890AA40CC05E22321F10129D2B59" + "1F317102034C109A56D711591E5B44C717CFC9C9B9461894767CAFA42D2B394194B03999C2A9EF48868F3" + "FB03D1A40F596613AF97F4ED7643A1C2D12692E959C6DEB8E72403ADC0E42204DBCE5056EEF0CC60B0C6E" + "83B8B55AC01F6C85644EE49", }, } /* ------------------------------------------------------------------------- Helpers -------------------------------------------------------------------------*/ // Fail if err !=nil. Display msg as an error message func checkErr(t testing.TB, err error, msg string) { if err != nil { t.Error(msg) } } // Utility used for running same test with all registered prime fields type MultiIdTestingFunc func(testing.TB, uint8) func Do(f MultiIdTestingFunc, t testing.TB) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) f(t, id) } } // Converts string to private key func convToPrv(s string, v KeyVariant, id uint8) *PrivateKey { key := NewPrivateKey(id, v) hex, e := hex.DecodeString(s) if e != nil { panic("non-hex number provided") } e = key.Import(hex) if e != nil { panic("Can't import private key") } return key } // Converts string to public key func convToPub(s string, v KeyVariant, id uint8) *PublicKey { key := NewPublicKey(id, v) hex, e := hex.DecodeString(s) if e != nil { panic("non-hex number provided") } e = key.Import(hex) if e != nil { panic("Can't import public key") } return key } /* ------------------------------------------------------------------------- Unit tests -------------------------------------------------------------------------*/ func testKeygen(t testing.TB, id uint8) { prvB := NewPrivateKey(id, KeyVariant_SIDH_B) err := prvB.Generate(rand.Reader) checkErr(t, err, "key generation failed") alicePrivate := convToPrv(tdata[id].PrA, KeyVariant_SIDH_A, id) bobPrivate := convToPrv(tdata[id].PrB, KeyVariant_SIDH_B, id) expPubA := convToPub(tdata[id].PkA, KeyVariant_SIDH_A, id) expPubB := convToPub(tdata[id].PkB, KeyVariant_SIDH_B, id) pubA := alicePrivate.GeneratePublicKey() pubB := bobPrivate.GeneratePublicKey() if !bytes.Equal(pubA.Export(), expPubA.Export()) { t.Fatalf("unexpected value of public key A") } if !bytes.Equal(pubB.Export(), expPubB.Export()) { t.Fatalf("unexpected value of public key B") } } func testRoundtrip(t testing.TB, id uint8) { var err error prvA := NewPrivateKey(id, KeyVariant_SIDH_A) prvB := NewPrivateKey(id, KeyVariant_SIDH_B) // Generate private keys err = prvA.Generate(rand.Reader) checkErr(t, err, "key generation failed") err = prvB.Generate(rand.Reader) checkErr(t, err, "key generation failed") // Generate public keys pubA := prvA.GeneratePublicKey() pubB := prvB.GeneratePublicKey() // Derive shared secret s1, err := DeriveSecret(prvB, pubA) checkErr(t, err, "") s2, err := DeriveSecret(prvA, pubB) checkErr(t, err, "") if !bytes.Equal(s1[:], s2[:]) { t.Fatalf("Tthe two shared keys: \n%X, \n%X do not match", s1, s2) } } func testKeyAgreement(t testing.TB, id uint8, pkA, prA, pkB, prB string) { var e error // KeyPairs alicePublic := convToPub(pkA, KeyVariant_SIDH_A, id) bobPublic := convToPub(pkB, KeyVariant_SIDH_B, id) alicePrivate := convToPrv(prA, KeyVariant_SIDH_A, id) bobPrivate := convToPrv(prB, KeyVariant_SIDH_B, id) // Do actual test s1, e := DeriveSecret(bobPrivate, alicePublic) checkErr(t, e, "derivation s1") s2, e := DeriveSecret(alicePrivate, bobPublic) checkErr(t, e, "derivation s1") if !bytes.Equal(s1[:], s2[:]) { t.Fatalf("two shared keys: %d, %d do not match", s1, s2) } // Negative case dec, e := hex.DecodeString(tdata[id].PkA) if e != nil { t.FailNow() } dec[0] = ^dec[0] e = alicePublic.Import(dec) if e != nil { t.FailNow() } s1, e = DeriveSecret(bobPrivate, alicePublic) checkErr(t, e, "derivation of s1 failed") s2, e = DeriveSecret(alicePrivate, bobPublic) checkErr(t, e, "derivation of s2 failed") if bytes.Equal(s1[:], s2[:]) { t.Fatalf("The two shared keys: %d, %d match", s1, s2) } } func testImportExport(t testing.TB, id uint8) { var err error a := NewPublicKey(id, KeyVariant_SIDH_A) b := NewPublicKey(id, KeyVariant_SIDH_B) // Import keys a_hex, err := hex.DecodeString(tdata[id].PkA) checkErr(t, err, "invalid hex-number provided") err = a.Import(a_hex) checkErr(t, err, "import failed") b_hex, err := hex.DecodeString(tdata[id].PkB) checkErr(t, err, "invalid hex-number provided") err = b.Import(b_hex) checkErr(t, err, "import failed") // Export and check if same if !bytes.Equal(b.Export(), b_hex) || !bytes.Equal(a.Export(), a_hex) { t.Fatalf("export/import failed") } if (len(b.Export()) != b.Size()) || (len(a.Export()) != a.Size()) { t.Fatalf("wrong size of exported keys") } } func testPrivateKeyBelowMax(t testing.TB, id uint8) { params := Params(id) for variant, keySz := range map[KeyVariant]*DomainParams{ KeyVariant_SIDH_A: ¶ms.A, KeyVariant_SIDH_B: ¶ms.B} { func(v KeyVariant, dp *DomainParams) { var blen = int(dp.SecretByteLen) var prv = NewPrivateKey(id, v) // Calculate either (2^e2 - 1) or (2^s - 1); where s=ceil(log_2(3^e3))) maxSecertVal := big.NewInt(int64(dp.SecretBitLen)) maxSecertVal.Exp(big.NewInt(int64(2)), maxSecertVal, nil) maxSecertVal.Sub(maxSecertVal, big.NewInt(1)) // Do same test 1000 times for i := 0; i < 1000; i++ { err := prv.Generate(rand.Reader) checkErr(t, err, "Private key generation") // Convert to big-endian, as that's what expected by (*Int)SetBytes() secretBytes := prv.Export() for i := 0; i < int(blen/2); i++ { tmp := secretBytes[i] ^ secretBytes[blen-i-1] secretBytes[i] = tmp ^ secretBytes[i] secretBytes[blen-i-1] = tmp ^ secretBytes[blen-i-1] } prvBig := new(big.Int).SetBytes(secretBytes) // Check if generated key is bigger then acceptable if prvBig.Cmp(maxSecertVal) == 1 { t.Error("Generated private key is wrong") } } }(variant, keySz) } } func TestKeyAgreementP751(t *testing.T) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) testKeyAgreement(t, id, tdata[id].PkA, tdata[id].PrA, tdata[id].PkB, tdata[id].PrB) } } func TestKeyAgreementP751_AliceEvenNumber(t *testing.T) { // even alice prE := "C09957CC83045FB4C3726384D784476ACB6FFD92E5B15B3C2D451BA063F1BD4CED8FBCF682A98DD0954D37BCAF730F" pkE := "8A2DE6FD963C475F7829B689C8B8306FC0917A39EBBC35CA171546269A85698FEC0379E2E1A3C567BE1B8EF5639F81F304889737E6CC444DBED4579DB204DC8C7928F5CBB1ECDD682A1B5C48C0DAF34208C06BF201BE4E6063B1BFDC42413B0537F8E76BEE645C1A24118301BAB17EB8D6E0F283BCB16EFB833E4BB3463953C93165A0DDAC55B385059F27FF7228486D0A733812C81C792BE9EC3A16A5DB0EB099EEA76AC0E59612251A3AD19F7CC567DA2AEBD7733171F48E471D17648692355164E27B515D2A47D7BA34B3B48A047BE7C09C4ABEE2FCC9ACA7396C8A8C9E73E29533FC7369094DFA7988778E55E53F309922C6E233F8F9C7936C3D29CEA640406FCA06450AA1978FF39F227BF06B1E072F1763447C6F513B23CDF3B0EC0379070AEE5A02D9AD8E0EB023461D631F4A9643A4C79921334945F6B33DDFC11D9703BD06B047B4DA404AB12EFD2C3A49E5C42D10DA063352748B21DE41C32A5693FE1C0DCAB111F4990CD58BECADB1892EE7A7E99C9DB4DA4E69C96E57138B99038BC9B877ECE75914EFB98DD08B9E4A2DCCB948A8F7D2F26678A9952BA0EFAB1E9CF6E51B557480DEC2BA30DE0FE4AFE30A6B30765EE75EF64F678316D81C72755AD2CFA0B8C7706B07BFA52FBC3DB84EF9E79796C0089305B1E13C78660779E0FF2A13820CE141104F976B1678990F85B2D3D2B89CD5BC4DD52603A5D24D3EFEDA44BAA0F38CDB75A220AF45EAB70F2799875D435CE50FC6315EDD4BB7AA7260AFD7CD0561B69B4FA3A817904322661C3108DA24" testKeyAgreement(t, FP_751, pkE, prE, tdata[FP_751].PkB, tdata[FP_751].PrB) } /* ------------------------------------------------------------------------- Wrappers for 'testing' module -------------------------------------------------------------------------*/ func TestKeygen(t *testing.T) { Do(testKeygen, t) } func TestRoundtrip(t *testing.T) { Do(testRoundtrip, t) } func TestImportExport(t *testing.T) { Do(testImportExport, t) } func TestPrivateKeyBelowMax(t *testing.T) { Do(testPrivateKeyBelowMax, t) } /* ------------------------------------------------------------------------- Benchmarking -------------------------------------------------------------------------*/ func BenchmarkSidhKeyAgreementP751(b *testing.B) { // KeyPairs alicePublic := convToPub(tdata[FP_751].PkA, KeyVariant_SIDH_A, FP_751) bobPublic := convToPub(tdata[FP_751].PkB, KeyVariant_SIDH_B, FP_751) alicePrivate := convToPrv(tdata[FP_751].PrA, KeyVariant_SIDH_A, FP_751) bobPrivate := convToPrv(tdata[FP_751].PrB, KeyVariant_SIDH_B, FP_751) for i := 0; i < b.N; i++ { // Derive shared secret DeriveSecret(bobPrivate, alicePublic) DeriveSecret(alicePrivate, bobPublic) } } func BenchmarkSidhKeyAgreementP503(b *testing.B) { // KeyPairs alicePublic := convToPub(tdata[FP_503].PkA, KeyVariant_SIDH_A, FP_503) bobPublic := convToPub(tdata[FP_503].PkB, KeyVariant_SIDH_B, FP_503) alicePrivate := convToPrv(tdata[FP_503].PrA, KeyVariant_SIDH_A, FP_503) bobPrivate := convToPrv(tdata[FP_503].PrB, KeyVariant_SIDH_B, FP_503) for i := 0; i < b.N; i++ { // Derive shared secret DeriveSecret(bobPrivate, alicePublic) DeriveSecret(alicePrivate, bobPublic) } } func BenchmarkAliceKeyGenPrvP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_A) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkAliceKeyGenPrvP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_A) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkBobKeyGenPrvP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_B) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkBobKeyGenPrvP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_B) for n := 0; n < b.N; n++ { prv.Generate(rand.Reader) } } func BenchmarkAliceKeyGenPubP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_A) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkAliceKeyGenPubP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_A) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkBobKeyGenPubP751(b *testing.B) { prv := NewPrivateKey(FP_751, KeyVariant_SIDH_B) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkBobKeyGenPubP503(b *testing.B) { prv := NewPrivateKey(FP_503, KeyVariant_SIDH_B) prv.Generate(rand.Reader) for n := 0; n < b.N; n++ { prv.GeneratePublicKey() } } func BenchmarkSharedSecretAliceP751(b *testing.B) { aPr := convToPrv(tdata[FP_751].PrA, KeyVariant_SIDH_A, FP_751) bPk := convToPub(tdata[FP_751].PkB, KeyVariant_SIDH_B, FP_751) for n := 0; n < b.N; n++ { DeriveSecret(aPr, bPk) } } func BenchmarkSharedSecretAliceP503(b *testing.B) { aPr := convToPrv(tdata[FP_503].PrA, KeyVariant_SIDH_A, FP_503) bPk := convToPub(tdata[FP_503].PkB, KeyVariant_SIDH_B, FP_503) for n := 0; n < b.N; n++ { DeriveSecret(aPr, bPk) } } func BenchmarkSharedSecretBobP751(b *testing.B) { // m_B = 3*randint(0,3^238) aPk := convToPub(tdata[FP_751].PkA, KeyVariant_SIDH_A, FP_751) bPr := convToPrv(tdata[FP_751].PrB, KeyVariant_SIDH_B, FP_751) for n := 0; n < b.N; n++ { DeriveSecret(bPr, aPk) } } func BenchmarkSharedSecretBobP503(b *testing.B) { // m_B = 3*randint(0,3^238) aPk := convToPub(tdata[FP_503].PkA, KeyVariant_SIDH_A, FP_503) bPr := convToPrv(tdata[FP_503].PrB, KeyVariant_SIDH_B, FP_503) for n := 0; n < b.N; n++ { DeriveSecret(bPr, aPk) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/000077500000000000000000000000001365325520100225035ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/ctr_drbg.go000066400000000000000000000065621365325520100246310ustar00rootroot00000000000000// This is initial implementation of CTR_DRBG with AES-256. Code is tested // and functionaly correct. Nevertheless it will be changed // // TODO: Following things still need to be done // * Add other AES key lengts // * Validate sizes from table 3 of SP800-90A // * Improve reseeding so that code returns an error when reseed is needed // * Add case with derivation function (maybe) // * Code cleanup // * Implement benchmark // * Add rest of the test vectors from CAVP package drbg import ( "github.com/henrydcase/nobs/drbg/internal/aes" "github.com/henrydcase/nobs/utils" ) // Constants below correspond to AES-256, which is currently // the only block cipher supported. const ( BlockLen = 16 KeyLen = 32 SeedLen = BlockLen + KeyLen ) type CtrDrbg struct { v [BlockLen]byte key [KeyLen]byte counter uint strength uint resistance bool blockEnc aes.IAES tmpBlk [3 * BlockLen]byte } func NewCtrDrbg() *CtrDrbg { if utils.X86.HasAES { return &CtrDrbg{blockEnc: &aes.AESAsm{}} } return &CtrDrbg{blockEnc: &aes.AES{}} } func (c *CtrDrbg) inc() { for i := BlockLen - 1; i >= 0; i-- { if c.v[i] == 0xff { c.v[i] = 0x00 } else { c.v[i]++ break } } } func (c *CtrDrbg) Init(entropy, personalization []byte) bool { var lsz int var seedBuf [SeedLen]byte // Minimum entropy input (SP800-90A, 10.2.1) if len(entropy) < int(c.strength/8) { return false } // Security strength for AES-256 as per SP800-57, 5.6.1 c.strength = 256 lsz = len(entropy) if lsz > SeedLen { lsz = SeedLen } copy(seedBuf[:], entropy[:lsz]) lsz = len(personalization) if lsz > SeedLen { lsz = SeedLen } for i := 0; i < lsz; i++ { seedBuf[i] ^= personalization[i] } c.blockEnc.SetKey(c.key[:]) c.update(seedBuf[:]) c.counter = 1 return true } func (c *CtrDrbg) update(data []byte) { if len(data) != SeedLen { panic("Provided data is not equal to strength/8") } // deliberatelly not using len(c.tmpBlk) for i := 0; i < 3*BlockLen; i += BlockLen { c.inc() c.blockEnc.SetKey(c.key[:]) c.blockEnc.Encrypt(c.tmpBlk[i:], c.v[:]) } for i := 0; i < 3*BlockLen; i++ { c.tmpBlk[i] ^= data[i] } copy(c.key[:], c.tmpBlk[:KeyLen]) copy(c.v[:], c.tmpBlk[KeyLen:]) } func (c *CtrDrbg) Reseed(entropy, data []byte) { var seedBuf [SeedLen]byte var lsz int lsz = len(entropy) if lsz > SeedLen { lsz = SeedLen } copy(seedBuf[:], entropy[:lsz]) lsz = len(data) if lsz > SeedLen { lsz = SeedLen } for i := 0; i < lsz; i++ { seedBuf[i] ^= data[i] } c.update(seedBuf[:]) c.counter = 1 } func (c *CtrDrbg) ReadWithAdditionalData(out, ad []byte) (n int, err error) { var seedBuf [SeedLen]byte // TODO: check reseed_counter > reseed_interval if len(ad) > 0 { // pad additional data with zeros if needed copy(seedBuf[:], ad) c.update(seedBuf[:]) } // Number of blocks to write minus last one blocks := len(out) / BlockLen for i := 0; i < blocks; i++ { c.inc() c.blockEnc.SetKey(c.key[:]) c.blockEnc.Encrypt(out[i*BlockLen:], c.v[:]) } // Copy remainder - case for out being not block aligned c.blockEnc.Encrypt(c.tmpBlk[:], c.v[:]) copy(out[blocks*BlockLen:], c.tmpBlk[:len(out)%BlockLen]) c.update(seedBuf[:]) c.counter += 1 return len(out), nil } // Read reads data from DRBG. Size of data is determined by // out buffer. func (c *CtrDrbg) Read(out []byte) (n int, err error) { return c.ReadWithAdditionalData(out, nil) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/ctr_drbg_test.go000066400000000000000000000062251365325520100256640ustar00rootroot00000000000000package drbg import ( "bytes" "encoding/hex" "testing" ) func S2H(s string) []byte { hex, e := hex.DecodeString(s) if e != nil { panic("Can't import private key") } return hex } func TestNominal(t *testing.T) { var entropy [16]byte var data [48]byte c := NewCtrDrbg() if !c.Init(entropy[:], nil) { t.FailNow() } c.ReadWithAdditionalData(entropy[0:16], data[:]) exp := S2H("16BA361FA14563FB1E8BCF88932F9FA7") if !bytes.Equal(exp, entropy[:]) { t.FailNow() } } // TODO: should parse *.req file from here: https://raw.githubusercontent.com/coruus/nist-testvectors/master/csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors/drbgvectors_pr_false/CTR_DRBG.rsp var vectors = []struct { EntropyInput []byte PersonalizationString []byte EntropyInputReseed []byte AdditionalInputReseed []byte AdditionalInput1 []byte AdditionalInput2 []byte ReturnedBits []byte }{ // With Reseeding { S2H("99903165903fea49c2db26ed675e44cc14cb2c1f28b836b203240b02771e831146ffc4335373bb344688c5c950670291"), []byte{}, S2H("b4ee99fa9e0eddaf4a3612013cd636c4af69177b43eebb3c58a305b9979b68b5cc820504f6c029aad78a5d29c66e84a0"), S2H("2d8c5c28b05696e74774eb69a10f01c5fabc62691ddf7848a8004bb5eeb4d2c5febe1aa01f4d557b23d7e9a0e4e90655"), S2H("0dc9cde42ac6e856f01a55f219c614de90c659260948db5053d414bab0ec2e13e995120c3eb5aafc25dc4bdcef8ace24"), S2H("711be6c035013189f362211889248ca8a3268e63a7eb26836d915810a680ac4a33cd1180811a31a0f44f08db3dd64f91"), S2H("11c7a0326ea737baa7a993d510fafee5374e7bbe17ef0e3e29f50fa68aac2124b017d449768491cac06d136d691a4e80785739f9aaedf311bba752a3268cc531"), }, { S2H("ffad10100025a879672ff50374b286712f457dd01441d76ac1a1cd15c7390dd93179a2f5920d198bf34a1b76fbc21289"), S2H("1d2be6f25e88fa30c4ef42e4d54efd957dec231fa00143ca47580be666a8c143a916c90b3819a0a7ea914e3c9a2e7a3f"), S2H("6c1a089cae313363bc76a780139eb4f2f2048b1f6b07896c5c412bff0385440fc43b73facbb79e3a252fa01fe17ab391"), []byte{}, []byte{}, []byte{}, S2H("e053c7d4bd9099ef6a99f190a5fd80219437d642006672338da6e0fe73ca4d24ffa51151bfbdac78d8a2f6255046edf57a04626e9977139c6933274299f3bdff"), }, } func TestVector(t *testing.T) { for i := range vectors { result := make([]byte, len(vectors[i].ReturnedBits)) c := NewCtrDrbg() if !c.Init(vectors[i].EntropyInput[:], vectors[i].PersonalizationString) { t.Error("Init failed") } if len(vectors[i].EntropyInputReseed) > 0 { c.Reseed(vectors[i].EntropyInputReseed[:], vectors[i].AdditionalInputReseed[:]) } c.ReadWithAdditionalData(result[:], vectors[i].AdditionalInput1) c.ReadWithAdditionalData(result[:], vectors[i].AdditionalInput2) if !bytes.Equal(vectors[i].ReturnedBits[:], result[:]) { t.Errorf("KAT failed \nexp: %X\ngot: %X\n", vectors[i].ReturnedBits, result[:]) } } } func BenchmarkInit(b *testing.B) { c := NewCtrDrbg() for i := 0; i < b.N; i++ { c.Init(vectors[0].EntropyInput[:], vectors[0].PersonalizationString) } } func BenchmarkRead(b *testing.B) { var result [16 * 10]byte c := NewCtrDrbg() c.Init(vectors[0].EntropyInput[:], vectors[0].PersonalizationString) for i := 0; i < b.N; i++ { c.ReadWithAdditionalData(result[:], vectors[0].AdditionalInput1) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/000077500000000000000000000000001365325520100243175ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/000077500000000000000000000000001365325520100250675ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/LICENSE000066400000000000000000000027071365325520100261020ustar00rootroot00000000000000Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/aes_test.go000066400000000000000000000265161365325520100272370ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package aes import ( "testing" ) // See const.go for overview of math here. // Test that powx is initialized correctly. // (Can adapt this code to generate it too.) func TestPowx(t *testing.T) { p := 1 for i := 0; i < len(powx); i++ { if powx[i] != byte(p) { t.Errorf("powx[%d] = %#x, want %#x", i, powx[i], p) } p <<= 1 if p&0x100 != 0 { p ^= poly } } } // Multiply b and c as GF(2) polynomials modulo poly func mul(b, c uint32) uint32 { i := b j := c s := uint32(0) for k := uint32(1); k < 0x100 && j != 0; k <<= 1 { // Invariant: k == 1<>8 } } } // Test that decryption tables are correct. // (Can adapt this code to generate them too.) func TestTd(t *testing.T) { for i := 0; i < 256; i++ { s := uint32(sbox1[i]) s9 := mul(s, 0x9) sb := mul(s, 0xb) sd := mul(s, 0xd) se := mul(s, 0xe) w := se<<24 | s9<<16 | sd<<8 | sb td := [][256]uint32{td0, td1, td2, td3} for j := 0; j < 4; j++ { if x := td[j][i]; x != w { t.Fatalf("td[%d][%d] = %#x, want %#x", j, i, x, w) } w = w<<24 | w>>8 } } } // Test vectors are from FIPS 197: // https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf // Appendix A of FIPS 197: Key expansion examples type KeyTest struct { key []byte enc []uint32 dec []uint32 // decryption expansion; not in FIPS 197, computed from C implementation. } var keyTests = []KeyTest{ { // A.1. Expansion of a 128-bit Cipher Key []byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}, []uint32{ 0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c, 0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605, 0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f, 0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b, 0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00, 0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc, 0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd, 0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f, 0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f, 0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e, 0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6, }, []uint32{ 0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6, 0xc7b5a63, 0x1319eafe, 0xb0398890, 0x664cfbb4, 0xdf7d925a, 0x1f62b09d, 0xa320626e, 0xd6757324, 0x12c07647, 0xc01f22c7, 0xbc42d2f3, 0x7555114a, 0x6efcd876, 0xd2df5480, 0x7c5df034, 0xc917c3b9, 0x6ea30afc, 0xbc238cf6, 0xae82a4b4, 0xb54a338d, 0x90884413, 0xd280860a, 0x12a12842, 0x1bc89739, 0x7c1f13f7, 0x4208c219, 0xc021ae48, 0x969bf7b, 0xcc7505eb, 0x3e17d1ee, 0x82296c51, 0xc9481133, 0x2b3708a7, 0xf262d405, 0xbc3ebdbf, 0x4b617d62, 0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x9cf4f3c, }, }, { // A.2. Expansion of a 192-bit Cipher Key []byte{ 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b, }, []uint32{ 0x8e73b0f7, 0xda0e6452, 0xc810f32b, 0x809079e5, 0x62f8ead2, 0x522c6b7b, 0xfe0c91f7, 0x2402f5a5, 0xec12068e, 0x6c827f6b, 0x0e7a95b9, 0x5c56fec2, 0x4db7b4bd, 0x69b54118, 0x85a74796, 0xe92538fd, 0xe75fad44, 0xbb095386, 0x485af057, 0x21efb14f, 0xa448f6d9, 0x4d6dce24, 0xaa326360, 0x113b30e6, 0xa25e7ed5, 0x83b1cf9a, 0x27f93943, 0x6a94f767, 0xc0a69407, 0xd19da4e1, 0xec1786eb, 0x6fa64971, 0x485f7032, 0x22cb8755, 0xe26d1352, 0x33f0b7b3, 0x40beeb28, 0x2f18a259, 0x6747d26b, 0x458c553e, 0xa7e1466c, 0x9411f1df, 0x821f750a, 0xad07d753, 0xca400538, 0x8fcc5006, 0x282d166a, 0xbc3ce7b5, 0xe98ba06f, 0x448c773c, 0x8ecc7204, 0x01002202, }, nil, }, { // A.3. Expansion of a 256-bit Cipher Key []byte{ 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4, }, []uint32{ 0x603deb10, 0x15ca71be, 0x2b73aef0, 0x857d7781, 0x1f352c07, 0x3b6108d7, 0x2d9810a3, 0x0914dff4, 0x9ba35411, 0x8e6925af, 0xa51a8b5f, 0x2067fcde, 0xa8b09c1a, 0x93d194cd, 0xbe49846e, 0xb75d5b9a, 0xd59aecb8, 0x5bf3c917, 0xfee94248, 0xde8ebe96, 0xb5a9328a, 0x2678a647, 0x98312229, 0x2f6c79b3, 0x812c81ad, 0xdadf48ba, 0x24360af2, 0xfab8b464, 0x98c5bfc9, 0xbebd198e, 0x268c3ba7, 0x09e04214, 0x68007bac, 0xb2df3316, 0x96e939e4, 0x6c518d80, 0xc814e204, 0x76a9fb8a, 0x5025c02d, 0x59c58239, 0xde136967, 0x6ccc5a71, 0xfa256395, 0x9674ee15, 0x5886ca5d, 0x2e2f31d7, 0x7e0af1fa, 0x27cf73c3, 0x749c47ab, 0x18501dda, 0xe2757e4f, 0x7401905a, 0xcafaaae3, 0xe4d59b34, 0x9adf6ace, 0xbd10190d, 0xfe4890d1, 0xe6188d0b, 0x046df344, 0x706c631e, }, nil, }, } // Test key expansion against FIPS 197 examples. func TestExpandKey(t *testing.T) { L: for i, tt := range keyTests { enc := make([]uint32, len(tt.enc)) var dec []uint32 if tt.dec != nil { dec = make([]uint32, len(tt.dec)) } // This test could only test Go version of expandKey because asm // version might use different memory layout for expanded keys // This is OK because we don't expose expanded keys to the outside expandKeyGo(tt.key, enc, dec) for j, v := range enc { if v != tt.enc[j] { t.Errorf("key %d: enc[%d] = %#x, want %#x", i, j, v, tt.enc[j]) continue L } } for j, v := range dec { if v != tt.dec[j] { t.Errorf("key %d: dec[%d] = %#x, want %#x", i, j, v, tt.dec[j]) continue L } } } } // Appendix B, C of FIPS 197: Cipher examples, Example vectors. type CryptTest struct { key []byte in []byte out []byte } var encryptTests = []CryptTest{ { // Appendix B. []byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}, []byte{0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34}, []byte{0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32}, }, { // Appendix C.1. AES-128 []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, []byte{0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a}, }, { // Appendix C.2. AES-192 []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, }, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, []byte{0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91}, }, { // Appendix C.3. AES-256 []byte{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, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, }, []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, []byte{0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89}, }, } // Test Cipher Encrypt method against FIPS 197 examples. func TestCipherEncrypt(t *testing.T) { c := NewCipher() for i, tt := range encryptTests { err := c.SetKey(tt.key) if err != nil { t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err) continue } out := make([]byte, len(tt.in)) c.Encrypt(out, tt.in) for j, v := range out { if v != tt.out[j] { t.Errorf("Cipher.Encrypt %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j]) break } } } } // Test Cipher Decrypt against FIPS 197 examples. func TestCipherDecrypt(t *testing.T) { for i, tt := range encryptTests { c := NewCipher() err := c.SetKey(tt.key) if err != nil { t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err) continue } plain := make([]byte, len(tt.in)) c.Decrypt(plain, tt.out) for j, v := range plain { if v != tt.in[j] { t.Errorf("decryptBlock %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j]) break } } } } // Test short input/output. // Assembly used to not notice. // See issue 7928. func TestShortBlocks(t *testing.T) { bytes := func(n int) []byte { return make([]byte, n) } c := NewCipher() c.SetKey(bytes(16)) mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(1), bytes(1)) }) mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(1), bytes(1)) }) mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(100), bytes(1)) }) mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(100), bytes(1)) }) mustPanic(t, "crypto/aes: output not full block", func() { c.Encrypt(bytes(1), bytes(100)) }) mustPanic(t, "crypto/aes: output not full block", func() { c.Decrypt(bytes(1), bytes(100)) }) } func mustPanic(t *testing.T, msg string, f func()) { defer func() { err := recover() if err == nil { t.Errorf("function did not panic, wanted %q", msg) } else if err != msg { t.Errorf("got panic %v, wanted %q", err, msg) } }() f() } func BenchmarkEncrypt(b *testing.B) { tt := encryptTests[0] c := NewCipher() err := c.SetKey(tt.key) if err != nil { b.Fatal("NewCipher:", err) } out := make([]byte, len(tt.in)) b.SetBytes(int64(len(out))) b.ResetTimer() for i := 0; i < b.N; i++ { c.Encrypt(out, tt.in) } } func BenchmarkDecrypt(b *testing.B) { tt := encryptTests[0] c := NewCipher() err := c.SetKey(tt.key) if err != nil { b.Fatal("NewCipher:", err) } out := make([]byte, len(tt.out)) b.SetBytes(int64(len(out))) b.ResetTimer() for i := 0; i < b.N; i++ { c.Decrypt(out, tt.out) } } func BenchmarkExpand(b *testing.B) { tt := encryptTests[0] c := NewCipher() c.SetKey(tt.key) b.ResetTimer() for i := 0; i < b.N; i++ { expandKey(tt.key, c.enc[:], c.dec[:]) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/asm_amd64.s000066400000000000000000000126621365325520100270350ustar00rootroot00000000000000// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64, !noasm #include "textflag.h" // func encryptBlockAsm(nr int, xk *uint32, dst, src *byte) TEXT ·encryptBlockAsm(SB),NOSPLIT,$0 MOVQ nr+0(FP), CX MOVQ xk+8(FP), AX MOVQ dst+16(FP), DX MOVQ src+24(FP), BX MOVUPS 0(AX), X1 MOVUPS 0(BX), X0 ADDQ $16, AX PXOR X1, X0 SUBQ $12, CX JE Lenc196 JB Lenc128 Lenc256: MOVUPS 0(AX), X1 AESENC X1, X0 MOVUPS 16(AX), X1 AESENC X1, X0 ADDQ $32, AX Lenc196: MOVUPS 0(AX), X1 AESENC X1, X0 MOVUPS 16(AX), X1 AESENC X1, X0 ADDQ $32, AX Lenc128: MOVUPS 0(AX), X1 AESENC X1, X0 MOVUPS 16(AX), X1 AESENC X1, X0 MOVUPS 32(AX), X1 AESENC X1, X0 MOVUPS 48(AX), X1 AESENC X1, X0 MOVUPS 64(AX), X1 AESENC X1, X0 MOVUPS 80(AX), X1 AESENC X1, X0 MOVUPS 96(AX), X1 AESENC X1, X0 MOVUPS 112(AX), X1 AESENC X1, X0 MOVUPS 128(AX), X1 AESENC X1, X0 MOVUPS 144(AX), X1 AESENCLAST X1, X0 MOVUPS X0, 0(DX) RET // func decryptBlockAsm(nr int, xk *uint32, dst, src *byte) TEXT ·decryptBlockAsm(SB),NOSPLIT,$0 MOVQ nr+0(FP), CX MOVQ xk+8(FP), AX MOVQ dst+16(FP), DX MOVQ src+24(FP), BX MOVUPS 0(AX), X1 MOVUPS 0(BX), X0 ADDQ $16, AX PXOR X1, X0 SUBQ $12, CX JE Ldec196 JB Ldec128 Ldec256: MOVUPS 0(AX), X1 AESDEC X1, X0 MOVUPS 16(AX), X1 AESDEC X1, X0 ADDQ $32, AX Ldec196: MOVUPS 0(AX), X1 AESDEC X1, X0 MOVUPS 16(AX), X1 AESDEC X1, X0 ADDQ $32, AX Ldec128: MOVUPS 0(AX), X1 AESDEC X1, X0 MOVUPS 16(AX), X1 AESDEC X1, X0 MOVUPS 32(AX), X1 AESDEC X1, X0 MOVUPS 48(AX), X1 AESDEC X1, X0 MOVUPS 64(AX), X1 AESDEC X1, X0 MOVUPS 80(AX), X1 AESDEC X1, X0 MOVUPS 96(AX), X1 AESDEC X1, X0 MOVUPS 112(AX), X1 AESDEC X1, X0 MOVUPS 128(AX), X1 AESDEC X1, X0 MOVUPS 144(AX), X1 AESDECLAST X1, X0 MOVUPS X0, 0(DX) RET // func expandKeyAsm(nr int, key *byte, enc, dec *uint32) { // Note that round keys are stored in uint128 format, not uint32 TEXT ·expandKeyAsm(SB),NOSPLIT,$0 MOVQ nr+0(FP), CX MOVQ key+8(FP), AX MOVQ enc+16(FP), BX MOVQ dec+24(FP), DX MOVUPS (AX), X0 // enc MOVUPS X0, (BX) ADDQ $16, BX PXOR X4, X4 // _expand_key_* expect X4 to be zero CMPL CX, $12 JE Lexp_enc196 JB Lexp_enc128 Lexp_enc256: MOVUPS 16(AX), X2 MOVUPS X2, (BX) ADDQ $16, BX AESKEYGENASSIST $0x01, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x01, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x02, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x02, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x04, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x04, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x08, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x08, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x10, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x10, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x20, X2, X1 CALL _expand_key_256a<>(SB) AESKEYGENASSIST $0x20, X0, X1 CALL _expand_key_256b<>(SB) AESKEYGENASSIST $0x40, X2, X1 CALL _expand_key_256a<>(SB) JMP Lexp_dec Lexp_enc196: MOVQ 16(AX), X2 AESKEYGENASSIST $0x01, X2, X1 CALL _expand_key_192a<>(SB) AESKEYGENASSIST $0x02, X2, X1 CALL _expand_key_192b<>(SB) AESKEYGENASSIST $0x04, X2, X1 CALL _expand_key_192a<>(SB) AESKEYGENASSIST $0x08, X2, X1 CALL _expand_key_192b<>(SB) AESKEYGENASSIST $0x10, X2, X1 CALL _expand_key_192a<>(SB) AESKEYGENASSIST $0x20, X2, X1 CALL _expand_key_192b<>(SB) AESKEYGENASSIST $0x40, X2, X1 CALL _expand_key_192a<>(SB) AESKEYGENASSIST $0x80, X2, X1 CALL _expand_key_192b<>(SB) JMP Lexp_dec Lexp_enc128: AESKEYGENASSIST $0x01, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x02, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x04, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x08, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x10, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x20, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x40, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x80, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x1b, X0, X1 CALL _expand_key_128<>(SB) AESKEYGENASSIST $0x36, X0, X1 CALL _expand_key_128<>(SB) Lexp_dec: // dec SUBQ $16, BX MOVUPS (BX), X1 MOVUPS X1, (DX) DECQ CX Lexp_dec_loop: MOVUPS -16(BX), X1 AESIMC X1, X0 MOVUPS X0, 16(DX) SUBQ $16, BX ADDQ $16, DX DECQ CX JNZ Lexp_dec_loop MOVUPS -16(BX), X0 MOVUPS X0, 16(DX) RET TEXT _expand_key_128<>(SB),NOSPLIT,$0 PSHUFD $0xff, X1, X1 SHUFPS $0x10, X0, X4 PXOR X4, X0 SHUFPS $0x8c, X0, X4 PXOR X4, X0 PXOR X1, X0 MOVUPS X0, (BX) ADDQ $16, BX RET TEXT _expand_key_192a<>(SB),NOSPLIT,$0 PSHUFD $0x55, X1, X1 SHUFPS $0x10, X0, X4 PXOR X4, X0 SHUFPS $0x8c, X0, X4 PXOR X4, X0 PXOR X1, X0 MOVAPS X2, X5 MOVAPS X2, X6 PSLLDQ $0x4, X5 PSHUFD $0xff, X0, X3 PXOR X3, X2 PXOR X5, X2 MOVAPS X0, X1 SHUFPS $0x44, X0, X6 MOVUPS X6, (BX) SHUFPS $0x4e, X2, X1 MOVUPS X1, 16(BX) ADDQ $32, BX RET TEXT _expand_key_192b<>(SB),NOSPLIT,$0 PSHUFD $0x55, X1, X1 SHUFPS $0x10, X0, X4 PXOR X4, X0 SHUFPS $0x8c, X0, X4 PXOR X4, X0 PXOR X1, X0 MOVAPS X2, X5 PSLLDQ $0x4, X5 PSHUFD $0xff, X0, X3 PXOR X3, X2 PXOR X5, X2 MOVUPS X0, (BX) ADDQ $16, BX RET TEXT _expand_key_256a<>(SB),NOSPLIT,$0 JMP _expand_key_128<>(SB) TEXT _expand_key_256b<>(SB),NOSPLIT,$0 PSHUFD $0xaa, X1, X1 SHUFPS $0x10, X2, X4 PXOR X4, X2 SHUFPS $0x8c, X2, X4 PXOR X4, X2 PXOR X1, X2 MOVUPS X2, (BX) ADDQ $16, BX RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/asm_arm64.s000066400000000000000000000156151365325520100270540ustar00rootroot00000000000000// Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build arm64, !noasm #include "textflag.h" DATA rotInvSRows<>+0x00(SB)/8, $0x080f0205040b0e01 DATA rotInvSRows<>+0x08(SB)/8, $0x00070a0d0c030609 GLOBL rotInvSRows<>(SB), (NOPTR+RODATA), $16 DATA invSRows<>+0x00(SB)/8, $0x0b0e0104070a0d00 DATA invSRows<>+0x08(SB)/8, $0x0306090c0f020508 GLOBL invSRows<>(SB), (NOPTR+RODATA), $16 // func encryptBlockAsm(nr int, xk *uint32, dst, src *byte) TEXT ·encryptBlockAsm(SB),NOSPLIT,$0 MOVD nr+0(FP), R9 MOVD xk+8(FP), R10 MOVD dst+16(FP), R11 MOVD src+24(FP), R12 VLD1 (R12), [V0.B16] CMP $12, R9 BLT enc128 BEQ enc196 enc256: VLD1.P 32(R10), [V1.B16, V2.B16] AESE V1.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V2.B16, V0.B16 AESMC V0.B16, V0.B16 enc196: VLD1.P 32(R10), [V3.B16, V4.B16] AESE V3.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V4.B16, V0.B16 AESMC V0.B16, V0.B16 enc128: VLD1.P 64(R10), [V5.B16, V6.B16, V7.B16, V8.B16] VLD1.P 64(R10), [V9.B16, V10.B16, V11.B16, V12.B16] VLD1.P 48(R10), [V13.B16, V14.B16, V15.B16] AESE V5.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V6.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V7.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V8.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V9.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V10.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V11.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V12.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V13.B16, V0.B16 AESMC V0.B16, V0.B16 AESE V14.B16, V0.B16 VEOR V0.B16, V15.B16, V0.B16 VST1 [V0.B16], (R11) RET // func decryptBlockAsm(nr int, xk *uint32, dst, src *byte) TEXT ·decryptBlockAsm(SB),NOSPLIT,$0 MOVD nr+0(FP), R9 MOVD xk+8(FP), R10 MOVD dst+16(FP), R11 MOVD src+24(FP), R12 VLD1 (R12), [V0.B16] CMP $12, R9 BLT dec128 BEQ dec196 dec256: VLD1.P 32(R10), [V1.B16, V2.B16] AESD V1.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V2.B16, V0.B16 AESIMC V0.B16, V0.B16 dec196: VLD1.P 32(R10), [V3.B16, V4.B16] AESD V3.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V4.B16, V0.B16 AESIMC V0.B16, V0.B16 dec128: VLD1.P 64(R10), [V5.B16, V6.B16, V7.B16, V8.B16] VLD1.P 64(R10), [V9.B16, V10.B16, V11.B16, V12.B16] VLD1.P 48(R10), [V13.B16, V14.B16, V15.B16] AESD V5.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V6.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V7.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V8.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V9.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V10.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V11.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V12.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V13.B16, V0.B16 AESIMC V0.B16, V0.B16 AESD V14.B16, V0.B16 VEOR V0.B16, V15.B16, V0.B16 VST1 [V0.B16], (R11) RET // func expandKeyAsm(nr int, key *byte, enc, dec *uint32) { // Note that round keys are stored in uint128 format, not uint32 TEXT ·expandKeyAsm(SB),NOSPLIT,$0 MOVD nr+0(FP), R8 MOVD key+8(FP), R9 MOVD enc+16(FP), R10 MOVD dec+24(FP), R11 LDP rotInvSRows<>(SB), (R0, R1) VMOV R0, V3.D[0] VMOV R1, V3.D[1] VEOR V0.B16, V0.B16, V0.B16 // All zeroes MOVW $1, R13 TBZ $1, R8, ks192 TBNZ $2, R8, ks256 LDPW (R9), (R4, R5) LDPW 8(R9), (R6, R7) STPW.P (R4, R5), 8(R10) STPW.P (R6, R7), 8(R10) MOVW $0x1b, R14 ks128Loop: VMOV R7, V2.S[0] WORD $0x4E030042 // TBL V3.B16, [V2.B16], V2.B16 AESE V0.B16, V2.B16 // Use AES to compute the SBOX EORW R13, R4 LSLW $1, R13 // Compute next Rcon ANDSW $0x100, R13, ZR CSELW NE, R14, R13, R13 // Fake modulo SUBS $1, R8 VMOV V2.S[0], R0 EORW R0, R4 EORW R4, R5 EORW R5, R6 EORW R6, R7 STPW.P (R4, R5), 8(R10) STPW.P (R6, R7), 8(R10) BNE ks128Loop CBZ R11, ksDone // If dec is nil we are done SUB $176, R10 // Decryption keys are encryption keys with InverseMixColumns applied VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] VMOV V0.B16, V7.B16 AESIMC V1.B16, V6.B16 AESIMC V2.B16, V5.B16 AESIMC V3.B16, V4.B16 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] AESIMC V0.B16, V11.B16 AESIMC V1.B16, V10.B16 AESIMC V2.B16, V9.B16 AESIMC V3.B16, V8.B16 VLD1 (R10), [V0.B16, V1.B16, V2.B16] AESIMC V0.B16, V14.B16 AESIMC V1.B16, V13.B16 VMOV V2.B16, V12.B16 VST1.P [V12.B16, V13.B16, V14.B16], 48(R11) VST1.P [V8.B16, V9.B16, V10.B16, V11.B16], 64(R11) VST1 [V4.B16, V5.B16, V6.B16, V7.B16], (R11) B ksDone ks192: LDPW (R9), (R2, R3) LDPW 8(R9), (R4, R5) LDPW 16(R9), (R6, R7) STPW.P (R2, R3), 8(R10) STPW.P (R4, R5), 8(R10) SUB $4, R8 ks192Loop: STPW.P (R6, R7), 8(R10) VMOV R7, V2.S[0] WORD $0x4E030042 //TBL V3.B16, [V2.B16], V2.B16 AESE V0.B16, V2.B16 EORW R13, R2 LSLW $1, R13 SUBS $1, R8 VMOV V2.S[0], R0 EORW R0, R2 EORW R2, R3 EORW R3, R4 EORW R4, R5 EORW R5, R6 EORW R6, R7 STPW.P (R2, R3), 8(R10) STPW.P (R4, R5), 8(R10) BNE ks192Loop CBZ R11, ksDone SUB $208, R10 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] VMOV V0.B16, V7.B16 AESIMC V1.B16, V6.B16 AESIMC V2.B16, V5.B16 AESIMC V3.B16, V4.B16 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] AESIMC V0.B16, V11.B16 AESIMC V1.B16, V10.B16 AESIMC V2.B16, V9.B16 AESIMC V3.B16, V8.B16 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] AESIMC V0.B16, V15.B16 AESIMC V1.B16, V14.B16 AESIMC V2.B16, V13.B16 AESIMC V3.B16, V12.B16 VLD1 (R10), [V0.B16] VST1.P [V0.B16], 16(R11) VST1.P [V12.B16, V13.B16, V14.B16, V15.B16], 64(R11) VST1.P [V8.B16, V9.B16, V10.B16, V11.B16], 64(R11) VST1 [V4.B16, V5.B16, V6.B16, V7.B16], (R11) B ksDone ks256: LDP invSRows<>(SB), (R0, R1) VMOV R0, V4.D[0] VMOV R1, V4.D[1] LDPW (R9), (R0, R1) LDPW 8(R9), (R2, R3) LDPW 16(R9), (R4, R5) LDPW 24(R9), (R6, R7) STPW.P (R0, R1), 8(R10) STPW.P (R2, R3), 8(R10) SUB $7, R8 ks256Loop: STPW.P (R4, R5), 8(R10) STPW.P (R6, R7), 8(R10) VMOV R7, V2.S[0] WORD $0x4E030042 //TBL V3.B16, [V2.B16], V2.B16 AESE V0.B16, V2.B16 EORW R13, R0 LSLW $1, R13 SUBS $1, R8 VMOV V2.S[0], R9 EORW R9, R0 EORW R0, R1 EORW R1, R2 EORW R2, R3 VMOV R3, V2.S[0] WORD $0x4E040042 //TBL V3.B16, [V2.B16], V2.B16 AESE V0.B16, V2.B16 VMOV V2.S[0], R9 EORW R9, R4 EORW R4, R5 EORW R5, R6 EORW R6, R7 STPW.P (R0, R1), 8(R10) STPW.P (R2, R3), 8(R10) BNE ks256Loop CBZ R11, ksDone SUB $240, R10 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] VMOV V0.B16, V7.B16 AESIMC V1.B16, V6.B16 AESIMC V2.B16, V5.B16 AESIMC V3.B16, V4.B16 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] AESIMC V0.B16, V11.B16 AESIMC V1.B16, V10.B16 AESIMC V2.B16, V9.B16 AESIMC V3.B16, V8.B16 VLD1.P 64(R10), [V0.B16, V1.B16, V2.B16, V3.B16] AESIMC V0.B16, V15.B16 AESIMC V1.B16, V14.B16 AESIMC V2.B16, V13.B16 AESIMC V3.B16, V12.B16 VLD1 (R10), [V0.B16, V1.B16, V2.B16] AESIMC V0.B16, V18.B16 AESIMC V1.B16, V17.B16 VMOV V2.B16, V16.B16 VST1.P [V16.B16, V17.B16, V18.B16], 48(R11) VST1.P [V12.B16, V13.B16, V14.B16, V15.B16], 64(R11) VST1.P [V8.B16, V9.B16, V10.B16, V11.B16], 64(R11) VST1 [V4.B16, V5.B16, V6.B16, V7.B16], (R11) ksDone: RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/cipher.go000066400000000000000000000035701365325520100266750ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package aes import ( "strconv" ) // The AES block size in bytes. const BlockSize = 16 // A cipher is an instance of AES encryption using a particular key. type AES struct { enc [32 + 28]uint32 dec [32 + 28]uint32 keyLen int } // AES interface type IAES interface { SetKey(key []byte) error Encrypt(dst, src []byte) Decrypt(dst, src []byte) } type KeySizeError int func (k KeySizeError) Error() string { return "crypto/aes: invalid key size " + strconv.Itoa(int(k)) } func NewCipher() *AES { return new(AES) } // NewCipher creates and returns a new cipher.Block. // The key argument should be the AES key, // either 16, 24, or 32 bytes to select // AES-128, AES-192, or AES-256. func (c *AES) SetKey(key []byte) error { k := len(key) switch k { default: return KeySizeError(k) case 16, 24, 32: break } for i, _ := range c.enc { c.enc[i] = 0 } for i, _ := range c.dec { c.dec[i] = 0 } c.keyLen = k expandKeyGo(key, c.enc[:c.keyLen+28], c.dec[:c.keyLen+28]) return nil } func (c *AES) BlockSize() int { return BlockSize } func (c *AES) Encrypt(dst, src []byte) { if len(src) < BlockSize { panic("crypto/aes: input not full block") } if len(dst) < BlockSize { panic("crypto/aes: output not full block") } if InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("crypto/aes: invalid buffer overlap") } encryptBlockGo(c.enc[:c.keyLen+28], dst, src) } func (c *AES) Decrypt(dst, src []byte) { if len(src) < BlockSize { panic("crypto/aes: input not full block") } if len(dst) < BlockSize { panic("crypto/aes: output not full block") } if InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("crypto/aes: invalid buffer overlap") } decryptBlockGo(c.dec[:c.keyLen+28], dst, src) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/cipher_asm.go000066400000000000000000000037351365325520100275400ustar00rootroot00000000000000// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64, !noasm package aes import ( "github.com/henrydcase/nobs/utils" ) // defined in asm_*.s //go:noescape func encryptBlockAsm(nr int, xk *uint32, dst, src *byte) //go:noescape func decryptBlockAsm(nr int, xk *uint32, dst, src *byte) //go:noescape func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32) type AESAsm struct { enc [32 + 28]uint32 dec [32 + 28]uint32 } func (c *AESAsm) SetKey(key []byte) error { var rounds int switch len(key) { case 128 / 8: rounds = 10 case 192 / 8: rounds = 12 case 256 / 8: rounds = 14 } expandKeyAsm(rounds, &key[0], &c.enc[0], &c.dec[0]) return nil } func (c *AESAsm) BlockSize() int { return BlockSize } func (c *AESAsm) Encrypt(dst, src []byte) { if len(src) < BlockSize { panic("crypto/aes: input not full block") } if len(dst) < BlockSize { panic("crypto/aes: output not full block") } if InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("crypto/aes: invalid buffer overlap") } encryptBlockAsm(len(c.enc)/4-1, &c.enc[0], &dst[0], &src[0]) } func (c *AESAsm) Decrypt(dst, src []byte) { if len(src) < BlockSize { panic("crypto/aes: input not full block") } if len(dst) < BlockSize { panic("crypto/aes: output not full block") } if InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("crypto/aes: invalid buffer overlap") } decryptBlockAsm(len(c.dec)/4-1, &c.dec[0], &dst[0], &src[0]) } // expandKey is used by BenchmarkExpand to ensure that the asm implementation // of key expansion is used for the benchmark when it is available. func expandKey(key []byte, enc, dec []uint32) { if utils.X86.HasAES { rounds := 10 // rounds needed for AES128 switch len(key) { case 192 / 8: rounds = 12 case 256 / 8: rounds = 14 } expandKeyAsm(rounds, &key[0], &enc[0], &dec[0]) } else { expandKeyGo(key, enc, dec) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/const.go000066400000000000000000000725101365325520100265510ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package aes implements AES encryption (formerly Rijndael), as defined in // U.S. Federal Information Processing Standards Publication 197. // // The AES operations in this package are not implemented using constant-time algorithms. // An exception is when running on systems with enabled hardware support for AES // that makes these operations constant-time. Examples include amd64 systems using AES-NI // extensions and s390x systems using Message-Security-Assist extensions. // On such systems, when the result of NewCipher is passed to cipher.NewGCM, // the GHASH operation used by GCM is also constant-time. package aes // This file contains AES constants - 8720 bytes of initialized data. // https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf // AES is based on the mathematical behavior of binary polynomials // (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x³ + x + 1. // Addition of these binary polynomials corresponds to binary xor. // Reducing mod poly corresponds to binary xor with poly every // time a 0x100 bit appears. const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x³ + x + 1 // Powers of x mod poly in GF(2). var powx = [16]byte{ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, } // FIPS-197 Figure 7. S-box substitution values in hexadecimal format. var sbox0 = [256]byte{ 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, } // FIPS-197 Figure 14. Inverse S-box substitution values in hexadecimal format. var sbox1 = [256]byte{ 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, } // Lookup tables for encryption. // These can be recomputed by adapting the tests in aes_test.go. var te0 = [256]uint32{ 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, } var te1 = [256]uint32{ 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, } var te2 = [256]uint32{ 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, } var te3 = [256]uint32{ 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, } // Lookup tables for decryption. // These can be recomputed by adapting the tests in aes_test.go. var td0 = [256]uint32{ 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, } var td1 = [256]uint32{ 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, } var td2 = [256]uint32{ 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, } var td3 = [256]uint32{ 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, } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/generic.go000066400000000000000000000150051365325520100270330ustar00rootroot00000000000000// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This Go implementation is derived in part from the reference // ANSI C implementation, which carries the following notice: // // rijndael-alg-fst.c // // @version 3.0 (December 2000) // // Optimised ANSI C code for the Rijndael cipher (now AES) // // @author Vincent Rijmen // @author Antoon Bosselaers // @author Paulo Barreto // // This code is hereby placed in the public domain. // // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR // BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // See FIPS 197 for specification, and see Daemen and Rijmen's Rijndael submission // for implementation details. // https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf // https://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf package aes import ( "encoding/binary" ) // Encrypt one block from src into dst, using the expanded key xk. func encryptBlockGo(xk []uint32, dst, src []byte) { _ = src[15] // early bounds check s0 := binary.BigEndian.Uint32(src[0:4]) s1 := binary.BigEndian.Uint32(src[4:8]) s2 := binary.BigEndian.Uint32(src[8:12]) s3 := binary.BigEndian.Uint32(src[12:16]) // First round just XORs input with key. s0 ^= xk[0] s1 ^= xk[1] s2 ^= xk[2] s3 ^= xk[3] // Middle rounds shuffle using tables. // Number of rounds is set by length of expanded key. nr := len(xk)/4 - 2 // - 2: one above, one more below k := 4 var t0, t1, t2, t3 uint32 for r := 0; r < nr; r++ { t0 = xk[k+0] ^ te0[uint8(s0>>24)] ^ te1[uint8(s1>>16)] ^ te2[uint8(s2>>8)] ^ te3[uint8(s3)] t1 = xk[k+1] ^ te0[uint8(s1>>24)] ^ te1[uint8(s2>>16)] ^ te2[uint8(s3>>8)] ^ te3[uint8(s0)] t2 = xk[k+2] ^ te0[uint8(s2>>24)] ^ te1[uint8(s3>>16)] ^ te2[uint8(s0>>8)] ^ te3[uint8(s1)] t3 = xk[k+3] ^ te0[uint8(s3>>24)] ^ te1[uint8(s0>>16)] ^ te2[uint8(s1>>8)] ^ te3[uint8(s2)] k += 4 s0, s1, s2, s3 = t0, t1, t2, t3 } // Last round uses s-box directly and XORs to produce output. s0 = uint32(sbox0[t0>>24])<<24 | uint32(sbox0[t1>>16&0xff])<<16 | uint32(sbox0[t2>>8&0xff])<<8 | uint32(sbox0[t3&0xff]) s1 = uint32(sbox0[t1>>24])<<24 | uint32(sbox0[t2>>16&0xff])<<16 | uint32(sbox0[t3>>8&0xff])<<8 | uint32(sbox0[t0&0xff]) s2 = uint32(sbox0[t2>>24])<<24 | uint32(sbox0[t3>>16&0xff])<<16 | uint32(sbox0[t0>>8&0xff])<<8 | uint32(sbox0[t1&0xff]) s3 = uint32(sbox0[t3>>24])<<24 | uint32(sbox0[t0>>16&0xff])<<16 | uint32(sbox0[t1>>8&0xff])<<8 | uint32(sbox0[t2&0xff]) s0 ^= xk[k+0] s1 ^= xk[k+1] s2 ^= xk[k+2] s3 ^= xk[k+3] _ = dst[15] // early bounds check binary.BigEndian.PutUint32(dst[0:4], s0) binary.BigEndian.PutUint32(dst[4:8], s1) binary.BigEndian.PutUint32(dst[8:12], s2) binary.BigEndian.PutUint32(dst[12:16], s3) } // Decrypt one block from src into dst, using the expanded key xk. func decryptBlockGo(xk []uint32, dst, src []byte) { _ = src[15] // early bounds check s0 := binary.BigEndian.Uint32(src[0:4]) s1 := binary.BigEndian.Uint32(src[4:8]) s2 := binary.BigEndian.Uint32(src[8:12]) s3 := binary.BigEndian.Uint32(src[12:16]) // First round just XORs input with key. s0 ^= xk[0] s1 ^= xk[1] s2 ^= xk[2] s3 ^= xk[3] // Middle rounds shuffle using tables. // Number of rounds is set by length of expanded key. nr := len(xk)/4 - 2 // - 2: one above, one more below k := 4 var t0, t1, t2, t3 uint32 for r := 0; r < nr; r++ { t0 = xk[k+0] ^ td0[uint8(s0>>24)] ^ td1[uint8(s3>>16)] ^ td2[uint8(s2>>8)] ^ td3[uint8(s1)] t1 = xk[k+1] ^ td0[uint8(s1>>24)] ^ td1[uint8(s0>>16)] ^ td2[uint8(s3>>8)] ^ td3[uint8(s2)] t2 = xk[k+2] ^ td0[uint8(s2>>24)] ^ td1[uint8(s1>>16)] ^ td2[uint8(s0>>8)] ^ td3[uint8(s3)] t3 = xk[k+3] ^ td0[uint8(s3>>24)] ^ td1[uint8(s2>>16)] ^ td2[uint8(s1>>8)] ^ td3[uint8(s0)] k += 4 s0, s1, s2, s3 = t0, t1, t2, t3 } // Last round uses s-box directly and XORs to produce output. s0 = uint32(sbox1[t0>>24])<<24 | uint32(sbox1[t3>>16&0xff])<<16 | uint32(sbox1[t2>>8&0xff])<<8 | uint32(sbox1[t1&0xff]) s1 = uint32(sbox1[t1>>24])<<24 | uint32(sbox1[t0>>16&0xff])<<16 | uint32(sbox1[t3>>8&0xff])<<8 | uint32(sbox1[t2&0xff]) s2 = uint32(sbox1[t2>>24])<<24 | uint32(sbox1[t1>>16&0xff])<<16 | uint32(sbox1[t0>>8&0xff])<<8 | uint32(sbox1[t3&0xff]) s3 = uint32(sbox1[t3>>24])<<24 | uint32(sbox1[t2>>16&0xff])<<16 | uint32(sbox1[t1>>8&0xff])<<8 | uint32(sbox1[t0&0xff]) s0 ^= xk[k+0] s1 ^= xk[k+1] s2 ^= xk[k+2] s3 ^= xk[k+3] _ = dst[15] // early bounds check binary.BigEndian.PutUint32(dst[0:4], s0) binary.BigEndian.PutUint32(dst[4:8], s1) binary.BigEndian.PutUint32(dst[8:12], s2) binary.BigEndian.PutUint32(dst[12:16], s3) } // Apply sbox0 to each byte in w. func subw(w uint32) uint32 { return uint32(sbox0[w>>24])<<24 | uint32(sbox0[w>>16&0xff])<<16 | uint32(sbox0[w>>8&0xff])<<8 | uint32(sbox0[w&0xff]) } // Rotate func rotw(w uint32) uint32 { return w<<8 | w>>24 } // Key expansion algorithm. See FIPS-197, Figure 11. // Their rcon[i] is our powx[i-1] << 24. func expandKeyGo(key []byte, enc, dec []uint32) { // Encryption key setup. var i int nk := len(key) / 4 for i = 0; i < nk; i++ { enc[i] = binary.BigEndian.Uint32(key[4*i:]) } for ; i < len(enc); i++ { t := enc[i-1] if i%nk == 0 { t = subw(rotw(t)) ^ (uint32(powx[i/nk-1]) << 24) } else if nk > 6 && i%nk == 4 { t = subw(t) } enc[i] = enc[i-nk] ^ t } // Derive decryption key from encryption key. // Reverse the 4-word round key sets from enc to produce dec. // All sets but the first and last get the MixColumn transform applied. if dec == nil { return } n := len(enc) for i := 0; i < n; i += 4 { ei := n - i - 4 for j := 0; j < 4; j++ { x := enc[ei+j] if i > 0 && i+4 < n { x = td0[sbox0[x>>24]] ^ td1[sbox0[x>>16&0xff]] ^ td2[sbox0[x>>8&0xff]] ^ td3[sbox0[x&0xff]] } dec[i+j] = x } } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/drbg/internal/aes/tools.go000066400000000000000000000023721365325520100265620ustar00rootroot00000000000000// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !appengine // Package subtle implements functions that are often useful in cryptographic // code but require careful thought to use correctly. // // This is a mirror of golang.org/x/crypto/internal/subtle. package aes import "unsafe" // AnyOverlap reports whether x and y share memory at any (not necessarily // corresponding) index. The memory beyond the slice length is ignored. func AnyOverlap(x, y []byte) bool { return len(x) > 0 && len(y) > 0 && uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) } // InexactOverlap reports whether x and y share memory at any non-corresponding // index. The memory beyond the slice length is ignored. Note that x and y can // have different lengths and still not have any inexact overlap. // // InexactOverlap can be used to implement the requirements of the crypto/cipher // AEAD, Block, BlockMode and Stream interfaces. func InexactOverlap(x, y []byte) bool { if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { return false } return AnyOverlap(x, y) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/000077500000000000000000000000001365325520100223405ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/PQCkemKAT_434.rsp000066400000000000000000007736421365325520100251630ustar00rootroot00000000000000# SIKEp503 count = 0 seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 pk = 0999A0BB085F85FDA70D04B8FCAE5A30989947F1E32E4BC4675C834CA22CBA08AE692935EC1C8AF2B5BF377EC17E79D09D57DB5828C6F6E1C1A64D0F30AF3D2F76D9D329108E01D027D856EC44B23A437872D538F2C26E48723E2F8E46A2E7A364C92D997C7B801ADA199EEFFBAB1161B29EC7CB4440DA0E75407F4CE02E37BDFB23154C513BD30CFA5F04D2E253357CBDEBCF6F539965C8B8B5F350A50526AD1B350A0220394AA33B18EB3E765F059FA7CB5585A9D18C8B198A07DA0E9CCEC61D6F43A4661CA6D8175C23A8C86DD30409607D6EBFA3639CDFD12599F9BB073AAEA9A1CC95FF0D50839049EDFAE95FD10DD4F27EC3C6921FA96DCB0366D9C086A8E8ED15390C4827E5672D167EE238229B188C0590E1FA38E8A74D34B6D17ECA1A64EA76AD65413F147DC43A762D69D072DADF573C13A7C983F9362D59DC6E37704BA0F15637CF6BEDBBD8C1051366FE4C21E03CC55964C0E24F6F8D738DC763B7E443122C63751F6D8130EADA4203A9671865F8D459035EAC2E sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148038626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB0F0999A0BB085F85FDA70D04B8FCAE5A30989947F1E32E4BC4675C834CA22CBA08AE692935EC1C8AF2B5BF377EC17E79D09D57DB5828C6F6E1C1A64D0F30AF3D2F76D9D329108E01D027D856EC44B23A437872D538F2C26E48723E2F8E46A2E7A364C92D997C7B801ADA199EEFFBAB1161B29EC7CB4440DA0E75407F4CE02E37BDFB23154C513BD30CFA5F04D2E253357CBDEBCF6F539965C8B8B5F350A50526AD1B350A0220394AA33B18EB3E765F059FA7CB5585A9D18C8B198A07DA0E9CCEC61D6F43A4661CA6D8175C23A8C86DD30409607D6EBFA3639CDFD12599F9BB073AAEA9A1CC95FF0D50839049EDFAE95FD10DD4F27EC3C6921FA96DCB0366D9C086A8E8ED15390C4827E5672D167EE238229B188C0590E1FA38E8A74D34B6D17ECA1A64EA76AD65413F147DC43A762D69D072DADF573C13A7C983F9362D59DC6E37704BA0F15637CF6BEDBBD8C1051366FE4C21E03CC55964C0E24F6F8D738DC763B7E443122C63751F6D8130EADA4203A9671865F8D459035EAC2E ct = 89611D5DB90BAA5BCC1F076B0B1FA275D8EAB09FD4EBD8B5D05D0864F95815CEF9F7952612968A459FA5C5F3791534916EC4F77C44CC59ED0EF96E44D45020B381FFD4F974AF89D41017C95B04E852174307B629D8479737BF3B5A597FD7689B00D2078D0D4D45166C49ECE65FB84D00EFF1E0A70D5727306865EBC8FF25C6F718BD4EFCE230A9317A01ABB35DBD00004146B9C9EA33FF4C43F541E0AFC23A7409F769AA8B25FF0AA6A3E41A7C7ADBD02043DAE72B794F1EBF123DAE1E06782D9F1287EE5D88813BE64BFD0B67D751AA6AAA6FC3B27D3F7FD9766D9B9AA5EF3CD4061898F37D916CD9378931EBF0234F00932200F2489ABD35944328D09178104970E9BBE25FA81ACA265DACF045A81897246A347B6CCCF70CB65E375A6F629D847A48AF98DE8165C3AFA882B5143CF2F453B5A39A5329E091542EE40B5D16367808F536EC39761B37D635943D312FF1DCDAF2254FA45D549DADBF5A999CBF1D9985908AA3D740DC59138EE19ABA882B3D4758B72C0DB81D681AAE44096514DBFF5E9512687025808CA10F45D395DF515FB0 ss = 4346C330BBB2526CECFCC8238FA86913 count = 1 seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F pk = AD4291FE871F32E213A04D25DB79BE6B3BCEF20277FB47F397549250571F95B7773E3F84823D84C8E7699666D8B8D6C962E0A4B0E501DCBB4F57DEE9AECA016A701E0361EA273464DE6FA0880F61C0D12014D27A0C175FF5ABF7E68FA8BBAFF46D2B3EF3674CA1BDA4973EC7F3627471A021EF4A5BB642FCC19D583C133BE1C66B36F46C61DCB53A0914A9AABABAECFCC5886AC2DBC44C7F15A3C6F584C8CB017D692854EA4006F8ADEA0DDD48EB69CD3F3373AE9F30155F2D852250210F7A53F4C010056EDB905BB82C39E4C9E56B2FE1187F89774F284D0696914B0341EABF43010AAF508D216064F965C7E2ACA80B82762D8F95F3672227CED31692FCB67952B85B3587F73DA0FE1D1C8D22A2446ED63711FB0C0ABFBBBF0253ECE1A6757AA10183479448E0A27892A1C5AEFE3EAE5DC55E79A514D73BAB8B19F74E607F30303A14C838BFE8D1CEAC1F48F76AF8DA5E9C3FFE67A4EA33FECF61FE8B26C7642AD02CB522BB5EA9E9F1935E7EA590D52220EDA948AE7EE03604 sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F17003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF602AD4291FE871F32E213A04D25DB79BE6B3BCEF20277FB47F397549250571F95B7773E3F84823D84C8E7699666D8B8D6C962E0A4B0E501DCBB4F57DEE9AECA016A701E0361EA273464DE6FA0880F61C0D12014D27A0C175FF5ABF7E68FA8BBAFF46D2B3EF3674CA1BDA4973EC7F3627471A021EF4A5BB642FCC19D583C133BE1C66B36F46C61DCB53A0914A9AABABAECFCC5886AC2DBC44C7F15A3C6F584C8CB017D692854EA4006F8ADEA0DDD48EB69CD3F3373AE9F30155F2D852250210F7A53F4C010056EDB905BB82C39E4C9E56B2FE1187F89774F284D0696914B0341EABF43010AAF508D216064F965C7E2ACA80B82762D8F95F3672227CED31692FCB67952B85B3587F73DA0FE1D1C8D22A2446ED63711FB0C0ABFBBBF0253ECE1A6757AA10183479448E0A27892A1C5AEFE3EAE5DC55E79A514D73BAB8B19F74E607F30303A14C838BFE8D1CEAC1F48F76AF8DA5E9C3FFE67A4EA33FECF61FE8B26C7642AD02CB522BB5EA9E9F1935E7EA590D52220EDA948AE7EE03604 ct = 0BA524F9F01CAA22CBFBFE744AEA8D2C0CD534291424B613077422D25435024577ACDF49356B43BA0475428354E3E294070D57AEE29DE81380600456B39F0E0DC959372C94B883A5D20C5EB879B54D825CEA693AFCADB8DEEED43A51B5FFF177D81D50B13F5357837FA8B349177E0B14FEC790989E2F6820C9054914F51C9B4BC773A527246FA13778E28A41A9FABDA71C3C2A9C0BFCA7393A4F271F531CCFD3A40F86273094D1EACA7541C037D6EE62D7D370D4670731F845EDA1E920263EA9E0F574566048270DCB9AB07D7B3E565619AC2BEA499CDF52771C09AF3B61B02781D13A28966DCB117733C31A4CA361A9AD5526F892C47F03BDEE462103DD14B8CB18232F174C028AED04306650299F66A929ADBB1EE7FC22D03FD2BAF88911EFF4B74C3762724E9E5A33DBE27EAEA743540EB75E9C7625FA519C12B67C1E88254E4796801104ADF702B4D2BB9D2BE7D268759630CEE00FD50A1A0B43696B1F96708028C06AFC2C3B4FBEBA40B4E9496B4A9D333A6A100362CE0EDB5C07F12FE29A22D1A86012DE9DE39F394C5ABE32444E7B ss = B5DB5992AD277FE747BEFB677040FFC0 count = 2 seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 pk = 8E1924039A1BD47E21BC95C9246B5C8F3356DBD251DEC594A4BEBA5F7B1A2AD95A9FC3217E70759B65CC8F4A643A0ADC36E1C0A29FBFD7A9D7496DDA697435BC5EA3B6E72500B54D7571253F57EFA19BA3EBF5D6C0F6B042CE15B8539F7CFAE79404AFE5DB9674DC7428928DA8855E4CDB348E847FDBD1907D3626FD7F30AE8F6C24A58E8B50CB6B6A25E558A9F78CEEE69430FB0FFFA805FCC80B1B011AED52F99E63FAC6C56792BF6C19433250BA25B6C15D5E9B2DAEAE9DF9473117FA8EBB626BF75DDFEE7DB8ADE1FDF18076E4C17FA1261452608C288379F728F3299B29CAE383B7418501E77F6CB73D0B96E70E44006B143B1687D1109CB023BD66ECF6EE8DC9A8BADF8F181475BBC2B4F4B4E4C965CBB8590EEE3AF26A6A0F10070D983BB5E3CB59C0C13917DBFE58269030116A1A321EF2C1894D17822D2E91814D4E5A6A3B90FA015014A6F59EB95962E40FFDB26A4B3C5B70897D803DB398319AE7F956231C5890D7434C1CD06A95A6E13BC4DAF6AA1E4F69ABC317 sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219A0E8E1924039A1BD47E21BC95C9246B5C8F3356DBD251DEC594A4BEBA5F7B1A2AD95A9FC3217E70759B65CC8F4A643A0ADC36E1C0A29FBFD7A9D7496DDA697435BC5EA3B6E72500B54D7571253F57EFA19BA3EBF5D6C0F6B042CE15B8539F7CFAE79404AFE5DB9674DC7428928DA8855E4CDB348E847FDBD1907D3626FD7F30AE8F6C24A58E8B50CB6B6A25E558A9F78CEEE69430FB0FFFA805FCC80B1B011AED52F99E63FAC6C56792BF6C19433250BA25B6C15D5E9B2DAEAE9DF9473117FA8EBB626BF75DDFEE7DB8ADE1FDF18076E4C17FA1261452608C288379F728F3299B29CAE383B7418501E77F6CB73D0B96E70E44006B143B1687D1109CB023BD66ECF6EE8DC9A8BADF8F181475BBC2B4F4B4E4C965CBB8590EEE3AF26A6A0F10070D983BB5E3CB59C0C13917DBFE58269030116A1A321EF2C1894D17822D2E91814D4E5A6A3B90FA015014A6F59EB95962E40FFDB26A4B3C5B70897D803DB398319AE7F956231C5890D7434C1CD06A95A6E13BC4DAF6AA1E4F69ABC317 ct = BBC0929CAFF99A0403167129E6735AE969CB2CA5AA30A992776FF0770BDFAB12A55983787B52D11FDDD53DFA607CF9B9C98AD0736E287967F8AF4099E06E2B4AE32885CF5A40C1DE310073F35C2FDE947484DB9F68A58E6100DB0F5E3CAEFADA961474061E1DF707464E1F746CE440C9F4E6FBEDD68A0E8111EFB3B1C83A9809136BE9AD5C743BC2141BD6F5CE434F0A88D30F3F5EF7BC599CE5E26DBF0992B57125BF4C9D76ECEA3F85A11B1E4E2234B69F64DEF6D3F243CAFE95B9061D6A9F45FBBD7603D028E49662F2DD201A37772ABB83AD12C9A724AB9C27B18017639CF8D3617B190073D10E5C0382611956422680EAD702A57B5A97A8E209F14973B98A5052381D78D33B1DA16A298F1E29EE07DD94484A54BB5DC685F7FA6B34892D065C88275DAB9FF377B9FE4CE8EE2A0700501E5CFB58887662A72651952D1A99379BCF8A94A2EDC96B78A8DD33CBBD056AD2A945002E3AC10576614D9035D1782DBDE8176FA274CFDB1A39CA4C44500602F9F1D725B13C366B1AB92EF7B33DBDF38552E70803C8C206E2DDD425BB555028B4 ss = 117914C6EE09FAC850DB582DEABA6546 count = 3 seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A pk = 0D775DDDAEEB4CBB584FC98FB49F2FF025F6F5E1BACC1D796F39826A61E0B298AE063409423A05755A03094FD1A82657DBC66B2CFB4FBE6ACB2F82AEBC353AC62322B564FD51822D15457F5BBA29942E1D531F5FBD3076AD30A77EBAF3DDCC6146808DB3A441D19DBC09B6C9DF345B8651B9803166F62643574B34D3E437B2E6C905DE1DA557C29F1EDFD843A2F0792D82CAFA07AC6192246847432D6E1DAA196B7AD23369EE60912908D76CFA685B803FD5FE239BC8BD611F76D7AB31F592A1B7DD6C8B10239A6339240CD1A262C92FF15DEDA3C57CBF2FCDE978E0A566A4A7E356ADC1EFC8036076665BDD8F9759B8E773AACA945C63598321C530525D91AC77AE287444FD95D72899326F74EF843372C1116226A4E06D345C41C4070C3EEA2ABDB96858076C761DAF8302FEA069761CF6954D380EDEE5AFEF17F019353085A32873FAE1C1098872E83ECF47AE6AFD1613E506BD80C2E9133619A0B9C78825CB2349C6002E4260008CF917A8D8265A44ECBA57443708ECD937 sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B06DE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF000D775DDDAEEB4CBB584FC98FB49F2FF025F6F5E1BACC1D796F39826A61E0B298AE063409423A05755A03094FD1A82657DBC66B2CFB4FBE6ACB2F82AEBC353AC62322B564FD51822D15457F5BBA29942E1D531F5FBD3076AD30A77EBAF3DDCC6146808DB3A441D19DBC09B6C9DF345B8651B9803166F62643574B34D3E437B2E6C905DE1DA557C29F1EDFD843A2F0792D82CAFA07AC6192246847432D6E1DAA196B7AD23369EE60912908D76CFA685B803FD5FE239BC8BD611F76D7AB31F592A1B7DD6C8B10239A6339240CD1A262C92FF15DEDA3C57CBF2FCDE978E0A566A4A7E356ADC1EFC8036076665BDD8F9759B8E773AACA945C63598321C530525D91AC77AE287444FD95D72899326F74EF843372C1116226A4E06D345C41C4070C3EEA2ABDB96858076C761DAF8302FEA069761CF6954D380EDEE5AFEF17F019353085A32873FAE1C1098872E83ECF47AE6AFD1613E506BD80C2E9133619A0B9C78825CB2349C6002E4260008CF917A8D8265A44ECBA57443708ECD937 ct = 1823E1425DC55E1B55078BE45A2E37E3AE4656889A0BCD74F5B8596117B705AFD7F4FA945DE51E68B2C07431C6C669CABB7712D65116F7F2A4435FBFC78525EBD02CE72F590B9347DF08BFE7F59B741FB352124C7A058786D38767237E0EF23F7E60FCC05846AC8CDC692BBA5899441095DB899621806DD035870F09B60815AD492BF0A9E13E0D65066285E298F567A19D54734C95F325591C321B508ACCC4370BEAE4ACC6571EAA63600170B39C71DF297AF880F508F7849FA2B60B3F23A667D707F5C22886D0159575EC15A187D1298F3A9ADC10F20978E76135D4385AB8876B7E4CE54D15D20245B62940175629C88AC888F87143FB8B01916B2DADC26D341D1FFB37EF9B6D2DD203CC8B84629512E270189C9788A900D2821538A38C9860746FCF2506BA4D9EFDCEF2ACA52814811D24D93E390CBDDFF32F01B171EDFE33FE1AE17627EBE3F8EFFE9E47598A261474E66BF1F117BD545DF8B8D5FF2CF121E866109AA8A46306FAAAFFD9EC7C280AA99B05366BD36F22CA340E267CDEF68066DDCC8EA9D1F75C528D6F40F08030D9C8A6 ss = 05285E8F9F81C749D7EB42CE41507CC6 count = 4 seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 pk = 474E2B7B828B4169F32429274C864FBA82675AD37A5502D3A5D7009EF2D98EFD6193A5F0A3CE9F244061776E92A258ACD80E0606A6568E7F1435CBF70E4015B0AE3322705122E0D6F889F408A26C97B400E3135803DC00A0ADAEA36B751A2DB7043409DD1CA49568C9D324D1FB02280D179149F77A21C057933C6C44C733834619DA448A1ADA5D5DACE97FA5DE742B1600EA04360224BDED07E02E084DC1AE9FE1574F46604DEBD9773D5FE85EC25A72E700932FDBA0C41EB3CACECB07AA221D497894F93570B65EAA58CFE62586F1155D189A354FFC9D191F64E0054365B1FAAD6B4F8024E3C7CCD3A673D4FAF69D062FA184C4D1F315CE9FE4E22D7F393C6E36C4A4C9829ABA6BEF38BE6142E1D705A37372526E1EFC5979E25CBA54CC36687D51431391003E784856819748D176AD0EBDA5AFA3B6BCD7881E374BC822D59AA603F77563DA71F77BDC648F5BEBC0B708863D293A9A1DD03541E84F863C86497CFE57C19FF05758C14DD1514C4DCD96718CEC60AA4E0CC6941D sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813804474E2B7B828B4169F32429274C864FBA82675AD37A5502D3A5D7009EF2D98EFD6193A5F0A3CE9F244061776E92A258ACD80E0606A6568E7F1435CBF70E4015B0AE3322705122E0D6F889F408A26C97B400E3135803DC00A0ADAEA36B751A2DB7043409DD1CA49568C9D324D1FB02280D179149F77A21C057933C6C44C733834619DA448A1ADA5D5DACE97FA5DE742B1600EA04360224BDED07E02E084DC1AE9FE1574F46604DEBD9773D5FE85EC25A72E700932FDBA0C41EB3CACECB07AA221D497894F93570B65EAA58CFE62586F1155D189A354FFC9D191F64E0054365B1FAAD6B4F8024E3C7CCD3A673D4FAF69D062FA184C4D1F315CE9FE4E22D7F393C6E36C4A4C9829ABA6BEF38BE6142E1D705A37372526E1EFC5979E25CBA54CC36687D51431391003E784856819748D176AD0EBDA5AFA3B6BCD7881E374BC822D59AA603F77563DA71F77BDC648F5BEBC0B708863D293A9A1DD03541E84F863C86497CFE57C19FF05758C14DD1514C4DCD96718CEC60AA4E0CC6941D ct = 4013B299AEA7681CEE91D42743D3DF7AB243DBC85EBF412BD0E89030BA5F5A8EEFA497D34725B8CDFB7DB19ADEF33DE1C20A75EAD433A325E250512E8D281EBD14C46FA4C1A9388C1CAB40FAF99022B9CAB070979DDCD55D70E0BC6672ECD76FE1DBAD198632C5187561A4E21A9AC58CE53145C062926BBDB2FA73F80B22175F2C2C18FD905FAB414EB5D3801C202CFCF17E61486E6FE23F2587576E9395EF2EF02B6F495A845A8941D16D5E9D5F76D06D5CE13D3D9A953040EDFE200B309B9B7C4DE0171A1C02D7FCD68C5B350A592C8A781866F47B17B584C07030A5CF7B6F0EAEE34C0EBD962154CD625E1E2832CD4479619E6FD338A44B73D90DDF1C468255404EB2DA87E8B55868E1296E1077AE8F894A18A105393B1D38803F697E78870173C9B38BFEDC7A9A2E6E231C066E11200BA558BD8FA1A4A2CA0FFA5FBB8C709F6CE6354570BE9E819E75857CD10ECCB3D7390F504212320B1F0ED2DEBC11CBAE1878273927E51D2B22B8C9D39E4C8714DD6EFC02CB42D2F3330B76D8EE6471524A7C89A436D5200430F89C4CD552CABDAA ss = 869B23C6147548D2B34B169E3C94A460 count = 5 seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA pk = B2D12F4C65DA60F9F0ED6436A28DF7A635894D7E8B2A523C95A04953AD860D6B5E046F8FA0A77357D05F16F4289BF2F27B23D6E66DC1E8B3BBCEA68AD11E362D4FD6A6861B3F94560EF7B7FE6764689746976D206B52ADD67C1813807699606A442FE4F5B62761DD9B2228DBA10E4FD2B80902FC29720DEE79B192CCD93BCCCFCCF7ED2F4DCF5AF81150CC12C67AC2FF6AE02BC3F5C2E581617EBCD9765C158431B33EF7A563898645CFB0B772577EF8EC6830B37E1F660BE894F9522DE19721B6407BA0551CD6339E9B0390883156C187DA72185C91048F93262D6AFC32798C5F2A671BFB1A16822BF2071E721291C0AD3B2C544C12C93A9547EF22E2213A870325F060F6FFDB8445710AD57786D9CC983154640632A70435A7156847B71D85AB49AEAB9EED5E4B6450D0BF660B3691DA8673CC6AC4B17A7A78150859D083F8569A117615C8EE892701E9412938CE1BF6CFC2532B85A1AA293F9FFD30D43EADB5898E8848C3EBD8CE854EB0401F47FE4369E3AA795C180F0A15 sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AA08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823002B2D12F4C65DA60F9F0ED6436A28DF7A635894D7E8B2A523C95A04953AD860D6B5E046F8FA0A77357D05F16F4289BF2F27B23D6E66DC1E8B3BBCEA68AD11E362D4FD6A6861B3F94560EF7B7FE6764689746976D206B52ADD67C1813807699606A442FE4F5B62761DD9B2228DBA10E4FD2B80902FC29720DEE79B192CCD93BCCCFCCF7ED2F4DCF5AF81150CC12C67AC2FF6AE02BC3F5C2E581617EBCD9765C158431B33EF7A563898645CFB0B772577EF8EC6830B37E1F660BE894F9522DE19721B6407BA0551CD6339E9B0390883156C187DA72185C91048F93262D6AFC32798C5F2A671BFB1A16822BF2071E721291C0AD3B2C544C12C93A9547EF22E2213A870325F060F6FFDB8445710AD57786D9CC983154640632A70435A7156847B71D85AB49AEAB9EED5E4B6450D0BF660B3691DA8673CC6AC4B17A7A78150859D083F8569A117615C8EE892701E9412938CE1BF6CFC2532B85A1AA293F9FFD30D43EADB5898E8848C3EBD8CE854EB0401F47FE4369E3AA795C180F0A15 ct = C3DEBEC051D27460D02C88A69AC8C12EB72C9ED9A68CBF4141550B6FD0DA2E6F21A876E1D6E959758BC520C1FA5A680231838D0B73260911836DC3783FC71338FEEEC913EECE44BBFF2B615008DAAEFFDA6A8F5EF9719B1B8F42628D844FE1E2171D43515381B5DC08F185455A2FC2481D3F2E7DD06FF9B69F02146A0E0BCDA44F75CEB91D981BEE8D059DC7EB6A178756BFEA33A2E09AE09F7DAF043932971A7EBBD476FB8D319875E2093C29B28FE838DFE4097444A819279E4355187BBAF998D9941A045BAB9A01804DCBDBE0301DC25DCADCFEED4C63991F21593DA24261997E377508700D71ED03381FE7D448B1CF5DB07C444B9E4B82FDFC3B5931C4FD3879BBC211EFC9F27767AB93DB6B3658314D26E8827B78A795DB07F5BC16135F0F9215A3AF612698A086773228285D9A66335FE208E235902840207EEC880A23F769A7FDEDB51B78FCF6D2D540E08C4533CEB814137B2B0D32E7224B6F25A28E49E7816D0EADBB00AEED66FB387EB312D0F3DE4D2BF64A440D39BF9BC69444058BDF5FB72D6715B7456C232D8520A1CA3D53 ss = 407BF6423B119BEA303F7DA6FDCB1CCA count = 6 seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 pk = AF2E1D9620704112613F3F0AC4798CCAA27BD6117E5F4FF6CD924EB10DAA8EE9C86C897003F3024BE2968984DBB3BAD1EC7DC0F0E121F6885A6CC494ED9A28D6DEBB39C7CA2FB7A249A11CE998478FA344BAF1B283AFA756E912E07742C26A6BFE2A338E5678FBE4917C0F33B31121E73EECD48A961EA493297FB6B3831086EB27EB56D7C3346676AE1B4CE48883E85656EAB24F8DF3CAAD84AAAAE535B76CB775E1CB3BA30C5CD695160E0CFEDDE3D3EB7AD7A428F26DA03D0D6E7A28A6BB576A98EA8099559118AEEDD6FAB5837C87D16ABCC6DF75F7C5D6C3788A50FB04F08210E1D9263C6676EC6A2B4CB1ECEF254AE406F0E01686978D1C891CBAE5D9925BEBB8DD4658FC1D847727E70D4CA6F9DF0AD6AF18F315FDBF0E8B8CB80FD1DD8B069D285D13B021C3E1E5D7AA26C778138A667572F61B264BDD0826FC6A9725FD95874C3989F7FA08F6C35A5ACCC0E85E684DCA24E04E8062353991316231C7BA52144D5373A5B9FD3DA8A90DC135FE8F6923492CA8B14C5111 sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC67484EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B06AF2E1D9620704112613F3F0AC4798CCAA27BD6117E5F4FF6CD924EB10DAA8EE9C86C897003F3024BE2968984DBB3BAD1EC7DC0F0E121F6885A6CC494ED9A28D6DEBB39C7CA2FB7A249A11CE998478FA344BAF1B283AFA756E912E07742C26A6BFE2A338E5678FBE4917C0F33B31121E73EECD48A961EA493297FB6B3831086EB27EB56D7C3346676AE1B4CE48883E85656EAB24F8DF3CAAD84AAAAE535B76CB775E1CB3BA30C5CD695160E0CFEDDE3D3EB7AD7A428F26DA03D0D6E7A28A6BB576A98EA8099559118AEEDD6FAB5837C87D16ABCC6DF75F7C5D6C3788A50FB04F08210E1D9263C6676EC6A2B4CB1ECEF254AE406F0E01686978D1C891CBAE5D9925BEBB8DD4658FC1D847727E70D4CA6F9DF0AD6AF18F315FDBF0E8B8CB80FD1DD8B069D285D13B021C3E1E5D7AA26C778138A667572F61B264BDD0826FC6A9725FD95874C3989F7FA08F6C35A5ACCC0E85E684DCA24E04E8062353991316231C7BA52144D5373A5B9FD3DA8A90DC135FE8F6923492CA8B14C5111 ct = 34362B4166EE921E04474293CD7A38938D291603708D9702F1F385D2873A4116D304724A74C681E6050E663CEDF864FB30DA124DC40F86AD7BF5ABF17A55246D704A742253061F382ED3D86B6A779C8A6E65DCF1B9CB36B373E22ABF60B36F91126DC3AF3529DFF5E838C944649C9E70456BB8B2E3D6A1A229954375251A01D009C7072A330E528EC0ADD3A4DC1E3F310C58F8F8538E4B0B9F2CF694BAADD13B6E9B14BED2C1EC19B6EAA0B0E74DAEF62E46DF488FDE2C29D4B39D1940D48E4207A908A48BBCA50741920E5839F14C77F30ABD36C6FCBDDDD7ABDE4FD125652E41428F8EF7FB186F1D1EF69ABF93C43FA28CE181D3C878E09AD9E0312D2914A5E4929730CDF41525AFE2232DAB9BF7C39AB3FD0C60CD3E0BFE97539D474239A61636611FD084DDB74DB809800D7BA122B88817901283C7C6B2BA36D1AD812CA2D9AD5B32E514048AFB975E62F67A29DEEA43E2DBFEB943C5B694ABDE3351EC880581BEA351E22A5BF39615DEE710645FDC178FE70223A2D9C51F216AC6374239C174F35906A5CD5E5A6E38B6D6E63ACBA747 ss = 257AC29EEAC6B952F887E5A2DCAB8F2C count = 7 seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB pk = 9D8799BCD44AC862C94312BB42037FA60B7DFF7284346055D056A685B00DB94014AFE58A48045E39C556648B75A9045D9D91C1CF91CA59FB7D60150174471295C96B426E086FC2DBCE4726F247AA0165B8E69E7A7D2A9BB32EBC311C2D560E79C771CF9494F55DF2A9C3C64464F119F8668E759F8127DF303D37A8F724347E6117F244AC23DFA7EAB9E5E52BAA1EAB369A1A618EDE8E8D9DF983E8CE30460D7FC60A6DF484FC99D994A01605BF8B0D7044C91C842CD8E111E3A1FB162BA570DB528EE85D9831DC1A5711038343F2267C26C90829C6D82C4CD93A665689921DED487F8E9748D62F6ED4BE0B130B8D783029993493D042FB88FADF0401CFCEC03A9A8B303D5ADCC06A3A111705193216B6304671D2D71088CBD0BE774219DCF839F2577904294F49146E18415BAEFA4F25B59384A21904952E14101B4E5775A92F880325045CA30D17C711A758A03A7424F1846CAA5DCC065953E76DF1541342E3BB536628AD3B98AF30AB4031D7FEC19F31AD3F4710C80AD10D32 sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF4864699DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD12099D8799BCD44AC862C94312BB42037FA60B7DFF7284346055D056A685B00DB94014AFE58A48045E39C556648B75A9045D9D91C1CF91CA59FB7D60150174471295C96B426E086FC2DBCE4726F247AA0165B8E69E7A7D2A9BB32EBC311C2D560E79C771CF9494F55DF2A9C3C64464F119F8668E759F8127DF303D37A8F724347E6117F244AC23DFA7EAB9E5E52BAA1EAB369A1A618EDE8E8D9DF983E8CE30460D7FC60A6DF484FC99D994A01605BF8B0D7044C91C842CD8E111E3A1FB162BA570DB528EE85D9831DC1A5711038343F2267C26C90829C6D82C4CD93A665689921DED487F8E9748D62F6ED4BE0B130B8D783029993493D042FB88FADF0401CFCEC03A9A8B303D5ADCC06A3A111705193216B6304671D2D71088CBD0BE774219DCF839F2577904294F49146E18415BAEFA4F25B59384A21904952E14101B4E5775A92F880325045CA30D17C711A758A03A7424F1846CAA5DCC065953E76DF1541342E3BB536628AD3B98AF30AB4031D7FEC19F31AD3F4710C80AD10D32 ct = 1A64D14D16BE965F9FA2C9F5B7CA68EFF6742FFA2E2E4956A56B1E7D6387A7AD683733005EEB25ACBC494F49170619922F9AFCB1657506F12E6C8C98B1A737D5616749DF1696D3EE2EA5AF09BF248D856C30B080E97582162901B77CCEF5F4018A2B4E1FB2C1F386E1520561FBAC27437B114DD8C418D6FA7F6294C3E738A16FABD12BFBEE09BF4A7E5CD3DB125AC6EC77EF3EDCCD145A35B220DE487A9268DCC116942F9A91676B3C1EEE79642B4FE51162403B75CB11C3F0F0A22D1066B9AABD5BAA4E43A182156F61FF016E5E6787707822A4A70E488ECC7DAAB7378E7F21EF496272AD3F8DA95A749084B4368A14FA34D56F59F3D18305E3B50062E7EB430B235FEE4C45A0F119348096317E943E312237F6E780AE6EF738E0634581FCD80190ADC28539BECA88E6F233145B37B67F749E8267178011E5AB1F6132CE86FE84ECCD6A6BE281CF080EC8AFA6EB9F81BC47113FFDDEF48CE5B0B55337CBB482D49E1D22D44BF1D9CA88D784B3C7B0EC010C7647304735A37809C253AD5D0399C47C09DA91D043AF50A6D43C7A61DC51017B ss = FF33202E25308946B34171420C1FFB67 count = 8 seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 pk = 973156DBFA8D13A58D7300D6665CBEF008ABC0595D56A0FF8DDF0214CEBC3667F5CBFAE3F479F9799BE047BFF15D92AE767939248BE053AE987BC2806E741B3DD8B5C8400EBC7AFF3B71D8767FEA8BF85CE2729873428F5E3933ECEAFB8D85559FA5287C484E838FF722ACC95412CA40957E9DD5FD916973FE885F8D78084393BE80103C32690E14CA286E6A0A5DE869DD5933656581B52E40463D44218AAEBAB275CFA00B1F89D53F3AC014B65F320E2161AA4E275FB4A6F145F2B03FFC91F7499E3269B2DA8E1E1BDE9A5020A2213386B7B262F5DA5C03C0468D025519814920F0AAC14AF2568C37869724CBE489B19B09E45BEDD14DA2B8B9702A806E128299EF1EBE6465AC3F519908D0A7A9126C57FCFC78FF1B99523F62BABF7EFDAE47DC45CD11F8AC6AA36E69C047F5D0262E30BCBA4CC9539E7ED17824807F85A581F3A01D37A05C3F9A2C1BD6B8C3CF8540D0264FFB4566788BEA085350416894E32E84CE90AE96F5E26657FC0A1700E8E4B0E5123CBA47EE3C9319 sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943BDA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A6771004973156DBFA8D13A58D7300D6665CBEF008ABC0595D56A0FF8DDF0214CEBC3667F5CBFAE3F479F9799BE047BFF15D92AE767939248BE053AE987BC2806E741B3DD8B5C8400EBC7AFF3B71D8767FEA8BF85CE2729873428F5E3933ECEAFB8D85559FA5287C484E838FF722ACC95412CA40957E9DD5FD916973FE885F8D78084393BE80103C32690E14CA286E6A0A5DE869DD5933656581B52E40463D44218AAEBAB275CFA00B1F89D53F3AC014B65F320E2161AA4E275FB4A6F145F2B03FFC91F7499E3269B2DA8E1E1BDE9A5020A2213386B7B262F5DA5C03C0468D025519814920F0AAC14AF2568C37869724CBE489B19B09E45BEDD14DA2B8B9702A806E128299EF1EBE6465AC3F519908D0A7A9126C57FCFC78FF1B99523F62BABF7EFDAE47DC45CD11F8AC6AA36E69C047F5D0262E30BCBA4CC9539E7ED17824807F85A581F3A01D37A05C3F9A2C1BD6B8C3CF8540D0264FFB4566788BEA085350416894E32E84CE90AE96F5E26657FC0A1700E8E4B0E5123CBA47EE3C9319 ct = 60A6D5643CA8FD71F02B492C27CC99B732DAD4DC9329F14A8343C417B2FD7BE5C40D55FF3250BD4CB8E15ACA6EE041DFBD51B53EB9F20C36E262DC4CC156316F7F68E4F9B38A200175CD82D109CD5E5AAEFEE46E6FD185FA233C38710EAA691A4673EC1BAB92F7DFE6CCDE50F3BE4CE042B6870D12B0E50D8D0D73B70F37347375D43188D28927BA4E3233C1C6602A7A7028CC2738EE74D17CF6435824C5D28BBFF3E16D1535B20D6758A979BD0BC4FEA390A0E7F6B94CEA31A204C012DD8E603438FA9640831EB796FA954F402A1D07116F583EC564C473C4046C4D361D369943CF4C0FF3E3D6E5C71C546EE807E88BC6EBC5278931C81BC9F27E0C71ABE82A6E601C3816341B99D9A1F03C5916AE62D8DCB335F99BE6A74533FF43E04AFA00F0EB93C0E4B49C48F69D111E070B35E7BCE9943402EFF246AC0433B78686FD43C780F26E106129DD4BCB6918C3B4C5E5259354FFF3D9DBD2A151E9091FCC67071C9D62DC0D2A8C2C2254D2C13DC3DE5EC125382F56FF5328AC084CB88551CAFDA4D058D6A744E99EFEF9D3C0EBA23CDBB755 ss = 15D5FB32C1E43645FC856D5F89A8AAB9 count = 9 seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 pk = EB11AD975B8DC144A5608E62657E5A611764AA4ECB405C7372A0FB99843D4CE7B65806C0BAD6D086F3623D5821F731C91EAD79A417FBC0652505441605DF39C191B4CE2B5CF4206DC51056CBC437F5E0EBDE9D0475302936CB8610EC6E8EC925F9B15DE6F5B312BD831A4F1B7BF4C2DED3BCB40E48065335ADEDF4AB603579E648C3BF6ACD6B0C66B3D38CA8186D25228CA97BE045801E2CB18C2F3BA8E29ABFEABB0DD8A1FD11D73F2AD2BB13803E76139638A953374218AAD71B0932AC645A803ADA021C26926FCC16C19FC471AACDE8FB1B3BDE4AA91C33DA796B2672A34D0D492DD48D9952EEDC10EBC090F33E78740B3A50817281E691795A40599B967D53A730D7E5D3ADE4D6D7D669F24F9327B8ED2E7312CA6ED2E021864202B00BC20BAAD40A5743A02E7CF82A041B99F0CBBABEE479CCB01F6F2340305441CACB161A4A6F9BFC5C574312A89AC18C4F6881C7C9210A984E246EFB62F324304009B56CA07FAFC8713577AF56CCE9D92146D73585969225F45B0CAD08 sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC156047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E5109EB11AD975B8DC144A5608E62657E5A611764AA4ECB405C7372A0FB99843D4CE7B65806C0BAD6D086F3623D5821F731C91EAD79A417FBC0652505441605DF39C191B4CE2B5CF4206DC51056CBC437F5E0EBDE9D0475302936CB8610EC6E8EC925F9B15DE6F5B312BD831A4F1B7BF4C2DED3BCB40E48065335ADEDF4AB603579E648C3BF6ACD6B0C66B3D38CA8186D25228CA97BE045801E2CB18C2F3BA8E29ABFEABB0DD8A1FD11D73F2AD2BB13803E76139638A953374218AAD71B0932AC645A803ADA021C26926FCC16C19FC471AACDE8FB1B3BDE4AA91C33DA796B2672A34D0D492DD48D9952EEDC10EBC090F33E78740B3A50817281E691795A40599B967D53A730D7E5D3ADE4D6D7D669F24F9327B8ED2E7312CA6ED2E021864202B00BC20BAAD40A5743A02E7CF82A041B99F0CBBABEE479CCB01F6F2340305441CACB161A4A6F9BFC5C574312A89AC18C4F6881C7C9210A984E246EFB62F324304009B56CA07FAFC8713577AF56CCE9D92146D73585969225F45B0CAD08 ct = BCCC1E6ACAF320BF985A83B4B1031F41167DF07E507EF13424FCF815838A6BBAA027C02ACC4500EF41B76DA466037BA177B20CE10B82E143A603B28CFF41280D481DA8DF798B7BB32F424D2D272BA653ECB17F3DE313EAF7FF40F78DD75718C1D39C779E0876DBC9F0DF1BABD5345FBC86B6537A771729995B14A947E424EA6663AE7C5542A1D2574392743421AC08E18CFC4453D732F843F40144F492A05484F40ACD3F08925627561A3FF838E3050F3496E30DEBAB9EC41BB92641036366A5FDBD0071B71B97E51AB661C9CEF8EC8F7FB3A6DDCCD1290144E7E7A325FD568D584362FE9ABEDE6FAF66CDE455FF110F3FEE5977523FAB726F0D3B02921FE1BE799672C142B6F69BCC7C9E79F86BA6584081F793FAC491A282C96435B872132B8DFB54CAE599E2756583F4662929006FA0150283F5830E2AF13B3031E64D746A2A2CD92E67E0F8D4D1585867F66490168527ECF712C29CE659FE0638DF580421B2359315DDF576237537FBEC623DA28B9EC800E4EEE51A01BF1747E7805BCAF53408F6A0DAEB0A116780280137AF84FCA0A6 ss = 2717DAFB00EB0A39977833FED3245270 count = 10 seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 pk = 1729D61BE220F49CBA0E8A78F1ADCF5DF2658E23874BA69765EAF2167639F2AFD5DEF78FA8DAD1745D997950779752C98B2D7CA2E726CA7A8F208960EB0633572010FE829D070AA62AC0E103DDAE6C71CF494BFF1FF53A389DFB8794AB2BD1365BA094ED6F3D285F187E295660E1B275F6E875A6E33B9298A44B8F39D032BFFAC4922CB14A95B0F0CFE55D45367E605EBD3F7BAD3C8BDF3797A70038FA6CC3665C1A160E8E2F1BC13992655D4898C0AB5CAE75EDFE03D600C46FC9EA0E53710FD88E26F5F44A54857DB99273EBABE7A8CA202CEE0DA1E4FA3FD11F5CE7FA77DE3C9D4075CAA787AF371908D602DDB4A80233F6D5A410EA675FE35C2E0E48DF36342DA186A948BF5D3028944A98058F65DBF4A71D4FD71B4BB4B69D8D8436284D347CA40367F50F23B8F2FF89DD3A8E119CD7520CE522EBB80B4D3F9750421DB28BC1163B7FF3CFD8250129549053BCBF4E15BD09C3A1FB5F7888463F6C5FFBEEC9D4D59B0AC9A4216D60020572D2D6F41514D6D09660C59F4420 sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC68D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C9716443031729D61BE220F49CBA0E8A78F1ADCF5DF2658E23874BA69765EAF2167639F2AFD5DEF78FA8DAD1745D997950779752C98B2D7CA2E726CA7A8F208960EB0633572010FE829D070AA62AC0E103DDAE6C71CF494BFF1FF53A389DFB8794AB2BD1365BA094ED6F3D285F187E295660E1B275F6E875A6E33B9298A44B8F39D032BFFAC4922CB14A95B0F0CFE55D45367E605EBD3F7BAD3C8BDF3797A70038FA6CC3665C1A160E8E2F1BC13992655D4898C0AB5CAE75EDFE03D600C46FC9EA0E53710FD88E26F5F44A54857DB99273EBABE7A8CA202CEE0DA1E4FA3FD11F5CE7FA77DE3C9D4075CAA787AF371908D602DDB4A80233F6D5A410EA675FE35C2E0E48DF36342DA186A948BF5D3028944A98058F65DBF4A71D4FD71B4BB4B69D8D8436284D347CA40367F50F23B8F2FF89DD3A8E119CD7520CE522EBB80B4D3F9750421DB28BC1163B7FF3CFD8250129549053BCBF4E15BD09C3A1FB5F7888463F6C5FFBEEC9D4D59B0AC9A4216D60020572D2D6F41514D6D09660C59F4420 ct = B982F5360AE0D6683B3104EEDDFB5D5130CC9B9D590B51807A55D725CC54F6984A09D679C8B669E4C9F8F0E146EA256DCC0655DEC651409D2664E26FB2331E8CBA8D7C1F9AA6F386DBE75A1D66B8858741E89371FF8D88E9A8F7BBF7CE0BFBF1CF388EAAA283B4B20024B2679D0D50C824FD8334D7A206767772A1B612264718C8B4C31FCF46CC883144C43E0ACF8A8314FF1D5A65E33981EBAF26A55D5DC39C6ABD412365E6D21A5AF0B307F9E04ED495B6096355793F482E3A32361D532FE714BA95815254238F4A20FE0247BADB9003F50D5BA1DC090B3CC5FC354EAC61475870B8F958725870BD3D591713665CB84C205B43A3F81425A22F763C5C4CCE6BFB896E17EF2F0FF9D1F632E5D8FD5CBEE8B695C1E0EF6B3F85BECBCE78BFF31C89BE521D3658E669D3D2182AE80389F790803716850A7E0E8C392D91D884991BF3A559FC5A3A29DC2387747B4CA68D8E658055CF196D1441DAE59A541E3353C18D2188F271175B9572997864456E1007DFFBF2898C5CECA2233DA3B464BB0338951F0BFE3CE7DF02BBF6CA2B383F4FCF02D8 ss = 30840E1414DF2542136A0DC0EF14C9C8 count = 11 seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC pk = 01DBA9AF4C32E82D29C244B0683AF597508BF60A2D1B6A2AF2A97DDAE092402F7CB143970A8665E44E1AF0191F832056F7F61A1A52571F7C82AAA362F0B8344C4BCD988A6DA40905D528C1FF49B3A824E5EE6D4AED23FDC7D0875188B728F714BE9112217455D207AF934F99C2EED6CDAD092F35B318CCFE68351FB1C31A5631E7D0FAFE529662B9CE3B5B51F9F229243AF099E1BD52EC73711CF458C3945F21E9DD64227175C65F03CA6A51E1A09D76A672E782538082A17D344D50282BEAF7179B91D5F1F17BCDD7675C932E3ADC3E3CDDB0A95813DF8D440B34297E94F316FD225F08E54C79047E8E475270D51B0819C7324FCE74F9E6F5B66D026B3980185207E36E264D16D0881AD6353A4C5C9659F0394F0528B16500DC482938EC10BFBCF79367AA1A288DC297BE868B19515F5CA5DCA3B781D0DAE43B230AF637BA1A9C75CA1F08CABA2B3F93FAAC07101D2BB3BFB7DC69B46EB69D45A322808CDF330096F0BBEBDC785178D237325E213B7EA1A3E3B70C5DFF7D4232 sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D10501DBA9AF4C32E82D29C244B0683AF597508BF60A2D1B6A2AF2A97DDAE092402F7CB143970A8665E44E1AF0191F832056F7F61A1A52571F7C82AAA362F0B8344C4BCD988A6DA40905D528C1FF49B3A824E5EE6D4AED23FDC7D0875188B728F714BE9112217455D207AF934F99C2EED6CDAD092F35B318CCFE68351FB1C31A5631E7D0FAFE529662B9CE3B5B51F9F229243AF099E1BD52EC73711CF458C3945F21E9DD64227175C65F03CA6A51E1A09D76A672E782538082A17D344D50282BEAF7179B91D5F1F17BCDD7675C932E3ADC3E3CDDB0A95813DF8D440B34297E94F316FD225F08E54C79047E8E475270D51B0819C7324FCE74F9E6F5B66D026B3980185207E36E264D16D0881AD6353A4C5C9659F0394F0528B16500DC482938EC10BFBCF79367AA1A288DC297BE868B19515F5CA5DCA3B781D0DAE43B230AF637BA1A9C75CA1F08CABA2B3F93FAAC07101D2BB3BFB7DC69B46EB69D45A322808CDF330096F0BBEBDC785178D237325E213B7EA1A3E3B70C5DFF7D4232 ct = CBB3918EC9AA60E7BAF511DE2413DBB64BF37DDBAF0C81B44E272778A05DC0EF9194BC204BE0A20CCD76674044BF6E9E2C794143B9CEACD0C256EB2871F80FA2B3AFA6FD8B270AD21CEC7908006B97E70670ABB41D7B2ED112A5A6189A81C4D614EEB65A6B3DA57637AEF6FE23DF80265945B89F634DD3469072437F150F76E1AA957DBBE8B8DC61F0C5EB28EB25B861ADA8F686B3C626917EF412CF49FA280BF0DA3F9E2486CA25F3D94599CA3A70C317C44795C98AD25E3877873A14BFE7BCAD04362B7B9F5A03C36075740B235BD804CB03478FA42072F81803CFB3D42608B184D24B83295EFC1417D69FA177A748F51FA3BCC67BA021D7E72A1D0BE7BEAB1F12764A1646A1EF36781509A82449D8D8991156DAD64487C95B296A6F85A0EE7BAD069FB9066D1FA37B1EF448AAE83DCD3C54BA886A74F273A5084B8F0F6E37A49B5F1CF29161E4F7316824DEBE708114FE11D5035DE26ED53300AC0303DBCE27CC68CEF0D6C6DE2A6B36D5FEA5EC403B3C9CCE746667C0713DDA3C9F8A889F37D1029208CBAC5B9F586FE9CDB6252A5F35 ss = 100D6491573BD34330D0367019F4C4BD count = 12 seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F pk = 482E4A589E6B9235C7EBCE7A77B48F31B7EF5F139F50056B024AF43184D3C8977740B74424220541C4DEC067746DDE32FA34500B72C6F5140CEC2FB0E1B0381040F79DA43E0A7DDE667E6B143DA4983D0A136E2691FA8A94C7E41B121D1C2856005C0BA8792FCB1F643E109D687816002657DE76D909D76DE3758293D901E7F04B0E0EB16EC99187A099D3D45A54CE18916B0B8B8F18E2166166E0D63E4753A39221F3E0123B93748595B2B1D242313D2D6EF5E353AD10327D0A194B11F772BF56B8176939A81948155FB58DF9BE49666B4DD7D77725A91C48B56A58B98EC75E82CCD6856FEBF180B756FAD81D52FC3B6DF11D4DC7DDF2A341BD28340A4D9725FF9EBA608B4A5EEFE10700F170F9498B8BC4B12E25DED0FBBE0D2D2FE14099D27A69D639D96525FECB68AD8046980928C78A894233BBF036A01A20C0C89FDD99496E0D6A6FD9C4AEE3394F8D4D3E4DAA39875680A631E660D496E124568D45DEB06733795279BE2A6CBC45101BD49CE56C14DCF970822367C93A sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC08E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A0C482E4A589E6B9235C7EBCE7A77B48F31B7EF5F139F50056B024AF43184D3C8977740B74424220541C4DEC067746DDE32FA34500B72C6F5140CEC2FB0E1B0381040F79DA43E0A7DDE667E6B143DA4983D0A136E2691FA8A94C7E41B121D1C2856005C0BA8792FCB1F643E109D687816002657DE76D909D76DE3758293D901E7F04B0E0EB16EC99187A099D3D45A54CE18916B0B8B8F18E2166166E0D63E4753A39221F3E0123B93748595B2B1D242313D2D6EF5E353AD10327D0A194B11F772BF56B8176939A81948155FB58DF9BE49666B4DD7D77725A91C48B56A58B98EC75E82CCD6856FEBF180B756FAD81D52FC3B6DF11D4DC7DDF2A341BD28340A4D9725FF9EBA608B4A5EEFE10700F170F9498B8BC4B12E25DED0FBBE0D2D2FE14099D27A69D639D96525FECB68AD8046980928C78A894233BBF036A01A20C0C89FDD99496E0D6A6FD9C4AEE3394F8D4D3E4DAA39875680A631E660D496E124568D45DEB06733795279BE2A6CBC45101BD49CE56C14DCF970822367C93A ct = EE1DF3CB9293446482991F20D6D593EABDF396ECCFE4DFF05049AC944EBCE9907D2A205A6A7E76B2D1DE0B9872619266B9155939600EDDB031AB58A02E860961CCAED38C0A8BBBA3BCFB07F95E70983DBD2EB988B8FAFD4260227203C07E48240FC753CB2AE0DB8BC9EECAAED4005925C330553A29094E10B9BE268BA925C3918C65818C6B784CD0251D5888AAEF191C7FF43F4B88EFECCDFD297A865F7D5DAED533E92D8B87CF8B47A1235625B60710FEE1C3BD3B553698346EE8CA0E0CAEBB82FB0FE1B69F28AFFD8EC7C52DBCED469156DF286E59BA004D94AE29BD8F3A7530D582F42EE38D12C70D6AB9EAA6B2040E245B4CDCD1D3CA5BA1D93B01FED40EF464E39AED94840FF687B37F935B5DE0AA480A1A7A7DE5C8DEB3664D111DE06F756105A965B3DA8EB46C5FF9D189D94F12A63B65C8DE3CE679CF0FA89553A03FCF17121B4A5948F8FCDA2838F12EABAE5A4BBFEC6F6F9288BE4C124BCC416069A42E6DF12559854250A5D54ECC6613A84A479EB200352DED4038BCD4AAA81605C18B368135C20F2F728789B558A8A8C76B63 ss = 4E8896CB8F77DCFB629C2B7985B5412E count = 13 seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 pk = DFD9A1E84BCE8FB3889D8AE2C5FB74E7C5BB14ED970E8C5865B40E34E1B7CD044C255363B2F34DE9934DA626651FE9FAD9A3BE0371336E39848C80662A642C9D4E35B143CE37E32BF7F51BBE3FB0385E559C218F3003032A2103EDD39FC6004B64038BEA9CE9E84FDFB4195DA74C84B812F33C2E41D7F16CE8F13C11012D5AED3E3B858A63026CFC0E839507F58AB688A8958F614AC82164F4D2750A9226E90804C14E091904D1F9B5312EE2CC78E7D180D105EC35A61B3B8C50C825308ECE01081E1735AB3DC873E265811EF38421D3B72D9ABA4F150F45615BE5DC9573F3150D91B46552E32C6103DC72FAE7431348A2B6D9F413B4C0F805B2232B7DF54CA1333A8B57BD1BE78206AC56D4FA2FBEF96F7B59C053101287541DA7D9A8BCB6C2B23C9023A466147815FF1ABA6FC8C74CB7966DA0E4767363EAA523A59A7AF54D24B67BCA70144FD232480981C251820AA3007C92FFBC9F209B2AFB2F98EB3167AF2A15572DD774315B320EB931D35C31A802B0A3DA4A12E2E51F sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11768AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E0BDFD9A1E84BCE8FB3889D8AE2C5FB74E7C5BB14ED970E8C5865B40E34E1B7CD044C255363B2F34DE9934DA626651FE9FAD9A3BE0371336E39848C80662A642C9D4E35B143CE37E32BF7F51BBE3FB0385E559C218F3003032A2103EDD39FC6004B64038BEA9CE9E84FDFB4195DA74C84B812F33C2E41D7F16CE8F13C11012D5AED3E3B858A63026CFC0E839507F58AB688A8958F614AC82164F4D2750A9226E90804C14E091904D1F9B5312EE2CC78E7D180D105EC35A61B3B8C50C825308ECE01081E1735AB3DC873E265811EF38421D3B72D9ABA4F150F45615BE5DC9573F3150D91B46552E32C6103DC72FAE7431348A2B6D9F413B4C0F805B2232B7DF54CA1333A8B57BD1BE78206AC56D4FA2FBEF96F7B59C053101287541DA7D9A8BCB6C2B23C9023A466147815FF1ABA6FC8C74CB7966DA0E4767363EAA523A59A7AF54D24B67BCA70144FD232480981C251820AA3007C92FFBC9F209B2AFB2F98EB3167AF2A15572DD774315B320EB931D35C31A802B0A3DA4A12E2E51F ct = 34BF8BCAED2AA180DB6ED5EC5676FA97ABE9249A9B548D2744A41F871AE6BBB828B0B797BEC5765CDB3C536A658171A5B4D27596D65BCF60960E042FEE80127EC143E33923A35839385E2CA58D990073E766B8ED0474C685C4E11BA29D8B91A6F3C0ED66F717FE826B7147CB440493506D019663C008EDED9B148DDC2C01E1CF1A4E42A7251C09D05430A036DF4A84C7BE282E3477AD7EBCB1232A8FA87A6533F53E0FDC9A847F2E17E005B614546B268EC338F41327C25DD110C20920D5757F57AD4A0E1833EEBD7E28BC71079898F9A713A7C70C29C2131B83EF8C3A5953B20D792B74076FA486F25B71AB15EEEC72E35EE66699270655AD688927C1FA194F171A37C10795F1238C855786246456F5AFC00933F0F49668F2BE7131211B497ECCA8ED1AE4073349D9399420107C7189E6DC338458D3D67C0CC83E1DCA1A304834562E9AAFF2C7F6B02BC11C7EA54B41181F45EF1AF9826EB438E72A5632A73B5357674F4F48D55E9777164F1E4A806044AD93B960546553EC10B3229BCF3760837B2B5FE6DD34379DE19887500BE32A960E ss = 8FC5CBFB343088B5E6F1EB63B61CAD1F count = 14 seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 pk = E76D7D9B539CF13308F26100C65260B9EFFC236E588024FDA48C8DB2221F7AC47DFB5FABF41F788E5F3AD3FCF3F87BE7D36B69343A70735B186CCD5D98843B0DFC91A10BE0D335FD62477577CEA0FDF011A15DA810F560EEFE64E8352B11753523FAF018B413DABEBEF987EB8BE5278D083DBC471E6892AD870EF434B30077C442101E4680983EA2B1D8581B19F40EC5C755BA8F5695F7E78E63D1850090FC4156442123E77D406E0526EA56D73694F06CB3E3E964589C5403538D0D007213964C2F10F87702C16D9AA7D10151A0BB4F6E191AA88F6739BF61EAF91CA84C37C639C2D5787DEA5B90554135924CA259FA430507E0EFBBE3A2AD8B90391708CF4284D46CAC25A0B5178E09062E580FE3156D4FEA3207C6934C33FB35645CC03BABC2970C664F2CFF38978E0ACD31B3CDE0DE06E996A31E5FA0AA8B08A6C1CFDB7AAB6309E5C2797B251BE2ABDC9C624D694B8F163B0D5ECF02DDB4516515015B25BCC60929ABF231473D7AEF17EB0D12978A1586BA8950DABA5C10 sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B960A2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253380AE76D7D9B539CF13308F26100C65260B9EFFC236E588024FDA48C8DB2221F7AC47DFB5FABF41F788E5F3AD3FCF3F87BE7D36B69343A70735B186CCD5D98843B0DFC91A10BE0D335FD62477577CEA0FDF011A15DA810F560EEFE64E8352B11753523FAF018B413DABEBEF987EB8BE5278D083DBC471E6892AD870EF434B30077C442101E4680983EA2B1D8581B19F40EC5C755BA8F5695F7E78E63D1850090FC4156442123E77D406E0526EA56D73694F06CB3E3E964589C5403538D0D007213964C2F10F87702C16D9AA7D10151A0BB4F6E191AA88F6739BF61EAF91CA84C37C639C2D5787DEA5B90554135924CA259FA430507E0EFBBE3A2AD8B90391708CF4284D46CAC25A0B5178E09062E580FE3156D4FEA3207C6934C33FB35645CC03BABC2970C664F2CFF38978E0ACD31B3CDE0DE06E996A31E5FA0AA8B08A6C1CFDB7AAB6309E5C2797B251BE2ABDC9C624D694B8F163B0D5ECF02DDB4516515015B25BCC60929ABF231473D7AEF17EB0D12978A1586BA8950DABA5C10 ct = 2F779D6BFF4BEBB201AD67BAF96D9D9A0587142098C8D796D31B1BFF435A835FFFFD87C0BA52C44B14E5CA30F4BF1F43696CCF7F009EF51C5179B76534AD34E617CC25A6264951682241CFB43B24C1D9E944E813C6644DE322B9594A90B42926FB7985D1B6D5A11CDBE2B4971AC53A22DAA2ACC8FAAFBFFEBA6ED720BE37B2326DF4439C8BB03FA87BA174BD8048971EA3F14A636E3E2C45806AFD35395BAE8277BC0EC512878775BD8BEDA04CCC32637B4DAD69EC3F489C82E710F43B371E4449841796451D77BF925B51A8362B2731AA7DB34BAA2A3BB031A7541530ED0A7D16673BE56C6EDCAF253AD3D00EC74991ABA4AF36FEC2827AED18E83F8F7D9ED8861FF81F185646D28CEBB838ACD26ADA77F423F30B68854B05BFDF8678F43DA019F861FC53E0C73FE1B2BAB55C7F44509180E7495CA509ABB661342760C7A803EDE1BD0744C817F67A41740C8F80D1FEA08D4E93D02673CB3F442BF7B33FBC2DB519A2355207FD1D2EC9482006EC523C243AD5E9AAC5CA1BBE1EBDA19585C7B23108DA502F7EA3E52C150A7A6E74267EBD8B ss = 924D938AF87AF4A5976041E0821B3CA7 count = 15 seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 pk = B1D61ACFE6278A696A3B275EFE297ADE451287FA6B4B2E9A95367DCC2F3914975D151BD872DCC15D927AD28981634288DD7EE855E0DB4628AA16660D57DA104132CB55EBC045969EA9051E10E07CB8C0E5D62D0D5B339FA9CAC90A37BC381638042312769F6FA92416A4B3699E0CCE1275297BE5926876FF656E7962CC1559DD78AE0911E096AC486A07FE1116FC12C39812CBE50480EA63FB585DCA5ED66C141DF75216A10143DE5E1D1EC44FA4366A027F259A1971F57D441D3ED9310EB8B9068136175FB9FA7FB2E5D917FF92D872389F2FF8451D7841F740A0DF7FE05E5CF1C72F13F4208C7A19FD42F58070ECF9CBD7E5B1DBF9A1751C7E262358F0A1B08C1F882E98A19259105157B7B55DF59BB302C2C7FF42A21743121F91F399969A81BD7130B7F770C80BF28ED060331B42422ACEA37AA203DDAFF939DE335EE9042B09D50D6E7A6A2E599C931B7B2A469D1B6131FB2C7631BF9D75BC7D59D1E9D50C7B5ACED93FEDA516709EB96394516F123D9AFEDBD613F3F93E sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C6DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD95605B1D61ACFE6278A696A3B275EFE297ADE451287FA6B4B2E9A95367DCC2F3914975D151BD872DCC15D927AD28981634288DD7EE855E0DB4628AA16660D57DA104132CB55EBC045969EA9051E10E07CB8C0E5D62D0D5B339FA9CAC90A37BC381638042312769F6FA92416A4B3699E0CCE1275297BE5926876FF656E7962CC1559DD78AE0911E096AC486A07FE1116FC12C39812CBE50480EA63FB585DCA5ED66C141DF75216A10143DE5E1D1EC44FA4366A027F259A1971F57D441D3ED9310EB8B9068136175FB9FA7FB2E5D917FF92D872389F2FF8451D7841F740A0DF7FE05E5CF1C72F13F4208C7A19FD42F58070ECF9CBD7E5B1DBF9A1751C7E262358F0A1B08C1F882E98A19259105157B7B55DF59BB302C2C7FF42A21743121F91F399969A81BD7130B7F770C80BF28ED060331B42422ACEA37AA203DDAFF939DE335EE9042B09D50D6E7A6A2E599C931B7B2A469D1B6131FB2C7631BF9D75BC7D59D1E9D50C7B5ACED93FEDA516709EB96394516F123D9AFEDBD613F3F93E ct = 7ACDBF7B9633A565956B0B7FCCAC3E86F9B58DBDF848A5CF0532705DC906B5AF4C0548FA7401E210A07DEB41C79FD6E9197D56E7C2CDCB2943519793F0E02F066590716AC0E82009C058C3A71ECEB7187619FE9A2E0D739B3D02E803D0FCDBE8E11A96AD2EFA2FD99CCBCC56551C512447D361F922DAA65011EE9CC09A3DF905DFA737FE8D2EA3F0B112E71520FB3F06EEC840EEAD37D23EBB8AA0C5DD4ECBA25F06C0232B911C23D0438DFEED1A8CE8EDD414453ED59A5F7C49263506DAAE3F6F6A25C4915FCF1EB5F703B94D5984347EEBADA4B34EA8C8C0DACA84DE012418D90FDCEEA5C25AE405CB1D62D303FB904AA38D80F34F127A6E6AE20832230DCC7F78D7AD186E81B2D580DAB9BF2EC4FB64FB511981BF46CD5674B82615110566B38B0B4AAE37A6B6915505B003F4AB97B07405E347B1D2CFF60F263009D6489EB93118A4A4C51D8BE13AF719DEB06190ADAE3902931DA5EF753B0D2A9318F0938CA6B597C609816C340A0757FCD06F0AD477C15C7DFF689C82300B1502F57701A16E34019924E28B83F5607EB56CDA01E7B1 ss = DF8970518FC6B152F4769FA78D2345E1 count = 16 seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 pk = 41965EC2EC7C85707324F6E9838A40D7BFA337BF7A82F4678A67A67FEB02427A0FDBC201AEE06BAB6F85FC9C0DE6F5840C45E3D582EDB344D462164928523F704A6306EE4FEA3BC4004C204EC646DC72326AD08D78DB938B996B0A5C2BF437605F8F5230235B1857A6BB58DA16102F270F80BE943D4E7E0BFC01BE1D3903922E2EAEDD9372CCCDD3A2A1FE9023B024824EC60162D1A73D1E464F01DD059A551A02F5BCB5C68807E820819FBC3E58AA72E2468682F5E2B505C6B5B282065FD85B36BF644DC3A49BCAE6A74E218D49BCC095742BC838675201AE21C27B931D791140A9B40C85A59356D0EC073A361A8A226D7369C762DAC6EEE2E1D02A88814B7EB6D25E35AA600E18B386F2A7451C7ECB9AE614D6A606B7A57F3427A84DCB7BFB67EFBE4927B71F20CEA9F1C3B33EFBE7A1C703696DE52EC53814250BE0B1713E65D17E38EE253A9BCF8C64352976748FE417A817BA09D02FF7E970C564D144AB064B36EA16E6E38ACA1D305939492C1D7C1B4CD0D7AD4AF5EF09 sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4CDF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12520E41965EC2EC7C85707324F6E9838A40D7BFA337BF7A82F4678A67A67FEB02427A0FDBC201AEE06BAB6F85FC9C0DE6F5840C45E3D582EDB344D462164928523F704A6306EE4FEA3BC4004C204EC646DC72326AD08D78DB938B996B0A5C2BF437605F8F5230235B1857A6BB58DA16102F270F80BE943D4E7E0BFC01BE1D3903922E2EAEDD9372CCCDD3A2A1FE9023B024824EC60162D1A73D1E464F01DD059A551A02F5BCB5C68807E820819FBC3E58AA72E2468682F5E2B505C6B5B282065FD85B36BF644DC3A49BCAE6A74E218D49BCC095742BC838675201AE21C27B931D791140A9B40C85A59356D0EC073A361A8A226D7369C762DAC6EEE2E1D02A88814B7EB6D25E35AA600E18B386F2A7451C7ECB9AE614D6A606B7A57F3427A84DCB7BFB67EFBE4927B71F20CEA9F1C3B33EFBE7A1C703696DE52EC53814250BE0B1713E65D17E38EE253A9BCF8C64352976748FE417A817BA09D02FF7E970C564D144AB064B36EA16E6E38ACA1D305939492C1D7C1B4CD0D7AD4AF5EF09 ct = B44302AE0EF1CE42B8229D84F3997A0C2D891D609223B92475DFA79B17060F0A641DDF33916637D293AD19166B452FAFE881A2D709913A91B7FFB5A547982CAABEB96D928C0EB25D8C85BEFFB532F987B4AE62C7E68DC8173FAC5899AA3A5D8A30AD47A25CD26E058F9A79D39D12857F07948DECD280F59B354319980B151ADD015D7ADEF48F8AB7DE9FDE4FF71720BD9BD4D32BE9F943BCBB27C45BD2C9B185528BEEB1F43C3DC4B2D1B4ED7F45A274DF00771367FCCC516758C32706C8648F4CF77D76E8C93C3956C8306023423E87DC7A79BF156B645371763F0D20497AC306AC842B60CF962BAFC730231CC2510AB58828CAB126AB5B50FB25344315C7658A5E00822E562EFF2E08D2477FDD46A872FE13DDC6E3B2E4B8B58D20E5F2A5598CE7FC79086EA59BEB2C2CD06E45499998C2A332A344C01430243D70B546C146B0277C8AD4BD414B1F77A40BF67EA661FE6DC9792E2D8B290E3768107C7CE03CF20A387B3C688773AC11FDB0CBBBEEA1148F9D04B28EE95FF810899C7F44FB51020462242F96EFA97E9CF23AC54F18D9EB94 ss = ED12EE03261E16E8F5E901F69BF972A8 count = 17 seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A pk = E6700C084D5E0DBA0085A8F8AB6ADA981B7D24EF1754A82E83D4475D67D1174D497B10AF7022298349FBDFEDAB31085BD7AC9F9E7A898EAE45C8DFBA2A461EC16DC46FE82E925B21C73A0EC7F1C546D4DBC1883C8672876375644175A7370A1C3FE3C7C22B28167E5E9F8CB8081F52C7087CCD941A1BC0988291C6AFC62AED56BAFE4065A6C40CCCE585D4421166360E839A6E86E7734110D71F40334894F78A9E489DA24D57E3F3D078EF1F22C444AB04F1F8F4EAE9513F76079656235196DB886209027C56DA35DDDD9658DE111183F18D8B2813A63BBCF57D21AC4312D1C15460891A1D38620CB8A89C3060449BB63BE4707F04C2037B091BE802A05AF2F1F50D8DA67B60EC5A5F490FC781FB444661374CEF2699B862791978514193737FE7805A7609AD7083FCA5D3E3BFE038262C086671AC74868CFF521698C59BAABCA808FCE635001F089A518289DC581D2A21A462BEC5F13D2129395BDB54A64D50FDE8768028BE40685CBE0B73DEEBF4FBAE1054B790EE5A216713 sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263020F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C30202E6700C084D5E0DBA0085A8F8AB6ADA981B7D24EF1754A82E83D4475D67D1174D497B10AF7022298349FBDFEDAB31085BD7AC9F9E7A898EAE45C8DFBA2A461EC16DC46FE82E925B21C73A0EC7F1C546D4DBC1883C8672876375644175A7370A1C3FE3C7C22B28167E5E9F8CB8081F52C7087CCD941A1BC0988291C6AFC62AED56BAFE4065A6C40CCCE585D4421166360E839A6E86E7734110D71F40334894F78A9E489DA24D57E3F3D078EF1F22C444AB04F1F8F4EAE9513F76079656235196DB886209027C56DA35DDDD9658DE111183F18D8B2813A63BBCF57D21AC4312D1C15460891A1D38620CB8A89C3060449BB63BE4707F04C2037B091BE802A05AF2F1F50D8DA67B60EC5A5F490FC781FB444661374CEF2699B862791978514193737FE7805A7609AD7083FCA5D3E3BFE038262C086671AC74868CFF521698C59BAABCA808FCE635001F089A518289DC581D2A21A462BEC5F13D2129395BDB54A64D50FDE8768028BE40685CBE0B73DEEBF4FBAE1054B790EE5A216713 ct = 95A10E00252F43CE70C6D8C611843289A420463E5E17F1F331F2FB1DDD98C5CAE3765583DA915BD620DAACAEFFED3427D264FA88258318476E3FD527B57215E5CA3A06AAC005663E3E78A661B465B48C5F0EF5B06A9CCC1806FCE0CF154CA880B26B1D7E26737A6210F912B9B560C2A39B91937BA0D5E0A6C109AD3FDC3458C691ABA933DA7E8232D88BB16F097285129DE0CEA87564C11F9E5FECF565D9550B457CBBB9372F8DFB3D55D603CB5D11CD12599F96D4B64D19D17AEFCB26672FBD48BFB54E9471F9C8747AEBFD44BA0AE9B7CE86D946B5EDEDF9DDD419E38BA26B93A1BB7F3BE7C571164C07739F4FE3A3A199ADF3C607C9DBBF064D2CC51D48C38CE921604CE70B92BF7752F71C5C0280306AA92E6DD1986D7184C2DFD2E1ACAC4425EC8F1D26013D98073C53FF3D502D07D748C92007A01452D31288F3BAD954F6BC6D0C235CAEF7D0E460F6547D7A5F2B458E76D9D9AADA0E6D6C9B413F2FBB97E89B62A1DF40333F69C8CCD3727B9AE9D6C6FD87F922174426787219DA16BFA20919DE8ECEF4258A969603955C5D1DDD74 ss = EDDBBE6A8F50E7358834D8790B68A44E count = 18 seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 pk = 69C1C4725722EE8457362775DBD1A20D2BA8407F173801AE186A61EBB19DA21612F05DA6F6684E6B953AE0913FB15DBE22E7DD7158D04F422EFC4EF9B7E51591CA54F966508795E383160436BCEF9778ADCF592101052B8F408D2E07FB0FAC4372765E4352A3168B69AE19DD5E6A1C0BFC94E69C6059BD1A43C0EB1EC21194947DB578CAC39199B161DC594D23BA3E53B55BD51ACD41DDDDD807C3AFA687B622993B89DC0A97F725B0C4AD72AEDB7B0CCBB05888A5B557B9CF3C508F255CDD8C464B4FC2E42C8BE545E1F08EB007F27B68E603EC65C940D0C00063C9C5B3DBB6FFD496E74EB62567772702BD35C69ADBD7D839D2893C1DCDEFCDFB250D326F119B0BE55EAEE6DE68C4C61C44EF0B18B2625A1DE82FC5705AD73C0F84037BC3767BE3241BFFF5F972D86B5297EAC9FF597E03DE66B4D8126672DC2D5A30BE4E04793C3AC727669B1F4DB6D8235BA5D4235A757E9D4D67B8AD9F9138589EFF18554F5BB595386A135ED704AB86A47BB10161D664A145B8C98E2504 sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D20F69C1C4725722EE8457362775DBD1A20D2BA8407F173801AE186A61EBB19DA21612F05DA6F6684E6B953AE0913FB15DBE22E7DD7158D04F422EFC4EF9B7E51591CA54F966508795E383160436BCEF9778ADCF592101052B8F408D2E07FB0FAC4372765E4352A3168B69AE19DD5E6A1C0BFC94E69C6059BD1A43C0EB1EC21194947DB578CAC39199B161DC594D23BA3E53B55BD51ACD41DDDDD807C3AFA687B622993B89DC0A97F725B0C4AD72AEDB7B0CCBB05888A5B557B9CF3C508F255CDD8C464B4FC2E42C8BE545E1F08EB007F27B68E603EC65C940D0C00063C9C5B3DBB6FFD496E74EB62567772702BD35C69ADBD7D839D2893C1DCDEFCDFB250D326F119B0BE55EAEE6DE68C4C61C44EF0B18B2625A1DE82FC5705AD73C0F84037BC3767BE3241BFFF5F972D86B5297EAC9FF597E03DE66B4D8126672DC2D5A30BE4E04793C3AC727669B1F4DB6D8235BA5D4235A757E9D4D67B8AD9F9138589EFF18554F5BB595386A135ED704AB86A47BB10161D664A145B8C98E2504 ct = B25B2CBFA381395BD92103F1E1783DEE4BFB0F1A3D42C5D5C1549CA644004DA0EA68F16D5F622E85CBC46508C1843156DD82830EA4C9EAA97787741A8434176DA1A4524E980A990D0799E0E0C49B6353BBD7958A0F2D4D3F93538EB1DC01133E32A9B86C9CC58F133C126350BA3B8B0326A4C12BFE7B8FAF5388BDDE0201E969EFD541DE930EE27FD93AB2EA32112BBEA06A204FECFE6C4382A67D28E15806274C1CF78DCA2F660400B0D9A28AE4D161090985FEEADE44B3616B150D03A6A69663E5B9C22A3E033CB7F3170A62147751F729D3EB47BBF7A3CC9362E554D7F7D062EA39C414958B892E74F905E22A0747FD0CD98E25072005B689B20C2FAB1DC1ADEB877D8215857260D2EFD04A8B22C5C1FF0A5EADE0B513771E883200A9D608443220BBD14A565B9366170D93BB9FC3B37CFAB2092F4F10850E3105DF2C0CF3BC6DA0D1627A51EB70745F64AA44B37C766B9206CDB5A34CCA5CA3406BBEFDEEE40932EB5E0BBBA0E994B522279BD50278B17F7CBED9254DFF37AB59CEDC4DE34F44168EF35635D6E53B0FE329BD5520D96B ss = A9C01E4872F2391F9F7749816C2A6926 count = 19 seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 pk = 2D927E13D371B802EB8A8073894EDE917CE3F133CF940973D62800496A99DA1ADCF584208047923F8D72E50C1F84E98014D25F42C9C0BE9E0EED134E8C5E29D2EFEDB463B5FB4050B982415CD7C83AADD2FA30BF363D0FEAD7DB85576316B21E7F8A810E2BA251E1F1FCCE9EE0BC64C7159231D39957727A53601E47F61F99A43900E2B5F4AD03D26C83E6153FE622136C79EF0F586276DED3417B0CB1C21B265ACA2A527813969D71D24E3A2C2A534386CC68FE7BAF4F8C7F28ABE00F42E4823D5829257C409AC3A7E2B9519C0379B813BEFDCF6A3B8B2CEBB48E3946FD89C1A646ABDC7CDD8B4B8ADE0727FA8685422F2F79481FD9A4784E36D5214FE68ED63705F2FC8309669E41234BC184C9DF6852BD888EA6A33D8A4E4743FA730D1FB5924421BA8999220A8A502E31C7772F1712B8E59EE65D78E2F4DF0C55461D98F0CA5866F353A7D62398A137D7EB4F9EF9E40D5C65EDEAB72868CFFC6526FC71A46589E78AE4CA89EB616BD620B16F27C48B037746307FBFBA703E sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D030F2D927E13D371B802EB8A8073894EDE917CE3F133CF940973D62800496A99DA1ADCF584208047923F8D72E50C1F84E98014D25F42C9C0BE9E0EED134E8C5E29D2EFEDB463B5FB4050B982415CD7C83AADD2FA30BF363D0FEAD7DB85576316B21E7F8A810E2BA251E1F1FCCE9EE0BC64C7159231D39957727A53601E47F61F99A43900E2B5F4AD03D26C83E6153FE622136C79EF0F586276DED3417B0CB1C21B265ACA2A527813969D71D24E3A2C2A534386CC68FE7BAF4F8C7F28ABE00F42E4823D5829257C409AC3A7E2B9519C0379B813BEFDCF6A3B8B2CEBB48E3946FD89C1A646ABDC7CDD8B4B8ADE0727FA8685422F2F79481FD9A4784E36D5214FE68ED63705F2FC8309669E41234BC184C9DF6852BD888EA6A33D8A4E4743FA730D1FB5924421BA8999220A8A502E31C7772F1712B8E59EE65D78E2F4DF0C55461D98F0CA5866F353A7D62398A137D7EB4F9EF9E40D5C65EDEAB72868CFFC6526FC71A46589E78AE4CA89EB616BD620B16F27C48B037746307FBFBA703E ct = B5E4A96E9BEED97A881440F8B6B774098602E7E22F071FC92D5C5A7935F0A267476B39EFC86AFD5B8670C461766BB77C102E0F3C2A06D7942CE3BD1E242801D56D4589B8305653CEB1024F527785656D64BF3F28B444D21A82A042DDC60369C3B706D568E610BA736F6AD867F1B6800E698FA9AFCD9AFF474B33536C37203B0FD37F7393FA2D1645243294A07130A6308CAA31F7AD2B8E1E8D04F1BB3B87528D44454FB52038A9F94FA9D05F8C30CE6B32F47B0ABC6C0CBE652495B50A6474C5EE83EF8F0E41FF9AD540417CAFB9DBF40CC8D7D973276D95F3216DEB7B5D51FFCD81075254D83E60FC57745FEE5F46F76C25886E8286A5769ABEC530F58A6CBD0C6984C3765E42032FA5C9D2FB31DB01FB3D25451E58DE159DB7A1316D670CA1D5D046CC5721579F186C34BCF9791A4812D9AEDFC95BE677CE1F291F585EE036FF2A0B2373F016B44CC3B390F9A4519EE44F68A60562F1D36699A896718C670388E3D454D3089AD8B5A9F69FE858EDF91C2AF35ADFE73F0F8E3A156EBB129AB038FEE14568DB9E13EB2B0446FB429B237EDB ss = F5C3C0F67007E4806C1D082B2A663508 count = 20 seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 pk = 88B3A00FD10549FE536D5ACF1511CDCF197B974AAA3F78ECC77B24AA98F8F52DCC479B36CC855820DC76B358486FD177ED3601FF8BD6F741E2F9DD47B50840C8083D688ECF125F16688B54B38019195C504AF534D97FAD59F58E730CD3486CB120DA22DD9D526A4EF5B35DBE0F2BD07AB78396458DD7AE8615AC279D8A27FC83480B31A24312D5F2DE3961C6BB1408A415937C0A7A8F43CC380E05EE2C041338B3679709515725D54313024F234E77913E440F903A8ACBE6C0610DF50723B4D1BF8034FF6AC1007E96B8363EF383506CBA163FAF41BF5D634EBD75EC0052573E390704639CBF216199709E9856D0396BAE63E6AA18FD8BDE5EF83306F4262C264248B10815059B35B4B80B7DE998FF27FD5EEAAF346F442E09E4B988BDA212981D0654A03D88137F0459910431988F8E1BC6754E1D17826EC1FD0976281BCD14D10B60E31AE0FD4EE7DCB322771E70895425CFB76FC7FA610AD91E221766BE0B74BA944DA795475BF974E81A210FD883FC458A765307D818FF34 sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B56590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D0388B3A00FD10549FE536D5ACF1511CDCF197B974AAA3F78ECC77B24AA98F8F52DCC479B36CC855820DC76B358486FD177ED3601FF8BD6F741E2F9DD47B50840C8083D688ECF125F16688B54B38019195C504AF534D97FAD59F58E730CD3486CB120DA22DD9D526A4EF5B35DBE0F2BD07AB78396458DD7AE8615AC279D8A27FC83480B31A24312D5F2DE3961C6BB1408A415937C0A7A8F43CC380E05EE2C041338B3679709515725D54313024F234E77913E440F903A8ACBE6C0610DF50723B4D1BF8034FF6AC1007E96B8363EF383506CBA163FAF41BF5D634EBD75EC0052573E390704639CBF216199709E9856D0396BAE63E6AA18FD8BDE5EF83306F4262C264248B10815059B35B4B80B7DE998FF27FD5EEAAF346F442E09E4B988BDA212981D0654A03D88137F0459910431988F8E1BC6754E1D17826EC1FD0976281BCD14D10B60E31AE0FD4EE7DCB322771E70895425CFB76FC7FA610AD91E221766BE0B74BA944DA795475BF974E81A210FD883FC458A765307D818FF34 ct = 943F932ED5CAA77B360202D8930AC90EE7651A48D62AAFC045D0CF8A3A39D7CF7241411099B9788C9DF8C2EAF15CDA9C6FD9A70008FB12D7284BEB33E35C19D55398370ECD70720E42B80C0050725E207EF6EB02EEC52475B4F9A7522535FF2FF400651B2388A7755386800A978182AE2C4E3382A1FE7D49E36F53E8233E471477D6FEF00D6866344B2739B2B19BB536699C103EBD43409B7B800DDF1710C4749E8BFC2034455433C78BB1C585ADB13015E318BEFF45817789DB6141122252B2BB62CCDA067261A2772909209E5994CF7DC490D2781BE37DE754D3382A10D074B7E547C93DA91644CED018DB53BBBD105B0A84A6E0AC60A0320C8100946F8FD6D9420B4C0719DCC0D8D709BEB98D8625980069E07A021A3B3CA5B7B9AFEA454BCC84CD6FC453C2BDF81AE1752E31B285574FDFC06FAB7AD6317D2024E3C090C8040CE3F915A00066856A77C04F044E9DEC74FDD10547BC4275BC53623A654804A401200B05D3EAC70BD4B21B1E1D827DE5A9541C7BDC7EFE0D10010367B9BCF7EE1BFAE95741B7E46D41C353F2291B51847F ss = 32F9704EC592C5015AE6F8B469FC6361 count = 21 seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 pk = 0D36A1DFADECAB135266A11CA3DD6E418EC222C9111026A7F564347F86ACD0124152EB9FB12985701B67DEAA7385BD037F6034C2AB5B5D61AC9A2C4F51BC3B717BF3CDB0612DE43B30F2B40651CA115D60841D6577AE40C8FA00A1FFF80E32D52C555F49DCF8966986A8DEA1AC194B1D6FE8EB5A5F43872F50EAACA0933102EA1114D038EE34892EB5D2B78B94D478E6AF43CA4A0F1EC681C399C355ECCC098424E9DEFD9C113884856CFAE29EFCCD38686C816FFCF1A172ACE97C5E020B272263159961126E7771768181007CD3A8608FD4B4D80B2364328B8B71B501D5537A0215F2E21325AFDD5FD98EF46B77AFE8EFA6CB0EFF6686236EA4352CA4C4877F9B584042BB8B199217B5BA5854F0F48443BBF20E01143923686E2FA87D37AB3C138CA3796D24073566F82269013C12B41EDB06C435361818628B342DFABD00216C978B22C00C82E3BE0AF2D06F6C23F2226BCB5E1AD54F28C41294786C9D4C9F2DABA7F8944F2A1045284E30A4ABF4880CBD79DF720B64880B08 sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104050D36A1DFADECAB135266A11CA3DD6E418EC222C9111026A7F564347F86ACD0124152EB9FB12985701B67DEAA7385BD037F6034C2AB5B5D61AC9A2C4F51BC3B717BF3CDB0612DE43B30F2B40651CA115D60841D6577AE40C8FA00A1FFF80E32D52C555F49DCF8966986A8DEA1AC194B1D6FE8EB5A5F43872F50EAACA0933102EA1114D038EE34892EB5D2B78B94D478E6AF43CA4A0F1EC681C399C355ECCC098424E9DEFD9C113884856CFAE29EFCCD38686C816FFCF1A172ACE97C5E020B272263159961126E7771768181007CD3A8608FD4B4D80B2364328B8B71B501D5537A0215F2E21325AFDD5FD98EF46B77AFE8EFA6CB0EFF6686236EA4352CA4C4877F9B584042BB8B199217B5BA5854F0F48443BBF20E01143923686E2FA87D37AB3C138CA3796D24073566F82269013C12B41EDB06C435361818628B342DFABD00216C978B22C00C82E3BE0AF2D06F6C23F2226BCB5E1AD54F28C41294786C9D4C9F2DABA7F8944F2A1045284E30A4ABF4880CBD79DF720B64880B08 ct = 3C7B34328DF6A1536F61EE5780E05C6F53BFE82098CE86E6C15BD8B267848E84FE787CE6E538A4A3DDD8F7F35951E265394E6D1A0CCCB81FB80389FC5BA13FA5989F1748331E03B119A9513FFD7896A86F1683858986BA89BC09CAE30D76F040CA5032C56BBB486CB2C08B36AA827B8CA7A2C093113271044C7022E5D43F9B67E8201E6CD6C69C432CF1B023AC63C386D9508B728120810D8C6BF0879A70ACE9D6D7CEBF93C0D120AE99E79E4C476B794CA791442AEB81293C9EBC761C6E9F98897AD6E6DAFDCD370CBCC3AC300245C595FAA3DC987A45342B567765795A4FFEAA75C13C2DA2CD89E1066FC8873C64D0911D41D6DEFC991841A5BE0FFB6BBD36C2573B2CC31464617E6829D579F1BA7FC4E051F61E143FF3D6AFB2165F5AD05747BAF6278EDDD39EB7398F03B122C70D0C999C9B141A4176DE0E2C8546EF78574B024F17954B35114C55CC13CC99FEB320D2407B073CBF172D1CB2779A87CC390BEE43D79EF4AE446A7016C8A75E20C37D5F02AE39DCDB09113F89FBD9E19C24F56DE42FBA308F0CF5594684AD89D975760C ss = 503934DAD7D41FC0B4B1490DFF65B398 count = 22 seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F pk = BA263A507606C242B768D27CDF1AF22E9D01FB7684A540DCB145B396DCEBE5DF05EBBB3C3D15A9837B9E82F2BB1E591B1837248BC6CF70E8D974E66557A70AB5B5A945A0C780AE154EFF832D54BFD9194EFAD492A88A5163EB048D3104CF1DD981EC884BCF20B555CF63D42D75478C8C52E3FBD1DE4942325F89C5CF8E281FCE5C92AD18652A867D0CB2FD1CDF07DD82DE9718E3C334F6DA9881E020CF94477B296947CEEFD7B4C566AF65528BDC06E4E63AFDCF2693F15BC01BF3C33F9443D363CB166A0BD6A10B27FD7E0D077B3B47608E6D47467C9FFDF402D6D5B8FAEB3785913BD0EBABAD608B2CEF7B4CC734C1750E4C0AD45EA482FED90E03D09A060A1080D2519CEE61819F08E8F936228CAD5CD1F84EADF7ECA3271553CC4430032F74B64DE5DF9E0FA748C392EF4659FAECBBA9E512CEFE426E4E321122DE83D42C7D613F3C6CA6D78AA235BCCC5FA2E80160F41B4BB881ADDA1E1CE7BFDA816D6FF2D3E3171625BA0DC70288F7D714737495307CF9FF2D74924416 sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD476EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A87880BBA263A507606C242B768D27CDF1AF22E9D01FB7684A540DCB145B396DCEBE5DF05EBBB3C3D15A9837B9E82F2BB1E591B1837248BC6CF70E8D974E66557A70AB5B5A945A0C780AE154EFF832D54BFD9194EFAD492A88A5163EB048D3104CF1DD981EC884BCF20B555CF63D42D75478C8C52E3FBD1DE4942325F89C5CF8E281FCE5C92AD18652A867D0CB2FD1CDF07DD82DE9718E3C334F6DA9881E020CF94477B296947CEEFD7B4C566AF65528BDC06E4E63AFDCF2693F15BC01BF3C33F9443D363CB166A0BD6A10B27FD7E0D077B3B47608E6D47467C9FFDF402D6D5B8FAEB3785913BD0EBABAD608B2CEF7B4CC734C1750E4C0AD45EA482FED90E03D09A060A1080D2519CEE61819F08E8F936228CAD5CD1F84EADF7ECA3271553CC4430032F74B64DE5DF9E0FA748C392EF4659FAECBBA9E512CEFE426E4E321122DE83D42C7D613F3C6CA6D78AA235BCCC5FA2E80160F41B4BB881ADDA1E1CE7BFDA816D6FF2D3E3171625BA0DC70288F7D714737495307CF9FF2D74924416 ct = 4217FB59FFA4ABDE6A9095497C964DD5E0D3FB1BAB14F09F7D39259632C08AD06823B7CAE69EA9F70B601BA3290FE08652B034EBD3B85C25CC8789980BB9240DE3C7C731879B114026D680D0F24703079D49FA26D04176457EFFB4E05FBD6A20CFE8459DF5D09732B27D5A79BC2AA2AEC4E2116F8566B1AD28D9E7BF402B9ABEB385E52B559278118410802554C6060E3728462A82D4B00D601A5FD2ED292C2640EFA04D9B5CA1EEAB829D400E98AB10B110F98876709D262DDAF57B1DA566ED8FA87ACE2EC9662A1243BDE01DB4FC3665CCF31F166DDFE6B1DDEF43AB458C88BA974431ECF653061D308B71B76666FB29DDBC46318FC107595A9622947B3C0C0E8967EA4A2D83D3E63C2FAB090E82AFA88159F39AFEE3D79044FD80967A62D7D93D349BFA49D9F129BCDF98CE746BF4194034BD669D39960760102B5273E2CDCB3F0EBAA1B77BC876874A2DE2F2D43DEA376C1C79759415CF98A558773871727EADA726629507D4C1D6D1AF8C167EEF6BC1AEAB14B355F6EB368EB94AB2533AC222BB1514AEB801A5FC0F175FE3A92F13D2 ss = B7EC19D26552CD1F9B8B3374B47F08EA count = 23 seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D pk = E254187A203ED9D80DE5F5342661AA2027BC29523DEB55B5C5C6251F9CAEE535EBB9856010290E80BC0BF868EC513841514826637B339E6FBCDA6878F31F3DCB6A6152F8BDE52050F3B06F6CA38DC53D8F07214B3D7F286905451408EB453DE9E703D29D860A3F5F93B9839873A3CCDA1585B401A4A316B04444CC0CFB093911FD412BB69CFBDFB36BBBF1D6B99AB54B809040540E56853525416727D084A2B7AC52B793E78A7B9A95AD706CEE088C13E13CAC3804069909EC12D86D22448B71F3EE493A95D75623119DF86EFC7841407D232A2C93CA9C4BA438DC119E9AFC7694923C2FEE2A07E708408ECEB1DD043A43AE00886C7A0C2C23941405154148B1B0EEEF72E853D1D4111F5727F24630B9878C228E429C99231FD7BA5AE0A920F9D8A46102889001BF7C82191F5B5527F7E6010CCE1672174CA8140222217F45D5D13B888C8F3A9B42D476AC3DA974347677FC494D3D8A01B4C29AB8C3A232221812666B5B3C426977DF8AEB5AC40A5230DF3351EE262595A9D435 sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A2FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D04023781502E254187A203ED9D80DE5F5342661AA2027BC29523DEB55B5C5C6251F9CAEE535EBB9856010290E80BC0BF868EC513841514826637B339E6FBCDA6878F31F3DCB6A6152F8BDE52050F3B06F6CA38DC53D8F07214B3D7F286905451408EB453DE9E703D29D860A3F5F93B9839873A3CCDA1585B401A4A316B04444CC0CFB093911FD412BB69CFBDFB36BBBF1D6B99AB54B809040540E56853525416727D084A2B7AC52B793E78A7B9A95AD706CEE088C13E13CAC3804069909EC12D86D22448B71F3EE493A95D75623119DF86EFC7841407D232A2C93CA9C4BA438DC119E9AFC7694923C2FEE2A07E708408ECEB1DD043A43AE00886C7A0C2C23941405154148B1B0EEEF72E853D1D4111F5727F24630B9878C228E429C99231FD7BA5AE0A920F9D8A46102889001BF7C82191F5B5527F7E6010CCE1672174CA8140222217F45D5D13B888C8F3A9B42D476AC3DA974347677FC494D3D8A01B4C29AB8C3A232221812666B5B3C426977DF8AEB5AC40A5230DF3351EE262595A9D435 ct = 016A3DADAAC208F3D8F27620EE042FA679DD4B6FE070847BBFC3DF0801BDDA8DAA4EAC86849392AE282B8DAEF58E6947C044049A9301A4D9EB5CF35185EE12C8A7F3BF7BB42ACAE7DC8FF9682E05E2F9CF2C9CA449BD7B8184F1C6DF81B06A6B4C1B1E0FAC5C3777422357E61550BCAC2A5D9C4E02D39FA5D42508725910691D5C2BD582BD80C7440651CF37F7945AB0D0745C35C4BAC215A7088111933E482A3CD477AE1DB7DB2D654C3C9398DD9BA0C389D86F4F116A1FF9570C7F32D8982AFF2959146A6E32E935493BE6E50A0FFDE5E4820044C94CEC9F6E4AC5DDCFE3CC715A42B25F15D704F5DF6E2EA2528DCBF897ACBDCC17243BF348A71762DC7A3AF1D44907FFEF0BFD7C641580D988D4F49D7719936CD01894E2D9C5D95BE562D083359CCCAAA8461966E6A1D60A7E94021AEB7A688529B5E2175F27E7EBD16A69D2D8C123924E6E4361E384A616FF732437C1094F344999C609DCA96FB1B88917F5A051738D9AFCE846CA6A30162085D74C638A6D875B2E3A350127A0AD970DB5C32E66490E1DB4AF6271E79251046D2862DF ss = E140EB4625F5D1AA558CFD1D18BF9552 count = 24 seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 pk = 8A0D8E9972CB36C9FD118873F3C1FB89B724DAE8468FED14AF60934E42F27F5F49329430E771013257266EEF34ED34E29E9868CDF4C6CBE75F936E6985E32A6FE03700933E48459F455F349D004285906D4103FA7963EFD357BC68A41BCEC76F31877A5C2668AADC98DF0700A64A4BEB8DC443AACEF70F81F48C0064AC358BDC240DC8E1C9B93D75D75E02A396422C4284F87FDD783334E2213BCCABEA32E1B77701273B3B1CF56A74540E110FF9B4C86597D8F7EC78D1B3AB201C5A06F646EAD438A75F77E7CBB9C01EFF51BA21F89E022363C04E37B57D6029C1C3674F478FDCF467712669C74AA2E39F93CF2450FAE3FA9DEA124270D69883232671CBDE07B63316CD89B46FDAAD6A97455BCB8335F78F1DC23A4E8D9EA53A8F39A0950C53CE2A344A53BA2C1E5F01DEB8B5E4E9CE2291F5692C46C205D9B80340B084B943845318B742600C12FD385BF44DA933FD6C2B5FC43C5F3EA7F056C2C12F823E46F6B598A32C0A627B8F54FE267DEA0206E81902741120FE287E31 sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55FF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A5088A0D8E9972CB36C9FD118873F3C1FB89B724DAE8468FED14AF60934E42F27F5F49329430E771013257266EEF34ED34E29E9868CDF4C6CBE75F936E6985E32A6FE03700933E48459F455F349D004285906D4103FA7963EFD357BC68A41BCEC76F31877A5C2668AADC98DF0700A64A4BEB8DC443AACEF70F81F48C0064AC358BDC240DC8E1C9B93D75D75E02A396422C4284F87FDD783334E2213BCCABEA32E1B77701273B3B1CF56A74540E110FF9B4C86597D8F7EC78D1B3AB201C5A06F646EAD438A75F77E7CBB9C01EFF51BA21F89E022363C04E37B57D6029C1C3674F478FDCF467712669C74AA2E39F93CF2450FAE3FA9DEA124270D69883232671CBDE07B63316CD89B46FDAAD6A97455BCB8335F78F1DC23A4E8D9EA53A8F39A0950C53CE2A344A53BA2C1E5F01DEB8B5E4E9CE2291F5692C46C205D9B80340B084B943845318B742600C12FD385BF44DA933FD6C2B5FC43C5F3EA7F056C2C12F823E46F6B598A32C0A627B8F54FE267DEA0206E81902741120FE287E31 ct = 936A6E3E3FCAF5053B18AA30D9A7726F4714757AB0664C25C0226EA7576F394F0465F1ED5B55642B41A2FE8EC2D05E17A7590291539AEA3DC5BE368476E6137BF4CBAFADF2E6C7643D943BC0EFA1E32A313899B944E4F111792909692854EA37D7D3DCD0E6C213C1C488B5038D78EC7B8805F5F2A2649F7DB35448F74B17C9CE6FB2A4E9805777239374C8BA2546444C6D980B76046BA279E016796A1E5BEB0ECEB068A8D35ADAD865A389CBE4F206403399CCD5FBDF7929E3592CAD1F20453069F5B760AC05D71B7DB363F1A5FDE43F32C7313D6FBF9C19454B2C6650731C5A3CF8197F5E9E59856258291E849A77EE0B477DA84DC4E6040B16482AA2F7804B98C6738C566C4162EFD473C157603EAB1D4BC81F8716AE946A48E976F476290851DC86CAD84284E5566DFBDF3807DC293F096479E1874D9E74EA1173BC18B8B08388F09538C0DA7614735D67D91170E0B033FE63939BD681B27D1376CB4E94EADE81F1045C849AC591B33561CCB3925DE65DBB9690CEE1FCE631B25737E5FBD1D5BBE4580D5F83E6701680ED74EDCE727E1D ss = 4D8A2D9ED0982994EB99DB04B474652F count = 25 seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 pk = 8279844007ED07AF756FFA31D2979D823E06B28B6BFFFCD81D49A77E9EE12B669E9BCBB55AF3A39E6C42FF646A4873BFC6B39C08E0A3CBB9DC1164064178038FAE82B00212DCDAB441E1A7C21111A21F43BA9364180703E5CD0660130787507C1D100AC7A70B1D6FC895876404833E5D6D172E2C276907EF144C19458A0F18123A4AD3DEC2AFE843D4FF5349826BEEF6D97E32E28695293750D57EC946E4E9F0DB3F67BA06CF8FAB2D51A07791981934ED692E7B5332EF4AE9853EE23EEA35BBAA49960AF04BDA02B9DA1D6AA17E0B6D7F9824775A58050B6511BA203F3A1C25AA150D7B3E6DFDE3BCD45EF19FF04FC9AF6629F86F741639FA534501164DA5B427BB92C45BCF422CB86E14E89D1F0C4A70E3F63CC17583FD2DD953FE1D9734CFC2D26DA0EAFFD2346E98AAA642A0267C734049236409D5B6BFA81F4390B566575741FD5FC2C4212FA4C8652E24E468A25D1D1A2A6170296E55F6605363D1EF1E92860CF0F756C3113FB735E4899F655088215EF00FC439A29F37 sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A42E1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141E098279844007ED07AF756FFA31D2979D823E06B28B6BFFFCD81D49A77E9EE12B669E9BCBB55AF3A39E6C42FF646A4873BFC6B39C08E0A3CBB9DC1164064178038FAE82B00212DCDAB441E1A7C21111A21F43BA9364180703E5CD0660130787507C1D100AC7A70B1D6FC895876404833E5D6D172E2C276907EF144C19458A0F18123A4AD3DEC2AFE843D4FF5349826BEEF6D97E32E28695293750D57EC946E4E9F0DB3F67BA06CF8FAB2D51A07791981934ED692E7B5332EF4AE9853EE23EEA35BBAA49960AF04BDA02B9DA1D6AA17E0B6D7F9824775A58050B6511BA203F3A1C25AA150D7B3E6DFDE3BCD45EF19FF04FC9AF6629F86F741639FA534501164DA5B427BB92C45BCF422CB86E14E89D1F0C4A70E3F63CC17583FD2DD953FE1D9734CFC2D26DA0EAFFD2346E98AAA642A0267C734049236409D5B6BFA81F4390B566575741FD5FC2C4212FA4C8652E24E468A25D1D1A2A6170296E55F6605363D1EF1E92860CF0F756C3113FB735E4899F655088215EF00FC439A29F37 ct = A558C101EAA95CCCA8F77EF84D78F02B24BBEA29A1750FFFB2B39D65D92233AC059BEBAE2F1CC14BDC06F36B8520C699B9C3353841DFC8BEB7CC7B8485A60239AAAB9E9768509CF5613419F8C777EF4FA526ECF0DB95C3E2A5803B91C94450E2D4650426C31AAFEFC8578F0AA636C645430A1B99DDBAA0BFE8E582AE68254BF3DC5B47828DDD9746F4679B413B36F5EEE1958C2365FBC11B9E61B943FC333E4548ED38CCF3FA9A3865F2F52881386D38774FD442F5A8B8441B6E6E5020BA62A508C5CF34463489F843CE8A03DF70BE4EA8BB1A25CCC56E78E36222B42E9B10575B2DC0C46390A4628C1944CDF678F0C37C1EC4889215440621848F3A5EDC35B210A9D03D76673F13F03FABFE0685399DFB2D63F27C188255513776ECBD20759C21F3D2742DA6F19F036869B9ECFA1A996738D7DE2597B08502FF3E647727B8F4F70F71829BA84C794815F67C2EDD4A0EC2DA465DAECFB65ABF7B1960A0A084C1D15A9613868177CE175D696C6F85945679983DDBCBE95AF16321B73D932943154C984C8AF76058E5CDC675B72199FFFC11D5 ss = C1E47D780D50986E263DD4BD763378A4 count = 26 seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 pk = CE9599CC6FBC1FD726E186FA7D4D44B642F7A69698CAE6B5DA5D30C6DD01D95554808827411ED0154F3D4D641B1E9DAFFDD0204F389900DA38D06354315D020B26A7502C2CEBD2FA830BE567A3B3B151A5065484BCF23C4008E518978EDE6AC321287198B2DD345D145027D4379E2AEF221D7AAAB60E101A15923574BA351B8B72CFA003854B8F9195433A913632DE93C00F4E8E47CC4CF4D43724F9A30951C94D7846684451C17176A3F3E886EE08E3A0CD19CE6A9C498C8B1077350B6D79BB7382FC0FB7E339643196AE5906DC597EEF5213723738017876B5E149BFD83942E33375A19F93C8E129CAC0BD783EFA5E3917EF1F8949246BCC10DC20DED4FE598AA3FCD5FF773E9447040281B8DEE853DF7E0F8514A272C79E0DB0F92C43AE49765BC086CB6326C66CA297C12A46C97E6070E0BC5135FC3C8DDE16343DB796A30FA71DEE9058230EB5D764FAE94B60A13BE648D8EEBDF22D9DEC9C019CBCCA8A9585B59D42A8F84D7E37FE367635CAF63F6BC5BCC706D81E6204 sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA02CE9599CC6FBC1FD726E186FA7D4D44B642F7A69698CAE6B5DA5D30C6DD01D95554808827411ED0154F3D4D641B1E9DAFFDD0204F389900DA38D06354315D020B26A7502C2CEBD2FA830BE567A3B3B151A5065484BCF23C4008E518978EDE6AC321287198B2DD345D145027D4379E2AEF221D7AAAB60E101A15923574BA351B8B72CFA003854B8F9195433A913632DE93C00F4E8E47CC4CF4D43724F9A30951C94D7846684451C17176A3F3E886EE08E3A0CD19CE6A9C498C8B1077350B6D79BB7382FC0FB7E339643196AE5906DC597EEF5213723738017876B5E149BFD83942E33375A19F93C8E129CAC0BD783EFA5E3917EF1F8949246BCC10DC20DED4FE598AA3FCD5FF773E9447040281B8DEE853DF7E0F8514A272C79E0DB0F92C43AE49765BC086CB6326C66CA297C12A46C97E6070E0BC5135FC3C8DDE16343DB796A30FA71DEE9058230EB5D764FAE94B60A13BE648D8EEBDF22D9DEC9C019CBCCA8A9585B59D42A8F84D7E37FE367635CAF63F6BC5BCC706D81E6204 ct = 289F78A97169C9830B2D998BDA6FA91A2AA7977CC9AB353382F7583AC2CF30D356D68FE166287E76258B6F20D13D56625E7EC496ED1F2133ECF21456D2F008E99AF70CFF77D796DB88E9E797BA70109CDFBA95B68B314CBBBE1117A92A266245A03180E90F65EAC133DE89A32F25B42C376ED2C13018828D6AC0748C563D13BD77DD19D75E8DCBF7AF484FA13B0874B82F7A5CF93BF931ED1A1F32EB2FD1CCA3EE6196FC6C6214FDB87CE278BBE17935E4AD4D6386109B46B51014AA360B3F0DA59B8FFA65D8C50A62C7F0258D1112C0C1D4C0D1B6793EBD65898D4EB8F0F3D0BC34D0F7DC72DEB0B7002B971CBEDF4EDD0624759C4F1AA86EAA8B2F75595719DB2350564F7DAD681ED09E0836E01B39B704D5882FCDB8DA2774BB2187E4EC25B3AEB30E47A32B312B944E6467D292EC5AF5B16FF970F44C49913095346FA5B36928CA2957F3989AECAA36899E3B14522B65E6BB541FF27F9E1EF470E3C738A26F67C8DF9B580112C2C72F958E437BA3C019CE3A233DF01BC028B19AB3CC3BA74AED19418FAD15F6FFAF2FF6C630D3B6A27C ss = 5F41497B81BC1B01750D99ACD47D7C3B count = 27 seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 pk = 8040151EF6F2F1FACAD513E56755FB7836A4E36AD9B4998879CF56E2FA2B1C9DF9B4A77A36EB93921E68E7FB21C54746B8F68FA766D9B3FED202577EE9043DCBAD7E5C58623DB70CCF1B3B341026ABB5F675E3DAF0C6E1045A9D682DBB5318CE310796CB1D2B4666EB36C6484874D3DD592E8650503E927255DF91E98B0BBECC66DB58F4DAAC243B2334226D53F826F6988D7C3D38551927A784C8BD862BA074B8C940B356977958BF06B2B6CD27DC52C9006901E741533E6104210B1CE5D8878F8C58318BFEE9AD0970BA2DCB0C15178B4F015642042870090A3468022AE3EE3EBB054F30CA55FE9FCF0E00D1006D156C123843B6338462A5252F031D7D771B64701D1DDC6828EE2A0F94517F5A69B39E4184637D1E4E51DA87DD67B01F97C5E0FE58C0C06D47AA53816B74D013E163CE8A0919308AFC6646FB150137C46918B5C4D348D3A07C533817027AA0534654EF8AD68A0B5134D40D453DF25B20F6CEEF0A637A0FF7E11D59C638AE6EBD04B62E5D12C5D1D1FFCAB231 sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB5671600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB60F8040151EF6F2F1FACAD513E56755FB7836A4E36AD9B4998879CF56E2FA2B1C9DF9B4A77A36EB93921E68E7FB21C54746B8F68FA766D9B3FED202577EE9043DCBAD7E5C58623DB70CCF1B3B341026ABB5F675E3DAF0C6E1045A9D682DBB5318CE310796CB1D2B4666EB36C6484874D3DD592E8650503E927255DF91E98B0BBECC66DB58F4DAAC243B2334226D53F826F6988D7C3D38551927A784C8BD862BA074B8C940B356977958BF06B2B6CD27DC52C9006901E741533E6104210B1CE5D8878F8C58318BFEE9AD0970BA2DCB0C15178B4F015642042870090A3468022AE3EE3EBB054F30CA55FE9FCF0E00D1006D156C123843B6338462A5252F031D7D771B64701D1DDC6828EE2A0F94517F5A69B39E4184637D1E4E51DA87DD67B01F97C5E0FE58C0C06D47AA53816B74D013E163CE8A0919308AFC6646FB150137C46918B5C4D348D3A07C533817027AA0534654EF8AD68A0B5134D40D453DF25B20F6CEEF0A637A0FF7E11D59C638AE6EBD04B62E5D12C5D1D1FFCAB231 ct = 1F0FA0104C96144E7C28342311FEB27FAF006F7E065C297D40EA0366793B14EA89F0950684364BBB1807DB5CC343617ED2C294F955E89C7D3FAACC6335CE29EBCC10DC040A255C67A11C6DDB62216BDAB157CBB10591367F57DA8A2034B8FCDE021D96815407F76ECF46E636528B486C506BB41654914CFA6EE82E59722D2BF1DAC285BF3B8AF2C1BC8A49597C275A1B8BED243FDF55F35A323B5CFC71030F90879815700A231CFB298C5827852801772624CA42EE84F9B66933F28E2F3945320F777522A373C02BA874F3D37EBFFBC933BF07037B3FB6821A4E8262467112A9A3E51D5D872F1E96BFB4113A5C3282AA65B9C16ACAC8EA376B163824B3EAA169587D9B416BE0455353D3F32C992C199D362169C73472534BB16568A702E5CF3C320F53E1CFA867AD0332904B487FDC2CD8D054A45E2CF490E6C93EA1DE39D97662877268386D684F044D09A1EF6BE2F5EBFB6D66DC7EDCAE80542EC71F8CD85FF83E7EA87458EDD16CD6DB61BD3BBE604283538445D86B022A1A405A399CCD476A0AEB865FD29A37621C3851BE47E31E9AA9 ss = DFF7BA4FE3860FA139A2D748AAFFED87 count = 28 seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 pk = A84E38AE1C3E876C77635707A79507625B8E65BD47B168BDFB6A2D0325DB44F125C791940CC97428BBF620FB79F175DC697A9FA1367FA36C9577CA5ABBCE0CEC0DB3F441869FE4426B5D6202B6D3F9D24921F8530ECDFE9A10DF5875A850528F142D62CB530ADF9BB2F9D05A61FAB58AC113B87835DF34E6BBF9B5EF0424E13A2FD86DB5DBE31EDB2A7D11F3CBB522409E718371C59DF5AC109792560F60A96DB5067820694A4CD1006E43CAC5434BE2291687B0E0B2675C31AE8ECB3645BA884297BF32237DC6888B7E090E7B9A82C2743489D019C1E736A8FFE3534DF4EF076B36E2E6E921CC0947203D6498BD8FF1B639CD8FF07F73985B73BA28B982F9ECAAB5441A201CCDA36D498BA840089B7B9B68FC7E819499A3DDA3A101A0BBDA6A6D3D4D6F791C9E417EEEC10CB5273A4E198540815A6E94542DD02C73908A73D48F346CAD48102DD7BD311F5DC56403A70910F9B04FFAC8D0210DCD96601B26A021CCA33DAE386276BCDC54C57FA39D54023B8757C14AEB4A7F11 sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D70E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F440FA84E38AE1C3E876C77635707A79507625B8E65BD47B168BDFB6A2D0325DB44F125C791940CC97428BBF620FB79F175DC697A9FA1367FA36C9577CA5ABBCE0CEC0DB3F441869FE4426B5D6202B6D3F9D24921F8530ECDFE9A10DF5875A850528F142D62CB530ADF9BB2F9D05A61FAB58AC113B87835DF34E6BBF9B5EF0424E13A2FD86DB5DBE31EDB2A7D11F3CBB522409E718371C59DF5AC109792560F60A96DB5067820694A4CD1006E43CAC5434BE2291687B0E0B2675C31AE8ECB3645BA884297BF32237DC6888B7E090E7B9A82C2743489D019C1E736A8FFE3534DF4EF076B36E2E6E921CC0947203D6498BD8FF1B639CD8FF07F73985B73BA28B982F9ECAAB5441A201CCDA36D498BA840089B7B9B68FC7E819499A3DDA3A101A0BBDA6A6D3D4D6F791C9E417EEEC10CB5273A4E198540815A6E94542DD02C73908A73D48F346CAD48102DD7BD311F5DC56403A70910F9B04FFAC8D0210DCD96601B26A021CCA33DAE386276BCDC54C57FA39D54023B8757C14AEB4A7F11 ct = 89A76D1EC84283D0962457BFBC983700C07E3BEEB4EF3663240F7AED7CEC2F894F281C75FB13867C38315CD60CC2F9359A72657EB628FDEC18E9CBEEB6C70AE216F545F508298546E6833BF59025BBD178B1D0C4B0DFDA14C5D0386275DD1684D9D5960D827EDA45C4AA2130F42DB923B80E72A84E067DB26234F550D20313AE3F4A6BEDF5E739E06C3DB67C4FE786AF683D4A4C6580FCCF353A9B69AE42BC875F315CF783347301C63A17EBDE1F02971269D105E9B22E00C556E8BA12372397F9C457087C62EB6ACB46F287194ED3A1A3A150CE594E935E233E6D1BEAFA055D9F165E750CD9AA599D48020EB62B4AE88DF7277628F1D333F1EC0910C8390BBD8F7384AC67474ABBE19C80AD6170D80B767F01E099F988C1E905418BE1CABA9B342672DAE18F246246C6AD9F47EB192AB189BD5455BE1C2AA848279C3E4BE28963EA258FC83A473F44971CC7B16EF791A645F66AFD5AF42FA4F515431C79FD284CE75FF35D3AE77A2100C5D28A82F12E423A9EFAE6C76250C62D7A6869C82ED45A41170F21E7FAB4FE7E082BE872D897BE90 ss = CBCDAB4276831A699154C99595F1BD3A count = 29 seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 pk = 602FA1C3C69FEEC48E7FC1586A996317BC4C857301F0331CA908B7DA4FE4DBAE7E191E3450ADD014DD3D21213536432914B27D88E0B5B7C5A3D1A8CE59280327F2B8CC2A5A3F067A58A0213AD72657F3EC2F6F841ACDEB7F024B7E4E7EE885C0AB8489AC68CC497009A19C3B3A2E70DE295E211D004A36A8AD198310F13AB7641988D29714D3CEF1EEDDF02196AF445ED7443D45F58E843CEE8EC0E008C64158976FF2BAFAA6CE9F81D4547DA454DBFD41DEF879B5163CDFC650A2612F7B506DED6036D2F9CFB027FFF52D59A74E99F200DB32E125C990D4A3DAD97498AB197E36BD9B7F91954FC07034B196BD83FA41B2F34BDA4EC2B2184C62B725E1F95EE62C54F26E8CB8553E44CD094AEA7FC9036C6B7F47FE582E1CEF86D660233A9EE9A938A2BB56D0B057B4422C2360E84918B5415800D0FF6CF127232383CE42E46CE23522387517DCD20C3B67FCC7BD09AC8C94E9329F6D7B0B4ACCCE0A97636CB9A51EB259E9CE6B061CF606E04C06FA6D7A4B570660C4BF524D25 sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D87750A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C40D602FA1C3C69FEEC48E7FC1586A996317BC4C857301F0331CA908B7DA4FE4DBAE7E191E3450ADD014DD3D21213536432914B27D88E0B5B7C5A3D1A8CE59280327F2B8CC2A5A3F067A58A0213AD72657F3EC2F6F841ACDEB7F024B7E4E7EE885C0AB8489AC68CC497009A19C3B3A2E70DE295E211D004A36A8AD198310F13AB7641988D29714D3CEF1EEDDF02196AF445ED7443D45F58E843CEE8EC0E008C64158976FF2BAFAA6CE9F81D4547DA454DBFD41DEF879B5163CDFC650A2612F7B506DED6036D2F9CFB027FFF52D59A74E99F200DB32E125C990D4A3DAD97498AB197E36BD9B7F91954FC07034B196BD83FA41B2F34BDA4EC2B2184C62B725E1F95EE62C54F26E8CB8553E44CD094AEA7FC9036C6B7F47FE582E1CEF86D660233A9EE9A938A2BB56D0B057B4422C2360E84918B5415800D0FF6CF127232383CE42E46CE23522387517DCD20C3B67FCC7BD09AC8C94E9329F6D7B0B4ACCCE0A97636CB9A51EB259E9CE6B061CF606E04C06FA6D7A4B570660C4BF524D25 ct = DFF7510B165CB9F29F5584E5DDDBC8C3CB956B474F3F8516E1121FCE930AE7A9641CAE16D79028556C6C68CBD256E325F6554AC9718BB84B21D2224DC7481DC9D010B5965CD5EE23A99E709959FBAE0ADC15BA1BEE2EAC6D8DB69A23CA88DDBBF40CD8F28050BA3EF85BFBEC68E1BD470FD99B56C838BF54FE8B0FD5062A46EFAE8DDC470F28F522A81D00690F96F16B7E6D332F6E3E0EC121D5F962BE727D96623427D27835CF7ACE9FF09F920CD4FD6FEEE3FBCA22570C7BA1E44C2692C16FF72A863B02041B89863EE94082F4E5BE780103FFEB01F31945B76EEDE4A93F9203A42CAF45B3FF0DBE8B510A0FD486694E7876A6563E41562C126A2D1B07FDB0D9631A4B176F6C8E43C281DFE47B699C80F3675894F418E041DE8F795BCC5638A1430AA8DA7E77790AE036C6A167EFDE863C81029311E2E1AED01D1FC3AB69CDFC3E41AC1462BFDF6F80F33BD0C2C1D7EE75157B492AFD539F188E93260127A97A5899BBF7332D7B51A454E7A441FF4229C9843E17EC81CC3D021A5BDC35EAD3C3B75D13EDC5348181D09615047AAB3E7A52 ss = 772CC9C84D47BCA08F41B27DD594178F count = 30 seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA pk = E84E74A51A664F28EEFD16F9EC713AEF6C23DA691B46B14352ED75096E47764276CD9F9801480CA3C6B8225C9CB876E6C617EFDB0C81AA67516347F368E80D339B639358BF0ED636A71B39D0089C3AA7A90B810745637BD27477816D56653A90CD8D1EEDC71712B109885524B7CA9D008764D9579C903A01B772A10CAE0E8FDFFA8A9734DF09CD084B3A2BE7402F7C13514BF0FE170B3C92B5E5523B83AF214900EACFDFD9076F315E5880E65967BF0BA131957249C6A4C0E618DD290DC3CC039D1C2E392BF5BB14D70CEE118B94E727DAE15BFD0C1CF688BD5143E58233C7981459FD230FAC0A444EA0E657345FE0F60799690DA4FE32671023173DBF0A4AA0DEA36A9FFFE0A2939EBE6EB4216EB6D0E2F5F10ED26F1097CDC1CF8C8106E57BD756ECEDF8DCA8A43584CDCA0DBE7B2A6C68D3341E5F458AD229290E94B5E942E263A9142B868F41CA841E11F05499E701D6C0ECCA5D60CB2DE0FB67A4B6544DC7BD403233D5A87ABFBED2BDAEDB2345399D76D41E89E2226C3F sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDFF072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5E0AE84E74A51A664F28EEFD16F9EC713AEF6C23DA691B46B14352ED75096E47764276CD9F9801480CA3C6B8225C9CB876E6C617EFDB0C81AA67516347F368E80D339B639358BF0ED636A71B39D0089C3AA7A90B810745637BD27477816D56653A90CD8D1EEDC71712B109885524B7CA9D008764D9579C903A01B772A10CAE0E8FDFFA8A9734DF09CD084B3A2BE7402F7C13514BF0FE170B3C92B5E5523B83AF214900EACFDFD9076F315E5880E65967BF0BA131957249C6A4C0E618DD290DC3CC039D1C2E392BF5BB14D70CEE118B94E727DAE15BFD0C1CF688BD5143E58233C7981459FD230FAC0A444EA0E657345FE0F60799690DA4FE32671023173DBF0A4AA0DEA36A9FFFE0A2939EBE6EB4216EB6D0E2F5F10ED26F1097CDC1CF8C8106E57BD756ECEDF8DCA8A43584CDCA0DBE7B2A6C68D3341E5F458AD229290E94B5E942E263A9142B868F41CA841E11F05499E701D6C0ECCA5D60CB2DE0FB67A4B6544DC7BD403233D5A87ABFBED2BDAEDB2345399D76D41E89E2226C3F ct = 67C81D37A9D752BC533D20675BD31F9841944B908A203302E2D2064153E051347D54795294182BBBDFAEF34EC19FAA858C0739C0CCC010F7FFE790E5D67E0A79D26D5E23FFC0BB41F41EBAB2B42E869722D294A88F391D7BD95BC9FFB8F81AC0EFEA51022E497E32C9D96592BF9B8BADD0045552A93FA805874A4DC3472FCBDF3DD4414893BB48F75EDAF36E4010CF3BF1379650046B8635E2B9B1954E68EDEB04609DA133E30B118CD130B8FA70B905F08EEEBC86D8AC707AC0E8640E61999A76A9FB260A39BCEF26A4D9666F32339560EC3CDFDE187EFBBF538A15042DF03AF2434B4ACB2337FA859B4A148FD340D92408E7A17E9306E9B16C6434A46C3BB2AA4C086390B7421325B864F0D16CE21E138887179702FA207B65BFE42A803F67439B4259CE7AA97829A9D91C975EC0577536AA9EA4E4DF6B99B710BE57D56E1B538F7909940068DF42A47171E61669DDF1F0A3F346E963F897F3B29E76443E5A7225D919350009FB03CCD59E187533035A3E6999E6B46FA00B0A7CBAF81176849220EF4758AC61D2A3B6E0F3206A9895769C ss = B2685302535EA18B700997146C2A54B4 count = 31 seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 pk = F11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6735A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DD0DF11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C ct = 1AD7BDD059DF883874EE21BCFA59493976E56B24EA8A747D586F462632E84AB3FD39DB97218916D927AFDBEA2DF448D940C664A3DAE6671AEB5030A65DBA39C75CB1D9173D0C1C9FCCDFC84DBD3A6519488F63E894572D134CD382DAF793B27B41253786BBB7B1E717F51335466382463DBB2C9CD6E53A1E4103C7671C0217C64A667A7D24DA0E1616A1AF9822171076717A2AE2A52E50D9A1499799885A8926F96410943D53E006107FD2749D34CEAA6CB5DEAAE678CBD527DA66DF215936E1AC8DB2A6177B4E17D7947693368B287AF67EF374B145D484EDF3890CC2B2AE378257BE4651859F9757BB809AAB434D045CC92E219E73A19679B50415153C704FF16FD53C5FB0E13361D444B64B41AD05977762CD174A3BC87A888844F223A799B360DBA68886A2E532DF2E893C8966FE1E2081145A3986A0114324B1F9A5677C5865D721CFF33EEB65112CA880F47E3F483AA76F078A22D1BBDFE80A0D3E672F5322A8EB72E23028B94997F911F6C0AE21A837A46C597FE0D53201E426F9C4B9B37F9B583ED394C5A9DF4C2A8A50C6166CCE ss = F7D9BF21FF4E2112EE4AD1C0811B2B32 count = 32 seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 pk = 09C8B819C7866E21006B8DE22C28AEA4AC787B9EC69E0C25848B34243593AF30340DF2A8868EA66E31B91E041B18C62CAA6322B18EB19B9FFBB17B5FC9BE1B4D279DCD851E0BA8695D0869254975D0DAE7952E4D92F991A287683694EDDF6E25D08C338255D8FC8A4D91173D73CF56CE890C9925520B38C0DB6F0DED2437324A568482E9BA4B7CF4693CCCADE63869163854E8A081C063F86EDFB342DB825671CBD4641BB8B2CD88971AD57393F618E2EA8FE7D79C764FA151755C6712B9EE564A98B294E3A41ABC33C06D90F7928AB797E3A173E1AEDEFF704EF6B64BDED85F925D4428E9BA58C3222D9512B7DD2E5F4C4A5BF77CB68BEF10CB992C0D1309E734B5160B67F260F8119404F1A85B22E79BD202CF9952AA0CAB0C21C12F1B6EBE0C6A1867291F9EC2503C51C0AFA08C978A24E07E32411F76C9470843C04E4B542B463198911E20369A5F5B849FF977ABF028BD8AD61326BE23F5679A0207D73B3DD6B13DCEA58F67D9A7159BDBF708955D0DDBA272EB9B476405 sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F036B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA20A09C8B819C7866E21006B8DE22C28AEA4AC787B9EC69E0C25848B34243593AF30340DF2A8868EA66E31B91E041B18C62CAA6322B18EB19B9FFBB17B5FC9BE1B4D279DCD851E0BA8695D0869254975D0DAE7952E4D92F991A287683694EDDF6E25D08C338255D8FC8A4D91173D73CF56CE890C9925520B38C0DB6F0DED2437324A568482E9BA4B7CF4693CCCADE63869163854E8A081C063F86EDFB342DB825671CBD4641BB8B2CD88971AD57393F618E2EA8FE7D79C764FA151755C6712B9EE564A98B294E3A41ABC33C06D90F7928AB797E3A173E1AEDEFF704EF6B64BDED85F925D4428E9BA58C3222D9512B7DD2E5F4C4A5BF77CB68BEF10CB992C0D1309E734B5160B67F260F8119404F1A85B22E79BD202CF9952AA0CAB0C21C12F1B6EBE0C6A1867291F9EC2503C51C0AFA08C978A24E07E32411F76C9470843C04E4B542B463198911E20369A5F5B849FF977ABF028BD8AD61326BE23F5679A0207D73B3DD6B13DCEA58F67D9A7159BDBF708955D0DDBA272EB9B476405 ct = 5EB0EF6306ED2DA3349B96D8DF6C877DF9251EF0742858F836C183E2BBC104945915058FDCB10D705B9E6E4525AA782B08F6DB143F1B063E6ED4770E22AF17D41B326A0099CAFA6E532B2749871C955AF3DBA379F1CAA22CD8547F32F284548CE167B71437FB570881EA43DD260C5663CEE7306B6E0DE07B9528C1ADF70E7D810031BA9D2318A8DE489E2A8DE8EFC2A48FED222CE2EE81A1299475BBE2BA89EA01093EE7899A9AA22F10C418A57F3E07C1F7E8BDB6CDD95AB81668A73DF595CC9C9B94C09C836C77CE2EDB27F26D5499567A44B056ECEB5DEC817758FB38456EBFFB92114452030D95CEE601CA5AF0FB8F49C978100FE421E435AE0683542C4618A19932B6B25B64668017411A296D3E0CF13B3176C50415E5E9EB474BE94ECB104E6D5E2AFC78A21B8AB82C586A7DBBB81CE389F8D9BD8A6ABE3EF005B2B3ACD5853259606ABE4675E4A24FD71DF08410B38492EF65300203D87CB25EF21944946DCBD9C122E95B385AEF1B7005C066CFDB604E21372EA8D90096BE597E14A39450D87E1B6E7246D5C78FEC6D97C37CFB7B ss = 84B8602DD674AA0BE4597F8A6416FEE1 count = 33 seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 pk = DF1ECEAAC4E613ACAB5B4E81D5C877DFE08B2313FB3196E6AB3ACBB8C4283360646AD45391FF36162D46F75235ABA8E766332956420B21C3EC5A14D01F003C1F267C6386AE7363642A4D33C38D886AD637FCB716E67B5C94392B4D6B19DBDB147CE0B62C41C092D6414E7E318B80E29BB321BE4959C0577850E1FB33BA251D5D4AEE9C1918B8123E70DAD5BFCC94F72322DAD2315111B3C654C5A98C37A3DB1E846EF06289D82109B8C8F59669A5EC82D1D25A29A5F503ED5DE2C8FF227A8A0AC553CCC3AEB95F2BBBC794D8B0BD947E785AC5E3EE4D9362613C90CD687D1124B3BFEC0725A55D7DA9454F91DF9CE2352BAB349EF96846BADE23D90DDB62DAA3CB5DB6457AEDADF67E496888AF65BB57F9CAAA4D051E8D80B626A38B1E570A77BC0CF052A8DB6F2EB77A83D59AB4162552D903B5E99AEDAA35A5389750AF399B7BB5492F60C3DED13E5659166E29FAA219AB48C487F8B409C7DD8EF1D33FD4338307E44F1207B250ECAB66C2430314FF4D128C1B7DCDE003A824 sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C775D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2ED06DF1ECEAAC4E613ACAB5B4E81D5C877DFE08B2313FB3196E6AB3ACBB8C4283360646AD45391FF36162D46F75235ABA8E766332956420B21C3EC5A14D01F003C1F267C6386AE7363642A4D33C38D886AD637FCB716E67B5C94392B4D6B19DBDB147CE0B62C41C092D6414E7E318B80E29BB321BE4959C0577850E1FB33BA251D5D4AEE9C1918B8123E70DAD5BFCC94F72322DAD2315111B3C654C5A98C37A3DB1E846EF06289D82109B8C8F59669A5EC82D1D25A29A5F503ED5DE2C8FF227A8A0AC553CCC3AEB95F2BBBC794D8B0BD947E785AC5E3EE4D9362613C90CD687D1124B3BFEC0725A55D7DA9454F91DF9CE2352BAB349EF96846BADE23D90DDB62DAA3CB5DB6457AEDADF67E496888AF65BB57F9CAAA4D051E8D80B626A38B1E570A77BC0CF052A8DB6F2EB77A83D59AB4162552D903B5E99AEDAA35A5389750AF399B7BB5492F60C3DED13E5659166E29FAA219AB48C487F8B409C7DD8EF1D33FD4338307E44F1207B250ECAB66C2430314FF4D128C1B7DCDE003A824 ct = 2FBB4B7D16A035D71A43587489EEF8EA6CEA196FADA08189419E9D50B20AAE6D54A67957C6FCF426CE8B47A16BBB423A82E8D009C58D6614B497F2C6D2B12ADB6A8F68A146C859CF72C05B97BC093479B557B064570E93359D4DE97A6893055A02F368F326765169DC55C1773182C22F14B4ECC549BB867F0BD598A6AF095E14103E48B815A5833E52D2F50C5F257B01B702197470945B52C30666D5738F5BF83C55CBD02984190724A315D4A95160E111B586FEA19B94DF37B8ADA41FF5D848D2779108EA429BDEF9669C80BBE25633114659F096EE9ECE8F377191815F4322BDDEEEAA143D1294D6EB90ADE4DC75AD81326ECFFFE65A91FF955D3778BF635060F88D9F880871AE9E5D464D76B9FEAC1C1DFF4442216C30B03B871DCEC39B2CFB1BF0862287B7E9C4C30B704BA628EA93B5C6558D8FA869B4603A567F996DF351F2D0535C4601730D056D357B49E9139408EEA2F0E1A5794812E5A2D303511B65DA8F8CD1019128D7F22A05F8143144F4F7E184E7280D1EA815B2226E4BB153A5FC6AF18539F7797CACB4F80E3334E452E2 ss = BABEDBAC90695F480D6DE1302F6C7676 count = 34 seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE pk = A2F678AF9D971B311647B0678E2CF00415BD9DC09B4A2C930527F271BFB61B56409471B321C8C2F43D9CB54A3A2103A3EC40CC41DB68CA8DF9191A5B9253397901CD540FB69B91FD5D7660B55CCF3463F78F521CBEC327892118A95D3DC9826A26632016858609360821B03CA33912209316F8AAF2FFEE278E65541861236A165335CD20052D1CAEB26DBAB8CE5F7F80E9127A6FC70EB0C3178E8A7DA09EF66697420E16A0CA08FA41958B6F8DBC220640A88AAC9B3FF381251300F821C3359FD37B04095BC5B801EE0354F49DDFED8DB4FD4A4EA41C91402177C6FB23DBA45FD96B6C12908987EA21E023B67222CA4E5D5299C3A5468BCB2AAD53109637E0B1AFC522F5EB9CC6C2B64DA86F4493621FCD46A91D6A76134876B6C31A105252E3414F417D1D9ABF4711A3788B6677BFF3D2676C047C1E4B059A6513C7ED198B1056EE3AB0B6157110F32EA080EAF3A5EE21B110AA47E4C45546DBB024FCEA6B1E32ED1A108CBC2F6EB8B86FFDC5AE005010D0AEF5DB15EF7F913B sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB12248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB0FA2F678AF9D971B311647B0678E2CF00415BD9DC09B4A2C930527F271BFB61B56409471B321C8C2F43D9CB54A3A2103A3EC40CC41DB68CA8DF9191A5B9253397901CD540FB69B91FD5D7660B55CCF3463F78F521CBEC327892118A95D3DC9826A26632016858609360821B03CA33912209316F8AAF2FFEE278E65541861236A165335CD20052D1CAEB26DBAB8CE5F7F80E9127A6FC70EB0C3178E8A7DA09EF66697420E16A0CA08FA41958B6F8DBC220640A88AAC9B3FF381251300F821C3359FD37B04095BC5B801EE0354F49DDFED8DB4FD4A4EA41C91402177C6FB23DBA45FD96B6C12908987EA21E023B67222CA4E5D5299C3A5468BCB2AAD53109637E0B1AFC522F5EB9CC6C2B64DA86F4493621FCD46A91D6A76134876B6C31A105252E3414F417D1D9ABF4711A3788B6677BFF3D2676C047C1E4B059A6513C7ED198B1056EE3AB0B6157110F32EA080EAF3A5EE21B110AA47E4C45546DBB024FCEA6B1E32ED1A108CBC2F6EB8B86FFDC5AE005010D0AEF5DB15EF7F913B ct = 0DC5DDFB19767AD39E22610522B06F9E58A8396C04874C63D3762FF50D03FA39FC67104C4CE1D53C7489FF5B2CDF423056FAF2302BC66A61C0334699EB841B9B036CC9CE8A08CB4F7F6AA05877A5598034B98B8E70DF0BC017DB9703974B610C1ACE37D298DFF3B5F88C95153D613764A77470EBE3508C488B60E6842C409ABA7F4DB54046240B96C36016B99989A8F99E3EF735944CB0B8FCA02045F8C2EDBE1F508673DA3C6721A3FD026AF61C61632A042229C15C154FF5E3AB44140D546369AEF0AFDC6A3FB6987619C4707EADE09BCD6BBA53CD32211DE634E59F06C15F52CD6CDA47479A1E339E58073B167FA8B68C24D7FA80CAB4800BBB17010F11BF0D628AEDA072985CFC1013A684A17020B504773D4F34D2B60B798DD976BC0D8C38802F7D1674E26FD501A4FBCCD3E5B06B2C955CC4921747E50A1A8AC73CC1BA2D09244D08E92FD9AA39173F3567FC4B9534E7C20652577C2125407D45CDBCAF4E22F3264F37F3DA89083C41D2581950245AFAFD8A42DF7F173603393CAD5BF9AB9CC54B381A1C1BAE6E0F680020C5E6C354 ss = E4035CEA25E010DD836BD1A03884A8CE count = 35 seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 pk = 86B70341C41E5F675BA450F65CE5A97F0949118F4EE2457303AB7602628EB8D65300F2D856BEC847ACA11551B9C8BB976DC3CC1EC4A5699F048180B2E1BD04447D73D7AC3ABE465A0ACDB6666112902A4A12154327DF54C00CB51DA47F9B1A8EC20F65EC6D1D0B72EA73BD6A991CC327BF9E8EA89161490350416F47FA13E6A5102AC9EBB2191ED34787DC9B480DF868E41731718B940DACCB416A3C48EA9C916FE1179D41B93A1B9866578144D0EF94605899AE95EAF374357FF2EF067F954C91E1451F8B5FCD5774A95EB04B56DF421642D6D95805FE1835AA37C4C68EEAF5A83603BFBB8689DED080A506AC7D4AA49772055997060B648BEA002AEEE6D15A0E927ABF0A15444DC782977DC66A7EE49952157E256B713D6B03FF19CEEC6D17813CEEBB0D6BAD2956DAD630C8111FD5A53677B734713BCEA4C90F21CC365D986C6A784F169436131EEDE061E47BC7C314614C7362097A1B32EF8CC8F104374FD750C882C9CE6DA902CBDC8848B9A6583C72AE05BF4C6B503A17 sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF861646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF0186B70341C41E5F675BA450F65CE5A97F0949118F4EE2457303AB7602628EB8D65300F2D856BEC847ACA11551B9C8BB976DC3CC1EC4A5699F048180B2E1BD04447D73D7AC3ABE465A0ACDB6666112902A4A12154327DF54C00CB51DA47F9B1A8EC20F65EC6D1D0B72EA73BD6A991CC327BF9E8EA89161490350416F47FA13E6A5102AC9EBB2191ED34787DC9B480DF868E41731718B940DACCB416A3C48EA9C916FE1179D41B93A1B9866578144D0EF94605899AE95EAF374357FF2EF067F954C91E1451F8B5FCD5774A95EB04B56DF421642D6D95805FE1835AA37C4C68EEAF5A83603BFBB8689DED080A506AC7D4AA49772055997060B648BEA002AEEE6D15A0E927ABF0A15444DC782977DC66A7EE49952157E256B713D6B03FF19CEEC6D17813CEEBB0D6BAD2956DAD630C8111FD5A53677B734713BCEA4C90F21CC365D986C6A784F169436131EEDE061E47BC7C314614C7362097A1B32EF8CC8F104374FD750C882C9CE6DA902CBDC8848B9A6583C72AE05BF4C6B503A17 ct = D98D8C436743CFE96B7EC82B65ED195736FAA459852941462AD95F1FCBE59FA0A64C16720356515671F71EF4F82C0B96CF2BF0F08E2D1207AE0EB5AFB06C3928B40348BF90460AEEE989DE10F9B2886BBCB8B9CA27B6FBCC49C56B51D8404506387B65F62C555B1A1419231C9AC154398526E756C2364265C374AF7EB1393A513E7DFAE327C08E70741AED32A7093702F1FC09010E2793BB66108D4D78FD78D45EECD23234AC46D7830AC0D9CC7C4BE2387C01FCDC96A10A2E9D20573F0EA50CCD9276297C211AD1C555657E6FFC426E17B5F794C5FBF04E8F68FC6F0DC25003FE74ACECB35959F2D10FA4E4DBC64D138447EC540BAB38030DA79D271FCAAD8D3250C0FB089756E38B8D601CDBB067D297542347A897C1BDBAE726E0B11F82F17E949FA48A09A25DA9E7E8E4F11A9F9E95E5AE58C14574423FA01551FA0496D3B496EA6EC4D444CE2B4B175D46D984F2A8ACAC707DEF1D899D8655C3CDD60F50A2EF3BA77FEC628C030E07079DB8A85BC35883DD546DECEDFB0966D2A49DAD34616F46B0A61C7CE188419F55A7C6ABFBC56B ss = 379C0F6C434A38A8BFFFA5A697B094DF count = 36 seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 pk = 0A204C8B526005B658629F2D6AAC7199AC1684438E8E5EF708B6B1C3A4F03E416B7EBEDE200D47CBDC37A0E46390497FEE8AF9F5467F13F18F5B216EB2743D2E7BAC595915E887F6423FF72D3FDC2588ACF6A42286E3EE98A8141F3C3C59B4862FB2E6FA5677E6C51E44DD78B28A23EAFDF05FC51AFE96AA93319D9AE60F6DC0F980040B841201244FB44342E66F1502495A9FE988A6FE5455CA121B286318460A7B358D0A40AEF423F105EF80DC7DC3D990CAA014FCE667DC8471692139FC8B8DB0F2BE7BA8DEB5EC070DE33D3905DB4DE175F96128FCB87C51AF94E1D841BA0560A0B28B1C2CF545CF23745EBBFCDFC155553C380C1637CBC3A61FD538A8FD2763F6AA63E5B4E5EB174D831676C5F41EFDA99DEFBB57AB78CC526ED727786E51867518472B80651C2084D374AF3EEB472C45AE2A4675856EF637ED6185E1B055883597E40A3934A76ACB5086EF62429F141B14B6BF94773F1782A020A0EDFA54CA3962306DD49F34DB83E2F9D597A65B1BED72D7691D973914 sk = 056661B38038DA4FDD7426F32A81576C73ED84843B30516879238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC5484010A204C8B526005B658629F2D6AAC7199AC1684438E8E5EF708B6B1C3A4F03E416B7EBEDE200D47CBDC37A0E46390497FEE8AF9F5467F13F18F5B216EB2743D2E7BAC595915E887F6423FF72D3FDC2588ACF6A42286E3EE98A8141F3C3C59B4862FB2E6FA5677E6C51E44DD78B28A23EAFDF05FC51AFE96AA93319D9AE60F6DC0F980040B841201244FB44342E66F1502495A9FE988A6FE5455CA121B286318460A7B358D0A40AEF423F105EF80DC7DC3D990CAA014FCE667DC8471692139FC8B8DB0F2BE7BA8DEB5EC070DE33D3905DB4DE175F96128FCB87C51AF94E1D841BA0560A0B28B1C2CF545CF23745EBBFCDFC155553C380C1637CBC3A61FD538A8FD2763F6AA63E5B4E5EB174D831676C5F41EFDA99DEFBB57AB78CC526ED727786E51867518472B80651C2084D374AF3EEB472C45AE2A4675856EF637ED6185E1B055883597E40A3934A76ACB5086EF62429F141B14B6BF94773F1782A020A0EDFA54CA3962306DD49F34DB83E2F9D597A65B1BED72D7691D973914 ct = 2639AC4A3EBB4329945875FC63362EE634804F8302BC5701888CD651C981CA1BB25289B82749EA27D4274F001E9F9BE75CBEF7A738843FAD2DA0FD6F7F5131EEBFF73F9B0101067C2F8F7EEB6FC26441CE4EBA80DFC73A2CB91E1B832B89608064B3B967CA1CAF6512EBCFB046BE702A485880D7EDF3AFA67E15BAEE6B087A91737C7B4C64B59A9A82D20AB75685E4804214BC64B6BC4A21BE3243116E84E00D1D087CCA625C00296D0B0696C50E2F0DAEFA3012FD0FD5DC0F18D93832E2CED15AC4DC2538FD20308027379CB07DC2C89C042FA88B1B6601BD883C3DB2DF4BC2D2A07025DC399762B65F4004B35AF5F24A3230CF137DC8FF47252C0EB90A045B57D480E672BFC4F4A406329EF0D36D6CAB59A026B68082D947439A66966A25A2DC4BE2B14EC26A903A993D9DFE9B48102848FC7F4D4F51826C982D990F9823299D779D2C223377B146CA36C47581F2BBCF2007CB2654A7DF17D57E9419397A34C7AC78AAB68B2F3290F412A227ADA19FA83FFB757D76B1868E0A7E0A9985F22575C17126FBD6A91DD584540735AF5109A72E ss = 115A32B447D3D37F67C59F64B392A3E4 count = 37 seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 pk = ECD3EF5E7652EB979AA17837DDE8D99BB20D2D3A518FE1F4DC4E7667F70E74588F12AD42CF4A8F9A780D616F056D7CB4ADDC728044F25557E93D58A6E099053FD830E142ACEFA7D8F0E3F1F943C150080D853904F6CD179A2FF729338518C0C548E21D92181AA7121AF5EC481C65420ED68319DA707E8621C1ABEACDF23C9E42787721D70DC864EDBE9A621C396CD60DD3AA452B2F5E97A4C1F219B8480F324C9E0AC388E2F64F21E5E90175A1D646549C510DE4EC1E4AA1FC38E14037E53149FB8742ACDD690B96105421FB37C3ECBE7363FE5D1FA735A57E956F053D95C9B486E4D7CC3806535D5F0249CF994A990FCE5D8AB28890C8475F438E34A5CE16D35AE2AC2EC22628C291DC1BFDE42AF872F110419698EEAB5AF766DC8B5EDA9CBE6801948401B9E41ACC3A123DCEDBFEAB24AEBF7574CC49BE0B8A2570E9AE49BAEDC27941490E490755646A1D29F5447C027A30E1BB87D9B806B8CFB3F5336933B353540AF1002419F21EBD4AA06DE1ED23AC8FF7A3397705DA25 sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F30CECD3EF5E7652EB979AA17837DDE8D99BB20D2D3A518FE1F4DC4E7667F70E74588F12AD42CF4A8F9A780D616F056D7CB4ADDC728044F25557E93D58A6E099053FD830E142ACEFA7D8F0E3F1F943C150080D853904F6CD179A2FF729338518C0C548E21D92181AA7121AF5EC481C65420ED68319DA707E8621C1ABEACDF23C9E42787721D70DC864EDBE9A621C396CD60DD3AA452B2F5E97A4C1F219B8480F324C9E0AC388E2F64F21E5E90175A1D646549C510DE4EC1E4AA1FC38E14037E53149FB8742ACDD690B96105421FB37C3ECBE7363FE5D1FA735A57E956F053D95C9B486E4D7CC3806535D5F0249CF994A990FCE5D8AB28890C8475F438E34A5CE16D35AE2AC2EC22628C291DC1BFDE42AF872F110419698EEAB5AF766DC8B5EDA9CBE6801948401B9E41ACC3A123DCEDBFEAB24AEBF7574CC49BE0B8A2570E9AE49BAEDC27941490E490755646A1D29F5447C027A30E1BB87D9B806B8CFB3F5336933B353540AF1002419F21EBD4AA06DE1ED23AC8FF7A3397705DA25 ct = 3A511FB52D891DD53225730289CC02A83FE0DCFC3694D99EB5BE9BF4AF001EE16EE33C1484BA45F7684F1F1534B218BAF49CCEC7F91B6DC66690E85BD1E105AD00BD69C316514ACBDE6C1D43156490E6680E0F9FFD4223F5A8C9E52BFFB05809E0CF2C94647CC8E131C87D95DDDAFE370372AC54536B9D32AA6A6D12F23CF6A143A376721D161E47DF3C724494D3720D73FCF50742816256E883574B8190272C0F45E9352E710C3E033CD0126A5E36C00402358673D7E4501F4CC69606D4FB47A9E3B0057C29B7D0F02A011518624EAAF1C00BE8EA290EE07CA2BC8CDFCE1842271AC918F4802E6FD4FC0E4F9FF0A7B86396CB270B969C5A9254D1217C9EB333C367EF7847A769812BD56D872E5F42EFA03E7EEEC1ACA41B8E05E6726DE973ACAE2B62E2CC17102BE43C6402219BE62E6E4B3191F65E63B303562CA37D9658E848623AE75B1FCE52A9974C68104377219E215CC9F2C584A172ADA04EC3A980817D413666E1094323E30336C6DFF47981D7C21DBE4551A0EEDF09F1168237CCE699D452E72AAF4A8B4767E6DE3652CFAD55C5 ss = 67441C630FEA500715135D01B2BF333C count = 38 seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC pk = 7B6618B5F4274DC7131D47D0801BE79037FE281FF709F80C333065D823FAA35F9288496092B789DA38D04780047D8497EEF0A2CEF6A167225FB1A5FFE5F21A4469007EFCC4F94878198DF179F51E853011FCC448B825B97886853AFBC2592B657C0A44B09E52878AF9CF3DE85939445BE8AEE2C879166470B7D54A7FE80F576D2E19B42EC49507CBBE904D2F9694682243D4B206B621886280FFFD7B42FB2E58805B0611F0BA850FFBD4AF6D12D2320A0254A7A43419F2470B783D9A1FF5715429B0967C64AB12CBA17CCC2B65DEC16FEA58DF742A6DD2C8C973E7FA6456E26C474398E57C3A9BA5FEE996AAE36FB61A0CADF6E374F85794AD983625DCB792DFEDF4AF73613C666101E74CB0274C6BD2236B658F81CF7F811A608A6C015277B83B8F48D0FC5B40BF71E2BB030BEEA82092908B48C9DFE691AFA52AD4EB3520C87FE122617F0659523D5AC29D2B0FA153DB309D784F684DAF3B44BC79FDF0CF86B2FDB39884D7F47B27993BD6D62397226734862E5AE0CB5EE60E sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA62D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D89770D7B6618B5F4274DC7131D47D0801BE79037FE281FF709F80C333065D823FAA35F9288496092B789DA38D04780047D8497EEF0A2CEF6A167225FB1A5FFE5F21A4469007EFCC4F94878198DF179F51E853011FCC448B825B97886853AFBC2592B657C0A44B09E52878AF9CF3DE85939445BE8AEE2C879166470B7D54A7FE80F576D2E19B42EC49507CBBE904D2F9694682243D4B206B621886280FFFD7B42FB2E58805B0611F0BA850FFBD4AF6D12D2320A0254A7A43419F2470B783D9A1FF5715429B0967C64AB12CBA17CCC2B65DEC16FEA58DF742A6DD2C8C973E7FA6456E26C474398E57C3A9BA5FEE996AAE36FB61A0CADF6E374F85794AD983625DCB792DFEDF4AF73613C666101E74CB0274C6BD2236B658F81CF7F811A608A6C015277B83B8F48D0FC5B40BF71E2BB030BEEA82092908B48C9DFE691AFA52AD4EB3520C87FE122617F0659523D5AC29D2B0FA153DB309D784F684DAF3B44BC79FDF0CF86B2FDB39884D7F47B27993BD6D62397226734862E5AE0CB5EE60E ct = C68EA5BA757FCB635FDAD5ABAE154EAF14BD465853E06EB4E4AC8633A0D47792BEBFC63E79F95F13B36F05DA6B4AF50F69A29847B7C9B72AE43FAFEFED110A013AE93D0A74ACE2C656A21822B98C280F77C4D8BB94BE93FC1AB1C76FA9B1C98981ADDA46DAFAF022C718F1DFD6A43E73D1F44538B36BEB649737EECC742A7BE07936A853A5B0CDA890B48F2843D2B83EE7190EF25A5EBAC853FC49F889CC2006DD9E052D21B037EAD45A14D258AD12E42A68C0E551FC5BAEDFBA75C125E025925606E7F1BF215BEB93F0CA49631DB836F87686A3EDABD942E28E33099C8A56C02963C34022202D36D650B48A12CDAF9890662927093EFE02B675D52E81B39D014717BC84BF33805EC736EE08165DBF3A56EF4BE6DB2E5350D0CF186E66B3149177DC72E038CBD877290C2AC99322DF5E3F4549300B30C448EFAE3A4C51FA15AE6103F2DB0DB2F3A280F45C74A26D9E8B1E7D718F0828DDF16690E4FE6B301D0369A4354F9E44EFED5E38ADD7537A55425B5BB397659C2EB6622F63E5C2849CDB46B866D9F16E429B056BE0E11DDA4BF2F417 ss = 26DF53ACC8BBB7F3BDD4525113B593CD count = 39 seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F pk = 5A4955E4D5DFB7AB332EDF7CE441D3702028E6631E409E7D07EF6D637868E34D673C1314A1269FE3FDD3B466E4F4B1A6241E6BB2164913FD91689607DB412112BC76160338A8B591B12D108958C58C587796CAF9FBA42E1C1F46F4F42D8D8BD68F50912F20AF93D7AAC287685FC6EA702A87B16984E4D7F12E1BE4D0063B1757DCD40A72210921291793986DB6E9C80B66E3EB479428EC13BE1107BC0878480C04DA25912EDB1B5016B0622DBCC9A5D2F8B18028174B9434B8951F7816E57E2C5723AC2245706D72DCCB51800C003CE58028202E4D8E9526316004F3EC441BFB49CEFF4EB26669F2FD9C588C325074AAC43C353E1588DF7FDF63421689EF4FBFF24D7A13C9D8FEC83D73774B4BA92BC9735CAE067AC6D444F995A9EE66EC555200D0786BBAF0249BB474D403870FCBF4BDF4F8C9A2B8772C65E402255AC3DB9B7E1BB064766B51AA1913FEEBD33D862B744390397D49AA3FF5977360A78C78344EC26E42EA4E55687B4D5D812F91A19F83B6331B9906A505191A sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A87801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164095A4955E4D5DFB7AB332EDF7CE441D3702028E6631E409E7D07EF6D637868E34D673C1314A1269FE3FDD3B466E4F4B1A6241E6BB2164913FD91689607DB412112BC76160338A8B591B12D108958C58C587796CAF9FBA42E1C1F46F4F42D8D8BD68F50912F20AF93D7AAC287685FC6EA702A87B16984E4D7F12E1BE4D0063B1757DCD40A72210921291793986DB6E9C80B66E3EB479428EC13BE1107BC0878480C04DA25912EDB1B5016B0622DBCC9A5D2F8B18028174B9434B8951F7816E57E2C5723AC2245706D72DCCB51800C003CE58028202E4D8E9526316004F3EC441BFB49CEFF4EB26669F2FD9C588C325074AAC43C353E1588DF7FDF63421689EF4FBFF24D7A13C9D8FEC83D73774B4BA92BC9735CAE067AC6D444F995A9EE66EC555200D0786BBAF0249BB474D403870FCBF4BDF4F8C9A2B8772C65E402255AC3DB9B7E1BB064766B51AA1913FEEBD33D862B744390397D49AA3FF5977360A78C78344EC26E42EA4E55687B4D5D812F91A19F83B6331B9906A505191A ct = CBC61B51AAD8CF07CB60E10BF51DC95B212F256BDA1BD1967F0C3A588F54E58A76FED6AD133D903268F503CFECEF9D408B93AE4FFAE698AEBCE5F104399A3633934105937B40BA859D55E918B9CC00EEDBF2F5F3A0A36E1483931021FFBF8BD62F6AEFF492D207C516EA6C9636C34C424B4D6E659EB30B4EB3C204862510956BC59059E58D90FA65260C393FCB0AE9F4A47CA2576FAA7787E407FF9044EADC94D5F9D729056109D5E0F9D1CCDB05F423A85727657281D1914DDA51A21A1434C7A8CD734C67B58A2210B27BF4A064F44C8E8BC2B13C02E805202A477133352916771A19FC25FA2DDB8C6F45E1D6611E25CE7E4D730D277285CCD26C15690465ABF167F2E3367E0CBE38EBA4E26A8DC299B97F61ADD67E524437D990948FE5C4EA0D11AA15BF89CC1C87D01EF583836784FCA53A9CB960406554EF2B79A18E5C266FC386F51B14415DDBA6BF35382D65AF24B9923E7A8AA47E5E44AE8453F062E8349E275EE571FA8023F5FA3FE58E848FC868CD78A156F32BBE3EB8815B80BB2C2104B07A3701DC486C471DE4699222B148AA ss = 8B439D25A81D260020D4F79C3B62A944 count = 40 seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F pk = AB10F6FACDFD1CD7DBDA4713B1BF169D24FC04639DC320D52B2C18EA3F5560CFCCB2BD9A27BF3FC8999561F54B63F52BFEE130B852B17E3A5E788EB2FB831E35C728356553A2726DD1DD8E2C7BFEB4A610D5C3E662F483A248ECD43773CCC41733EA3B423CCBD79DAE69EFC5A0045958D0974A3F28FE676BB1EC2F903E1B37279100C8A83210255D11A8E75688F0E5CC50F60E8E9D919E03BB8D526088BFC4AFAAEAB2C2C31852D7B141CCF572E96C3C21428377AAC6647BD70A3EBE051BF05403940C5B93FF0798FC316E23F28232473162883FB20D664E62BCA731C36B5786317E2EEBC0D6BF3A0186EC80F0BA15EE5CB44467C64A85468D7CE10768019A63985667848643136930D7BC5CB555CBE1E56EE6C5939D699C9265E28D11F9EB8CA4E805982966F7ACAA69381673D5B2C19811792A55B58CBB72263D7266AC3D822C0A7958B2F414F614EC16CDFF787B3C103EC22B39BB480591D808B18B21BAF85ABF9D46733C2402FC336F1FD7423C7BFCDEBDA7E80DD2A9BC3F sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D7904AB10F6FACDFD1CD7DBDA4713B1BF169D24FC04639DC320D52B2C18EA3F5560CFCCB2BD9A27BF3FC8999561F54B63F52BFEE130B852B17E3A5E788EB2FB831E35C728356553A2726DD1DD8E2C7BFEB4A610D5C3E662F483A248ECD43773CCC41733EA3B423CCBD79DAE69EFC5A0045958D0974A3F28FE676BB1EC2F903E1B37279100C8A83210255D11A8E75688F0E5CC50F60E8E9D919E03BB8D526088BFC4AFAAEAB2C2C31852D7B141CCF572E96C3C21428377AAC6647BD70A3EBE051BF05403940C5B93FF0798FC316E23F28232473162883FB20D664E62BCA731C36B5786317E2EEBC0D6BF3A0186EC80F0BA15EE5CB44467C64A85468D7CE10768019A63985667848643136930D7BC5CB555CBE1E56EE6C5939D699C9265E28D11F9EB8CA4E805982966F7ACAA69381673D5B2C19811792A55B58CBB72263D7266AC3D822C0A7958B2F414F614EC16CDFF787B3C103EC22B39BB480591D808B18B21BAF85ABF9D46733C2402FC336F1FD7423C7BFCDEBDA7E80DD2A9BC3F ct = B13ECE8CD546758E5A087B9F1D332563B5DF735908852B975CE8B14D5B2576D02F8839D66753537AFF52382EFD64513E1A3274053411BC3F8E0CE8C742790944E27070256F992DA4D9453E5C74F52416382A134FD7111320689DAB6CDFD29390E51799477415CBF48D4FFCD76138C0626AB1C45975296F172CE764023F15C3E1E6447650A284E8BCA40EA9FD3A54E0FEFB365B7BEDFE33AB242BD177088DFAFF8B337A27293B5B4BA78314C31138B22842940EC999C6B58558499EF60C53E2B1987851CE8C13CA7A527F844FA9052596D157515C4378A06E1DDDB4B740DCE88EED71854DA267096B307E29D88DCB64DFD4A541EEDEFB0C406708A02D22F558857D98FF6BE1150011DBE443F9E6CE9E925D26A5BB0F29F1435242B64B48C15B8C944EF111C93A5216F1551D5C62B7EEBBB71A352EBE3A27E3EEA5143F95D3EA1729BF55AEA2FA7B0EA42BCCD4B83E53D4352675901F13E01B3624DF1E622E5DA5435ADEC11841FB127D4561B66515936CDA1157100EFF2621E6196B314CFD3E06F97976511026DC7511D87F076C1338B1825A ss = BEC47F1C887EE2DB4C56261F8A1BCCE0 count = 41 seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED pk = 1F2E5CBA1FC922F7D7F0125B7E3C294B25CE775452D3EEE4D679114589C052BDE6E0E8A4871FC5F397D999D7AAC77F52D47D2B07AA20C69BB6ED77112B60302A0E7689101710C73E95C908896D39D8819D289DABB4253C93834688C4261000469D49C0DF3C489984649A900E2B38EFBB2755110330EB817DE23716371107D53CDEB07AD2F7929CE86C8BE5E61DCD0378485F646D1FBD16D266B293B4879475A413B649A94C83EB960A4102C1B277F656F791D6FDF3D1B1A32EAD0F952E743FC9A831F3C1586D4C03B4EDCDEB42B8BED94B455BE743289C19A418DC9BE77D8BA6836E95D836B6D24F4BBD444563941A7588E2C081AA38547EF0FCA9216E7AB3BDD3525F314BEF21F49CC838A75956F81B875693A8B0A76AFB6F12E3EB2DC5250ACC1D892873D2C8B7FD201E16233C50B2775B85246E9E82AF658011DB7CCF28FC95C6A8AB946F18F1BFD37EF9550080585E4BBCD0EA541A525E86361202D4433FCA65CCDB818A80F3440450384A81F9040EFB615930315264A229 sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05F89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E021F2E5CBA1FC922F7D7F0125B7E3C294B25CE775452D3EEE4D679114589C052BDE6E0E8A4871FC5F397D999D7AAC77F52D47D2B07AA20C69BB6ED77112B60302A0E7689101710C73E95C908896D39D8819D289DABB4253C93834688C4261000469D49C0DF3C489984649A900E2B38EFBB2755110330EB817DE23716371107D53CDEB07AD2F7929CE86C8BE5E61DCD0378485F646D1FBD16D266B293B4879475A413B649A94C83EB960A4102C1B277F656F791D6FDF3D1B1A32EAD0F952E743FC9A831F3C1586D4C03B4EDCDEB42B8BED94B455BE743289C19A418DC9BE77D8BA6836E95D836B6D24F4BBD444563941A7588E2C081AA38547EF0FCA9216E7AB3BDD3525F314BEF21F49CC838A75956F81B875693A8B0A76AFB6F12E3EB2DC5250ACC1D892873D2C8B7FD201E16233C50B2775B85246E9E82AF658011DB7CCF28FC95C6A8AB946F18F1BFD37EF9550080585E4BBCD0EA541A525E86361202D4433FCA65CCDB818A80F3440450384A81F9040EFB615930315264A229 ct = 4B9B43530FF0A15D20E0D3E31DD29E02A93B4144D70A5F4D779917111916C7F79F9E11C433CA11499463D83894C04896DB00A73F7200D74875B0925E35BC3742E972F2B1222DEBCB7E1457112B1F7992265B4E66D567507E66068EBA3C4B139884FD2C438BDDDFC9536D8B5D4D963E84BEBF895EDCA44937BF361455AF31713B4A66199832F3831CC147D4DD055C8D9EA6558A2A7A003220434D8AAF25808D7028E9FE9FD36B961F85D51C4C157E1A8A8CF19F76E3347B7FE4EED7F73C1128D523F4C38677A2933F7FF4D462F91CB5233408D7BA92FED26DFE6D51D1EA79741279CE777BF070BBB1FC67A9C35B1BB263DD8AA38D07CF7297BC2FD92FD7A9031B7E4B6297EED234530067059A677BC306B3DB8220CA173A391C37892F3FB0835EF0CDCD75988362AB11F2E9412BC7EF57883AF5241680F37505FB269D5DE89C1A66E3E9A2BFC06F93D643F802A746ABB0CB052F1527FEF9DA4A78E7E700F03151094174D43C589F82D8331DC84E63F36B7B420FD6891BB96F70356A632BC56176D8CDA9E60322ED9843EAA8E6C9A0DC143435 ss = 64367D7F06B9FF57BB12260CD6D53AC6 count = 42 seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE pk = 77F0362429A1BD4764B3C193B8DEB957DADAEA8B7FFFC016C273AD245D876288197901E789151E5429A8ACD710E30F0E61AAA9AAEBE53F83192C441D73F2254CCDF18F1ED5FF67315DCD9203C121573810ED176672165D9DE82E66EE83D5A6702B202C77455874BF6CE0C087F3A4BD6AF72EF3C74444D9A61542BA76B421AA78C310BFAF4EE4D83CA75FCC4741F83453DE1C7274939BE16AD6591580A24503B884EEFE8FDF2BEBCC80A7CD21FA1BC5830B61AB5BA1BD4E833CBBEB213E39835BA680C1FDB616C4D3C6611598B3631C19ACD020A680E095D748ED429345E44B3019AA5F10EC40497DCEC22DD4ABE19EF078C79525643FE7FDB4E34919302869E65C8548286B7BA24A9879074FF5EE55DAC533B8ED50732F853867E747D95E90B9672AC718785EFD5222ACF797C20779A91023533989EFC474464337DCB377FA7B840AECBC37E627206C8EFE2825344DAE9C7E816DD7ACFCED82F3BF6227795154F3FDE22698DE947A9F09757DE12B8DC1FFA3B10DD089BDE26519 sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE0CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C520D77F0362429A1BD4764B3C193B8DEB957DADAEA8B7FFFC016C273AD245D876288197901E789151E5429A8ACD710E30F0E61AAA9AAEBE53F83192C441D73F2254CCDF18F1ED5FF67315DCD9203C121573810ED176672165D9DE82E66EE83D5A6702B202C77455874BF6CE0C087F3A4BD6AF72EF3C74444D9A61542BA76B421AA78C310BFAF4EE4D83CA75FCC4741F83453DE1C7274939BE16AD6591580A24503B884EEFE8FDF2BEBCC80A7CD21FA1BC5830B61AB5BA1BD4E833CBBEB213E39835BA680C1FDB616C4D3C6611598B3631C19ACD020A680E095D748ED429345E44B3019AA5F10EC40497DCEC22DD4ABE19EF078C79525643FE7FDB4E34919302869E65C8548286B7BA24A9879074FF5EE55DAC533B8ED50732F853867E747D95E90B9672AC718785EFD5222ACF797C20779A91023533989EFC474464337DCB377FA7B840AECBC37E627206C8EFE2825344DAE9C7E816DD7ACFCED82F3BF6227795154F3FDE22698DE947A9F09757DE12B8DC1FFA3B10DD089BDE26519 ct = 6B9F8886ABF9DDADEEEE3C619A8610E3CC9D1F950C9A9BC1BB0AE7F132F6F64378268852E98F65501063C7E181DCE1E1235452F633F1B59D4577E3175F473C0BC217EDF63F122F8F24F0158D2092DF96D6718182D06DB15FE28DEEB2F03B7BAF66DDE6078660939359D21A11506AB522057FDBEBC89DC9DA4521DE4F6719C72C97980A9569948E4D3D27FEB2C973D9131F3AF4744E78BF2B67D4DBA6C3D4AA477FB1E68C0A9A7F852802B8E758F1B79FDB7C06FC0A98B2B11E5F69E423E63E9DE45609FF147B236CB9C41FC0FE7BA02636080CA4E8FCC61DA071B50FAB056BFF70690A3B24FD9640F367BC429027AA3338440A7E535FDBC354C2300EE9EECB58CD59439B394D1A27EA47384C949C0A6242DEA52240D58DEE9695AD31D782983AAE49D2A5E6B00FF74D3926E5EB30803054D03F54F13A45FE476D2646097459B48515602B9D4D871584C7FFF381FABAD144A413B4816671FB272264200874A9AB4ED9306CFD9A72FD20709D33F1D99C667CD3D4C0D3886B0EDD2B3420DA6444B389BC573569BF3A73E54CD0108B816729B087 ss = DDE2935E7883F7596BCE6CE7183C2B32 count = 43 seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 pk = 602A5A2B2616CFBA8718C4728D43D0B01F42E575E4C07EBF98651763BEA0935D693E7B25DD19CFF2991C5D4775D0924F5B31AC558880A5E64C9481D693A800BC8541199A9EB6AEB38C49DF2F28884E254FF23C1B406587EDF7A749A9680A3D190A493563C6AEEF16F19EB2DB0E4A1E24F2F6BF077DC962713099E039F801D5C368CBEAB827D331EFB0680ED7741B898A57A1C7F4ADECC51E2018C2F1578C10F35CAB371DA85D824BDADC11D05801BF4D5CCB6C8675D87C0E372B3B5A06F84CBAD3B5CE6D9ED15EEB7D8D159A2C063A81E8AFCD4D5D5AD8179E32962C400A005CDB3E00C50A78E6C0B276D9231947D1DFBA760F2DA385E3479D3911020184F5D186758F0506D624DC883438F295C6D41525FA52674C703D45256867FA7242519793DFE2E24A8E1C239E8DD96DE6E7A4C788829C7954D08A898CF235D67C678ACD36B76328262040D80680C39D810F9B694CE042520965B7BCB90034B4968704872F217F83D8EE2843C5C741F11D364BB01BF9E0F0621A56ECCC20 sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F888C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB360C602A5A2B2616CFBA8718C4728D43D0B01F42E575E4C07EBF98651763BEA0935D693E7B25DD19CFF2991C5D4775D0924F5B31AC558880A5E64C9481D693A800BC8541199A9EB6AEB38C49DF2F28884E254FF23C1B406587EDF7A749A9680A3D190A493563C6AEEF16F19EB2DB0E4A1E24F2F6BF077DC962713099E039F801D5C368CBEAB827D331EFB0680ED7741B898A57A1C7F4ADECC51E2018C2F1578C10F35CAB371DA85D824BDADC11D05801BF4D5CCB6C8675D87C0E372B3B5A06F84CBAD3B5CE6D9ED15EEB7D8D159A2C063A81E8AFCD4D5D5AD8179E32962C400A005CDB3E00C50A78E6C0B276D9231947D1DFBA760F2DA385E3479D3911020184F5D186758F0506D624DC883438F295C6D41525FA52674C703D45256867FA7242519793DFE2E24A8E1C239E8DD96DE6E7A4C788829C7954D08A898CF235D67C678ACD36B76328262040D80680C39D810F9B694CE042520965B7BCB90034B4968704872F217F83D8EE2843C5C741F11D364BB01BF9E0F0621A56ECCC20 ct = 6B39A49EDC15AAECFD30C6004C18FC41E386C5829A525F5638B4EB9C1649E66A2BDB5C7CE761127575B20548A22FFDB02AAA85B02DC5C7E25A41BE4FAA4B1F2EFF8A161EC99BDB706028118771015E9F8A957EFED0AF070D3FF3EB52EF8F42A0D7E43CC605267CC6B4A4C42D0E70CD9007074E7533FCF38AEA4488385E3C6995EC899BC20E9FA0EA8981E334FB00BD7E67C683F4D48D97B63F081D9ED4C47914CA9A518BB957E1816DC38BD2E0A76BDCD316342E4533569E0E0E115E1D58A42C18835836A4A711AD84CD2233D548A4FC324876F47BB0BAB562339E2C86BF2BBF66A58BEEF780BDC57E32EE36C3B43AEB9F8CF5AA67AB1762B36E7F1A9F3804591FFBD59BE3F6D607A95B0786FDDBE023DD5A8F490205DFC93AA19FE23EDEDEC0F6D6898CE3896BE3BF74AFF88BC1888CF16E114736A6BCCCEFEC0152A32C14680687A41E190F5B710C3E7E55682026C31C893B653378502DE947A61820176BA5F3263F74C4BD816AF390BABB6AD563C93322C966DCC32DF2483D2249EA1361AE1FF0456A9B99FB6552A70FFB86F53BAB8A99 ss = 9F078C127285170CF8980292F8D73FAA count = 44 seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE pk = 9DF10C6830490591503823CBF42DFB5BB2C2D9D5930C608919A968E4E7A16AC3B045A0B2E4358732FE62C935D22E40D6B5520391E758E8DAC0274BCF130035F1F8CB601D461FC6D1774C758BEF6AEC09F14524B80109FDD5384BCA2F1AF5F38B3EAC642BA1A7095F21730405BE9613D15ABD9FF9CAC4BDA95C57CFF6951CFBE8473120042497C38EDC87E1B20657AF295B55A1FC5D950235FFA42753BA42388E9D90E4D18F5915AF45E32B36BFADB72847B7DAD881502D7640A08C0339F95D117B3837DF4ABD2BF68EBAF19ACCA53AC3BDDC0BD1C02A0F39EB45FA3704D3B085DBDF36C912BB8ECF519C080AAD77019AC7FC41AAA6307BED960C5D01F4375A97DD2ADB94AFFBB1A624690948B109C2D6C4B2B2A1C25D0D24AFC7D3893060B2C2695F686C67015F09A60F88BDAE9CA4C6BD3CDB056930FB60B2703E72C51F6160226D73CD916E620161316E1D2DEBD4505DA951044258F5E36C6B3A8D2196831C53432D97A09665C1FDF5E67541D0BE0D1A291AEC06574288AA2C sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF8E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED690D9DF10C6830490591503823CBF42DFB5BB2C2D9D5930C608919A968E4E7A16AC3B045A0B2E4358732FE62C935D22E40D6B5520391E758E8DAC0274BCF130035F1F8CB601D461FC6D1774C758BEF6AEC09F14524B80109FDD5384BCA2F1AF5F38B3EAC642BA1A7095F21730405BE9613D15ABD9FF9CAC4BDA95C57CFF6951CFBE8473120042497C38EDC87E1B20657AF295B55A1FC5D950235FFA42753BA42388E9D90E4D18F5915AF45E32B36BFADB72847B7DAD881502D7640A08C0339F95D117B3837DF4ABD2BF68EBAF19ACCA53AC3BDDC0BD1C02A0F39EB45FA3704D3B085DBDF36C912BB8ECF519C080AAD77019AC7FC41AAA6307BED960C5D01F4375A97DD2ADB94AFFBB1A624690948B109C2D6C4B2B2A1C25D0D24AFC7D3893060B2C2695F686C67015F09A60F88BDAE9CA4C6BD3CDB056930FB60B2703E72C51F6160226D73CD916E620161316E1D2DEBD4505DA951044258F5E36C6B3A8D2196831C53432D97A09665C1FDF5E67541D0BE0D1A291AEC06574288AA2C ct = 63D81CDFA2C580AA22C99BE7539D8E412BD6979A9DCA7AC4521A81950E7BECB4C24E942930641002CF6C2A614E34103CE8ADDDE47B5969F764563A2D342639838A3716E7C5A29A77373A16F6733026F75470D50D09ED2ECC24719421DC523A8046AEF782CCBA2A1283A58EEDD3130ED5D51393BA8410504CDA0C4738EC2E47437F727476B066753DD3AEDFEDE22B50A67363885E17AFAB3B4B4E8122C9726EB2C09BD2F8E6534D4960004413AE146F12A4819D7AAB24E156561811A507E740E095A2A0BD3531C55E047BE2D7096EFC6CCBDE1EFFA330DAF45CA4B4DF94376D12357B3BEB30064DD25828693FAD9D34CF8D7441E252447176862A7B211D950A2C835676380FAAB50C1FB789FC50FA1EC83D553058912D107665422C1A737E94BD2A2C70C340482805B23D0830654C27BF3E3A265281483B8346761786D6ECB4D211D36C79CFA24C8C3BD598260F88C215976E8A879DDAB3AF38E9D59396CCA5CF4A42B1085FDA4BB2C72B95E1BA88E781B3D6CC3327093891FA125F9933A7C8C39B9E1F4461C85EF444D17EC2757FA0B30466 ss = 4A6147CB62271297E148553A2232BCE0 count = 45 seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 pk = 6CF713DADD6EFB8489B21B60BA56066B7F6775D3502019B0087018D3702328FAE35F0F5B02C1D81247823C9E24444ECF7EDA0D6820BC07561743CA4ACB1F2CC916896B3CA64D6B74A0EA103A47E1C9A5B00F7F6999369820F16041C6B19F5ED61D118B4A3173AB9176F33A95A52FF70FB032E1AC2945086A9EE84142F421F666A0DE1BDF4D8129BD11D2EEF37520BE6DFAD4FC53ACBC3F09E5E740D6DE5ACA0C6E488DA5EA0A202FB8FA10C441BEB4B4B0BF0156E638B1BE28BD3D7600FED4A059AF623ACF3472485115D5135985EE418FBF1A54CD970403B5F966D258734A203FA5CA9ECAFC93C34B64C62FA51A893CA3A18789490FC0E4C0DD63161F382014D0960451D5D06D36544CABD7B6409BBEEF82B517BECD1C97B8CB3469E84F396276F868142B9B4DBA6FE790FA8B24909F09ABBB855DA5DAE0B33B06F167D2C77DB5B5976974D267E1AA7771E50C39B076956DC92C4D479B97F30562508768AEA7EA58BEF27F60ECEB5A630E00F39B4EB39F43C94B51B96208333B sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA9020DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8B086CF713DADD6EFB8489B21B60BA56066B7F6775D3502019B0087018D3702328FAE35F0F5B02C1D81247823C9E24444ECF7EDA0D6820BC07561743CA4ACB1F2CC916896B3CA64D6B74A0EA103A47E1C9A5B00F7F6999369820F16041C6B19F5ED61D118B4A3173AB9176F33A95A52FF70FB032E1AC2945086A9EE84142F421F666A0DE1BDF4D8129BD11D2EEF37520BE6DFAD4FC53ACBC3F09E5E740D6DE5ACA0C6E488DA5EA0A202FB8FA10C441BEB4B4B0BF0156E638B1BE28BD3D7600FED4A059AF623ACF3472485115D5135985EE418FBF1A54CD970403B5F966D258734A203FA5CA9ECAFC93C34B64C62FA51A893CA3A18789490FC0E4C0DD63161F382014D0960451D5D06D36544CABD7B6409BBEEF82B517BECD1C97B8CB3469E84F396276F868142B9B4DBA6FE790FA8B24909F09ABBB855DA5DAE0B33B06F167D2C77DB5B5976974D267E1AA7771E50C39B076956DC92C4D479B97F30562508768AEA7EA58BEF27F60ECEB5A630E00F39B4EB39F43C94B51B96208333B ct = 3DB4DDC2BF9462BE23C7845D56F29CFBE751B10F29C2CE294A1F09CB0C4557C9A07D7BD54D103670049BEFE5F67559B3F21E9B2C8A84FF780341E69B6B3C03669C2FF57F72F4D678662F9B084EABC15CDE90DCC6B0B1B14F71E4BF0702C4197FC7326065F3F5750DF7C2F8289E60F3304DCAC9159A066EF9F13580DAC911E11952DB379342E899E63973B9C2D89D7D712ED14EF04AADDB2E6B83ABFE5F7FF260C30F8F420884DD4D5A7D0EBD686CC45AA5F4A6FA778D3C761EF7D703085A6A9272E4F3AAC77DF5BB858E82C7FDEE00BB259B9734F6099725F87D9C0C3CF22F81AACB9E862D6185F7CBAA60C2DA3494709F715F11B50CC58527EEEC0AC8857F4CA7E06AEEBDEE498E6780C20A1FD5E6853D2E879EA69656B0D43F5B0530960292282A20B245F8E91F4C763AD997DF34B051B928C4F48EB406AF1539D155D2514A861246253430E79DBE204924CA40C76E3FC7B77B7092F2299B225BDB4481BB647F898E70525263D074763BCD8034EF5A0CD9A2CD99A1E61B5F3601BB61C9D6911FE657383BF18E129930B4D25D64B85F93B5 ss = 50892947CB223F9E90F01B5D18B7C069 count = 46 seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 pk = 0E06629F6A29C0783125E0810B446FEFF76394E440ECB4674B2170128E805DA616FA75448FCBD259176C612EE69E63432A537214C743998DA42ABBAD798839269C9F028239DF63E0367908EEB19E7DCD30CDB0BC22CD13FF7EF717DA01FD5E157D9550EAFA285ADB287F768F8FDFC3E2B72C6AE4170B551633B784394C053F6EC0D99E879FBF38C1BED3656AF4592A1A8A7513BD8C61115CE00F4AEC61DC39F58D8A04ABBFE4273341FF84463122852C1AF2090173714A95B5A24AB014C360E2C887126BC3808941DBE66B9488B38FA89D67083A5813BF589906E34A17250BC3646C31AC1681FF0A7DFBA055158D06B9B3D5C902B129460C2F451032D5C1967100AF6AAC8686F1E80A7AF0AD4B5AEA97E0C2F57A7697D3F44AC251AAB7033F61712F4993F491C6765151170D30F064B2DB027D8FA269A716E4DA05623EBB451D9858EA1276C6D5A98EBD609CF9C66AC365A2B13745E4A38D0972C05E9709C7375C4DD2EC4FBD220E7A48B4E0EABEF8A1A13038DFE5F5E18B3F0B sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6491C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511020E06629F6A29C0783125E0810B446FEFF76394E440ECB4674B2170128E805DA616FA75448FCBD259176C612EE69E63432A537214C743998DA42ABBAD798839269C9F028239DF63E0367908EEB19E7DCD30CDB0BC22CD13FF7EF717DA01FD5E157D9550EAFA285ADB287F768F8FDFC3E2B72C6AE4170B551633B784394C053F6EC0D99E879FBF38C1BED3656AF4592A1A8A7513BD8C61115CE00F4AEC61DC39F58D8A04ABBFE4273341FF84463122852C1AF2090173714A95B5A24AB014C360E2C887126BC3808941DBE66B9488B38FA89D67083A5813BF589906E34A17250BC3646C31AC1681FF0A7DFBA055158D06B9B3D5C902B129460C2F451032D5C1967100AF6AAC8686F1E80A7AF0AD4B5AEA97E0C2F57A7697D3F44AC251AAB7033F61712F4993F491C6765151170D30F064B2DB027D8FA269A716E4DA05623EBB451D9858EA1276C6D5A98EBD609CF9C66AC365A2B13745E4A38D0972C05E9709C7375C4DD2EC4FBD220E7A48B4E0EABEF8A1A13038DFE5F5E18B3F0B ct = F4CEF7781207BFA19177F3B2AC8641A99C80641A61B9BC091A311549713968D3601F612617192FA5BA5486948AB670CECBD76972A242008D188D5E4B680C1B24A11277BDC58729E64ACD7513369A29DDA344C3947A05531698070E080372FF003BC9E269D1927D7BC6F4A59E9BD95E3FBD55E8FAE370C4A23B4BC2B5930CCF91B8278F059D7F476FA63F5B8E7791F30611042A0D13E405FCE4CC50F15C47F37777B65E484B19D18960B5BE43BDEC07425076437D29CFF084954D05C507B19D8FBA94FEB6500729E72CF3100052D0FBA8B3B594DC989AF64A50EE5CF06A820F8053F659CBE9DD2130EDD6C7C81F9FA3F78604A347D5E7BE16AB9C4928A9EB92A9E1F19B9D2C4728181CC16225DA76E21406D6F09DAAE0CDF163010906DEA72798B5E5BC284767669C2381C607D8DEB93BF614571F35F325892221160EB3FF9A2B06923C2C5FC8A9F79D2330087470A34CE89EC236BF1E3D77BB6F823CDF80B14E39467ED638A6ED5BA9B29E1C232041E2727F9133D618ADA9110F452A3B80BCF0E0D31113577E0280ED1DC93FFB453F0F4034 ss = C5950B09FEFBAFFF7D911370D2A3FA40 count = 47 seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 pk = DF69854E0ED42A59F006E8C01367757A97D5A4F22A0514610780FFEA7F8D6BDA8EB5187BBB1872BEA6B2AFDF4DC03DA1FCD7B32212A33C555E2793D4F40B1D89F98C22677A88C52B90DBD624CBB1271EB8F3C1EFBE187FBBD45DD1092D9ECE8D336EFB21FB235ADA2FDADD236F0AF47FC100BEC6F6F95BEFE716A695410CED55261C1FA05882C1F47BD1013ABB8885F5E172E4CCAFC34B81D1598CB6DCA3C09ABE7107D661B0F7231DED12CC13E621CCB19C809DEBAFBFCD1522007C276120A509B334264B7035453074B3FD5E7444A625AA8D42B416BD646BE057C0FCF640D4E23A0916F25AE0B55209C9325F5C0BB1F7B09E8F23800F39D94CF73A707570D63E22C0CCA2F584102C52BCD908A0DF3753B867DDF857C3B65BDF5DE564F2101844664E1E71E6116673F546E326D38DA21940FDDAF94A07047DD11404990B5580E0520FEBD4AA52AFF8B3E43C7A3893AEB9299914132C74EBF315EC795736AD79A0B01D5256268F59E57F12C616D9307B3D1312254BB18243520E sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CBDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B0DDF69854E0ED42A59F006E8C01367757A97D5A4F22A0514610780FFEA7F8D6BDA8EB5187BBB1872BEA6B2AFDF4DC03DA1FCD7B32212A33C555E2793D4F40B1D89F98C22677A88C52B90DBD624CBB1271EB8F3C1EFBE187FBBD45DD1092D9ECE8D336EFB21FB235ADA2FDADD236F0AF47FC100BEC6F6F95BEFE716A695410CED55261C1FA05882C1F47BD1013ABB8885F5E172E4CCAFC34B81D1598CB6DCA3C09ABE7107D661B0F7231DED12CC13E621CCB19C809DEBAFBFCD1522007C276120A509B334264B7035453074B3FD5E7444A625AA8D42B416BD646BE057C0FCF640D4E23A0916F25AE0B55209C9325F5C0BB1F7B09E8F23800F39D94CF73A707570D63E22C0CCA2F584102C52BCD908A0DF3753B867DDF857C3B65BDF5DE564F2101844664E1E71E6116673F546E326D38DA21940FDDAF94A07047DD11404990B5580E0520FEBD4AA52AFF8B3E43C7A3893AEB9299914132C74EBF315EC795736AD79A0B01D5256268F59E57F12C616D9307B3D1312254BB18243520E ct = 68DA11421151CAF9B5E5C2FCD826EAC60C86B1ADEF15F90E97D82844E198D6924F2618C0CA03DD69C801E92FB263BF6AD7ACF8039F9BEB352EDC7C2C0AD9156A2CBE42125A7AE99F1E96874A63E74C2D19B92B995E520852D4CD073B54D66D2629916531515CEEF7ABBBDC96E39D08F9D66F1D8E6A26FB1801C2FB192F32830F6014FFA54F64B8F2EF380B18412C39EB8241572B3F23A8AF8357B408AB9FFEF382C269E8C3114F61CF74CF2B96C84A148D738E47B6B2D1399BAD46EB3993FC0F75806AC699FE81F956564F7F521AD827F0D5C9D87CC33FF0B91109D32E0EB6CCB249F335CB68F812D407E5F1974C877F30781CDE47FA87525D5CA72BBFD18E17D73003BE9217E7548D68BB3BAF416F19BD43B470D7F4833EC991232136B6DE4CC67729B0AB2BB99834AF4CADC93A22A679E142B0257395EB8597386C6F8A93BA498C422F9F4A250AD5341F9A1C5150902881F09929196F9DD114731CDC01F01765709E40E0D7AA65B66B1B3DDBC8B632FFE638EFD7C907AA000237E8D9B40284F88B9A1DB15688CE3724FAA28865562C8F60 ss = D28A52E0A58E670E214D511D48FB2BF4 count = 48 seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 pk = 282415CBE417099ADC28E9F82F22D2371E25F06294EBDB6A78A4D2A815BE70F7974BC715A3F97562F70B1674940A818C4EAFDCCDF83E28F00473E6C985D4373A99AB070958FDFA5036E4B5B824EDF759E6367877E87EF7F0D620BC2CB9D9F114B363D24BFCFB6AB8E09A09E792B27AC1233A69DA9C1D6DC46297ED95BE0FD89BA6E09DB720CA0E63E21898AA0C286E78DA927123DC4C5BE9A060E2909CD92EE3EB340EF378D204866AE368A4595AD35755116E231AD51D5747C0AF1414D281329154F629C3104F6840C8051CED6AB2A2E73AE8AA76F7349CB85C12DEFE80AA41F826663FA71E1E43270EEC78FD403E46C77E04DD7737D12491CB7119C1E3D4CCE167DCD5FC37F89574EA94F24745690BABB22C0F2000FA25E38B4D66AC2F0399433791E8A017E16CD79921DDBBE8426BD866AF63EE90B646373F3B46A146A57A4E132C0F3BF34D3C8494487FFC603E59720C6284975E252262E0CA59C697AD6A5E175EAFB6924CAA84C225A994EEFB948BA3BA14F158F9AC4209 sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27AFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6206282415CBE417099ADC28E9F82F22D2371E25F06294EBDB6A78A4D2A815BE70F7974BC715A3F97562F70B1674940A818C4EAFDCCDF83E28F00473E6C985D4373A99AB070958FDFA5036E4B5B824EDF759E6367877E87EF7F0D620BC2CB9D9F114B363D24BFCFB6AB8E09A09E792B27AC1233A69DA9C1D6DC46297ED95BE0FD89BA6E09DB720CA0E63E21898AA0C286E78DA927123DC4C5BE9A060E2909CD92EE3EB340EF378D204866AE368A4595AD35755116E231AD51D5747C0AF1414D281329154F629C3104F6840C8051CED6AB2A2E73AE8AA76F7349CB85C12DEFE80AA41F826663FA71E1E43270EEC78FD403E46C77E04DD7737D12491CB7119C1E3D4CCE167DCD5FC37F89574EA94F24745690BABB22C0F2000FA25E38B4D66AC2F0399433791E8A017E16CD79921DDBBE8426BD866AF63EE90B646373F3B46A146A57A4E132C0F3BF34D3C8494487FFC603E59720C6284975E252262E0CA59C697AD6A5E175EAFB6924CAA84C225A994EEFB948BA3BA14F158F9AC4209 ct = EEDFDECB83C3BACC3EE7DE64C6377E8AFB02CE89768D61366274AAB2E5BAD54550B1D7D9ACA70AFB236D9A5AAE390C02776B7D34DFDD65C09DB0C0856A2F2854CB6E04C0888D8E99BB1AF97260D29EBFAC1A278A71DB46FE214FBC0B6D9C44891CA1DEBEFFB69CDDD7AFF4AFE3988F2181DF4208FF40D4CF4D671D29393BFD9D424E27C598901C09D0F3262E0CF54D4411D68BFBFF7FDCA2A257091417BC8A5B5188ACBB1B2A1F3742877B0ABE4CA7FDE730E72DFF5B1FF9412DA2E61A678BD4A4FE0943AA75C60A5FADE3BA1779BE63A83A4DCCAD32D10688782AA16AEEC29524EB96AB230BCA3573E91655FBCF954BC58357F9D09C82A7B6C83F19DA0CF16386D2A050A1AD368344049DA22490255F057B927C2FA8359F55E0FCA605377A56CC40FAB85470A573B60863973BDDC1FEE223BD8EF14A9ACD3C571B28EBD9C83E00F448BA69121F49565385587C7D0EE36D10EDB902A307C39BFAC0508AC49F2BD4AB25198EDDC1C91263A4FDA546840DE8F84EE97C1E6C8A99026F3AFA99B2F569392F7F6E751BC556F1B1E86BC384C92636 ss = DC6232FFF7603332889FD1199627246C count = 49 seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB pk = 6881C771D8A4766F58BCFF0226044135C7FA37D6331821C334D244290DCA1066FB222E2F95ABDB65E5086B389DAC3166BAF93DB1CEB16906601BDFD5715910B00E60267C6D40B77C9C5B348CCDA6E9D09E5CDDD16E5CBC9AC8BEE6BAECA548B99120F4087A512577C89CD466055365ECB76FCC1F027071E09B56E287C11580F2ACBF9864C1B066CD927C293E2E4C8148C7D0602F1AD6B8B15F130F1CCFB159E4C77789D380D38C734D47556A3B1DA2061C4574DB36D1727D7905611C039B6660E06E7AA08F8F1190AE3F4F4E124A13BCF38BA30DE9D76AF1024236D793F18D2B46CD282895C08F52D3AA277FDAC4530463002E05EB2D56E911AB5E1E5E3C2D7269252D31DDA6E7C813FF94D37DDC203FADB7134FEF6325F8F20717961435DF2E7AD6D89A31F44E42BA9DE70DEE808A6FB37F1F2E5593658F686E032EF4F351C2951882ACF69577CEA6E59FD26DA3F038203F72D87D661B2A7C3A08F3CFBA4DEE28A71B549A3FAA39DABFC33E7F6675FFB32C0A845FA3F817BD18 sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB620A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C016881C771D8A4766F58BCFF0226044135C7FA37D6331821C334D244290DCA1066FB222E2F95ABDB65E5086B389DAC3166BAF93DB1CEB16906601BDFD5715910B00E60267C6D40B77C9C5B348CCDA6E9D09E5CDDD16E5CBC9AC8BEE6BAECA548B99120F4087A512577C89CD466055365ECB76FCC1F027071E09B56E287C11580F2ACBF9864C1B066CD927C293E2E4C8148C7D0602F1AD6B8B15F130F1CCFB159E4C77789D380D38C734D47556A3B1DA2061C4574DB36D1727D7905611C039B6660E06E7AA08F8F1190AE3F4F4E124A13BCF38BA30DE9D76AF1024236D793F18D2B46CD282895C08F52D3AA277FDAC4530463002E05EB2D56E911AB5E1E5E3C2D7269252D31DDA6E7C813FF94D37DDC203FADB7134FEF6325F8F20717961435DF2E7AD6D89A31F44E42BA9DE70DEE808A6FB37F1F2E5593658F686E032EF4F351C2951882ACF69577CEA6E59FD26DA3F038203F72D87D661B2A7C3A08F3CFBA4DEE28A71B549A3FAA39DABFC33E7F6675FFB32C0A845FA3F817BD18 ct = 37E8FCB261967D7FA6C356AEEBB59FBB5E4395325DAAAE48ED8A7216E700752B57C462FEA84FC440DEBC38832F74FB2D7493C54A86A23E519BFF5056933806C5C75BCBA5A604A35F480EE924372D4E16C1CA6E916744F4E3E64A28D70C0DB3B050EBECCE0A5DC48A6B642CC074BE05CCCFF2D628E634C6C2E5A21984FF3D12EFCC092435BC431C888C4CE0452ED2F1512C955F7024A9236846748BF22318484FB1C97118A92E7AFD78DB33A926599B4455386B21BF68AE56DEEF20F532D9D68A4DC0B1E54801A5F104EA3193DEE7C08A5BDAEA521626E527B0C2337F0CAB9B18E1CBEEACB40D2AE8537AE5308F59F984CE551C9B22011F090E29CF192B12CDDB6332F22ED8CEAC4D9C42F1357621AC36916AB7129CC8A8D4A61606A4485CC983AF50A76712F7C5CCA7EB118325A8EC81E27E9B30CA7D8B4D350E1A929A83F4BBC7051755A031551A0BF4B70C6582468C838FF7CDB25D02D122EBAA0F9AC984F7A62B60EA285AA715D06AEF526BCFDA1B91E8540F446BE81AF420B05FC75200FF3DAC7E294620011E5B4373668F564B0FB8B4 ss = 244944E9E0B7FFD0B370F7D5C5FDA850 count = 50 seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 pk = FD7F908C0614E30BCA5EDD2188AFDE9DA1F322E5AC2B55551B317023FF54DCED780DFA7C3D5301DF5FDDB60FD19C2575997CA4C700E1D7934F37A5AF5CEE3C01E8ACCCBEA788A75394C4C0B0EA9321D7BACFC40A0BC07A6613ABF55A2CC3EF8FD0D931EC145B862ED92243FAAA6A4E4E8E8858533AB78E8BDED384E3DC2C856409EADC18455420D953472093D59BF66D84968C28CD3CE6BF591840CFB014F8B5B2A5672728775EF7494303162AC87F314CA8A1A099EF8608EE26F04B20B773BD592C54B2D1623537E01C8367350A789887CC892158E3EC9460500F8DC046E81C78449E7C2C7D00F978D07AE6F53F9308D877E8CD1C8364C12E9E3926EE366C6B282E1347C53F2A5EEB67524A530E31EAF1C9DEFCCD2419070FF96D4639544258A91F7A6B6BF5FCF186CCABBC0134803C2F2BFA6A22EABB9A71AE22E97FEB0370FAAFE4B2AA4250921706E24D068EFF02AB3331E324A362377B3592C07FAD3498CF8D1EEE9AE952DF3BB43B3384B5EA1C261D8EB179E83D72DF30 sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E6862677B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2F09FD7F908C0614E30BCA5EDD2188AFDE9DA1F322E5AC2B55551B317023FF54DCED780DFA7C3D5301DF5FDDB60FD19C2575997CA4C700E1D7934F37A5AF5CEE3C01E8ACCCBEA788A75394C4C0B0EA9321D7BACFC40A0BC07A6613ABF55A2CC3EF8FD0D931EC145B862ED92243FAAA6A4E4E8E8858533AB78E8BDED384E3DC2C856409EADC18455420D953472093D59BF66D84968C28CD3CE6BF591840CFB014F8B5B2A5672728775EF7494303162AC87F314CA8A1A099EF8608EE26F04B20B773BD592C54B2D1623537E01C8367350A789887CC892158E3EC9460500F8DC046E81C78449E7C2C7D00F978D07AE6F53F9308D877E8CD1C8364C12E9E3926EE366C6B282E1347C53F2A5EEB67524A530E31EAF1C9DEFCCD2419070FF96D4639544258A91F7A6B6BF5FCF186CCABBC0134803C2F2BFA6A22EABB9A71AE22E97FEB0370FAAFE4B2AA4250921706E24D068EFF02AB3331E324A362377B3592C07FAD3498CF8D1EEE9AE952DF3BB43B3384B5EA1C261D8EB179E83D72DF30 ct = ABFEB8FEC833B354CAC958BBE1D840840D71F47ED3B3A5DEC0DD179C6724EF9903162F8F8A2542D6D0513F6C554997B268D370D1B348E58BAAC6121C7600045B8BE851282CA87AA39684F5D5A64077FCAB87F0649B7A64C662896FF2C6D640FC149C43551770AD67484CBB3F297B53055B9EF80789DDE1408C202481C021288B6EBF9D1898CA223FD223B3EB49A09641F17EA94C04549FE4995EF81AFF27E9B91B9673576C00FB0A613945331BF44D61ED1ABA96A129C13DF96D3C040EEBB0485ECC1EEBC72835849E0853BB9AF32E505F0D1D1C3409A0A5B56CA410DFCB5B02C2475190B229E6F2C181EF1F0CC819A61AB63A7B2CF1ABE8C6FFDE2C394CF9A467338563B862232F956A8508F6D3730F65EEB08BD259A243B4A6B7954F1274D6EC870A9C54508E93117088D3CE588CDFA4AFC993F55E65538E4A111BDFD2FBEBB70B8DE50D5841A2C066C3C912C1C2C4F0FF3648279666F9AE5D413D46E3105BC0167DF54E2D7BA3E53FD5E8213932651A1DF0C550622141CB106216CCB142E52400DC2BA6D30B2A2FEFDA0BA86C4E390789 ss = C4E28992CDC9C48F405D3CB3BA053AEB count = 51 seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 pk = 3A993C13157B9BB2D4A3AC00AD76D36BC2E5B52456D0A163BC4B72F0B59036A7E7D760D481500C65E77432656783CC23955A4D4DAB7046F24F5E64320D4D030FE63E591E970A18A53CD7436FA906FD6B02360450B7A9B5070ACD261C348183D38857534AA2836CA38A444030628D51107CEF1AB5C2EE5E18EA6658BE66036AA95D146F62FCF6A5EB4808016E6D4085F44FA4DEF77023DD9A24E39EC3947073B0EF7F702DCBB9B2D701DDFA776E8C4BAB3AA125A78B6449EA0A6673B02146D9B8BE278FBAC942466B862CF57DD18829C14A54306482B544EB2508026EFF078D321929008693B065B7EEFB9CEA2FF21D8FFD35267AB090728D51E94B12D0015E6787C455147825FA3497A8F1A9F8F8B98615AB5FA371B17B166BB1DEA406BCEBB4C6D905BB7DA68E5369CCAA07E3EB848BBE1ADA82131E3A9892F126ACEF362428680157E232BCC8DDC1EC23F18493C0C727B576C9C7282BC2C91F917CB0EC745F60106AA69595E5BCAD14BA9C04D55D8606401ECC51FBF35BFB1F sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA0F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC4013A993C13157B9BB2D4A3AC00AD76D36BC2E5B52456D0A163BC4B72F0B59036A7E7D760D481500C65E77432656783CC23955A4D4DAB7046F24F5E64320D4D030FE63E591E970A18A53CD7436FA906FD6B02360450B7A9B5070ACD261C348183D38857534AA2836CA38A444030628D51107CEF1AB5C2EE5E18EA6658BE66036AA95D146F62FCF6A5EB4808016E6D4085F44FA4DEF77023DD9A24E39EC3947073B0EF7F702DCBB9B2D701DDFA776E8C4BAB3AA125A78B6449EA0A6673B02146D9B8BE278FBAC942466B862CF57DD18829C14A54306482B544EB2508026EFF078D321929008693B065B7EEFB9CEA2FF21D8FFD35267AB090728D51E94B12D0015E6787C455147825FA3497A8F1A9F8F8B98615AB5FA371B17B166BB1DEA406BCEBB4C6D905BB7DA68E5369CCAA07E3EB848BBE1ADA82131E3A9892F126ACEF362428680157E232BCC8DDC1EC23F18493C0C727B576C9C7282BC2C91F917CB0EC745F60106AA69595E5BCAD14BA9C04D55D8606401ECC51FBF35BFB1F ct = C7298705F3D39D135D51B7EA600CF4673A2674414DF0D6AD1B9E228D6CD5A4736AC084324A47B71DF42B69EC9917EE699CD4587ABBF0A19CBA32F8D5FA6E0448921A0612B2C79E5A13DDE14BFCCBA16125B8A1DAEE2246934C29F0D8F78F70767502EA641C3F0A652FC062F7833DA1DCF92BF2A359D7489640FBF099B5139A15938079677BABA48619CE9F95A27A63E7AE03A1061E050FB53D45BCD542975F346A0E31372F80361AE970772D530C0BEB7683F354EA5AB7D70C679A9A209BF1B8624B6676C60C76675255AD3CE3E12937A85D7236C26F48716798F8F5777151C41AAD6FF14D97280AAA46B7D0AB7E85D8E1F4FB0B95C7939999288F0FB0443558C72D9470C38E04162F4F5A7271D0E8BBEC868CA810A22DB159BE8FCAB39198778CE211745F7CAEE8733B178728FC02F2B9E6F78F5CB39D93F8621F9E95BBBDEEFA7A5E40B210C379A7060431F3F735A62171518E5ABF926FD3C406773A3B1C68948CA6279D8D10EE0EA138E44F516D3FA075B38008299897340F8B2EEE6BC60200B0D4E90DCAF0EA07FA12A304A40D3FA589 ss = 35913AC0FA5A1FC2D538AEFAB8E94B6D count = 52 seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F pk = 771D97565A58084F748614EBEBB8E495A94F06D334C0DD1408369420446E42ABA040D2B8C464DCF715FAF88FE0B1AB2E14070C0E09E87D6488B9528462AD11E4B7238EBCFBB80441C0CAC6AF36E5DEA280A001B2C24DDE9EE2CB0FB1F9990D39DBAE222FF5CACC945722D0A909BDB66B46A59C949D1A0AE1FC693511E134C2A738A6A0772648CADFE3E2D5056DEF930CEF5F6D9C91D83DB3C160BCEFA3079B32A8D1C7E8D2BD2DD85928F21B61F043B6D6E6BFD6D2703E224371C8333902B3F0F82F992757F78D8DE11C9A437EB577411D78C27F22B20FCE900957C80DCBEFE848DDF8B0909F59C70649C099C62611821615AA6F5A6F8DB84E4CAA3CAB097C05B39BC3DF05EB204538CA521B9691C263F6DDCCA1D2AE93068F129E4C9506FC04312EBE683C2E1A9AA69E23C81616AC3C10095D04F22EDA4BF02D3F9CD997BD08D31186EFA83450793585F14A6A4A94FB543446FD1A23B2D94F87420BFD1C7D2A16CB4A1D64D49982F02DF8041EC7BBAE41FA3FF3FCE9D4A6CA0D sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FBE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A140B771D97565A58084F748614EBEBB8E495A94F06D334C0DD1408369420446E42ABA040D2B8C464DCF715FAF88FE0B1AB2E14070C0E09E87D6488B9528462AD11E4B7238EBCFBB80441C0CAC6AF36E5DEA280A001B2C24DDE9EE2CB0FB1F9990D39DBAE222FF5CACC945722D0A909BDB66B46A59C949D1A0AE1FC693511E134C2A738A6A0772648CADFE3E2D5056DEF930CEF5F6D9C91D83DB3C160BCEFA3079B32A8D1C7E8D2BD2DD85928F21B61F043B6D6E6BFD6D2703E224371C8333902B3F0F82F992757F78D8DE11C9A437EB577411D78C27F22B20FCE900957C80DCBEFE848DDF8B0909F59C70649C099C62611821615AA6F5A6F8DB84E4CAA3CAB097C05B39BC3DF05EB204538CA521B9691C263F6DDCCA1D2AE93068F129E4C9506FC04312EBE683C2E1A9AA69E23C81616AC3C10095D04F22EDA4BF02D3F9CD997BD08D31186EFA83450793585F14A6A4A94FB543446FD1A23B2D94F87420BFD1C7D2A16CB4A1D64D49982F02DF8041EC7BBAE41FA3FF3FCE9D4A6CA0D ct = A0E26D84A08B798A2E04D6461EC95801BFD995F1B5BC7AE7B4F150855B145804AC941DA633759AD5363BEE5478C1A75450F94E6978D21EB2FD2AC561B1B60198DE37B9B84F3A1D7E67338A5748BFE386ED0D62B73F08D5D6A21CA0C099CC549E7DFAA72C08C5083A735F9AE14F255C479FE3B83D4929FAA86852DB4663083240422D8188935B884E7112A76052E355263FC7AE4EECD52E9BE8C11C57DD7BD17762456687BD1243F2C06AB735808C0E53F073D20200E5E7BA3559A593159206C903401167A1005A0E33B4B7382C61DB01F55FE4FE7211F52351E6B69B8D30FD46E198716B2F075B9233D951038DD585078448C312AA2CC6E32C180D36E6540B8411B6DF45A4EB5B0A613143EF1E1DE4FD1574409EC56AFC1DFC1CA2010EA9DF485C6AE9AEE4130185719AADA2AAA91076953DEA175A51776B66C10ADE0F1BAB96B81B725CB639554142BC422DA33F8EED93C9D0CE2D478E576268D26A6B77A4164A9D7376F932D9E79BC9C3EB723636D6E00905D7F46A2F2A3710898626464631E38F6355D6DD68EC60C4B43467ACF71AE205 ss = 611A6A572140FAAC867BE729608EC80E count = 53 seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E pk = 0F2F08205E3FB2109300CE453C71371305353BB468EEBEE66170BCDCB52C94DBD3027510ED29C8A964151D6E2CFEA1AF466A185C213C8420ECA636D4C4C92FF0664B93C3B257BB815492D40BEA7B2278892600DABBCF70699C317EE539668EDD8C826A8B499800982EF73766037188BCB83606EA9A65DDBD167C5446161E39724897F5756330317712B8556277BD59175BE06B7259A9289676682F889B6E98020104B97E071769608F341F171938E3A4C53D6669E013BA76B8BC3819226F68A2621DD7A713FB4A8FD4750AE81B605F9678F26F0595B0E202E6B5ECE2F08B84D628FA3E7C7F5C35F969ECD67913CE1D0B3E03E789D1DFF20D668F012302422D7A170E2266276B1D5E0BB7FDAD7B13848BAB0940D9E4D4FCD7DF7101857CE84F6450898FF00B13CD6199F650ED503DC52AD5CF4EB7BBF9972ACD3940DD506ED99F1342EA277905915FF0C51CF425D6B26BE4092CBC6C5BF1DF1438DE8B33528AF02990FA222B076FBBA8345E994C07573DB9EE6D67B73648DF4D20 sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1565A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89020F2F08205E3FB2109300CE453C71371305353BB468EEBEE66170BCDCB52C94DBD3027510ED29C8A964151D6E2CFEA1AF466A185C213C8420ECA636D4C4C92FF0664B93C3B257BB815492D40BEA7B2278892600DABBCF70699C317EE539668EDD8C826A8B499800982EF73766037188BCB83606EA9A65DDBD167C5446161E39724897F5756330317712B8556277BD59175BE06B7259A9289676682F889B6E98020104B97E071769608F341F171938E3A4C53D6669E013BA76B8BC3819226F68A2621DD7A713FB4A8FD4750AE81B605F9678F26F0595B0E202E6B5ECE2F08B84D628FA3E7C7F5C35F969ECD67913CE1D0B3E03E789D1DFF20D668F012302422D7A170E2266276B1D5E0BB7FDAD7B13848BAB0940D9E4D4FCD7DF7101857CE84F6450898FF00B13CD6199F650ED503DC52AD5CF4EB7BBF9972ACD3940DD506ED99F1342EA277905915FF0C51CF425D6B26BE4092CBC6C5BF1DF1438DE8B33528AF02990FA222B076FBBA8345E994C07573DB9EE6D67B73648DF4D20 ct = E302E0545FFCC25CD015B5D3B17349A4381502CF54A9C8D28848DAA5E0B8B19482A39EFE94052AA67F604BC9C3FF2B7F03CB04C0C64959E795AEC7896CB80A704A0FFC9FEBDD8E20C25C4FA6A6456BA66247054C116D15577210501FBE9A5547358081235D341A57675721066302A5BC3149AF3EE965F30D48AAEA3E493ED5ECFE919BC58D3B1B83F51BA364AB5FCEECB4BB997BCB888C5E28CA44FCCC5398C44B1C2E3678BCFE9A533C80D50E3524E2D0D2A7274C7D734E1D7D90801C9C9EC4A6017B1CE4A86AF8D6C0FDB28A0E4E171A0EB4949AEBF6DCDFE3BD0309B463FC7ABBDA2D0E7836B9310930CEEC31EF832FA08E4C9BC4C5A528A105018D6AF262726C67EA6C25EB598BB6AF03290DFF3FAAD3FF2A7305D601D69B4E4620036FF39A3B035110BC3EF85C8FD79022B42F26A4AB177A00D809380692072B1B712C7A256541EA3C9125F0D1463F73991FE9A727B54A4B537C807CD6C111BB1963D0B6E704E95DDF7FE55C2DB0DE4FAF0934FC4BF2A519799F1B81081A4BAB8645C2CD9ED6F36135E94B598D4C9B1A31059628ED1B ss = 40D1B0F3D0438CBA1F0C51420EF5A622 count = 54 seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 pk = 272399ED0CC7DA890D56FE3744E373D32C18AF96FB485F753F37B136EBAEE5318F0DE3C38435D11338DC62761838B55A5C3D342C9D75CF375C56001A28852E49A87CABFAD3551FF2A8DB50D5650E6818F780E0BF24FA24E32E152BC4BDD97A039E19CC87644A345D85D5A69E8E067E4F60B0193E4662F2AB9C257BABCB136822F35250AFC1B0AA1617E53D306644535B1ABE84E9C24CD73519EA82F31A0E1487519FB96F281717E3BED8D8ABCF40A75FF7D8A2EE2EC8B38ADCAA223A2E818A6CF2D16287A077C51904B6CEE453874244826C52091EE2C7CB2DE37625054110D3CEA8C8E229A59CF246851F04937AE77F284E9DD0B3BDEA467D57C33B5F380838F5EB185CA7EE5C2AE8BAF2245874DC0E76A05088E8074076C53F431DF04344CCC12C6983676E6E677D6DC7FDF37884BB89BFBCBC2A0F540D3C310D8B9E249A03D318A0BC90A3D3D21EAC22213853A34DF007CEEEDD8AAEA6C4CA32238A67BA4DA9138199C62CCFD1EF322B9A4B95FB5D85DB628FB20B601FD82C sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C9B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA08272399ED0CC7DA890D56FE3744E373D32C18AF96FB485F753F37B136EBAEE5318F0DE3C38435D11338DC62761838B55A5C3D342C9D75CF375C56001A28852E49A87CABFAD3551FF2A8DB50D5650E6818F780E0BF24FA24E32E152BC4BDD97A039E19CC87644A345D85D5A69E8E067E4F60B0193E4662F2AB9C257BABCB136822F35250AFC1B0AA1617E53D306644535B1ABE84E9C24CD73519EA82F31A0E1487519FB96F281717E3BED8D8ABCF40A75FF7D8A2EE2EC8B38ADCAA223A2E818A6CF2D16287A077C51904B6CEE453874244826C52091EE2C7CB2DE37625054110D3CEA8C8E229A59CF246851F04937AE77F284E9DD0B3BDEA467D57C33B5F380838F5EB185CA7EE5C2AE8BAF2245874DC0E76A05088E8074076C53F431DF04344CCC12C6983676E6E677D6DC7FDF37884BB89BFBCBC2A0F540D3C310D8B9E249A03D318A0BC90A3D3D21EAC22213853A34DF007CEEEDD8AAEA6C4CA32238A67BA4DA9138199C62CCFD1EF322B9A4B95FB5D85DB628FB20B601FD82C ct = 3CCE6A0013A316F2B0ED0EDEB256359F6FF5F1FCC27E0644D0C2D9F13F93FB4DF11D6B0689DFABA0BB77ACDEB8459FCAC2A52BF6882753FC56E1E19F97153468BF2EB4D98580BA9D6DCA371069BE6D185803B99057EB9A6EBD522BF7099D437C8F3EE62C9A62F30A538509CB6B206A724E05C5A72F4F5865DEA3E810193F0E562A67A7F536C6C71F303F6EFD0CD43EAC569C83AA3190773E043A91F712FD030CCEF5B90B642C1EA9E4482C16211F9999F280CA64AF346C9BA099769106037FC2F079BF7880A3FDB7BFF3F83EA19A49DF6689B60270B857B273F8B9AC3FA6DE4F5A113820A35F350A015167A0097C52E7D02F39BD0B571367DFB6C71EC6ABD8974372135E9EBCF521D536D31B357FE79B23EA6756C268E7C8C4D4BC3DE8BA00A1980211CC3305FBBBC76CDB9C737B06EF8062D9CD38D03495F5FD142343678141F06F7AEF2756A2193D9766AE1978BCC55C8BA6C3C8554FD382C4888E488BE74EC09012FF931928CDF62B8BB720CD3C17DECC3DD85394C215E4175214737383C2944141CB3A1FBECF7ED91EC6123708A0FACB ss = 866E40E891E961606F2F289D83493A12 count = 55 seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 pk = 3EDDDE29C17BD70405A941C4B0484C764F31F91BC8F563729E43C6707798E72CE9E1EDFFE5D42724F7A15E072FBCA17BACD179EDF4825B17AADDFB59704D1DD415FE6E6ACFDE22B5731E2AFD5E33548FFBAC1EA7ADF485FA472336B80B191E3EB0D7DA4A15F3CBEF28168ECEE7C5305F5B7227CCCDA8F39DAADC4B2C5423FEDAE2DDC9A11CD4D6B83908FC5FB3858E586CC3403D7747D1848F433EBD49DCB2EDAAE32D8850F7C9AB874F98FB603E6E12AE48A0F7BD495DFB58459966356198E4AEABA4A99A5FAFDC42218833333B7C9FEA4AE4638BA53A05375FFD073EA16B4A1E1EE6146D70FD5756F276757B04BE5C0DB45792E211512CF995150D42E679A9704A0D99BE97EFE1D60EB55D65534E0FECA27D5BBEBC8A68E221B2530BD40B181F6C79D28C68BFE74C3A108995C9FF00BBD3AE15A7137E40BAD032B7E9CE785C003037840FE2F514D32B47384185A3A940875A7AAA814A01BF76777550063DFD24FF321495450E87A52560E5DEC5F9D71563050A3850CEB9E524 sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161C24C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991B043EDDDE29C17BD70405A941C4B0484C764F31F91BC8F563729E43C6707798E72CE9E1EDFFE5D42724F7A15E072FBCA17BACD179EDF4825B17AADDFB59704D1DD415FE6E6ACFDE22B5731E2AFD5E33548FFBAC1EA7ADF485FA472336B80B191E3EB0D7DA4A15F3CBEF28168ECEE7C5305F5B7227CCCDA8F39DAADC4B2C5423FEDAE2DDC9A11CD4D6B83908FC5FB3858E586CC3403D7747D1848F433EBD49DCB2EDAAE32D8850F7C9AB874F98FB603E6E12AE48A0F7BD495DFB58459966356198E4AEABA4A99A5FAFDC42218833333B7C9FEA4AE4638BA53A05375FFD073EA16B4A1E1EE6146D70FD5756F276757B04BE5C0DB45792E211512CF995150D42E679A9704A0D99BE97EFE1D60EB55D65534E0FECA27D5BBEBC8A68E221B2530BD40B181F6C79D28C68BFE74C3A108995C9FF00BBD3AE15A7137E40BAD032B7E9CE785C003037840FE2F514D32B47384185A3A940875A7AAA814A01BF76777550063DFD24FF321495450E87A52560E5DEC5F9D71563050A3850CEB9E524 ct = 9B34D90878FD0A9EBEAA19B7C48786799FB2F92C5B49FDD9F5753367D773405A6E5D3140B66B065450D83EF38CB40E54CAAFCF850263292E992579BBD5CD0F99CFB60E9F3B2B4A6A6E5E5C366F833220C92E1796EC841E673BA0833A5C3A4390C8857E4A416E17DFB1C1E7B6991A4AAE4DA92141EC6B1C282D07CD2F7308DE9937D635CF769AEBE0A247AF5492CD07DCCB68551BD6D71772300537CF311BA2B99BD8E0E479BBD14C1FE606FD51182BBDF26441ACAF72621C514DB9D323A04B07099B69994F9FC2CA74E432258DE420F7CCEDDA44AEE6FA918DE0EB47A3CBFE2BD675806D15AF09DF071D198A4C23D47BA78A75D26EB7C658C064A53239518BF135E5E927216017665ED5ABC66E72D393282318D874A98DF4738C110AE38FD192C6D7FD3F96B626FC215AD878228701E7A25C858775BB2CF1AB1F0235EDCADCA9652669F65BF9ADA0A64F174373718179A3FA756D0157C0DA9E70E1FC06CDA7416BA91FC0985EE4987B1884E646422F7354ED046A5C93B42304336C11245EAAA559B73E8420DA8AC675E1887FB4C827302623 ss = CA0D7585046662311189B3592F76645C count = 56 seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 pk = 6B1319C8117FFFA442B0F1412F6A7D6D0C7408DFFE495790A79A3C8B4D147912E7617F70C87BE6C11A7EECD34C41C51B05F39A0D45B87EAC7B96FE092E6F08C5510AC68BC5CB09EF335D2FFB77CE1291FF80E765E63765A2FB14773908B9D4D072E0C61961BE84281B98389A20241C7F12BA082DEEF8ADF948680D965B0431BC1F07C5590EFDACA02287D3C34032B88F41BFB9E408E10435784EAF2CEBAE679F962386CBB445862067C0D99DB53164477D375567CF835DC983B0FC2E1D71BE7ADF03B26F3177BB0947A1BB55EE70D5919DEF18261D33FE5CA36C6E7FC7D6405A84D92EAD1CA2FE8307350822504105FC72D0C951D0F4DE3D4B605E29DF181E5CE2443E0EB97EBE91595B58B5E2F2E56C8848F410746685A2049D1941DD806F72D83B2682C6D95E0E4E130C272A2E0422F80D4D655DA043DED68D3935F41D06AB744B3627E81234574162D02AB7D5A6B038E9522F1762F86694231D7CD048210DB1576C86E3E70B2588BEB1B1ACF59E56E201020C7E6C54129B34 sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F036B1319C8117FFFA442B0F1412F6A7D6D0C7408DFFE495790A79A3C8B4D147912E7617F70C87BE6C11A7EECD34C41C51B05F39A0D45B87EAC7B96FE092E6F08C5510AC68BC5CB09EF335D2FFB77CE1291FF80E765E63765A2FB14773908B9D4D072E0C61961BE84281B98389A20241C7F12BA082DEEF8ADF948680D965B0431BC1F07C5590EFDACA02287D3C34032B88F41BFB9E408E10435784EAF2CEBAE679F962386CBB445862067C0D99DB53164477D375567CF835DC983B0FC2E1D71BE7ADF03B26F3177BB0947A1BB55EE70D5919DEF18261D33FE5CA36C6E7FC7D6405A84D92EAD1CA2FE8307350822504105FC72D0C951D0F4DE3D4B605E29DF181E5CE2443E0EB97EBE91595B58B5E2F2E56C8848F410746685A2049D1941DD806F72D83B2682C6D95E0E4E130C272A2E0422F80D4D655DA043DED68D3935F41D06AB744B3627E81234574162D02AB7D5A6B038E9522F1762F86694231D7CD048210DB1576C86E3E70B2588BEB1B1ACF59E56E201020C7E6C54129B34 ct = 771416311ADB3F965DB35A8000987A64AFAEF47D526587A24C25A45358D71C773B07B22E3211ED9577C3E177140600B64F6D75CE8B88B0DB78B971A9E3982F98FBD07419B4AF178F653EF3C4F063661B4F16ADE84F4EF602F2CFB89A63F2A68AA65AB878278FE95EC5AE8D2D7EA06DD5EBC3DE6B1FDA05BF9934776C9D2ADFEBD9FB391D2C49190EDF4E8742292C815F7E74299F2DF9BD5619BE48FFBEEE23C5C918B0DAA4AE326504A7F41248A92DF93973113BE962F18AF9F9A2A02C31DD6B62BBC7A6EB4F0857471AA0F1ED648AA1E6F0851DEBE8A56CF8DC2FF64454DECDFBEBDEE5920141AEDC0370590666436C0FB24D54D036855B14338807BF2498D789E9D665AD9DA9D63D61AB0E827CD738AB04C4BBE26476CDF16948E4868AB67C457A50012C37193A054A41590C4D375C5763A0E86A49B510B25C1033A035310691A1FC2E2C1F765B11DB4C72DB341D12E0807C092FB8A153AF8C9B701CD3FB49ACDF1E761415B86512E5AF841EA23D5F8D9B6FCE1769766D26118A3B78ECEC26852CC106AAED9D81E7CDE7F878A55709B881 ss = 4C202A19F5C63CBCE9783D5CC76BF831 count = 57 seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 pk = 6D2A89C69923487EDE1BC34A8A13B155E7F9168D213D70D7905FE2404D4622D1669F7A4042B8A9B544CAFC65BC003FE713A2B2FC7ADA4055655358A669F92BA93F265C0F0E49C2FEDF05D5A3829D760F3A306FC9F5FC679EB3461C9294AE82001CA57D5C4E9D9D3F56F9064457BDC7117077FAE8A957AD940135BB6AC40B2B6C07C175ED665309F9C9EA39524F072231CD206C816404D710DCD196414CACFD7480DAFFB57FF37766D84FCDD3526A7E0FBB365816C6BFCB4A531F9E9F327F6AA13DA7B7B0481A5938D2A91FD5EB8020BAB66B5D0D6BF99C54027D0DCE93B090044793EFFCDCB3959E33822B5F851587B728A77F58CECA18223D07221D701FB4994D62BB6DE992453364A204FC1F3816432A42F178299E93C69E992900A9FDEC8532B064F87B9EE684907ECF2D587AE9C7A21FB3BBC515D188DF831D283A261435A359E7FBE876E7C8BC5B2004A2A196BE2543416A088296C0A5AFC42D2C036866A595720FC216C62082FF7B811BFD7B0DA7F0B7C08C58EF386C03 sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50076D2A89C69923487EDE1BC34A8A13B155E7F9168D213D70D7905FE2404D4622D1669F7A4042B8A9B544CAFC65BC003FE713A2B2FC7ADA4055655358A669F92BA93F265C0F0E49C2FEDF05D5A3829D760F3A306FC9F5FC679EB3461C9294AE82001CA57D5C4E9D9D3F56F9064457BDC7117077FAE8A957AD940135BB6AC40B2B6C07C175ED665309F9C9EA39524F072231CD206C816404D710DCD196414CACFD7480DAFFB57FF37766D84FCDD3526A7E0FBB365816C6BFCB4A531F9E9F327F6AA13DA7B7B0481A5938D2A91FD5EB8020BAB66B5D0D6BF99C54027D0DCE93B090044793EFFCDCB3959E33822B5F851587B728A77F58CECA18223D07221D701FB4994D62BB6DE992453364A204FC1F3816432A42F178299E93C69E992900A9FDEC8532B064F87B9EE684907ECF2D587AE9C7A21FB3BBC515D188DF831D283A261435A359E7FBE876E7C8BC5B2004A2A196BE2543416A088296C0A5AFC42D2C036866A595720FC216C62082FF7B811BFD7B0DA7F0B7C08C58EF386C03 ct = 86C91E6EC454EC80779399FFE0B109312D41E7E385EC7EB1AF45726279388C76A77F7AC9B252B365F2D70EC56D19584C9693DA07C37F55D43F11844D512B0AAEF5DBCCC6870C3002188FF37AA488F11FCE52C5783FA26B8181BB6A903D0AE4D2CED85F7DCA3BB2B114789A6CC79D4E48032022E1FD3088B8AA4078471C27A573C2B054A6F81ED1A8250D4136C7FB38D62AA002998E98F2A8634EE1CF6CA6088C1D1CCA99E921231EFB907CEDA9F5C26027B421416C9DD65581B34C9C18FC1B8F1C4DDCBF34D1589C5D38421377BB71E9445FC32B8394B63C34BB3851F150AB776442B771A259411699057CC95584BC4D259ADF5B4CFC4445EC1A5807D358C7D5D75CB6E80E26221435B3D1DF31305256B83A48810567AF6D2D871BEFBD0DE7465A6BC79EF83147283B8ABD6D1F6A58AD9EC776047AE5E05027BC04C3F629524510C4A05134B0099FE4B5C2D082498929EE25073E16660645D547ABFB88B506124571F940C3A82E17CE6F577F1BC6C437D74D3B72CF3A1596F6007AE094C860A5B85ABBA331BE2700267B4C4180169694A43E ss = BCDB0612341C644C1E49A67D3E5DAE5D count = 58 seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE pk = 79D60D3B20762812250E359F4EAD8013AC6945E600097DCF220DFDFDB0EF77778E6D5831038292004BDC4CCF3C3F9A741401E4BC36C4398C2E2E8E1E13710F9F97F7E9C83C65DD8DA7DDFDD7BC4E355F6AEDB7680291F43BC740535FDA098FA2B43E6C765E195AEB05F2197FC427BB2323AEAF0D353819071A7F0071793863596388D29327C976B53621E73809269D9A76AF0E8BB48F613FE910A11334046ECB7BE1E6ACA632AB9816A9D0BA7757D972DC50F827DE04AABE9C51BD7303717CA9D16C14D169C814BF5F5BAEF2A3255BD440C91239A3F104D3568556763F790E469F8F0D86A06139860CE70420037ABF9F3DB28AC2C09D06D7AC137B1D1D4A24C90C0A3AF1EB6724A0A34D549DA83877BF3F40A5559994CD9062C836A0CFFCE230A83CE9903863B1ED8D78CE01EFD1551FB91B44F096F291E50D8636CCD3BEBC9620CB63DD37F49D607A0D5B8B9CF0D0E899E26687FDBC9114BD9BC53DEE1393AA2DC4191FCFC9885A91796F9B2FF31CD331AF8BAB786CFC992B04 sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DE0979D60D3B20762812250E359F4EAD8013AC6945E600097DCF220DFDFDB0EF77778E6D5831038292004BDC4CCF3C3F9A741401E4BC36C4398C2E2E8E1E13710F9F97F7E9C83C65DD8DA7DDFDD7BC4E355F6AEDB7680291F43BC740535FDA098FA2B43E6C765E195AEB05F2197FC427BB2323AEAF0D353819071A7F0071793863596388D29327C976B53621E73809269D9A76AF0E8BB48F613FE910A11334046ECB7BE1E6ACA632AB9816A9D0BA7757D972DC50F827DE04AABE9C51BD7303717CA9D16C14D169C814BF5F5BAEF2A3255BD440C91239A3F104D3568556763F790E469F8F0D86A06139860CE70420037ABF9F3DB28AC2C09D06D7AC137B1D1D4A24C90C0A3AF1EB6724A0A34D549DA83877BF3F40A5559994CD9062C836A0CFFCE230A83CE9903863B1ED8D78CE01EFD1551FB91B44F096F291E50D8636CCD3BEBC9620CB63DD37F49D607A0D5B8B9CF0D0E899E26687FDBC9114BD9BC53DEE1393AA2DC4191FCFC9885A91796F9B2FF31CD331AF8BAB786CFC992B04 ct = A78A062B9B784E4104DE8729007821C055B52E3FDC21E1E63BE3010473B07AEA415A15F89461B92B69A41CC884C15439C8D42E249459BFB496A9A916D02C3F8E643D5F07927E4FFBCF10B36A356C1A67BF99C87F7E49AE5B671F8AD135BD8C6E507C337732F2CCBB61A21A1A5F68C43AC8307E3870E0706087CA25D0C12FFB86F4BDAF1DB3DD9837233D6CBA74B6B7F3EB2E1E4EC582A0D3816152FE812E2A3F9B68A67A2A7038C985840A032571477C2D50320CC9A76F922D14DA5E115CE2CA8CF9145B4A6B29AABF82AAA1045B369F6C9A00C7DA469CD9070B641CCF6B32F6D9C58BC93C129F227F28D4A1124C15400A4BABD45DE969E414F0180908DAF9802415181E7D23CA62E371AECAB64EDBF525C00A33B261814A399FA099372F24EEE11F291D0FB7F8FEDDD791D6BBC66791BCBF60D9F1A94C5E54360B766E3F7401153A7750BC5579EA330D95A0F3ABD114CD9F8C14737661127230980E6EB6524535EB911F6961DFED2FBAD069F6EDE40ED11F47FAD601A07EB904687D558038252ADE0CB9F106824AFDDEB3AB58A31739773E ss = F8A5E526945388C27DC5F5DEE3F1A242 count = 59 seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 pk = 55380A7E3C64B3D9FCADB872F18F9B73AD97BBAA08808C380986007DF9DB3D444F91158BBDA5597C392C592CAF058149A46DDE8089F1ECD17014B7F7F784136B5529273AD2FF6202B610B3F64D2A48CF931A6ACF6037A4D12CB1019B17F3E75BF7B4FDC806FC2A8E745FEBAF3B8FFB4BCB13A438F17997D15C28DF6CDE0B36E18F27EA52EE86E74EF7AD57BC5F315D32C217B6A504C7F004E98D63C318B8F0ACF6CB7A5194882DB598C040BB2E689D9AF3ED351B05B485A1B1B63835064823FB12C6FB7EE015051ED6CAF4494BDF230731C417E38812C51BC4D602774529A190B73B704618D8A3A23139B98619B00EB718F8469E5B0A17D706FAAC1F77947DC8289C2A570658A47383629C8160DDC1A9C98B89B12B1CA1224E0B836383357151E2D5046F661743A4C1E38DCC174E514675F56CC7CB7D3288C43B3648E41A8D4563D8DEAF98FF11D0133A53BAE6C6D9C11F084B19F37405FE362B07349DB2CFC4E5A71C76A4A99AB73A91045BB9AB25CF1F87175BC4D2B7D3E824 sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB7A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFD0A55380A7E3C64B3D9FCADB872F18F9B73AD97BBAA08808C380986007DF9DB3D444F91158BBDA5597C392C592CAF058149A46DDE8089F1ECD17014B7F7F784136B5529273AD2FF6202B610B3F64D2A48CF931A6ACF6037A4D12CB1019B17F3E75BF7B4FDC806FC2A8E745FEBAF3B8FFB4BCB13A438F17997D15C28DF6CDE0B36E18F27EA52EE86E74EF7AD57BC5F315D32C217B6A504C7F004E98D63C318B8F0ACF6CB7A5194882DB598C040BB2E689D9AF3ED351B05B485A1B1B63835064823FB12C6FB7EE015051ED6CAF4494BDF230731C417E38812C51BC4D602774529A190B73B704618D8A3A23139B98619B00EB718F8469E5B0A17D706FAAC1F77947DC8289C2A570658A47383629C8160DDC1A9C98B89B12B1CA1224E0B836383357151E2D5046F661743A4C1E38DCC174E514675F56CC7CB7D3288C43B3648E41A8D4563D8DEAF98FF11D0133A53BAE6C6D9C11F084B19F37405FE362B07349DB2CFC4E5A71C76A4A99AB73A91045BB9AB25CF1F87175BC4D2B7D3E824 ct = 06A2AF7C92E7B49326F0859AB182F020669CD37CC4C16A8ADA2567824AD47062349E5B65977E3BACA2C1E5F9E267FBC2BF6FF23D252ABE697F5BC0C45D6922B2A305778688AA4542DB38B8CC5E7DE6630F61A6C34F1705BDB2FCBFE9A72B3C21A71300D07BF02260E93D4D703F1995710C85720261544B0D3A491FE99002E17C8915D722C98886B5FE133562D64A259AFB1C9BE05C3F51D85E07C4E5A517BBC4C3EEC4919721D1BB02D411409657AAF73A623BA1348A27691A849E590F2457129BA28C798FCA2C5A9ACA75FC9D8D251D7BADB81FBC76ECCB22D98ED0AA12D6D141F3BD905337207043170276489732DCB5B7FC1DD00AD2032A030F3298EEB9E9D9A57998994C9D66382D0CC200CCD647D37254D8DE27D98264F8D8CD00B232FFE28AE16EF605FB504DC8DD9B7A49F8AA7B851EFDC0CE1C7A8D9D2712496B7F3321130D17B5AF4F51895D72D8C17FE00576EE8C047426C6658AD0055F6828F26FAB0C182705F88CF98D84956BB3A674569A2B176B8AFD05BC8D0ECD3A4A899543AE192BACB7AC6BAF01E34F5507D0501C0A01 ss = B691E2F6CF111770164E0BC987BF29C7 count = 60 seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E pk = A946E01F62D730B029F61B0D6AE1C4DB4FAAB8B3A381D07210AE19D799AFAA2DED4766F82A7461E846D89B50A7268BB3F27C4694D29CE95F7A6CFBC3E7C6066282D3CD66A509BA71F5C162F2699CFB0CF884FEFD3BFE2DC036FBB36CE56E4E1A2BFD24CA6B9EF77D808E17925CF2D9AC7C7FE75C6C0639EC3F5F7B38D422CCDAF4B08047798957687A6F715A03D16F53B8475EAC4629FBCAF81CED52FA524AC88D00D46639694F3FAA3EB35768F721BDC977819329ABF41D62E64D5D13258E8B5C9BCD067EEB98424F786C7937101B2F46E4AC862A396D4AE3DAC9AFF4B71967A3E329C979139CD9A06B47D171D6C172AA1F0520676DC4DC2DFC5E2EA0EBA6102A8ADCE25045241DE39FE1403459C147876437531D7CEB3642908127CF1F8D653481281E294B8FFD672F0F64413B3967FD044ABB2141B62610021ECB974AA2A4362617A79AD53A2101272094654F6E2A5348B5ECAB6FA4E214FD0F9175DC3DBA35DD18857D610AF904034894F6A6C8F7F268700EED15CECE5824 sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B28F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A0707A946E01F62D730B029F61B0D6AE1C4DB4FAAB8B3A381D07210AE19D799AFAA2DED4766F82A7461E846D89B50A7268BB3F27C4694D29CE95F7A6CFBC3E7C6066282D3CD66A509BA71F5C162F2699CFB0CF884FEFD3BFE2DC036FBB36CE56E4E1A2BFD24CA6B9EF77D808E17925CF2D9AC7C7FE75C6C0639EC3F5F7B38D422CCDAF4B08047798957687A6F715A03D16F53B8475EAC4629FBCAF81CED52FA524AC88D00D46639694F3FAA3EB35768F721BDC977819329ABF41D62E64D5D13258E8B5C9BCD067EEB98424F786C7937101B2F46E4AC862A396D4AE3DAC9AFF4B71967A3E329C979139CD9A06B47D171D6C172AA1F0520676DC4DC2DFC5E2EA0EBA6102A8ADCE25045241DE39FE1403459C147876437531D7CEB3642908127CF1F8D653481281E294B8FFD672F0F64413B3967FD044ABB2141B62610021ECB974AA2A4362617A79AD53A2101272094654F6E2A5348B5ECAB6FA4E214FD0F9175DC3DBA35DD18857D610AF904034894F6A6C8F7F268700EED15CECE5824 ct = ADD7482CE5D3611273D876BDB1769A7198D5FE4168920CBAD2EA1D557DFCE7584C4ED3CF9AD401E12FE3287AD8FA9D02061109F405C8A1406304AE275DDF1B33BA787A727A29AFF8660546B2ABB9EA683EF2818B6D0726D2B71C9D90892F5C4BD367CAC12CB66053EFE2A36D7BF4A49205F47B6AB0734DFC2451B919E63C90B602670B764AC7BC0C39542979D8484D49C9637D1B7F05D4787C4240BE385E06A59D07BF474E36985EAC8E04801B9255F10223E20AEDEEDDAE371C9DA609911F2C6F3BABB1742805469999CC95C7CDA1B3E10286630B755F40D4C1EED12FD1D2AA4FAD7422F521E89B35CDB18D7BDA464A2D1B83AAAAB69A430E376A274D437CB6B601AC40ABAC7DA79EBDA6A7417D899A21ABA073B7A19B2BDADCCF13A20A2DF8E7EF9E3126C8F52763C9A03227CEBDD441C999E30685D6F6F4C3038BAC6683A637C36A14C1A34547D75CFCDA21E56DF42E8116092F66234CB6D0648CE6AF4479A1F17AFEC23FB48A1EA74F0189F4ECA4F9BD1AFB9CF64D2C382CFD46D42867BC08D3A27362B57ABD59E60F99A56EC2532F40 ss = CD46C969AA5DFEA2E170905CCC89AA13 count = 61 seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 pk = E2496A4E000054EC2F545122E667FFFD6AE4616339799F5E631EC3F70504409E6FFD933F7307EA1674002DD7442A7B5361CC07C0492FB47C737B32428BB33B8DB1DFE23ED99C0B3F02BFCD88EA9E9AC8C537B773BD0950EFAD1D9A83F780BCDFB4D9238501AE3CAAC4E5C70A19979AC316D9FF903433CA13F31C169BE708410C8D4421E9A5E784FC90EF2CC4CC1C47BD86F3056E7A43C7819E7054C5E116D58ECD1C864B1C623018BF62CE283BACC405502A65791D6B4758A2F7102705AD795C3464DC7BCD94503D95C1D6E618ED44D4C75E6DF264429C663DAEC426F8D5404DF7304B757136B4DF1E9306BD35229DD18AC000652DDE20C58E13832109DD95785FFBD6760B0C475E546383CBB6C9FF1A810D55F9D79F8D02AB7D5B58FE053FA26A0317E3E9519AA1D632F35AD4F3AB836C7FFCF7C3C2D0DBC12607E4C7708653F1888D2FF863D6AD43857DE9ECA28535F1F88AABB52ABB67A458952937A0DB55E1857B7A5A709550388158BF8F2AA600FFD777F11AA4B97AD019 sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB08E2496A4E000054EC2F545122E667FFFD6AE4616339799F5E631EC3F70504409E6FFD933F7307EA1674002DD7442A7B5361CC07C0492FB47C737B32428BB33B8DB1DFE23ED99C0B3F02BFCD88EA9E9AC8C537B773BD0950EFAD1D9A83F780BCDFB4D9238501AE3CAAC4E5C70A19979AC316D9FF903433CA13F31C169BE708410C8D4421E9A5E784FC90EF2CC4CC1C47BD86F3056E7A43C7819E7054C5E116D58ECD1C864B1C623018BF62CE283BACC405502A65791D6B4758A2F7102705AD795C3464DC7BCD94503D95C1D6E618ED44D4C75E6DF264429C663DAEC426F8D5404DF7304B757136B4DF1E9306BD35229DD18AC000652DDE20C58E13832109DD95785FFBD6760B0C475E546383CBB6C9FF1A810D55F9D79F8D02AB7D5B58FE053FA26A0317E3E9519AA1D632F35AD4F3AB836C7FFCF7C3C2D0DBC12607E4C7708653F1888D2FF863D6AD43857DE9ECA28535F1F88AABB52ABB67A458952937A0DB55E1857B7A5A709550388158BF8F2AA600FFD777F11AA4B97AD019 ct = 603091FE4CC2161FC3C9C514BBA8783CC0FF7738DFA45CF72CE8E27415984C79384D955DF0075A51912732EC71372F38E17FA5F898BF1E79138A4E52C1CB3FBA5938772F045A3988DC9B05F25912845D64543C16C8A84F11AAFFEC30B3B6DAD60FB945AF7192B5BB0840BBB7D78097267FA85FD2A61E934A8C98A5570B24D7418AB4A24DEC606F6C84E6A611A9D5F277396C1783B4AE46C2825E379A0CD875F28A0AB807D8678D9AAA10D73E5CAD6352919669B990D4A41F4300925B06ADE61E989CCA250D570CF66E59348B811DDD6CD19E12B33EA17501BFDCF66C94AEDCC2E6B86C60F24054DF83C0AE3B63B4948B26C12DF34CA8ACB9A6AF3F313F71ACC69ACFBC46DFFA89E3CC4E3AA7DE93963EC1C4C57375DA3E6F365EB68C8DE9D8B3B968666A2B1F3481EDA65625BD30ACAF341919E11C8C542F72D537182181B435EA7ED2638BEC1654CD118FE7BD6544BEEEBA51B71AAF29905E5ED6CD18B6DCB060DFF7DB617BC339514E15B000522EE75C7A4FB74075C7147039DBCCB0B6DBDB27C136746E19D20E56D5CD3D12DECD6FADAE ss = 003CD451783593A761402EE4AB2A4734 count = 62 seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 pk = CE956094326ABDF77ED13D3A85B5EAFBF1B4D4ED41E4E3F76F2B5CF8D20DD28F4B46064589FF3EDB866A4C3297873066F41683F084A5E9A8624B799270733AA72296063A559FE5DC663A2A5E092EEDE75C2BBC3788D3EFCB50C656B36F5F30104033ADC9500C8C329A113340E418B036851C27599947785D691A2724CC03BDB0C8EF395A6FE518B0C6DF0626E1135F852E476C2945257C5AB15DC6B5AA68EF26F1A0533D5F4315B6C6010010B5CF5DD93F89FE773A09033FDA80906F188C1D22521B514F07B8F5DC8996A37209CD107440C3952A98EC592FF3009E9008AA70E58681E6F60EDD587534060BC8468A64B3E020C18E81BC1A2DE8D6BC30624F731BB8DD50137B3C0DC23C2264F98A49E6BDCCC62BF9CA6554D3707F351FA4B700AA9DE28F122FE35BBFAD4C2E5334ADB835630DC25B026FE69A94BB17FFEEEF6F358C6EAAC4B50A5E3F2D4B0023568D75EB6BB781BBF80C1A7B22F6FCCE448A7A5BD86F1F17C46325386C6EFDDB767A8D79EC2613146A3ABFF54C1E sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA20139393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F95405CE956094326ABDF77ED13D3A85B5EAFBF1B4D4ED41E4E3F76F2B5CF8D20DD28F4B46064589FF3EDB866A4C3297873066F41683F084A5E9A8624B799270733AA72296063A559FE5DC663A2A5E092EEDE75C2BBC3788D3EFCB50C656B36F5F30104033ADC9500C8C329A113340E418B036851C27599947785D691A2724CC03BDB0C8EF395A6FE518B0C6DF0626E1135F852E476C2945257C5AB15DC6B5AA68EF26F1A0533D5F4315B6C6010010B5CF5DD93F89FE773A09033FDA80906F188C1D22521B514F07B8F5DC8996A37209CD107440C3952A98EC592FF3009E9008AA70E58681E6F60EDD587534060BC8468A64B3E020C18E81BC1A2DE8D6BC30624F731BB8DD50137B3C0DC23C2264F98A49E6BDCCC62BF9CA6554D3707F351FA4B700AA9DE28F122FE35BBFAD4C2E5334ADB835630DC25B026FE69A94BB17FFEEEF6F358C6EAAC4B50A5E3F2D4B0023568D75EB6BB781BBF80C1A7B22F6FCCE448A7A5BD86F1F17C46325386C6EFDDB767A8D79EC2613146A3ABFF54C1E ct = 7DC0798455B5A26CB05790521AF3D45C88097EFEF2F830A9141D2B22C453D0D4B0D03D7E43E1F0901F593E1DFBC47AEE3BB4F41783C9ABC2926A97C3907A3E4E0F7485085D7172D085B5CEB7B71ED0F2E7A36D263009AA247386CD72253FE736D3491CBDEA7A0CA5130E050DC597F8CA3E2472264DCFCC7FE9AB07946F02F4E9462AEF52D7C061ED483F9F23498849E51AE9B357BCCA2FE1BA57FE159F40A0EEC1A3D6BEB9BEED50ADE070F79FC7135286DC4D7A7CF1361067F73B41242BF6AF8ED472F9C88896D8480B5FACC7706C2E4B6048520FDAF6E90073260957A9C121546B1402C5946E06C288C490C4F9F708336B744EC2D4D05A443CCA3D8316BD9EC4C8E54AC2FB4E38A39B16966E656D10F5AD630A5D0CE7E686B27D2A6E877CB21F73CD3842F5917F03FB9EE48BF79633B73217CD05C1DDFCA8AD07A7F3BD4C1D5F3435AF4A9B8068ADCD162A9F107C65E1322B70EB15E522CE00F5DEBC995B5544FEF5C85170B946C4729E482E4E44C29929150D15FC5BAE4D1AE526E20E25FEAE987E29A33A24F009D131D7C06B15559DB4 ss = C703F50DA9CBEA117DDA3F19CCEC719C count = 63 seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC pk = BD9243DE189E15CB45C6767CB179EB18047C5ABC559325AB44B4D319E665636F2950C673930AE172B87B2C7AE5985DE2DEFE8BD8430844377AD9F905DDBA07EF4BC80BDB80E5B681182A72FE4FA6B87017E3DE0CD34F515117CC08AAE91F6D72DF7675D56F0979E9E0C49CEE40A0728A8FB0EAFB75EC27B6DE76A21C510EFD378B37B067978F11F219D82FC94BB51009510C6E15AEF66D2FF82FF83A1106D1D954A1EEF7BFA2A8C414CE045CA8FB4A7E0C15C60274194E2DE8111285020A631AB2F0F34EFA18247EFEEEE1B48835B6AE97FB4049771D2D907582F3340E89C4E167E15678910C8ECC5B882561E8733E1EAF12E30EF8EF3B82E676282C891C450979663024FEEBD3AE27F2E5506EB6EF15A40F06746547305EB562AB5209ECBDEFC39ECD28EED4412EEC2E710846549A6CB9F3C5CA49A4F5E3D2CE35AC3B9DD1223BDCF7ECA86FBAEDE5B9144FDD082D190F46F83A85F6D4D2D23A6BE85FF81B489F229011C5A333A9D724D679CCB259DAACDB4E46108A27226B20 sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEEAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142901BD9243DE189E15CB45C6767CB179EB18047C5ABC559325AB44B4D319E665636F2950C673930AE172B87B2C7AE5985DE2DEFE8BD8430844377AD9F905DDBA07EF4BC80BDB80E5B681182A72FE4FA6B87017E3DE0CD34F515117CC08AAE91F6D72DF7675D56F0979E9E0C49CEE40A0728A8FB0EAFB75EC27B6DE76A21C510EFD378B37B067978F11F219D82FC94BB51009510C6E15AEF66D2FF82FF83A1106D1D954A1EEF7BFA2A8C414CE045CA8FB4A7E0C15C60274194E2DE8111285020A631AB2F0F34EFA18247EFEEEE1B48835B6AE97FB4049771D2D907582F3340E89C4E167E15678910C8ECC5B882561E8733E1EAF12E30EF8EF3B82E676282C891C450979663024FEEBD3AE27F2E5506EB6EF15A40F06746547305EB562AB5209ECBDEFC39ECD28EED4412EEC2E710846549A6CB9F3C5CA49A4F5E3D2CE35AC3B9DD1223BDCF7ECA86FBAEDE5B9144FDD082D190F46F83A85F6D4D2D23A6BE85FF81B489F229011C5A333A9D724D679CCB259DAACDB4E46108A27226B20 ct = B299CE6702196439BA77EB9CCED77848129554AB4C769AA38FB4B5F45A9B0CB22BAA0EDFA55DEB998A1E2F72C42A3BB15D2833DDB57AC4BB484032F4D4390ABB662EB544C53AE9B391454881DD936B92CF2132737481D2303C3D48E7FAB653FBAC4B932B9294FB30B253240897E4702CE078C14DFE372D3B0EC17B8ACD00D8B0D0546EFD122D306B5E371272CD1321BEEDEB09E777E4B7AFFFD65415A588117B444F46E334BAEA4E1D06CD6689A86CAE36E074D1E64E595EA20D138120C4EAE891D24C8C1BBFDCB36716063838AB7138CE02915CDFDC53B29B69C0D795A0999032A9FF732D8FD631C7A6DB6F1E73EF55AE40014B7294FCEBBE60A607FDA204E75A42813385AFCA2C31532F8EE93EA9E3686DBF54C82560EC51D1E4DAF80EA448D96BD4B7E9ADBA915FDE0F5F30C618B5CB2527B552B30D1FF5F416533EA1482BD742BB7F49B5726DD49D6887EBF94B99C2E6C136D978F67B6FFF5F7A23F9D457DAEAD5A6139B6C86E2F5D1700CEA98DF3B7AF2F26D7082CB31188FCC6A5E305BD825E7344F7B9D171E01BE31453AA8060FA1 ss = 6353E3E351F88595AF940EB23A4756C3 count = 64 seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 pk = 7BC613BB6E6B1C6182269F6879F737F79E79A3040987FAF718B8743FA97169F3F85BF6152CF846A8A000FEFE8AB56FD632FAB9D1B8B53D107C872B8A3A3C05B0141DEB35CC85D61188C45C6CDE567E79B8EB962CE6539B88F534662BED38CBB8F243119967946992FF424601DA4FCD3C88D7AC44437E0FEFDDFC572FEE183B15D5A9F64EFB60A2C74A46E5781430BC6A66FC99B7137981BF414E2D99FFBF040A7BBE28C5C9857116A5A2D278646AB01B2269FBBDE14A6646AA838ABB31BC7121D343D4CC5317BCDE624C4E2CD243D1AD364CA06656AC2E297BE782BE6A9F1CCD966BE558B3E120C67B24B17501EDE12A46D4BE3B108CE6250DBCC704F95EBC1B8DE8E939236D0297E051D473813D68F68F4F5F6D7C981B59B41D70DB620AED9AA7C26A6474E00C3040E14E20E758C374C68565F0628A0EA7C19531C385346C5C7375A90C2FB9B08036F79F9F6B2284B3138CA303F453F47E0A4116B5B675B81C63F7BBA9954610E0D1B9DBE48D55DD0E290864D360BA6FAEDF13 sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A353FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA90D7BC613BB6E6B1C6182269F6879F737F79E79A3040987FAF718B8743FA97169F3F85BF6152CF846A8A000FEFE8AB56FD632FAB9D1B8B53D107C872B8A3A3C05B0141DEB35CC85D61188C45C6CDE567E79B8EB962CE6539B88F534662BED38CBB8F243119967946992FF424601DA4FCD3C88D7AC44437E0FEFDDFC572FEE183B15D5A9F64EFB60A2C74A46E5781430BC6A66FC99B7137981BF414E2D99FFBF040A7BBE28C5C9857116A5A2D278646AB01B2269FBBDE14A6646AA838ABB31BC7121D343D4CC5317BCDE624C4E2CD243D1AD364CA06656AC2E297BE782BE6A9F1CCD966BE558B3E120C67B24B17501EDE12A46D4BE3B108CE6250DBCC704F95EBC1B8DE8E939236D0297E051D473813D68F68F4F5F6D7C981B59B41D70DB620AED9AA7C26A6474E00C3040E14E20E758C374C68565F0628A0EA7C19531C385346C5C7375A90C2FB9B08036F79F9F6B2284B3138CA303F453F47E0A4116B5B675B81C63F7BBA9954610E0D1B9DBE48D55DD0E290864D360BA6FAEDF13 ct = 710FA214C02BB2B832188B6CB6C9F66BBC26C94BB3724AC5405DCFD5C614B56294FD05C8133758F78FB31EF3DACD98F404B934FD2A4747B66AC339600B963458407DF968AFCD97BD6A125B8AAED89BFF750A2D2956596CC136EC9B97FC362878325062F3FC6BB12914D2B34177B0284748AFDE07C212CD7BE376C3A5061861A41536117C4F5E864762F92870F39B92452FA42EE03B2CB90CB7FA2796E392F058CE6B0FBB33F28D50D340D33DF71DB2B8330476827AA1AC0737337972142512746F31F230E5F431D10C06BEAF7B65CAB286346146BAEEE85BC81BD59B713FAFF5BF3FE96E30F75B14DFB9307C7C695A55C7B6B185F88AC3B00A5F5E2810A5EA8922AB3F9613D39B69D6854DA6F3CD5EBC51A25C7B4D827AF9BBA38678E839E3EE87186C48F9CE52CF4EF3B2480A927F55D21CC19A3A2A6E4396812C8567451B81532D6B785DBC9AD686A26E390ADF348CB19243F090D2912467D6A4E09423099074363CEFA6F957329B51724A835D18387265106F7899DCFCC91C7877756B1F9002DF661C49F5CE6A7BC202AEE3AA043FF3ED ss = B9EC435D5568F1BB8153E1D11B62911C count = 65 seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B pk = 000912DCF30216E62A3CB863665C9AA712FCBD5690C67AE96C6982BFE6B007F6DE84DF6D4250DE55865948C5D112866CB46781C8A1D4DED38D90CA71438C27DB9379E303D3370FAAD11FE424DBFCA3116823C1FFE46277EADE5EE9A818EC12A63A33644CC1A3396F2AFB047F4D61FA78F53213866CF0FA20BCC70DBDBD29230844128949B228FBF76F74A3DFDF51D39EFF67CAD7AC18043F06F3EDA2D9AB6B23A1FD77F99DC066A6B2168B32EAF4765E79917C43A8D967E0FB839F132948EFE3535D0FD5641CAC539C0F7933F3B6B292B217937FF15D2ECD545EF5865D4D98B8BB1A2253994C6EDAF353611860912B6689C2C5F0D214633B3AD1973773C09B0604405A532566CC9350AC9DD5F3CA538BEB05B12A9F25184F3128153EC38C28E93EDEF4F8EB6EFB5E71324145F40AE41CD1AC0D07BB3EBB7157110BCD7A07609FDE07C6442EC0307F959DF2C1560554563F2589E4AF3DBBBB1DABF563AF293C8FDBAA1978DC2AE340A7CF76A7FBF37CC2B65A02D8604338E59B28 sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26ECD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF70D000912DCF30216E62A3CB863665C9AA712FCBD5690C67AE96C6982BFE6B007F6DE84DF6D4250DE55865948C5D112866CB46781C8A1D4DED38D90CA71438C27DB9379E303D3370FAAD11FE424DBFCA3116823C1FFE46277EADE5EE9A818EC12A63A33644CC1A3396F2AFB047F4D61FA78F53213866CF0FA20BCC70DBDBD29230844128949B228FBF76F74A3DFDF51D39EFF67CAD7AC18043F06F3EDA2D9AB6B23A1FD77F99DC066A6B2168B32EAF4765E79917C43A8D967E0FB839F132948EFE3535D0FD5641CAC539C0F7933F3B6B292B217937FF15D2ECD545EF5865D4D98B8BB1A2253994C6EDAF353611860912B6689C2C5F0D214633B3AD1973773C09B0604405A532566CC9350AC9DD5F3CA538BEB05B12A9F25184F3128153EC38C28E93EDEF4F8EB6EFB5E71324145F40AE41CD1AC0D07BB3EBB7157110BCD7A07609FDE07C6442EC0307F959DF2C1560554563F2589E4AF3DBBBB1DABF563AF293C8FDBAA1978DC2AE340A7CF76A7FBF37CC2B65A02D8604338E59B28 ct = B466E61CF90D5CE11392D4F87DA07AC8E700B673512B094AED8A6B065E61A4C1761870BD436324173B773D7B3F044FEB9306BC6D27480BA425E6CE1501BD0791CB4085F0A48F1DE71D9D7A82FB828DF468CD45742BD108E0F7D692C2BD70E221D5CE4C67E106F5E0F6BBBA29F9E6884FA5FEA3AEE4182277824FC164D80A8D311DD723005EF04865CEDFB80B71500447D812E9DC9E00E59B64FFE7C5DFDB4AE05047D11C077F913FEB49C5BFE29E57C88C11375A00531515E7B7CE5A23A189AED31F6B6C735311FA0CAFCA609ED86EBB35318DBDD4E2D5598E679E98BCBED7FD708B7A277D1FE7EA75B08B70CD73D82CDAFD6CED8DDC3CA58C7DD004AF4B1E92A21233C69AD581EDC702A8CF9DB7E9E33116A819C4711BC179BB7D4CDBEAEBDF194AB4040EF615D7646B66C689EC3E362C0855A6BA611EA2359A026244249C7B25719032568DB438658798903AFB6160E03A2AAAAB2C134B254C8F5F6753E6D403832B110E54E13064E56E4CB61E35A41D370EA384B6AC67612C073C85AE35374DD5C014116DDB651907A06CA4A2F6ECDCF5 ss = BED32BD3C8A0F9D270BABBB812BAE14F count = 66 seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 pk = 198231B2ECE738116B8E716830579B4747EA32CD93C1F2026FC0B0BF4A608977912A8E61B24ACDF60B2D9F89B54795782D82DCBA07E6874BA64CEBB73592354353B97A2D2AC634BD9EC0C8495DEA7C24027D0B65B0B3848C5EBC61455B0032838BBAD62098581BDB125DA6248433E5A60DBDE1CC65F6E8A8E19653E9070C66326146D0BD71CDAFF11FEDCA7E4A89A8E89C10A8D3D35CDA59675B8DD15610719B37C6AEC5E80848804B5CCDAB2A3382C77592A6AABC34F4FD06B7B69A2F0C60D063DFD1901E7378305BB3BED982F2C65D82559B95C57620A23A562D63E65F2C6C81F95C651D8856D646394998C3590CDDC55D126AA9F41AD69A941B008167F6DE68A23CE9FCA68EC8CBA4C05AEA971877D04C0FDE00205ED2C715762C4C523D5EEA0D25D7FBAAA4A33A04AFB243B328C0E1BD28D832BA754102FA20E1D02B2A3A8EB27D312ED69A4039164D3EA8B9749A1871D15090A650DF069C4D6839D61809A9C5D7B97A699A6EBF90E22115063D37D26C65D62DE1861CAF32 sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E7B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F124603198231B2ECE738116B8E716830579B4747EA32CD93C1F2026FC0B0BF4A608977912A8E61B24ACDF60B2D9F89B54795782D82DCBA07E6874BA64CEBB73592354353B97A2D2AC634BD9EC0C8495DEA7C24027D0B65B0B3848C5EBC61455B0032838BBAD62098581BDB125DA6248433E5A60DBDE1CC65F6E8A8E19653E9070C66326146D0BD71CDAFF11FEDCA7E4A89A8E89C10A8D3D35CDA59675B8DD15610719B37C6AEC5E80848804B5CCDAB2A3382C77592A6AABC34F4FD06B7B69A2F0C60D063DFD1901E7378305BB3BED982F2C65D82559B95C57620A23A562D63E65F2C6C81F95C651D8856D646394998C3590CDDC55D126AA9F41AD69A941B008167F6DE68A23CE9FCA68EC8CBA4C05AEA971877D04C0FDE00205ED2C715762C4C523D5EEA0D25D7FBAAA4A33A04AFB243B328C0E1BD28D832BA754102FA20E1D02B2A3A8EB27D312ED69A4039164D3EA8B9749A1871D15090A650DF069C4D6839D61809A9C5D7B97A699A6EBF90E22115063D37D26C65D62DE1861CAF32 ct = 97896865CE6ADD775D4494D67021EBF50B7DB54E531382E6A0F295F07AF5C8BEDA125EE68313F75B91270E62BC5BE80178A0325D50324FCCD94D2F00BB550A297273EBB14F34670AA95C3CDEB7F9AF20326B6C37FBE4FAA5D06AB472A14BE13D24A5ECB9BC9C67CCCB69AA4BD93B93ABA96D479434B32852C3BCA49BF31367D6DE0E3F9928F2E170507BC82AE881205821945E122D9738C2425C50E8016B81EB19AA2C66847AFD5B56617E7E4B15BC34992143C6CC767AE4910B0BE7093344D982872F7168693DFC0642AB675AE7FE5F18D66A07285AE68CB4E74536B20B43A4810DF5F82437365C300D9806BC533A345FE9DC8C58505466F9EB210DE2F32A4C594F5ADF546ED2102DE1E06329AC5FF1E0886C243B8CDBE01A5EB89BA41992CA45D9724A2BE1CE89279EA07AE9CCFFC6CFF86D2C3B60966B4CF1211B8E92B2C42707DBE957292C77D5DDF96ECCF121DE4A119162F8416BE19B2F3C8D91CB78FED227B05B1531686773C2AEBEF2F9CF337AD43A1B2D1552BC3116AC8DA9448C33F234DA667D3C138DE343F0E06C09EA88257D ss = 51C06A9252A9A1E7FDAE296584C13112 count = 67 seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 pk = 2EF91EBDF5261EB92B2F470053DC48EB4563E5D40389FA27BE0586E1FA15D379446C42C9E79647588BFD4072C1EB2D90BC75C09B0DE7F2388502552AD7E43D7258EAA76380809D61E709F5BF278F075C2265E915D892CA7C74CBFC23DECAED089E6C652A5268F2FCE22A518E2A8495F14F645F630B73ACE37BC964AD63229ADC14339CDC0544703BDD5F206920011D1E72E5FC5028D1592906A7506B2CDDF4281A350C49FBF2F6DDC610EB9774E5FF32E2E394D2B00666F2EF1DC9D62E4AE7550B7F90795BF7FC318A404649CDF2D1D69BD8887FC04B5FBB7EF6AC2E47EBD7EEA4FD18576DEA28A6BF25B19E45B541181C06BBB760713C7873AA1D1FBAD06A415DFEF47C327365D3BC224B12534A889D93CF708567FCF2B23F334860587D9C79EBF5984217D78443712EDE9019862E48B6B852B823B972FFEC482998266488AE4CC1BED9973685C14CEA59BE35723DE7FCA95AE88C42EA3976875C817E2418180D6E6E21AC1F08F86D5666C5B12C3A04C6733FF3A98851DFA93B sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D25032EF91EBDF5261EB92B2F470053DC48EB4563E5D40389FA27BE0586E1FA15D379446C42C9E79647588BFD4072C1EB2D90BC75C09B0DE7F2388502552AD7E43D7258EAA76380809D61E709F5BF278F075C2265E915D892CA7C74CBFC23DECAED089E6C652A5268F2FCE22A518E2A8495F14F645F630B73ACE37BC964AD63229ADC14339CDC0544703BDD5F206920011D1E72E5FC5028D1592906A7506B2CDDF4281A350C49FBF2F6DDC610EB9774E5FF32E2E394D2B00666F2EF1DC9D62E4AE7550B7F90795BF7FC318A404649CDF2D1D69BD8887FC04B5FBB7EF6AC2E47EBD7EEA4FD18576DEA28A6BF25B19E45B541181C06BBB760713C7873AA1D1FBAD06A415DFEF47C327365D3BC224B12534A889D93CF708567FCF2B23F334860587D9C79EBF5984217D78443712EDE9019862E48B6B852B823B972FFEC482998266488AE4CC1BED9973685C14CEA59BE35723DE7FCA95AE88C42EA3976875C817E2418180D6E6E21AC1F08F86D5666C5B12C3A04C6733FF3A98851DFA93B ct = D09252E5A9F857F98190BEE372E55AA91D9E73E54DC356890DAE6FBBBB871FA9D53DEAFADE19D90ED6D3B9E5BEF7E78B606A7744E33DC6B48269C0B1B71F12F4CB9C820A28D834145014DEF9A1E5B497FC96D45EB6712F334B2A640FAC7C925D054A0DB99C91A44FB6DD44FABF4B4125546C874F36E0FFB9301D042B8E314312B61A9EDB2F7F72262E1147EAD48E68E2B13EFBAE89F43E42AF27E1348761A01F726E6496E946BF7270C8F9A3616AA8C13B6FC74FAEADA26F5B0D8EC70472D9FB033DBB519534392BF440D404E2FF3C9DF5E2E4E5935DA68D0B9C15376243780B9397C5A78FF193A99BB85539512450807B237D54E90627DD60FD3816E5F87E8894C4299279094BB4F274E0F425ECAC0564EBC7ABFDCCB7AAE9F7BB1BB4F385A13AAEBA839A5327C53204110A2B24A1F82575BE823A77887BC94C037A7A95742D56072FAD78825FB4DB760FC741A884C3A0E18DF1A447C11435E946A22AABBB1804940DD025CC4D06D85565BDC155EFA1DEEBAF2D400E011DD235A8C0079933500A7C9E7E1EDC0D582ADC676EA8C5CA77D452 ss = F7AF39468071B219E8EB76EB6CED97EB count = 68 seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA pk = DA9F2EB2890FF8FAA53012E5FE3FDD8EA020482EC2B9AA51C0A47FE492EF6EC9499C0A7B94A8D250D3DCC89C4497167B7ADF29249AF72B9A79D7E180FE582402F2E7125ACB73AD623A9BB17CF72A937BE227134364DE051FC482A756E31632EDACE335859115074CBA8289331FE265B70B9CA57567FF1AF84AFDE8320E1FB00E9800DA0D939C64C8D97647055CCA7914E806E4F8A2199ADBE8B06CCB2E328271162652504DC175ACA71F0CEF6F2B43A9DA5C42B2EEB8D3748FFB8DD41DCC274E120AE56658E17C59A92F113F9AFD909C5666D547CC7DDCF25597799B1D9A33BA0877325D2DD347AD85BCCDE6D4E2CE9DE7CF6914957667C1B98EC12DE48CDFCFEE5AF16D5B7ABAA07085E362232C581D7122BABC9408C6E64731249C00C2DE00C966592D077D740565A11177A0ACC0BFB7821E932B8BA2C1445312C6AD889604D3602D43BBC4BB0405E7BE1956B6C43F487B0F0335420E137D8C6AFC8DC55BE65EA84756BB75CFFBA50C43CFF2D900F81E44F92DEFB1DB1E283D sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E606DA9F2EB2890FF8FAA53012E5FE3FDD8EA020482EC2B9AA51C0A47FE492EF6EC9499C0A7B94A8D250D3DCC89C4497167B7ADF29249AF72B9A79D7E180FE582402F2E7125ACB73AD623A9BB17CF72A937BE227134364DE051FC482A756E31632EDACE335859115074CBA8289331FE265B70B9CA57567FF1AF84AFDE8320E1FB00E9800DA0D939C64C8D97647055CCA7914E806E4F8A2199ADBE8B06CCB2E328271162652504DC175ACA71F0CEF6F2B43A9DA5C42B2EEB8D3748FFB8DD41DCC274E120AE56658E17C59A92F113F9AFD909C5666D547CC7DDCF25597799B1D9A33BA0877325D2DD347AD85BCCDE6D4E2CE9DE7CF6914957667C1B98EC12DE48CDFCFEE5AF16D5B7ABAA07085E362232C581D7122BABC9408C6E64731249C00C2DE00C966592D077D740565A11177A0ACC0BFB7821E932B8BA2C1445312C6AD889604D3602D43BBC4BB0405E7BE1956B6C43F487B0F0335420E137D8C6AFC8DC55BE65EA84756BB75CFFBA50C43CFF2D900F81E44F92DEFB1DB1E283D ct = 01775494EC485C77F94642C265BA581BED2697A183EBA6314F640EB220814067A26C0172A7B12695960731D76F68CFE1D29DEF66D7B49F541E8B1813BE93233DCA84999925B0B20B6BB3872B3DDCC3322DC3AF9AD9CE594DA5F47D2B2295091EA1AFC66DD414D91D53BEF899AFC91C10546CDBC2DDD6AA4A4039FA0396099A2094099C78A410E0830382379BA0C54E2DED11C55E12D813C5678014909973A807B7803CDF3B385B0AB412AB6B19C9A7D342B99FF3262596B2A2E7F9BF0AE69F01EB6AFF39CD52C27F87891B661309663CCCAC6287BA575D2B1E90EF3E0A3353704589C62539F783EBC16A405291A91DB52C22E5E8B5CB5A9CD1016713DD7B1E97A864DBDE036BC19E9E1EEB8D452E2D2E6611FCCBB5563DDFC1F7F443D2668ABBD2A6451EB60BF11D5CCB265163B8F6EA132D3CE13D64C0FCE7BF299BDE91ACCAEB63E125118CA30F0C87B331662CD016B131FBF20EC62A8B78DD6F7C4028650E16A83CF7B2D9846ECB1A8D01687CC8C156595F436FAF76C7AE0D73605BA3B6616E13FA6352808BD767BE9F6741345D4083E7 ss = 795C1639B810FAB967C5F7F15CD7EBF3 count = 69 seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA pk = 002A7F962B812789ADA4705FE742572BC322707D916465EC0ECF52CE90DBF4C0556AD81666CB42882D39068F04D94BD3A065C3DDAA2A0953B99FC34B6F543B5BBAB07F1E2430BB7079B6136D9F438E41150C3DF99E303A9288DE9B2A7F1002885EE60D8274D7ED1089AACB3F5058861F690C386931F2D7EFB5181EA0E710900F785260DE3810AC24B8F80A42871C87BB8C4C0E52D63112E1D82C65879E8E6529AB7671C763715F304174643301F640BFC816CC9C37E4087FFF8905B93BC47C300DED52C678C110B594FFF3FFC0D02A0BA17016F868942D38E718B0DDF221141202F92AAB40B7605B90A94BFADACB9F31646546E23AA0B55BE40B901C0F782CFAB4E6B41EC13932109CC5AE781A1EFA62BAB10E742E7E512B8BB5181024F9C62AF2F9500F058CFBCD689A35822BA7DAC6CB61589FF123004305382F81E253B45A4ED3DEE72784DC8673EB0E85BEB00B24ACB68396EA2686D035782AC912DBB4C16620103121B288FF6903B2EFD8630A5EEDD98692B102F6015F36 sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDEB28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F20C002A7F962B812789ADA4705FE742572BC322707D916465EC0ECF52CE90DBF4C0556AD81666CB42882D39068F04D94BD3A065C3DDAA2A0953B99FC34B6F543B5BBAB07F1E2430BB7079B6136D9F438E41150C3DF99E303A9288DE9B2A7F1002885EE60D8274D7ED1089AACB3F5058861F690C386931F2D7EFB5181EA0E710900F785260DE3810AC24B8F80A42871C87BB8C4C0E52D63112E1D82C65879E8E6529AB7671C763715F304174643301F640BFC816CC9C37E4087FFF8905B93BC47C300DED52C678C110B594FFF3FFC0D02A0BA17016F868942D38E718B0DDF221141202F92AAB40B7605B90A94BFADACB9F31646546E23AA0B55BE40B901C0F782CFAB4E6B41EC13932109CC5AE781A1EFA62BAB10E742E7E512B8BB5181024F9C62AF2F9500F058CFBCD689A35822BA7DAC6CB61589FF123004305382F81E253B45A4ED3DEE72784DC8673EB0E85BEB00B24ACB68396EA2686D035782AC912DBB4C16620103121B288FF6903B2EFD8630A5EEDD98692B102F6015F36 ct = 3A79A90DE415D008A85D8B1555E0E5BC944CF2AC384D1779533E4AAC61969F8FA4300CB60AAF606FB692698C220995D7582666D00369D4855B5560C328AF24074D10A8E95743EBD8084380FFDD12A1E7C6233A331D053534C942991694BDEB581216A42F15155972792369A55E56F9C41EC6C318BD9E91BBDB7ACA3D4D3074C04CE2DA22B39270EB0E1F3140C2ABA6AD06F38A2F893357F431880A1F68C8241C8CF3AF0E0A4DA6DD198B30A8B30DAD26D12B118F7AFA8CD4276D65C21223BD96FD81F38E8E4F56CBB36ED6F957558EC7B50161A05C3A53FE66E67E5A00220C49DB191081DF1F93368A12A1F16C9C91604A7A0FC5FB980035F711E1289EA4406291A8E772BCB26351561FC5AA127862BEC2710D29C65BFA9672124F6E46D2E59CC7BA7206544B61F11926392350BE5187552B7B2287A95908B939254880A152F88165C75BCCE5BE5D2DBFDA7B80DF1B5E88EB23F993D521413F3C20C9D19842E1F23ED0D84EE7CA240398FABE0C885A61E1F4F232A51726A65F1F766CBD9A43D994F904311A98A0128969FAD16A3DB0634CD0 ss = 1BD1F7208EAC7A8D5E17FE75A98CD1FC count = 70 seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F pk = 8F597E89C13C38AB2F3321F6CF5956813192BCE0F64A7275650D6333FBDE04DCB412E958F514266A48D71598B66B4F5491E2396689809E57FD3FA1002818199DB0D3100668121004486FC8C68201A44033FAE9B9DC342A798904BD831A4E92E633E61DEF7FBA08FD888EFE77EC94B95AEA9FE182DE6A352957769F4854178CDE6A05526EB236D19A424FDF12017C4AC9F75BC7E47BC6DEB8EEC98817ED85948B352686F695438574229350F37A0CF73FDE1F31B3D991239B37D51DC922E927B1437C68079EA998555C51C7902D15B74E6B7B0F2CFA87B26667C9AD273285473C76D407A536CB24136CCB45A040B6BC98C5B7AA9A7948DE47D86BF010664A1DE26205A1E9FE44BF527F4162CD0F1DC42F820A811EA2223B612B78CEC9F2131F0D49CE3A53143F0384C4F19B3EBB9093E393CA99018AD7544797130EF2F0A7CB8E5A2C1AE7F1F39B66E2AF0A4BF714009C5C4774EB0098AA65F86413D0AE44A462B9D83398F0C3E9198B02EF039836B3B15A92CBC8312F61DAB529 sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC718D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C4038F597E89C13C38AB2F3321F6CF5956813192BCE0F64A7275650D6333FBDE04DCB412E958F514266A48D71598B66B4F5491E2396689809E57FD3FA1002818199DB0D3100668121004486FC8C68201A44033FAE9B9DC342A798904BD831A4E92E633E61DEF7FBA08FD888EFE77EC94B95AEA9FE182DE6A352957769F4854178CDE6A05526EB236D19A424FDF12017C4AC9F75BC7E47BC6DEB8EEC98817ED85948B352686F695438574229350F37A0CF73FDE1F31B3D991239B37D51DC922E927B1437C68079EA998555C51C7902D15B74E6B7B0F2CFA87B26667C9AD273285473C76D407A536CB24136CCB45A040B6BC98C5B7AA9A7948DE47D86BF010664A1DE26205A1E9FE44BF527F4162CD0F1DC42F820A811EA2223B612B78CEC9F2131F0D49CE3A53143F0384C4F19B3EBB9093E393CA99018AD7544797130EF2F0A7CB8E5A2C1AE7F1F39B66E2AF0A4BF714009C5C4774EB0098AA65F86413D0AE44A462B9D83398F0C3E9198B02EF039836B3B15A92CBC8312F61DAB529 ct = 4811CBB081422C8875768D4247563872C3E04AFEDA462BD11E05EEAC5EBFDA4B9B60EF30849F552D6EC5D4CB86AA6E096046BFBD538E613E80F0A4F2BAFC250FC5A08F1D55DF9C64BB744CD6078DCFDE766B0B8E615EFE40B41EC1709E867F25FCAA1D0E3C68E8D11678ACEBDCF3966AE2EE57A495C1752DB6E924356F32C7984BF5D465A7A456594EB8DCF51DA32CFD3264FB69310ABD4798813C3DFF8521346F7D00038197AA19F17441CA943D902C9108F17042DE1755EE933CEC38479EA58ED69D266E49FC5CDAD3494FE875B3596E23E73195CEFDFB87E9D6E7E8E8751A693734BEE91CA599297CD1B711B3BC733ADA13AF3E9BE51328BF453E7843F56D113AE50F74E78A565800F3B5537390CC860893CAF27EAB97825B36E4376576BFAEB3831F54BFE8C404BDCEE69CF895936720754417B403F363121E4D16F481CDFF128191E3748E1ED817C92F7E7842C7E291F145E398B39655C942353F49689EE569CDC47A234E326B8E8E58EF95B41B7BBCFD957DF33E5F983AB7DFC5695B6664BF0AC9B5AE2F2DE93FCD7C62A94898E40D ss = 0EE00DC6B4C3F9A5E6A8CB5E450F4C8C count = 71 seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D pk = 4E2442EAAD94F4C03C29C95D54B2F0FBFBEBB53839F756D4B63EF9A975B457F2C9E4B095254D8B7DC0AB6D5F27FAEE6FC499A085721BE47C4DD20D93BA30343B6241890E84AB706C9D7BB78CD51F72B10E48BF08975EA53B7B539AE22EB171004FE57CA44E7C46899041C5E6A0C2E89172ACAAD919E34125285DDC31BD0DEBBE3199FFD6F4EC817F9CDFA6F9F60CF510B7270287F72513AD7179359072ED317A35BD42AF5477D5F94159D19A14AA67F910616C7CD3DB226306ADC42501A2F1BB190C9C47D1657722C31C6F1773F8E8CF9A76D11615841C367CDEF564388F400872D2E8F0AEC77813F69593D722A7C34E68DE4E956C1FDCB5B855A4180C0ACBAA82144B9E9F952B02A034AD4BC201FF9C99B4B5CE5E749839DA803CDF7FEA6D584D075DAABE5E19E809B57EFA7BE56D4C5B657563D5047F1086841F1794F753D6906C5306D08BC791B107DAAA1B22926886EAEEEAE2359B501112A702FB165476E6BCFF6295D80338D6427C0D29BC667884692FEA827D7C243D33 sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B890443B6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812000F4E2442EAAD94F4C03C29C95D54B2F0FBFBEBB53839F756D4B63EF9A975B457F2C9E4B095254D8B7DC0AB6D5F27FAEE6FC499A085721BE47C4DD20D93BA30343B6241890E84AB706C9D7BB78CD51F72B10E48BF08975EA53B7B539AE22EB171004FE57CA44E7C46899041C5E6A0C2E89172ACAAD919E34125285DDC31BD0DEBBE3199FFD6F4EC817F9CDFA6F9F60CF510B7270287F72513AD7179359072ED317A35BD42AF5477D5F94159D19A14AA67F910616C7CD3DB226306ADC42501A2F1BB190C9C47D1657722C31C6F1773F8E8CF9A76D11615841C367CDEF564388F400872D2E8F0AEC77813F69593D722A7C34E68DE4E956C1FDCB5B855A4180C0ACBAA82144B9E9F952B02A034AD4BC201FF9C99B4B5CE5E749839DA803CDF7FEA6D584D075DAABE5E19E809B57EFA7BE56D4C5B657563D5047F1086841F1794F753D6906C5306D08BC791B107DAAA1B22926886EAEEEAE2359B501112A702FB165476E6BCFF6295D80338D6427C0D29BC667884692FEA827D7C243D33 ct = 3A7E02DAF340F52C75549EBC9DD5C254C4C951EFE22E9E9BFD1D7EEFC7699C8BE83553DD804B38159A7A4B50A73AE026456760F60EDD52B292BAA4B6FC7E1548C083EBBD185871BD06424577C4B9866624787E13EB20BE494F2D75FD309398391CB53BBCB4178E55F71A05D610E20EF024ADDB3B023BA87191B5AAFBD41CB2CC9BF03EEA6B1D1AD6C1521768C78A75DE8A2A4D9A24390ADBD70F47B6158DAB9D83E089D6C85C3D010EAF3507348B143DC7288E6CFFC9C6C56435F2EA0870F25C4F660A73B22263AEC9C1C417760E1F68572714329D2C48A0741183C0539FBD450474154353729F48DEBAEF03C71DDE56DD1DE1CA4AD8212C6E916935A77FE23A6FA01391959CE44289AD680A97C206A40D0EF9D1E2397C6DB12E9995C579CFA7359FA7967465543CA075A68C3F137FD964A4E2CD999411C735B02E2318EBA08FEE58183E6D18566FF3569AE30879E74354D846DDB0BD519BDAA19D52B529288DCBB623B1D33DACFD5FE22D05B418196132CB14BF0A24FD0BE010FEC25B1A299E2D7CB83191D9B6FAB4170B26DE6C02726CE2 ss = 76FCEFC491ED89034E8A6956A3F8D9AD count = 72 seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A pk = D0AE536B7DA777D322FE70CFF08D604F6129ABDD3190FB6124553D7331C645EE8E76E345032A41A1F612A23CD5049024AD6B342A75A09884BC430828C61A2ADAA81B5FEAE4D6D969A56F01B2C81F12EFD152CEE4E8B332AA5AACA18DA195D980D4FA64CBA24CF86916D006EAF12B8100559855A58F13E195F09526C264323A38169E6ADDBD5168E619ADFC498F65D313AF684B087A868B7E53E37ED58FAA0B84D85876BE1AE9176D27B003E82BE3D9C407384FF9E40E4B4641721DCE290D273D2826F2365ECCB71FB9C5200262AB014A03DDFB854B265D13A145DCE6039E51763355F14D8FB2E8AF489B0191AE3ED263E5A8FE4EB89D1A958792BE39712E6043B92671087F4C56398B7C805498EE663F02DD2607A9CE72E104BE33C4426E2C499EA00A676D3F63A14D3E02C5E386D7F1B0776AD1CC9EC9D4B8D619483229545FA18B999F7AD9DA8C0785B524C0E693804FF6D513AC7005CC4C3106597F3FD4BEEE6468F7E6D8697C58B07A0262E158EE9EEDFFBF6F63D07A7435 sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E7600860406D0AE536B7DA777D322FE70CFF08D604F6129ABDD3190FB6124553D7331C645EE8E76E345032A41A1F612A23CD5049024AD6B342A75A09884BC430828C61A2ADAA81B5FEAE4D6D969A56F01B2C81F12EFD152CEE4E8B332AA5AACA18DA195D980D4FA64CBA24CF86916D006EAF12B8100559855A58F13E195F09526C264323A38169E6ADDBD5168E619ADFC498F65D313AF684B087A868B7E53E37ED58FAA0B84D85876BE1AE9176D27B003E82BE3D9C407384FF9E40E4B4641721DCE290D273D2826F2365ECCB71FB9C5200262AB014A03DDFB854B265D13A145DCE6039E51763355F14D8FB2E8AF489B0191AE3ED263E5A8FE4EB89D1A958792BE39712E6043B92671087F4C56398B7C805498EE663F02DD2607A9CE72E104BE33C4426E2C499EA00A676D3F63A14D3E02C5E386D7F1B0776AD1CC9EC9D4B8D619483229545FA18B999F7AD9DA8C0785B524C0E693804FF6D513AC7005CC4C3106597F3FD4BEEE6468F7E6D8697C58B07A0262E158EE9EEDFFBF6F63D07A7435 ct = 18F16C348230CB186A40FBD5035C57C305DA54D940F3C35E5775E38E98FA54C685BC2B9687308BEB3B62F9A8BAD52AC07525F772EBA731FC6CF2F8F88F32098A1245A8E37BA152E6FBB27D580BB7127A98BA43F509ED7B313FEE686BA36DBE58F8C0922E72AC06E072486FC2336DA8FBA5DFA430F8C44F4B51C115A67838D240D39562575A9C60CD8F0394F9FED1D2479CD1BF0FE27F4CB418CF723D29C3CF9DD4013DF8FC4C327E9492D729AF1300BD4FE0A5741817B976C46308B4033A213C9DCC451D544133DB3DDBD331D60D9B9D791092FA5AD6CA50FF6F38EB9F8987FA7C07C1C98E96B6D23F2E53D4DE0E6DA0978F63E9DC6AF1C107D92530BF749359E87F112E7BA0AB9E69317737D7E7DEA63C785213FFFF2B0542B9DDDB76019D9CECFFF0EC8735D25CDCDF7D337C75AAC550BD80F181F088DD0D471DD250D398BB2CAC98F9BC67DB1C5623BD56AECB0346F6A9E338D47505518FC12FEF594397226CAAC3A874963260B01ADE657DB2CAFD0DFC37268D2AD0536928CD6BF63C5E5F3378C4090FE3477D1056766FE7C96255ECB0 ss = ECEC8EBB1FF787CCB3D3CD06618A3ADB count = 73 seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 pk = 856A5DB00361F60DCEB644A5E578DB17565600190421B3A7700FC3578D3BE5C362D343185E72799B14A085C7C56C8A52B324ACB62141EB842A305DD0FCF31040D3DBF058DDEB7D3D89A90A0CAF69FF9D456DB0542816538F0FB24FC50F09719AD456B623E79AFD871FF9602F4BD3AC89E0C0542BD817875AE70477657F384DA137E30FBB7DFEBF0F9C9019F0B18F86A1255ABCDB5331549BD3FC24012428BBA76AD9D121B3884AAF95E79DD927E8D73A8896C496CC7F8CD6267A0A3A2163DACD9DFB72B9597E3A0721CBE10786D6CBF09A9C4D19E3E1EAB4DFCE09EA77129AB3FB480F623F09C4E5810D70A89E47E0BE2A6772287269F5E13DF0EC29427CF801F9CEA60157935F7343F3BF662995D726143008511341B5EAE5697A7E41E522B7218B1C1EF6A1912408422F32F5D1103410E60C3FE819E3E6FE8B3C034A7C24682F48BF588E92E957D9CD551C78F1F6EE52D3DA73A251C558879D638EFB8FB522112E1DFA854296E62E84F230A0BEADB884670C57F2462C52D414 sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF7A3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B09856A5DB00361F60DCEB644A5E578DB17565600190421B3A7700FC3578D3BE5C362D343185E72799B14A085C7C56C8A52B324ACB62141EB842A305DD0FCF31040D3DBF058DDEB7D3D89A90A0CAF69FF9D456DB0542816538F0FB24FC50F09719AD456B623E79AFD871FF9602F4BD3AC89E0C0542BD817875AE70477657F384DA137E30FBB7DFEBF0F9C9019F0B18F86A1255ABCDB5331549BD3FC24012428BBA76AD9D121B3884AAF95E79DD927E8D73A8896C496CC7F8CD6267A0A3A2163DACD9DFB72B9597E3A0721CBE10786D6CBF09A9C4D19E3E1EAB4DFCE09EA77129AB3FB480F623F09C4E5810D70A89E47E0BE2A6772287269F5E13DF0EC29427CF801F9CEA60157935F7343F3BF662995D726143008511341B5EAE5697A7E41E522B7218B1C1EF6A1912408422F32F5D1103410E60C3FE819E3E6FE8B3C034A7C24682F48BF588E92E957D9CD551C78F1F6EE52D3DA73A251C558879D638EFB8FB522112E1DFA854296E62E84F230A0BEADB884670C57F2462C52D414 ct = A2A47D16BE215576F1470608A443E615C8BFCE5E7F9ED5B249D6F573A2DBB0FDF843EA8C9662E5420B2C896AC83D9C2D0835416E25792CABBFD9A699A2150C132910B446ACBDEE88F3B746CEBB97DEA9B98E349AC6773DDEC949BBCFDE3701680B958D70024426F63D9AC3A831264E5CF96808AFC5D852208DDD10F6F93628F5B4157BD876452F60108803E6D19F489C514DC88E997CAFBD2811877D8D828E153327E818377FF0E068D7E88DDD0B6F30877EFBCD8F4B8BE15899B6D62620C7D6EF58FBE58325DF7CCD9A8D5417EF85406ED2B02A046A7B6A4C6262E318CC322BC061EB8817430CD55366FD3DE7FCFC0C356C8B0E41E41E100E5CBD3BC430CA100DAAE05B394951DA156DE25436867D5F6A09B99B94C1DB7A60996163FFC80143B00DA9805D962E05218DEB5D7C548AACABFF4C24605C1968E5A53ACDE8028D42D01CB2C8CF9FC90FCCDCF0C173340284166B32107CEAA5990E4F29BB975BD671DF5F044A7244C5E9B36819317D23F6E6A99F3A7617250EF28514B3A56FA4A80F8AE6AAA5FD88F28C7A30410593B916834373 ss = 7229B4C1AA0A7B970123AB36B190191C count = 74 seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E pk = 92ACCC567671EE5FD8809FF0F2FAEF216C9928598992C7E96D47EB30D7C5DBCE2A2C4B8BC46B3FC30E8A960221C574B9244F3E6B27213B0508F16A7365890661E67F4B9C1F3934B87F943E8E8F350794CF2969C2A837C06FF03242EE7746ECA4425D5359B3B5641B0E269201FCD2A8758B2D8E3A58B285952F52B39DF80A73C63F6C31B02C464F49345873A35F25DFF34D62CC39A1667E0DAC951D1F169E2291B4180ACF5B7C793F7BB8E38DCB3A13385204C2CCC84BE1726B5751770E8EEEE365DC46561D70960A093EAF4817672DEA8D6B1CAF7A05B9C69C0EADE21AF50939AD74CAD7AC20D892F688A3736764888003AB84E55BFC0F840331103E960BE3A5220DB5DE37357ADB7DCCA91802C74DDEDAACDA07259B8DA14B0E2C4965DF9F8A99B92234C0F58F5D2CFCAC08309FC03A39B9EFA944C0030BF8CB38B6618147E950162129387826181B5A40E5526DB7C9D15839A1C39CA1A5111EC00B9E836A226783D55861FB9F4EA96B8A3C25FDF064DAD0A2973D15BF431538 sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F89E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C92ACCC567671EE5FD8809FF0F2FAEF216C9928598992C7E96D47EB30D7C5DBCE2A2C4B8BC46B3FC30E8A960221C574B9244F3E6B27213B0508F16A7365890661E67F4B9C1F3934B87F943E8E8F350794CF2969C2A837C06FF03242EE7746ECA4425D5359B3B5641B0E269201FCD2A8758B2D8E3A58B285952F52B39DF80A73C63F6C31B02C464F49345873A35F25DFF34D62CC39A1667E0DAC951D1F169E2291B4180ACF5B7C793F7BB8E38DCB3A13385204C2CCC84BE1726B5751770E8EEEE365DC46561D70960A093EAF4817672DEA8D6B1CAF7A05B9C69C0EADE21AF50939AD74CAD7AC20D892F688A3736764888003AB84E55BFC0F840331103E960BE3A5220DB5DE37357ADB7DCCA91802C74DDEDAACDA07259B8DA14B0E2C4965DF9F8A99B92234C0F58F5D2CFCAC08309FC03A39B9EFA944C0030BF8CB38B6618147E950162129387826181B5A40E5526DB7C9D15839A1C39CA1A5111EC00B9E836A226783D55861FB9F4EA96B8A3C25FDF064DAD0A2973D15BF431538 ct = A4AF2C2FB7AD4C82B5B60E61B2B91F58C33F6AE78D46A0A5A1C8C78742AA41A2C82F85B20E453DD10B48126817AC73349DF685FBBBBE86EF5AB5BF2D201C2F13D9BC525CA033F552AAA051FCE249EC07085C25DCC39F77FA26D44DA98E169D9C998E85C7D70B3AFE33EA55B5A8209F2FE6669C9E15CAE92DBF9A86BF04175AE407EAD46801EF10A024B8920ABD24BD5BE62CBB79A3FCB6485B7CC169F8EED49960EA0F58DE3E4AE6794E877AA106FEE70BB204A4B69818B25FD39A3D3F7CC8D2249E35C90183D5DBE67838FFE518FE3250C929BEF5B16BB0BE6F591E97AA953DAD4E03801AACBD2BA3351D7823332E5818B846F7C2A2D94741A2F73ED7A588AA63E1FC33D70F1798BE627F0D496219EB2C08840FB7056E363D88D8E9B3C17DC604D0EED673E6945569F6AF7931A63F545541A5262FDA2808336919C4E77915C3F5A2EABA866A61E8EA6ECD22256CB413EE5BD423FFC79EFC9378C7EEB659009459E4B9E3120126B6A8F16EC62AF7B706E4DBD369E298A0BE532FFE046E29B3F85C35D80E5B1A494711E5BB39CA1C0737D58B ss = 407DE44BEE5F3EC9A7B60A4306A3763C count = 75 seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 pk = FF02B3C5C69A3457FB719185EF965C04DE3C8DB013B4AFA2D50FF0972EB022F4A749B43BD41D08C6A17A164B78D6AE1DE196BBEA124F560E139ABFEB647801484114ED5EAB7D961FE55A2DF68DACB951681C38938823FD1B95BCDF6FF7E57EB226A83CA25744D84B069C8EC8F1AA4EE9611D988AD2A5632B52C2706EC1147E5CFF24EBB838C74E0AD1CFBCC71C39247E0C4C3AA583B4143F7CBADDF16928B35195D58EED5DD647BE94C6A9DDFADA7509C4C10396A7210E930F734FE5122AA9649D864DFF1D2520E2850ED8DAAEFEBCF43E1A2624C5CC6796F5D2AACED2757876FA3EFF482348E70CD7E6027C3578B3A360C06965ADE2C27294721F3B9DAC3F32C8318E543951E247009F07AC4B4943D9C0253978DEFA640C55C044070953C098E5C9EE4A64E56B0C78BB10EDA4613B615519C4AC9DAE7D478BA50CC4F173CE42F8D2EDE62D2C49B0E4DBCD036DB5CF878627B9502FF8A0A175638AF34260CCC801E25A74E6C9FADC67FDAF97CE4408C581DB59CD890F4634E337 sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C985100FF02B3C5C69A3457FB719185EF965C04DE3C8DB013B4AFA2D50FF0972EB022F4A749B43BD41D08C6A17A164B78D6AE1DE196BBEA124F560E139ABFEB647801484114ED5EAB7D961FE55A2DF68DACB951681C38938823FD1B95BCDF6FF7E57EB226A83CA25744D84B069C8EC8F1AA4EE9611D988AD2A5632B52C2706EC1147E5CFF24EBB838C74E0AD1CFBCC71C39247E0C4C3AA583B4143F7CBADDF16928B35195D58EED5DD647BE94C6A9DDFADA7509C4C10396A7210E930F734FE5122AA9649D864DFF1D2520E2850ED8DAAEFEBCF43E1A2624C5CC6796F5D2AACED2757876FA3EFF482348E70CD7E6027C3578B3A360C06965ADE2C27294721F3B9DAC3F32C8318E543951E247009F07AC4B4943D9C0253978DEFA640C55C044070953C098E5C9EE4A64E56B0C78BB10EDA4613B615519C4AC9DAE7D478BA50CC4F173CE42F8D2EDE62D2C49B0E4DBCD036DB5CF878627B9502FF8A0A175638AF34260CCC801E25A74E6C9FADC67FDAF97CE4408C581DB59CD890F4634E337 ct = 9AA1680EA9AAE087F6DF3196CB083FE3F462E560F1FBF9EFC708E8094A9CEFA627427AEBB99DE558416FA1A177DDA7E83713A325151F56C64DF41CDD485F050187CD7CB248887CC8F3C21F34EBBCD229852DAF31080365E88809B05ECFBB347EB814FA5D8311B99BC0000FD113E95BB99395CB473AFA937AA4FB135FD004AAE6ABF22AF7126200760C5084E97F1437BDE7BBF46651882EF1B34453A4E461DD7C37A726881C4C9C750BD1F749C2E317AF3FC171B6BC3C4E379035CB6E0BABA39E687ADECF28C2FC6D1396488EABFFEA1F4DA9F90CA21475D4ED599A00F3C6D5B32D844CF5D50724F9584EC20E2972D6A6168DA648CB21A0FE9236A0397B66411121A08D5F7341A035B52EE10F57A379F329993B61CBA5C306728B9FC8A047FCB7B2A9E8CF6CBDFDF240DD63AF861ACABA60AB86B615647DAFDE04277AEE2BF29FFCAF38FFB9344F82253EFEF2220115AF4BE4A20F2F4BD0D519CA80963BF17AE7FC840E2D80F8C4B8673D2B75B6C7150135DD7B6433D6F0474120F29E8CC3DA33AE84A296D6E577E7E63E4BCC07C952DF0439 ss = 2881428F09AA4288D15C7AE62575673D count = 76 seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C pk = B1977F87929DF034286F716088AEC299A479997BF56501E99778B214666FC1F8715E349AF17F9359349BC6A5391DB247054E2CFAD482607AFEB5364CE82C2341AF4258A4E19DCABD36542F9F113C75A5ECB3B2CB48BFF4E863B00BB676D6027ED417782617E0F5A6B089F29833953F6373D140E42905AC2EEAD0FAF9D0350F757F74B735EF57CE74764CCA2DD3C8DE894381ED568CCE84EB50500FAFE242FB9FD22B7ADEB0E1F1BEF547F5D68F314BB4742516D1AE528A8F454CCF4D3E59136EED77AB2544E80C81643353A74A85A6EF13236164E590C8B634BAFB67CF6A5E3D023BD9B506240B71DFFC972646DFC374D91B29CD140787CACF11F13FB603E7733DAFF51B586AB52941B5136A983FC696C13F92FD71A59E284CA3ED434F7F821FCFB27CBADDB439AA03FA2726FE40EBFF312C296174048653DE6335CE777AB5B34E3ADC9C0438E4BEEC423672757B8EA60232C0D9A406C7B7F8CC124D6C1001C9397DEC07EE3DBF647FD5562B642A21BC1B7259FBF943ACE46134 sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16FF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587A07B1977F87929DF034286F716088AEC299A479997BF56501E99778B214666FC1F8715E349AF17F9359349BC6A5391DB247054E2CFAD482607AFEB5364CE82C2341AF4258A4E19DCABD36542F9F113C75A5ECB3B2CB48BFF4E863B00BB676D6027ED417782617E0F5A6B089F29833953F6373D140E42905AC2EEAD0FAF9D0350F757F74B735EF57CE74764CCA2DD3C8DE894381ED568CCE84EB50500FAFE242FB9FD22B7ADEB0E1F1BEF547F5D68F314BB4742516D1AE528A8F454CCF4D3E59136EED77AB2544E80C81643353A74A85A6EF13236164E590C8B634BAFB67CF6A5E3D023BD9B506240B71DFFC972646DFC374D91B29CD140787CACF11F13FB603E7733DAFF51B586AB52941B5136A983FC696C13F92FD71A59E284CA3ED434F7F821FCFB27CBADDB439AA03FA2726FE40EBFF312C296174048653DE6335CE777AB5B34E3ADC9C0438E4BEEC423672757B8EA60232C0D9A406C7B7F8CC124D6C1001C9397DEC07EE3DBF647FD5562B642A21BC1B7259FBF943ACE46134 ct = AE72316836860FFB8CF7CE76BA799D1DDA61253E361203B00F9A870FAF3CE3D71E711350474A218A851A3B9D3ADB673B2C2C9770FE5B16FCB8BABFD7CBAA2D1D406D449D03B834B8AA495886C1CA0AF168658AB649ABDE2A3B64FE9C64FD8F0D53F3A1A0C95F893B9DB915B5B2B1F7E5EEB794F5B62097A11045569CBA167B2DC1A948805924B131559D3139A2B741DBB7BF587515E6B51FAA90F0F012A411136A8B8988E2709EDB2D31DAE12CCA3E74D6C97906ABF32DDD4C8466710415B1895EEDC2720AC865E7A5B6ACB136EA784041865A817A4B8540153294045E96F62ABA55A89E9576EF7AB1B4AB5FCFF64F9161BF59952BED10AAAC8F8D111497706038EFAC711FB9F6917B66CD215684270414440A709EF39C47460815E22FC30D1E4A940A9A3403D3713F19D02A2EAA5A3EC39452F029D372BD8CCA1991108239C1C9B3C8841078B40D0D738280DF8D106A9D0D3411F7CBA6B8C95F9E54394D08A43C874AF8BC64AE915C5001F27EC7599A637D61CA24B4301891048D55487C04F85722F0C8662EEB621D781C9A7992D20FEFA6 ss = DAFF69A6D052736A29F7F699C38D75F8 count = 77 seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A pk = D7E54D1530021849BC2C79A18C4591C1B4D2A83C3537D0DF3E38EC43F625059FE7F0C458884D12BFE55AFC1C38DF88A1EB8E74941BCFE5080B11936A67C52CC62D66C5BD2F53AD1DF2B16132A888EA3C631D7EA0FAE26AAD70E6659E037376365AE13C032845B287E06B537ED9E3550726283A3EC7EC8010919935EFDC18E1C455868869D89D2B72A54ACC840ABC7AFBB39E91BF071E86582AFBC07BEFDE60DD36D7737B8C2F84B7D496779DD12A547FD14D98EDD6EB7AD0E88FC08E3102AFB41AC4D74F8766AA6475B6723FEE42E51830FC47F7090ED1ADDF1D35F94F976EC09181E36E81C7D1DD2F26D35D26633CCAC4368B33E18CE69D42B9121127E5E23D4416A2F1BE0325BB5A32E914FCD1437BC35D0D9D99873481BB25D3994B1208850218D8E21709D44A3591F7E2DD7B55E9628F0898B890E42C2A783DFEA67C4747DC83BC0F485A5E4841F3E26C2A39B07B2D1939A265AED5F74E010249668DF38A6ACFF03EA8556003F0F1E7B568D9CD5D0FAA2190FEB55C098E3C sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E10DD7E54D1530021849BC2C79A18C4591C1B4D2A83C3537D0DF3E38EC43F625059FE7F0C458884D12BFE55AFC1C38DF88A1EB8E74941BCFE5080B11936A67C52CC62D66C5BD2F53AD1DF2B16132A888EA3C631D7EA0FAE26AAD70E6659E037376365AE13C032845B287E06B537ED9E3550726283A3EC7EC8010919935EFDC18E1C455868869D89D2B72A54ACC840ABC7AFBB39E91BF071E86582AFBC07BEFDE60DD36D7737B8C2F84B7D496779DD12A547FD14D98EDD6EB7AD0E88FC08E3102AFB41AC4D74F8766AA6475B6723FEE42E51830FC47F7090ED1ADDF1D35F94F976EC09181E36E81C7D1DD2F26D35D26633CCAC4368B33E18CE69D42B9121127E5E23D4416A2F1BE0325BB5A32E914FCD1437BC35D0D9D99873481BB25D3994B1208850218D8E21709D44A3591F7E2DD7B55E9628F0898B890E42C2A783DFEA67C4747DC83BC0F485A5E4841F3E26C2A39B07B2D1939A265AED5F74E010249668DF38A6ACFF03EA8556003F0F1E7B568D9CD5D0FAA2190FEB55C098E3C ct = A89C39659D7A0FBB006773546299C09A8D1A2C1E31825DCE83855161C247C77DED1CBD3344E26388D288518283AFE4C30E9B83B7C2A83A3FB8F1290ED5B2102355C360CB7C18AD149A8F7E8D157FCD8D0240A18F3CF324690791EC9AD33B264355F7367027EDEDE00E98C70AAF3EF727898D7E90C1B3B1A1E90960E6141C2E6BEE51400BDAFF69A74CB5D296269AF82A7DB57963F15EF25DCB43E0A980E29A8E41BC4C5648173E114D8004BE3DF8AB497E45362A4F1535C1F7B1654E0F79BE515DB5CDD601FE0620D8C77BD3D6F6D404B4359CE6D9F97D92D193F85B2D6C912E405544C93345FD6E585EC3E2154502F9FA784A2C5DD6FEAD5A3D0C12302740AA5FB978302E357B10F3B8B52EB949AB86487B185450B3E8E4FAEE86930BF70EA737537777EF66BFA24E80353C5428CA0F61EE42A3D6191006C29D17CAAB81A8696B1096B56B88DC92C857F25BD5DA8FD551A5951346B9D466AE6B8C8A874BC78FA85B670D186C4EED2610A45F5529F73694C519616CAE6EF7C5178A48121F37DFE351577044B21F328FF9CC39375150090FAB ss = 847E40381D9F22A10B88A3F94286A927 count = 78 seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 pk = 642360A0B412E8D7515CF84720336C3931F865AFDD13B25C130941D69FB7B81D57D3EA774602A895243CABF6FEED7CB8C65159E1BE8C9BC6410B927C6EA706E3802E5024904B7A1D682AB58D413F1C0D448C7F10FEAC8A255CE21274047A31EAE0E40EBC1320CC7068F7D84F347BB785FAF063494A239515A0C5D9D0211711793D2524227F81E33C9C0929FCC16CCBE3ED24A8D4D846D45F52878EC534D6888AA2C6FE956C7B45C7E56D99B6ECB4C7EFA7EEFF890C409E1D89D1934240C2A250B5829BF24ECAE9B0C00E4A8F783A2B4050533D4EE7F4389C604F40AB18F2B3428F0844387EFDF1C98D43A93505AF2E33164B21B9F069E2E47EA8AC3760E528E74E6230FFE534DE81A70B7C7760FB07FAE4D99516D850115AA8AD79086B44A022ED640775D38F64D051A4AFA8614157E8CB26B1AD27810D44F2A820AE22E51E2D948A626D058CFC1188FF66C6FCF87A658609ABBBDA2CDA0FF9EDA6480ADD631689E18D0D89C714C03CC1F062A8F7A98EC6E90B2F01EDD81A9E1E sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F6338939E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8909642360A0B412E8D7515CF84720336C3931F865AFDD13B25C130941D69FB7B81D57D3EA774602A895243CABF6FEED7CB8C65159E1BE8C9BC6410B927C6EA706E3802E5024904B7A1D682AB58D413F1C0D448C7F10FEAC8A255CE21274047A31EAE0E40EBC1320CC7068F7D84F347BB785FAF063494A239515A0C5D9D0211711793D2524227F81E33C9C0929FCC16CCBE3ED24A8D4D846D45F52878EC534D6888AA2C6FE956C7B45C7E56D99B6ECB4C7EFA7EEFF890C409E1D89D1934240C2A250B5829BF24ECAE9B0C00E4A8F783A2B4050533D4EE7F4389C604F40AB18F2B3428F0844387EFDF1C98D43A93505AF2E33164B21B9F069E2E47EA8AC3760E528E74E6230FFE534DE81A70B7C7760FB07FAE4D99516D850115AA8AD79086B44A022ED640775D38F64D051A4AFA8614157E8CB26B1AD27810D44F2A820AE22E51E2D948A626D058CFC1188FF66C6FCF87A658609ABBBDA2CDA0FF9EDA6480ADD631689E18D0D89C714C03CC1F062A8F7A98EC6E90B2F01EDD81A9E1E ct = 6E7AC1C4C4AD722541C905C23E673C34664BACBA26541C25FD08ABC629906C0468CEFD57CE94C245C6B6D49078F58E8AFE2747C47569D7E7179909E5A78315520C19208B0AD916F3592F3878F8636821250189DE2B0FFBAC2CDA60023A263187F75967D9F6BF3012BB1014986AD6EA2B72534F006CA609DE4C2EDE35420915112853E2D00F9DDE7FA32B255D755398AA7F71EE3ADF091BDB65EDE1A6D14E28927B5A9DB0682DDB0F75BB157A973CC3104E34F315F8E58C89F97AC8A21015DA0338EC8BDC1987876D1D153351895FA0617AA42B670B730563FA71C983B3DD509FD6E0B7F58C02691C00083C8F62B5D38B4B2BCD18CDFB075A8A887612E283A02938ECE6BB7C3645406F715562924644959A96B5EFA4B61AB150965913B9CC88BBBF9F081C8D35B2FC4481725521C5BB2971EC9071C67E2A2A60BC35DF4C7362688D8B8A11A7C65C0F638CCC13716E18E2FAC5B6717985482811F4977D7568CC7D67405AF40942254C016D214C32A23AAFD87049725F494A6C5E144098F32F95B5E0979B37F9FA7EB3C49484707A7F1B6417AC ss = 1F4E558F02585211E37077BC66DF2389 count = 79 seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 pk = CCC8419C22AD3E6EABC9665ACE9CB9251F8BA5BDF97BF482B6C4E091568F566D577455FA0C2F15215F27A072996AD3885DA8D09D918F18A6F7E82366D2BE33F2BCF48B0E7214D3BC01A4D134F1D33CBF9B7D8ABD5BFC9CEF7445EAE34D7126DBBC7DD47CE1974112B27E24EAA40C332AFF7318C5634EBE47770F31FAB1334C4FB59315D0A01F0CB21D3CFCBF82CCB20D88721DC622784B98B30D29CA6FE757E8376B6E2B32B5EAB474B593F1CADEA618F4A4324B4F9F8C363E6F21B82AF941BE8C721D8839D6C64167751E13850DA14603C8D4D179601AE9006A328A9E10013799C24EC705C9CF7722C40A1D97E817A70FA5EB24B9B70FF33A0F6A2A69D22236ADF666A0F74B496E7CA27432D41179F9B6EE6AF23BBBED639CD11CE95435EFB54BD416D1092D35607285D009B26AA53E39E08FC1EA2E69E704CA2D4D950097B461E7358AA628494D701CEC52FA04AE8F02A5BC224BE9DA0D5B9CB1B3C23DEB7921F7944DC29160864C89EFB7CB796E3E38F9DAA60C960DD21316 sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF89C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F405CCC8419C22AD3E6EABC9665ACE9CB9251F8BA5BDF97BF482B6C4E091568F566D577455FA0C2F15215F27A072996AD3885DA8D09D918F18A6F7E82366D2BE33F2BCF48B0E7214D3BC01A4D134F1D33CBF9B7D8ABD5BFC9CEF7445EAE34D7126DBBC7DD47CE1974112B27E24EAA40C332AFF7318C5634EBE47770F31FAB1334C4FB59315D0A01F0CB21D3CFCBF82CCB20D88721DC622784B98B30D29CA6FE757E8376B6E2B32B5EAB474B593F1CADEA618F4A4324B4F9F8C363E6F21B82AF941BE8C721D8839D6C64167751E13850DA14603C8D4D179601AE9006A328A9E10013799C24EC705C9CF7722C40A1D97E817A70FA5EB24B9B70FF33A0F6A2A69D22236ADF666A0F74B496E7CA27432D41179F9B6EE6AF23BBBED639CD11CE95435EFB54BD416D1092D35607285D009B26AA53E39E08FC1EA2E69E704CA2D4D950097B461E7358AA628494D701CEC52FA04AE8F02A5BC224BE9DA0D5B9CB1B3C23DEB7921F7944DC29160864C89EFB7CB796E3E38F9DAA60C960DD21316 ct = 1DDDEB545627E5F2473D93D22E9A9B046281AB338AF1AF01D565A1C9F2A1DBB65F63ABE4EF76278F0E5E07A0679DB6FEB531F36895DFAAD8A497C5AABF981F35D4CFFFCF2CE7865696938FDA5ADC9220C814AFDF3AB6EFD20E57B8467260F10EF84950D0D76565E244CA856150553C0EA625927E98CFC8E592D531254F05C0648DDBD390EB619585846B7F83AC99AB56B2D5BC1F428E08263402A0121410E3B8DF61EED178FA02D1FC43EE753EE94B65C98A13932ADC58AC5CEEF8BA1C0FD09F26C4C5E3983C36F639DCDD11714B421A48C91D18D7F6AA5032280C5765E37D92545A9B4A0AE885B532069055A7A73E25EA31FA61B1356DEDE3AC183A4EF42F3350E03F4075F41B6539C21B6BA572CAFE30C2FE96D361ECF06E3EA986F991ACCDA5A3504669A73D0D978D5CDB531A2E6868BD74A7181BDFA143560228B0503D632207BA87DE12D3FC3FCAC3B89D1D79632C2A3B58894FE3A7D6E6AC30E944BAA01D0E77995538740DA805B0932227346337ED476B8FAFA250D91030E5866E54578F653076A71651DF7CB33952BC4DC4B35319 ss = C9E1C47EBFF65677C78699B126309CEC count = 80 seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E pk = 90A457B5D8CDD1DCBDD2039BAD67AA4ECF08AC53F834ABCEB3F7525033C93840F31BA362A6973CDA35C5E5DDACFA427B2E0A27062A15F4CD575AA51B1D231F27F813B79F4671A301EFB77F75632E54F42BD110798A7CE02509B6BFC7326F38A3903B72DE008E58E74F79756D3AD307666AF6EB434478BB40F128C1EA7839584F9D89C1A33D47557FE312BD732EA43801F8CBD3C9C14C46C035676334373E749968D40227F9555D6A6AE1B0F326845C82F50D621185F7A2CB1FA382A609E449A3BB2939176376CA50BFCB494402CABFBAB0E68B3556C67DAEB2DC17C9B0C4A29C593524962DFBDD53DC4B6988B2BFD0C4DFF4E904DEB26257F4A6FF353A7A92C19B92F70E3655D8B222C55F8DDE38334572946778E89794770309601194549EE9B1370828F3F27F9B2A1FACBBB72702E3C67FE26F6E18252E6C0D1C0A612AB8D977FFCEA29622905BD85B15BC051507354AFCC59052561E464C6FCB5626E424B2091C2419BD495AC4322ED4B45799EE141C881B9B98B03F3F5422 sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE55FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D710F90A457B5D8CDD1DCBDD2039BAD67AA4ECF08AC53F834ABCEB3F7525033C93840F31BA362A6973CDA35C5E5DDACFA427B2E0A27062A15F4CD575AA51B1D231F27F813B79F4671A301EFB77F75632E54F42BD110798A7CE02509B6BFC7326F38A3903B72DE008E58E74F79756D3AD307666AF6EB434478BB40F128C1EA7839584F9D89C1A33D47557FE312BD732EA43801F8CBD3C9C14C46C035676334373E749968D40227F9555D6A6AE1B0F326845C82F50D621185F7A2CB1FA382A609E449A3BB2939176376CA50BFCB494402CABFBAB0E68B3556C67DAEB2DC17C9B0C4A29C593524962DFBDD53DC4B6988B2BFD0C4DFF4E904DEB26257F4A6FF353A7A92C19B92F70E3655D8B222C55F8DDE38334572946778E89794770309601194549EE9B1370828F3F27F9B2A1FACBBB72702E3C67FE26F6E18252E6C0D1C0A612AB8D977FFCEA29622905BD85B15BC051507354AFCC59052561E464C6FCB5626E424B2091C2419BD495AC4322ED4B45799EE141C881B9B98B03F3F5422 ct = 6F03F7BB3BC8A42FDA1B7A8786EFD05EF906AC9EEFF520ECA6786411ECDFB9220E270AE0B7084CB7F166FBB5BD162EE5524258B74AD993BBC83816848C5F12D9E46180DAFA00C6CCA35AE13BED20D5735E2D76584E2B3AD0D5883502AD61F51ED01E2C27817DC585AB5BF5051657B14E13EBD9B0446012BC4F52053B4232C70ABD29EC96A2213C21B155B52E94B505BAE49072BDBE7351FFA6259B44F9B0C07A8F4529CBFEF5C9177547C8A8DACC9C0FC2AE27D904B7D4DC5B32B30D27E4260FBF06954E296DF28DFB73848D38FB58DBBB86932C2979EE19913C9799AC4C5454AC5C2C1D49BE237CF26C84B9F482BA71F6CE982D43F6E8127B2811051935263DD1ED4D524CE96C56F07F0278A97D5047C088C5E360971D78E0D9EF071F56C3909642E06F68CC7310035671E3D60B41E28F08FCBA900B8436D92A2F736F0652BE1A3629E766F4F262825F51D05B4CDA272EAEF488075021171A4969A202B1881FB1E2945D598A0836E8E46AAF34591297BDB498034A91E0E40C0AD0442FF0BDB43E5CBD445B6FE6A673712006219339E3F960 ss = B1539F6452E1BF74ED406CF80085929C count = 81 seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D pk = DE9328EF6711E305CFA2CBDB563E1E3E0CCAC31B30B02AA92FE52053594DF4BDA18AE313F7F4084AD6C22B09C4660B5E16C1D71664A854A28924580CF3130F36832120605AD82ED5BB785960FC571649BB653A9C63F9934FDC55CBBD585797DB9B206405F1C03119327C3CBD69D558EE6B270A7483EF5779056BC134AD040044F7C54471C8C789D212F53F9D2F93DEBA6A7A827DEA59FD0795E676221374FCD5905300BD698D706DF1BA5835259F4AB84E25E58FFF2BA510EB340EC211D084CD74628FA11CFA992496878B1BAE2004E23C5A64FFFA5B29F3C0FDD4AB69F13821D3A9B7E4FB41AD0816EE685A9119A48C6A843B511145D93D239344022C0A0B449AE925A1D6FA5FC6504A663F94FE9A8848B6759AB197685A3A9349E9A902B417D9ED523D058B0CF5FC81232267577EA991893EC957057D2A8D301936C2B66341F92798B5CC300D5E1FA4AE449E88906824464A9216879FA4DBF94F4FD01286544990AA64F402708B03B35AA7B6959ED637A6D1250BDD410B7500 sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D6311EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E0CDE9328EF6711E305CFA2CBDB563E1E3E0CCAC31B30B02AA92FE52053594DF4BDA18AE313F7F4084AD6C22B09C4660B5E16C1D71664A854A28924580CF3130F36832120605AD82ED5BB785960FC571649BB653A9C63F9934FDC55CBBD585797DB9B206405F1C03119327C3CBD69D558EE6B270A7483EF5779056BC134AD040044F7C54471C8C789D212F53F9D2F93DEBA6A7A827DEA59FD0795E676221374FCD5905300BD698D706DF1BA5835259F4AB84E25E58FFF2BA510EB340EC211D084CD74628FA11CFA992496878B1BAE2004E23C5A64FFFA5B29F3C0FDD4AB69F13821D3A9B7E4FB41AD0816EE685A9119A48C6A843B511145D93D239344022C0A0B449AE925A1D6FA5FC6504A663F94FE9A8848B6759AB197685A3A9349E9A902B417D9ED523D058B0CF5FC81232267577EA991893EC957057D2A8D301936C2B66341F92798B5CC300D5E1FA4AE449E88906824464A9216879FA4DBF94F4FD01286544990AA64F402708B03B35AA7B6959ED637A6D1250BDD410B7500 ct = 54E763B0D9A6BFBA0303C86FD60FAAFF7C17C285C409C917D1AFF15A3CDAA8596FBA7C00BEB2CDB1A2F4A1F8C6DFF9BB7E3D89A30632F153D089603B1E5B37E3486220085FD493AB9250D58687F3BE07D0AB20FAAE68AFD81D929B5FA33C62115424FE158AC1182A6DDF943C8A2071C07C99DA3D8B4AE8D8C818054C752F4AC47FF3A24FCC7FF75812820B9F48AA3E9FDAED4B57538DBA1D7E73FD06B1B61FF9553EF23BE5180946B2FB64CFB1F8D57F0C5716C37CAEF3A20663FFC93F0139691C386812BA3A8F5EDDC749F42886C1F033A9D01C8BB81B45EEF8C694651BB0BC20C2E2DB4756FE439CD11514E7F5547C5E1303120713846BD9391937E0DF4AC2B1F862595DEC35E36967EE40A8E6693C05E458CB779084180F1694855BE7FA8D10E79061DE1B7BED9971FB01D82ECF0EC364E3454EA5694339FB2B8DFCC7DEE18BB44636DA0623C7F8922EAABBF052DB1B4013B2E1D0E2A263BC2EA16DC162F855C5DABF448C4B76294FD82256795F3DD062FE87E26A3647DA2B006C33BFA35369411A24BBE29BF79935532F93A3B910EDFD ss = 54C96066F192ECAB63D4812F427D3B6B count = 82 seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE pk = 97D03408EEAB6AD688C85FCEA80C3048F0203E9BFC05E8784DBC647FED94A11131C2FA20316FEB69A5DA69681C15C488965461606EBDF0DAF978E6262C4F3839EF2937D62FEC34606D1F4EA11516D4EDA4D131FE0F0801FFE65628288F083E843F9DC7DD832B18C21DD39A3DFCD6C31D59EE82257BB01CEDB747CA2B2340BC0A8DC6DA98A7A9F8B5A9FE8D2F46468597875393A00A007A28C09770E401385E35A98D855E80DEF8439C3B826D92FCD2F3CD4105A4F7BAB0C55294C2480C5C1253E09279D262FF422965CFB1270A0EBA7A9B4F1CDFF67E48F36CD997A529F8E6BCDB95E9B69D43DAAD25BB6D7C584C47B69ADFB45DCD98D8C89DF1D415FF598E5DDA597534B039CA4D1644D2572AB2C5E2AF895EBDBFCDDC332F25A99A5C376588C29013B151D1DE07B8E96C0BCB0857B3D1638580BDE55CE165602103EEE04D724CF84F1494559D8417D5A23654087D6B6DB81F73A6CF4E8F0F68CE9DD3982AA69B919B83484D4DB4658B230CCE4D1E8396FED568EDA7C17E5728 sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444011136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E0897D03408EEAB6AD688C85FCEA80C3048F0203E9BFC05E8784DBC647FED94A11131C2FA20316FEB69A5DA69681C15C488965461606EBDF0DAF978E6262C4F3839EF2937D62FEC34606D1F4EA11516D4EDA4D131FE0F0801FFE65628288F083E843F9DC7DD832B18C21DD39A3DFCD6C31D59EE82257BB01CEDB747CA2B2340BC0A8DC6DA98A7A9F8B5A9FE8D2F46468597875393A00A007A28C09770E401385E35A98D855E80DEF8439C3B826D92FCD2F3CD4105A4F7BAB0C55294C2480C5C1253E09279D262FF422965CFB1270A0EBA7A9B4F1CDFF67E48F36CD997A529F8E6BCDB95E9B69D43DAAD25BB6D7C584C47B69ADFB45DCD98D8C89DF1D415FF598E5DDA597534B039CA4D1644D2572AB2C5E2AF895EBDBFCDDC332F25A99A5C376588C29013B151D1DE07B8E96C0BCB0857B3D1638580BDE55CE165602103EEE04D724CF84F1494559D8417D5A23654087D6B6DB81F73A6CF4E8F0F68CE9DD3982AA69B919B83484D4DB4658B230CCE4D1E8396FED568EDA7C17E5728 ct = FF133B570CCD1DEFAB8AE44866C0D3DECE43C34A06CD04EF6570C514CE4F066F7B47F1D428AC6BE51F68B838C4D97F7A5E3142A6709AB20D3DDF67F60AC5380467E7FA0284D83582D59CC58EF24FD34128E64252EDF4CE0794171710FD4FC7EA0E4DFE28CA85F3DDC19825E5C6219A45244F70A277B44C144319DB7539114039349D5BC06FD168CE67749017AFBD90E68BC580625C07EF5367F5E62B09E17DFE89DAE09ADB00E21E719D8A1554108988FF07D94BBF4A423EE7D46B1E36B1E4A1136D8ABCA3CE5D171419415A6899436F250D2A47E359FDD0182DE0D40E3C2C6D86253AD0D41F54423832D339ACB7C01108895AD4B97EA01A7F9AFD1249490D78B5A1CBA65E0B3C6AE93EFD24709828778A50742C178D3FFE159EFFB11F0D8692640EB098FB2C1661738D3BF91512FB43C7850B66FC29BAB9458102FF5845A39E18C408FAED4FA3D23AB4425DF160EB27C9ACBFE6130388A9063AF191E2501BE1CAA73BA897CC4F3E675B459C01251CB131B6F3A1C629798DC53594AD8B48AB9F095735B917AFA97CCCF4738D64317C4363DD ss = EA52FD3FB349E68A70F89236C6101482 count = 83 seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F pk = D971FAA0DB5D1F80630FBD527CBB0D18184CEABD1564FF16550BA0A865453F25F9BC978B5D3DF1FE99E3D6E0524A75A5A7CC443D24513062F7934D99357836CB5DEC7E2C01BAD0E27C5E9200532A2CA9FCAAB69B143F63867050843244C76E9AE9D60A72A1D467E9ADCC965C30B93FB4A600BCE3E990F3102C2C56082E380034785CC4D220E84A4CDC509D2E248D9135A22FB6E77E1773D2F67A4EFE9781BA162E6C533DB743BEB473EA53433177ABA71B93BDABA4A5CBA2259747853B61A7EA2840D9F22455F65C5641962BF14B581B7C96BD874E705EF526D246A9F57ADC94656FEAF48E177D0105AE6069E208A02741E04BB79A30BF3A36182020D4D6B3DBE4C62B43F0276AA3627297BCFD32EEA82BC9797A7B07421C629500005C71C6C6C5156DA35A223E11A3C2D1F0DC3469F377BC0A15022BA95D187228ED127853BF4B36BD962C9433F50FCB5DFDA987279CE49A9BCCC898AD8FB53D35EF4D1DCD9468470029AD5558AB918EC489D7F36B95A5B40464B2FA689FA43F sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B81436CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE02D971FAA0DB5D1F80630FBD527CBB0D18184CEABD1564FF16550BA0A865453F25F9BC978B5D3DF1FE99E3D6E0524A75A5A7CC443D24513062F7934D99357836CB5DEC7E2C01BAD0E27C5E9200532A2CA9FCAAB69B143F63867050843244C76E9AE9D60A72A1D467E9ADCC965C30B93FB4A600BCE3E990F3102C2C56082E380034785CC4D220E84A4CDC509D2E248D9135A22FB6E77E1773D2F67A4EFE9781BA162E6C533DB743BEB473EA53433177ABA71B93BDABA4A5CBA2259747853B61A7EA2840D9F22455F65C5641962BF14B581B7C96BD874E705EF526D246A9F57ADC94656FEAF48E177D0105AE6069E208A02741E04BB79A30BF3A36182020D4D6B3DBE4C62B43F0276AA3627297BCFD32EEA82BC9797A7B07421C629500005C71C6C6C5156DA35A223E11A3C2D1F0DC3469F377BC0A15022BA95D187228ED127853BF4B36BD962C9433F50FCB5DFDA987279CE49A9BCCC898AD8FB53D35EF4D1DCD9468470029AD5558AB918EC489D7F36B95A5B40464B2FA689FA43F ct = 1F2563859F0E09BE5CD4D9C0E57763513465F8B4F510F52E2F2CB87C09E941F9D06BB56425E94E495C71E5514DA242FDA88DD68400C05B3D6BF1A00213F114ADB26B0E92BEB182D06A1498AB45D6DDDE7E799C6FC7337BF0A335136BFBF8D393C90F48AFD51A419B6CC551E466F0F0BB4882BF7B864B4E93E51381BDC4084D3DB01B1939AD5A8811B39507F27110C51A09CC44689D09618F994DB989AC40F985A3836B502C298B6ACEB74B08CC4DD283CC17B8BC63191AD17CEDCE270504DD19805FC1D573E1426436A80164085C12E764FCE69BBF4B9B00573F6F86E7D4FE5A0610AF303E77C443ABD9709AF2DF2ECE70CB507D542009CA09355A39F36A89B4C620B0001DD3755D0C37E654E634E8A0B049863E07CAC4BAEC38BBD1FD10745B507163855E0F6C16D11FEDFD2AE3B0F1106893470446948FB66906D912DAF94736C7FED348FC7DD0156CB6F61D6D9EE1767E1405A3FD4C110D585AD68517BD59E9618C98F2C93A0C0E4C25F11390F691C5FBFF7B4DD9E7B4A208DCA6779C6EDC4906F0C6083EEA35897AE01975229C991981 ss = 86B83ECBD384B9FC9E99049CB7C82EF5 count = 84 seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 pk = CC4EA3899EC60116BD548F1ACD092663810D63F74BB4CD71FA7D9B5A900E6C255A63F27021B744DD3BFA97DCAC329BF60742F68C8B2B192CCBC43DC78C1D1C440FACE0691058A0FB3D9A3D0CFCC38D733F5DB6E7F3D602196F3B1E79B282283571DF9515340330B87C94B2AB17481A88EFB6D1DA5674F5A83D706AB68E02EE7A94E4EEF70738F15C15C90AF70E0A34EFF05310FED0CC31262033106B6AADF9DD6D8708DC0611AC4992F0943A48A9C03F75944FEC854BC7C16C49734D23189AD44A6DE0BA7818FDDD5D4EE30A969D4C1D01384FE6EF734B6604D326D4EAEAED96B5646C39D55CF22495B53B71179B9F80C778CB70728723B24DF65B12526FBD5A78E76567FDAF40BDAE1EA432CF239F9B9A5DA012732764D218963879CAB8D161A6268778E170F74C9643E5C00D3353505A7E41533ECBCF66FDB63DAC50AAAD83E20505587DAB22E1B37B2F3DB99139F0928222F9C607D2D80B062D5ECD8362FDC6826A757DCB7EECD1740FD7B438077EA2ED3B74993523262337 sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281FFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF36111704CC4EA3899EC60116BD548F1ACD092663810D63F74BB4CD71FA7D9B5A900E6C255A63F27021B744DD3BFA97DCAC329BF60742F68C8B2B192CCBC43DC78C1D1C440FACE0691058A0FB3D9A3D0CFCC38D733F5DB6E7F3D602196F3B1E79B282283571DF9515340330B87C94B2AB17481A88EFB6D1DA5674F5A83D706AB68E02EE7A94E4EEF70738F15C15C90AF70E0A34EFF05310FED0CC31262033106B6AADF9DD6D8708DC0611AC4992F0943A48A9C03F75944FEC854BC7C16C49734D23189AD44A6DE0BA7818FDDD5D4EE30A969D4C1D01384FE6EF734B6604D326D4EAEAED96B5646C39D55CF22495B53B71179B9F80C778CB70728723B24DF65B12526FBD5A78E76567FDAF40BDAE1EA432CF239F9B9A5DA012732764D218963879CAB8D161A6268778E170F74C9643E5C00D3353505A7E41533ECBCF66FDB63DAC50AAAD83E20505587DAB22E1B37B2F3DB99139F0928222F9C607D2D80B062D5ECD8362FDC6826A757DCB7EECD1740FD7B438077EA2ED3B74993523262337 ct = 65E5BDB7839542B08EA7EC3E3FCDC7A6586777F800E97A61489F53689E43CCE8A2B90F7661B954C3DB65A8DC39A0B20AA17905CE50F12D26759EFA11D60A3CE05B66442DAD446F23CC96EBB24BA416A7CF4ED914EA9B35CF08BD3B40665C6132E26AE8810EC533BE7F9F2D1A8C6CAEDBA2A09C76B4E04ADF78CC7631841244A7FBB407A71B9790AF5A39C7B74552F637BB72058534A45DA28599BB99503A6B9282D30048A38E6DF4B53669632E043708DC3301B07146554F8DBB536C29361B6D128F2D08A9D357D829D6EBADC01B8A43976629C6CCF78FBAE82F9F2AFC614B1B49F5AAC6EAB5D372FBD0577375EC10A8FDBFBB5666A2273163991E3426E5DC438097089D13D7807631A2B12B797959C01D8BE9AE043F525836CB872BA84E5E1A6AC9CEF99A54E89B786BC42401A22D820294AFA550E9147166DC3B0D256CDCAF041C62F26E5FA02661BA88FF30CAEBF2DA81488BE85A15536ED71615BF2A3F2EDE8474BD3B26A7509A5038BCE2609FA37C3E462984A26DA3DB266E37A2BAE46DBB151DFE320085873FE70B7146CDB208DB5C ss = 6D6C5ED8617BA9758120078AC91617D6 count = 85 seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 pk = 230A4D4E99ACEAE56E4A10FCCBCA69EB553F5E38D0B96F4618D19E2A569952F08685F1513B8FC59AB972444E387F236B42C9B6758B7CA02AAD3BB05D75092D849E295A20D0A3BB83F6F4A7313E5EA1FA5EBC4DB72E631E993CE3DB17105D5570B04EF9D76732769C77FD0F075C417472B0187A3AF07A45885048706D4D21945B8400981A91D9C9B6A2D727D0675879F34D0F759199BCAFF529B2F9E9345078D68DF3EAF78ACDFEADBA40B324AC2C4B46ADC6A662F0003236A5D1803412D65CD58BFFF0C37510BC913E68C333E7A4DC92C497EF9C981773D67D1594489EEF222BE2B37A63E8FB19A79387FA07D0C1732AE9CCE185C42621910E6F3617C17C8A9B7F787AF9CC130D47526F0D1194962F35C6C717DBD3AD6F29B1DA1778D055B8069BC943AC0084A93FEA544AF483D51A9450FA929261B782C622B412A7D73E98EEA0113E9B8924180EBBEC3449070692A806A27ACC73FD0C0782B1B6B810AE63820E8631F90B1A3580B81BA21D4E66BC5540189E04BBD8A6C40434 sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E0B230A4D4E99ACEAE56E4A10FCCBCA69EB553F5E38D0B96F4618D19E2A569952F08685F1513B8FC59AB972444E387F236B42C9B6758B7CA02AAD3BB05D75092D849E295A20D0A3BB83F6F4A7313E5EA1FA5EBC4DB72E631E993CE3DB17105D5570B04EF9D76732769C77FD0F075C417472B0187A3AF07A45885048706D4D21945B8400981A91D9C9B6A2D727D0675879F34D0F759199BCAFF529B2F9E9345078D68DF3EAF78ACDFEADBA40B324AC2C4B46ADC6A662F0003236A5D1803412D65CD58BFFF0C37510BC913E68C333E7A4DC92C497EF9C981773D67D1594489EEF222BE2B37A63E8FB19A79387FA07D0C1732AE9CCE185C42621910E6F3617C17C8A9B7F787AF9CC130D47526F0D1194962F35C6C717DBD3AD6F29B1DA1778D055B8069BC943AC0084A93FEA544AF483D51A9450FA929261B782C622B412A7D73E98EEA0113E9B8924180EBBEC3449070692A806A27ACC73FD0C0782B1B6B810AE63820E8631F90B1A3580B81BA21D4E66BC5540189E04BBD8A6C40434 ct = 818660F073D1E71F13F4456F2B0A4FC1FA772B4578528C8CFB2BB1DD424AEE2899F3BEC35D67E65405F72B10FE49899A707EF859F217ACD1CB4ECEBCA6632F7D4DA21C9C01158BE7565BFCAE02B71724C9D84130CAA2C555D614FB93D15A8C11FEE523DA310515ABB7B3562FF95CA330022F76DAF427C8248E130AF377211F62FFA7F5A4C1D71ED7F34D94A67D02CC3B4534F9FB48E372AF174422C348C465FF3D69965CEDCF881EDD9B34D8B14F047C271E548127FF990B77F9C4481C0E85EA4A89F5FED0F236D81AF6AEDAA53530A23D9F34C371FA518AC7DF99E009CC58342A1698782B2F4728134CD40E57F8C9122569DDEA920CC60D7AE5DF3FC6735E4B09A6E2E903E41BE67710AABAB7D72359C2F7E211374B73B20AD0537FE696AC4DC8BDA4B2FFFF28A0391C2B4C1755752A1D2D32225397D4B4655B1F917FBE4EF62CAA9A3289B95C5BF825FAC608E5A16C58D855D2565EA70F9EA5FA73E0A5C6A588BB9F57AD352802CEA7C20D4D04209987FE596A5F0932C9C619EBCC95E6E8A82189A8C93DFCCFBD28D20688833CB981EC66 ss = 6D8D23DB9FFA4384E25A93D2AB371B98 count = 86 seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 pk = 2850B78DE78F3D4875582C63771C2242556DFDDC20942CCBD794C386228FE949EFEAA976147CE145C8CBA3FBD57BC32B9506E267B97BFF84315E35797B400F8B675068CFFC3B2CF3330577C4A027FC808B01E01087B116D9F90EE0FA79D6EE2E79817F04AD3F5BEBD736B1570FF58B9CC78EF8A74ADB21999805AE4C7923A57E697C878C75B60FE1E44D7D6FDC4F4808543B5879CD19F6499499527B3B8DCC16FA7B516239EAFD3DAEEFCD576C5EE488622B32183492B54E1E2356900959B4F69DFD7290F118A001CE12F91E072761F9A3AFDE134ADABA3793C90402E1B1DD5001A42E7715270310B7FA03EEFEC775B10CC7B9103E6D96F82242F0039AD1DB386D945D03D19A60F1352A1329A8206A558434D678DC4EBAE951807F544BC5FB535BBB33F72EE922AA5909AE1B5AA09FB9B0DE6B2D6043F43850021AB683829C75EDD0C52A761295E40F8F663A88B71EABEA14FDE1A875D70493D2B2AEFF6F4C9A90389C5195B4DE21FDD97A3A3655C7A4AEC03219EBD8568B953F sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456ACE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A01022850B78DE78F3D4875582C63771C2242556DFDDC20942CCBD794C386228FE949EFEAA976147CE145C8CBA3FBD57BC32B9506E267B97BFF84315E35797B400F8B675068CFFC3B2CF3330577C4A027FC808B01E01087B116D9F90EE0FA79D6EE2E79817F04AD3F5BEBD736B1570FF58B9CC78EF8A74ADB21999805AE4C7923A57E697C878C75B60FE1E44D7D6FDC4F4808543B5879CD19F6499499527B3B8DCC16FA7B516239EAFD3DAEEFCD576C5EE488622B32183492B54E1E2356900959B4F69DFD7290F118A001CE12F91E072761F9A3AFDE134ADABA3793C90402E1B1DD5001A42E7715270310B7FA03EEFEC775B10CC7B9103E6D96F82242F0039AD1DB386D945D03D19A60F1352A1329A8206A558434D678DC4EBAE951807F544BC5FB535BBB33F72EE922AA5909AE1B5AA09FB9B0DE6B2D6043F43850021AB683829C75EDD0C52A761295E40F8F663A88B71EABEA14FDE1A875D70493D2B2AEFF6F4C9A90389C5195B4DE21FDD97A3A3655C7A4AEC03219EBD8568B953F ct = 8BAFB17C24ECC2884FD96437AD1BD7F22C13303AD91CD849635939FC1FDB0D68B9B7E8439C2F53D528CA525A335CA2AFFEC4DFFAD8E2ECFDA2E1617ED68C275E6C02476901543AA63F29B735BF4AEC1E2AC6BEF1838EF21FF22145573C9F9B41D517664D19AA4163C66D24E45F52CEE3D469C23450550CC21E9BCEC03413F0D48B714D518EA52E83E77B7C6B8917F4A84426B98F4A2D4705135971E62D17E47792719D9E4CAAAE5BE3AC89EE95E9AEB0C7518CA70F9E26F7FE19430E2ADB548FFB4195E5C5BFEDAE30845F6F2A4B3509A2E09D4738130BB35E69B26443E565B44FAE290AB8CE817CD5E821DBF1E91D4E39DA6628A05BF44DB2CC9F1097F783A1EDCA1432D8E9FA4D20C6F97984F6BEBF527C1C320EB54AD1138209AC9B4BA6A3762DC1D8D94AD8451660CF90BE9F6A38F6BA8CCB3EA7D1F67DA824B6AB242310E1860AB767EAE589E3928B200E1C7BE65F9F0E02394FBE4A89EA882A92C4D3B8DEE317A8FF05CC787F88EEB8A0CEB07A9BDF63B610AC1432041BC0ADE743D77F4EA5288D30AA3EBAECBC6962B9C19B6AE807 ss = E3FDE1D506D13594CC9856AD93406F79 count = 87 seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C pk = 33A2EB0FD92DB950D2CE7DDB6BCF4512490CFC9C6662593005FBF8DFD8AF63F2A40AD26DD3CC666C2537E0128AA6340047FF71D20DAE7C7C7240D8B036F410747EFB15BC6500F07C0E4210C0FD2E77250BEB8E522AE7894736544579F9568E042E8D6CFAB27A75D56FE7982BC963B68A199BE8D60E96B4A5B7CAC0B81B33EFDC883580719CC62D481192ED4893DE4D57C73D8C0D2A488F8F4D749E224AEB42E0BD1418A8B5E3138E746DC1B3F3B6DB72F005BDE88D601F8B69EFB6680149132FA2916F04C15555D66F0EEDB39B05A284C94BA053749B62500E062ADE9D4EEA3D28C4BB53DFA61CB9789F867327F9EB5349A5853EAE9C42BA741B2F2B5F2C2A4D812DA687B8897A9CE3CF994F8B17C6CD0F0EF1841E5BCD82CE4D29C89386DA7309D0A2B2EAB7A67F686018C57977FA2B82ADF136E03E8CCBD5F41B40A1960F42A35EA57787334211A511FB6F1FD98E0D565E08D3FCEC0193F4F6E163C6679A9BDADB08ED9F120B6CA73AD0F8A9F45C032B9B965E3BCADAC7AA27 sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93047F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D970233A2EB0FD92DB950D2CE7DDB6BCF4512490CFC9C6662593005FBF8DFD8AF63F2A40AD26DD3CC666C2537E0128AA6340047FF71D20DAE7C7C7240D8B036F410747EFB15BC6500F07C0E4210C0FD2E77250BEB8E522AE7894736544579F9568E042E8D6CFAB27A75D56FE7982BC963B68A199BE8D60E96B4A5B7CAC0B81B33EFDC883580719CC62D481192ED4893DE4D57C73D8C0D2A488F8F4D749E224AEB42E0BD1418A8B5E3138E746DC1B3F3B6DB72F005BDE88D601F8B69EFB6680149132FA2916F04C15555D66F0EEDB39B05A284C94BA053749B62500E062ADE9D4EEA3D28C4BB53DFA61CB9789F867327F9EB5349A5853EAE9C42BA741B2F2B5F2C2A4D812DA687B8897A9CE3CF994F8B17C6CD0F0EF1841E5BCD82CE4D29C89386DA7309D0A2B2EAB7A67F686018C57977FA2B82ADF136E03E8CCBD5F41B40A1960F42A35EA57787334211A511FB6F1FD98E0D565E08D3FCEC0193F4F6E163C6679A9BDADB08ED9F120B6CA73AD0F8A9F45C032B9B965E3BCADAC7AA27 ct = E1839CC42C1710F317FBA47743B9B6355700AF2281CBADACFDF7DAF4761AA491D7712A5B05F744F6376C4CF318FD92A5BA38E37D7F75AEDE9070C1DDF225297C97787DA6BB480D9C8BCABD60C3D33F1DFB9BFAC07DC99339B72CA01A5DDA6F9B71FF2EC9836DDD3592B82DA753F8E4A9BDCD4BBDB5CC83D642F15163B0075FA2B1BA78288DEE01BF29DDC6061941F6F97AF986A3C8F098D31B8CB4C58AA9985F3A5F131BFD5E2D9A5DBB7264459034C8C153A873784C08BA048BAF333831E75E7FC452ED81F365A0436E9CC65903943287F03182B8A3EABC2DC16F41DBC89D36BF6D2DBA557CA198A24C0EA8A11F0830BE1EFB4DC4037D953A6EA53081E7FAD51790D55E02A3DE2C7D6BFA5FC44AFD08A8D782F1B3C8CEF2D7BFB368A0905E938DB817367971B1A0BD30B000E221100AD23B4F6038148CA913CB00B41770159DE6183DCADC7EA401FF0455AE8EFC8B7E6DF60ACB72C7C5536F160CBB3F0C8EB7C9A4A794A196E1CA5CBC07ECEB478B5A56B035FE800F9C14B33876605FB2D28213E55DCACBC2F0279684A4E3EE9F46BB7216 ss = FE4AFDD6BA0C06756200A3004D6C7C88 count = 88 seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 pk = CEFC16733057373639D513F448235B5516C8B282C0810BE347246662DD533C79411AFCD9BE987F2C8A1598E8B3F128118E9F5489F7BFA40E3C47CD7038330B6D56A41D1FDB2C619CF7EDF971A8C5FACC209BB9E289EDCBCCBC5270014CB65ADCB438935B7DE3C1B59B2E8341258D5C329CE4B2F89A16F8189602F5484F1984A8D5FE55A6A4B0E93F0393E3F28ECEB5A9F84049B5BB0F9D39768F5273A71BF794FF8093ECBF86D8A23C977B435847BFB735401049267EBC38DCD495122FC8FE22EE42F917C9AECB628442522A369C010A30819A9CDBF635F4D79D389072190FCF98D2B3DCFBB35D1308DFFC9266EF316E46F862DA1BD71DFDCAC19116B338CFF76F541F077B93E3D927C45C01924F6E9E08678660056B06430226027E91012373A6439F97439C03FB17C9BDFA7CE91DA70ECA3A4853B7309C8AC11F2CF013A558E91EB62AF3D73F752DA7E7AE60BC5D010FFD43439366AF11787ABFAEC2FDD2BD3877DF61DCE564226CAC91D684579015B5C9FF1CD518B9872020 sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946CD82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEA00CEFC16733057373639D513F448235B5516C8B282C0810BE347246662DD533C79411AFCD9BE987F2C8A1598E8B3F128118E9F5489F7BFA40E3C47CD7038330B6D56A41D1FDB2C619CF7EDF971A8C5FACC209BB9E289EDCBCCBC5270014CB65ADCB438935B7DE3C1B59B2E8341258D5C329CE4B2F89A16F8189602F5484F1984A8D5FE55A6A4B0E93F0393E3F28ECEB5A9F84049B5BB0F9D39768F5273A71BF794FF8093ECBF86D8A23C977B435847BFB735401049267EBC38DCD495122FC8FE22EE42F917C9AECB628442522A369C010A30819A9CDBF635F4D79D389072190FCF98D2B3DCFBB35D1308DFFC9266EF316E46F862DA1BD71DFDCAC19116B338CFF76F541F077B93E3D927C45C01924F6E9E08678660056B06430226027E91012373A6439F97439C03FB17C9BDFA7CE91DA70ECA3A4853B7309C8AC11F2CF013A558E91EB62AF3D73F752DA7E7AE60BC5D010FFD43439366AF11787ABFAEC2FDD2BD3877DF61DCE564226CAC91D684579015B5C9FF1CD518B9872020 ct = 3FCE4F1D3FB741CAE7E131520375BA6C3EA07041D3ABF6110C7D621B1A89898C098BAC50DC32C01335738A5DAD8F2F02C1364F15249B0EE4A1606E11825E3AA55A10C8C573810ADCA2B2287E751DE63A2EA558A342F5CC211E7494B10D5EE3A6E79088158D7062C287B2005F596A2EC3776DD4A888E76B4380DA2BBA47395AA05646B10C474B4A1601CC35C35DF0B29F14A22DA8C1AC9C6069012392438BC72E2AA684646D2A280AFBFB66E608ECE881AAF1ABD2519FAA5B9C0AE5620F67CA5DC33CF3A1CB70555A99DB46ECDD00AE5DB6BAC324AA1685D233A97F6287790049C748519824524AEE697F98B034878EF8BB4DC0A26FCBBBA9483EBC3F14F5AFE062ADCA42765F04495CC5175DE992828C624718C310EFBE87161D4C3F4622B4DBDDBC98B6EA2FFE16D4A1C13AC71C17D6D866AE9EC0B929C48B3D02D67BEC8ED7DA7E1F03FD1D05211CD6E76FCB2776CC40C43D9A361FC4CECA9F8FE1E81E1023B79807151C3BD05704170F24F6FB484DD2054254167EC303882705783125F7752B3F0FAE7A8DF1EF8E920B7C0D46D54A911E ss = 2CBF3FF7698FE2FBE62024C72D132036 count = 89 seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 pk = B064D7C66CCB1063770459C943C3C1764E39C15507845FD77D8A18816E879152974AA973453F5C351E58EB9BAE560F757ACBB69ACE83D5A5B3A9E6A553ED08D909E44B05AE5495CC7F790E2025AC71FBCED9289F8F5E855F3A7DFB4ED50C612D36BE3BA61A1778F66F2EEF977012C43193997959C84F85A33FD1AB23D039995DF342A4B398683467EF6596E24B90F72A41DB1F518E6ED23E45309C8A58DF6A67EF42EB2A235C93A2CF00D072B422AF16639038E22CE0C6A66E686D4107BC08029E778701C73113D99DE0A2850412A42A8A3EE41F8D3C4EC6CBB7A95F785193C7078EABF2CA4EA66C73DE2F94DAE9A53840A7FA86CCED3F10A4A0791471061F12F5F0ED06A7373B3348BAC90A84D1223ACBDDABB82759C41AFC50F85A25F4DBD86C013DF110722CCA65A42B55B67905C8B750E9EFE193F0CBCDC024B2B0AD5EE7A779A46003928FFB9CF262A00201FE03C02ECF5523F4BB4802D03269E5DAD2823C41C524B8E4D698684AE29C99728FA4850E0209E9BD703C9425 sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4788B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A0AB064D7C66CCB1063770459C943C3C1764E39C15507845FD77D8A18816E879152974AA973453F5C351E58EB9BAE560F757ACBB69ACE83D5A5B3A9E6A553ED08D909E44B05AE5495CC7F790E2025AC71FBCED9289F8F5E855F3A7DFB4ED50C612D36BE3BA61A1778F66F2EEF977012C43193997959C84F85A33FD1AB23D039995DF342A4B398683467EF6596E24B90F72A41DB1F518E6ED23E45309C8A58DF6A67EF42EB2A235C93A2CF00D072B422AF16639038E22CE0C6A66E686D4107BC08029E778701C73113D99DE0A2850412A42A8A3EE41F8D3C4EC6CBB7A95F785193C7078EABF2CA4EA66C73DE2F94DAE9A53840A7FA86CCED3F10A4A0791471061F12F5F0ED06A7373B3348BAC90A84D1223ACBDDABB82759C41AFC50F85A25F4DBD86C013DF110722CCA65A42B55B67905C8B750E9EFE193F0CBCDC024B2B0AD5EE7A779A46003928FFB9CF262A00201FE03C02ECF5523F4BB4802D03269E5DAD2823C41C524B8E4D698684AE29C99728FA4850E0209E9BD703C9425 ct = F1D911DF1B6E0533094946E1C19E6160167933020CC8C83298A1219D1F608B204EB59B7C71A1B255603513B05E3CE4D5A9E49A545B5B28D66CBCD3665AFF333D284F1565C8461E786CF841097EF536CE7D767E32401AAB3A4AFF28C932FE9AADB858270C65211C11B3557C0FC1B587FE7735383320AAAB0014D84CDFB9030DDC8B744BBFEA8D420EAF5E5C4FA61DA399027E5AF1A2E782B9A0E0C60907879C22F8722F5D30AE8F935AE08FDEE80C1581BE846B73BECFE0161C54FBB03E19C44B1B9D459B7682ED85BE33B5E001E99224E94B4302120FA81DDB87C47586C7C8CFBB68170BD2E8272E921EDEB5A3B70AE53F0682C3A56CDC887BF6A70A7449FE4F3052EBAC80CDAB82B66B102D33449025C9E99E4DF3EE773F0A62BA6EB3F197338277FFCCB5ECD2BE51DE338AB6222D4CE2D9E6992F2056EA072C064F268B12ADDE576DFA38A754F3D28B595F15CFA844574A65A33DC7525A5471A1B239E862F0CE07D513AA3D05285CF8971878394A87CFE235A7848626362A1CA3B2D1175F9FD1B2224BA92754904745FE832B240C4AD9F8 ss = D4ED66490233B2FBBE6597A368AA1C00 count = 90 seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A pk = 1C3F032E2C6CC0BE4676928C3B33E47730CAD51C89884D3A7F4D2B9C8B454587971AB783E8FDA00644620CE8AC6A697C9D0E760E1EE366BA1D2732FA3B96372CC9CD8BA087231C1A046DD600F85EA5106EAD0B88D7C4A012556F54E593A34398B8AEB6F52C9E5966C0438B0025E36780F9E0CFAE9076616767F054C41A0BB25A83E3AD7DF4F44B36E660D4F41D3BCECB91965F091466BDA74824190E3CE9B2914D71D4D6C6A5F556678864D35FC096057AE124AE49AB45B96119A3F71CCD89310DE40E4A28A0363BAE92C17220BD3F92F4C258D3C412FC5FEA0EAE6621C516992532DD4BA241A5C821F8592C98E180021BA6B0638FC64406DACE8604A43CC384884C309CE885C1410368AB735FCEB08AEA6452C2A06E025F986418DE45857BA6A4EB6D48C561E8D3C74AEB027DD18311477391BC25ABF322210736CD892E42BA416ECF54D5107296743FCB387150343A9E9FA2EB9DD8988D00BAC2AB3F509DED286D882E1E098AC93B2ADBCDAB0CF60F0F6A5E214050822C5C22 sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45ED051C3F032E2C6CC0BE4676928C3B33E47730CAD51C89884D3A7F4D2B9C8B454587971AB783E8FDA00644620CE8AC6A697C9D0E760E1EE366BA1D2732FA3B96372CC9CD8BA087231C1A046DD600F85EA5106EAD0B88D7C4A012556F54E593A34398B8AEB6F52C9E5966C0438B0025E36780F9E0CFAE9076616767F054C41A0BB25A83E3AD7DF4F44B36E660D4F41D3BCECB91965F091466BDA74824190E3CE9B2914D71D4D6C6A5F556678864D35FC096057AE124AE49AB45B96119A3F71CCD89310DE40E4A28A0363BAE92C17220BD3F92F4C258D3C412FC5FEA0EAE6621C516992532DD4BA241A5C821F8592C98E180021BA6B0638FC64406DACE8604A43CC384884C309CE885C1410368AB735FCEB08AEA6452C2A06E025F986418DE45857BA6A4EB6D48C561E8D3C74AEB027DD18311477391BC25ABF322210736CD892E42BA416ECF54D5107296743FCB387150343A9E9FA2EB9DD8988D00BAC2AB3F509DED286D882E1E098AC93B2ADBCDAB0CF60F0F6A5E214050822C5C22 ct = 902BA4320C75DF263CB6CACF83E47084F65598A7F903B7D891F80B9084FAE8D2BD8680BF82EECA492E6B1C7DF5E32DBE1CF02A7C501A46F2FFA223E291171EFDB0B4DE8C13A98C1E8DDD721565D015152040E823626C15DDF5A968803E77E25BB1637A18BA216D63D65DA957E912768D79AC7F46C4C8044951FBF4A51F09DFFBCE78C34B898CBDD8B5ACED13F5B4581A74A82C9942F7FB389F76E070F85B591CFDCC59380884FCA79D5A84C4DCA61E6813D410C9B6726D0D550905A91FFC589AFC4A5BAF9F7E2928A69DB6BF074C7C9B114B8AF61B8DD8FB7C16A7EFE09D1053152A797A4DB68CA695D1FDEB9C7D0879EB500CAA65D547288112B21C9FA9FFDA52A91B9DA8C8C41BFFD4D75AF11C07CA6B00AE02B45418F26447568DA90482474D82E04A1FB1F0DA9E8DC7C652C72AD078C1FCC5382ED622C39510A7A2C3F5960692B323012CF7818E894DC6B786D92BDBAE48A95F8C2A20BF4DAB5A2912F994F66679BAA49E7EF45CCCF434568927A12025FFB1FAED979EAF208BB70FD13658C6B55D2895FE9798AA3B37EC201418B8B252 ss = 806E56F46611E29B349D7CB34E704C69 count = 91 seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 pk = 0A9647127903BE820A711895C7734CE6174DD75821064D59E285465EEC15B440BC100EB962362EFD3BBFCBF31D0449D6EB52A0FE56E67FDB2465821803C50C41E16455951265D43E4ED164ADC78FB51250567D260D63E4EA4A13A54CD4941A0B0EAC4270F9C8EC1739F1A4542CA0486B73AC472B19EDFF38DFFA9B5BAE15BD8AC9AE38FAF5421F586D9E0E802B5200D3C8A43ABF784BC40E34A31F3E36A0F6E5E55E8F2EA3254CBA8693260D6A70095F9DF1CC357223E3E4982E43562952283863B7DA170DCD074B3A61E997502F760297DD5D9B4A9BD5F3956F4BCA1817D61A5A29A8982F74BD794E9496E147AC80A0E986E4055FE628C9350293298E7204A6FE303B622D6FCBB97DABD2BC64BD922A44B355560758D1EA77186AA66ECEDBF3E8C6EC537AAC701336868490F088ED06AA549EDA4E71FE7916643FA54C45AEC1461C76EE1F968E9F1D74D7E095B7B2C06B3F9A8698DA0A4E4D7E24CB49BDD6D64F3BC0C83230700001D14FDC071043A2EE89C758A81B92086707 sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8D0E0A9647127903BE820A711895C7734CE6174DD75821064D59E285465EEC15B440BC100EB962362EFD3BBFCBF31D0449D6EB52A0FE56E67FDB2465821803C50C41E16455951265D43E4ED164ADC78FB51250567D260D63E4EA4A13A54CD4941A0B0EAC4270F9C8EC1739F1A4542CA0486B73AC472B19EDFF38DFFA9B5BAE15BD8AC9AE38FAF5421F586D9E0E802B5200D3C8A43ABF784BC40E34A31F3E36A0F6E5E55E8F2EA3254CBA8693260D6A70095F9DF1CC357223E3E4982E43562952283863B7DA170DCD074B3A61E997502F760297DD5D9B4A9BD5F3956F4BCA1817D61A5A29A8982F74BD794E9496E147AC80A0E986E4055FE628C9350293298E7204A6FE303B622D6FCBB97DABD2BC64BD922A44B355560758D1EA77186AA66ECEDBF3E8C6EC537AAC701336868490F088ED06AA549EDA4E71FE7916643FA54C45AEC1461C76EE1F968E9F1D74D7E095B7B2C06B3F9A8698DA0A4E4D7E24CB49BDD6D64F3BC0C83230700001D14FDC071043A2EE89C758A81B92086707 ct = 10DF5522874D9666F978D85F3CD5A404E15D9D282A887F45E6ACC1AF3B4BC8C837D0937C20846F5C6BD1137B3D3E6139A7ACB92E0627E09C48A08CCF916F1837674E10391CE6B866C845AA9EE6F5C9137415DCF4017B7B37A61CAC12A648F5B7B7FD64423B989C6ACE8D14E4B95E27F0A9157AE2D3D2604BC18298A4C515694D4407BE3C762D499978CD00CE253DFB713B7DDA9BD25B8D892AB3AE47AF9B8B7D598A04BCE222CCA767AB8AB45F72C73253F669666D621F4C3BD805AB34314F81FEF89EDD5D1B26C74C38A8AAAEEA5937B5D3948E9A01B7C1668E7F8338EC44E3C70FE5DB06D802600512419D9F1E2035314422B0ED4B91467B9BFA060CF7DA41105B8F191B745F7D809087C91D7E6A8BC9C99483D1593EA84B7ABBEB7F5AD20E018A5A74C2319F65292B63885A918D14B4503EB79445BC2977C50C0ABB0A64E5EA713E74CCF3EDA00FF31C166334BDAF9AEF608A087BC3F34229D25CFBDA3945EF94A89DD8538A197AE2E0A7D8CC40E7EB0ECC13EE45E2BA72389BC6EED10A9FFB92EFC940D756EA70CF3B8E447F54C8BDB1 ss = D448BDE9B6537AABB3C2C3BA0A5C6AE3 count = 92 seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 pk = 430954DE5B960282592E869745318D82C79C22F68D579A070EA97B8FEC1C5D9A2DE15A6504E6CE344132B36063668101D77ACF38C84734C7EE32F546E4750CAD0B8808EDFD5E4186C6426D8839CE47917ACFA4AC3BCB11BDD1C221167BD968A48D790FAD9F3BA49479D0391CF8A9A24A194BC17497548DAB60198EC34824500D8DA6092A4831F2D88A3C1AC71FB91460A369A9125DDB53A3E1A12256BCB27FDB01B04011A85B411FC2003EC36A9EA0E43E71ACDE05125E58D58B78012622AC37C96537AC947A608A3186E05CF7BC809BB693D133103BE7F2C0AE64854DA0A694BF15163243D9F2F1CA457D920CDD4D638A5998EE0954D62BFF67610A58084B8BE7D3D7ABF586CB65F4A16FB07E2F8A2871A9CDAA9B5ABB297A31586B6DAEA50BE067546FA90C3A191118E88A24D061120E3C16AC7F6F283A9BDD0270C608BBFE1F960822B6139360D2B880236345364869D7573A4D8A870F526EA4FC4A337F0691105E3FDE2ED55BA6EF4B774B4E4CDE7567CC26E0A783852538 sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F1481C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423280F430954DE5B960282592E869745318D82C79C22F68D579A070EA97B8FEC1C5D9A2DE15A6504E6CE344132B36063668101D77ACF38C84734C7EE32F546E4750CAD0B8808EDFD5E4186C6426D8839CE47917ACFA4AC3BCB11BDD1C221167BD968A48D790FAD9F3BA49479D0391CF8A9A24A194BC17497548DAB60198EC34824500D8DA6092A4831F2D88A3C1AC71FB91460A369A9125DDB53A3E1A12256BCB27FDB01B04011A85B411FC2003EC36A9EA0E43E71ACDE05125E58D58B78012622AC37C96537AC947A608A3186E05CF7BC809BB693D133103BE7F2C0AE64854DA0A694BF15163243D9F2F1CA457D920CDD4D638A5998EE0954D62BFF67610A58084B8BE7D3D7ABF586CB65F4A16FB07E2F8A2871A9CDAA9B5ABB297A31586B6DAEA50BE067546FA90C3A191118E88A24D061120E3C16AC7F6F283A9BDD0270C608BBFE1F960822B6139360D2B880236345364869D7573A4D8A870F526EA4FC4A337F0691105E3FDE2ED55BA6EF4B774B4E4CDE7567CC26E0A783852538 ct = 565B2B7E871425D6C7466C603B988A4D09D3CFE2141D8636FE9AE8FDF4A788CA96DDFD45708ADA67782BAF8A246C0B34BAA46A3D435D440B2325AFEFFFB922195C0F9BB74396A48192D203BF218F7A40A9D43488BC1ADAB0AF7A65BB81B53FBAB94984AE806CCC969D94A587635DCF6EC909F120A9B35D1258319043D32AA1AE350B3CD969601764CAFEE84E310210F3E49F56B86AB0610AD53ED68316278CD20DEE85F1BB68F522C43787FF56CFB735C24005699F62E86D58C890AA0CF762F189C70F006889BD2176DB918BDA1863F3A9A22D0B095467B56279EBDC24C5B39471A9CBD7D57508ED90614B775292362CF634954D497A1849F4C2AE289D59AEFC0F30C0EC56D4E3ACBFC2CBD12FB8FCA902A5BB67A331B368E1710D6B0AA4C3A0F5AB4E167BB43FE4A02C179FA6E85F4C97C434285BE36CFDA9AE29864611EC717C21DFB6068F6AB87AA70433A2F2D0A9AAA11B69327F4CCAD6B722079D1179D4F01A8F914508FA6ED2E9FCD4600D12046C8DC59388C0AAC18012043154B4EFBE7D36C6592FB0A434C5087E143FACF3018B7B ss = AF3B268BDFBA03AEA8B35CF5DEAFAD99 count = 93 seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 pk = 23C9B5C3CEF34344ADDD53B40A7AC18F7A620E9427D4E372AE517A2DC3DFA7DED1F5F8C28F36B3218264C92B0E87DB0F8AD2BF369F0F951B3B141EA627E42C5479C10A4315CF9AEA9BFB16CD81B7DBA3E39346158C2D997C98D46E3AFE7B5879C29888A87A972AEC9214009FF433FD716DC9E3B3E70EBF98A3055ED5952831B3E503F62D2B41CC6DBF2690514DB13FC137EC41B9BE3EEA69E8B65EC00A783720363F9F6E43263B3ED2B078B0B5A39BE0A35B330B3D09FEA903A8C8900A484FEDAC0AD5CDD11D22D6726750A05A90B51E64BB1E66627E9D86132505F831008DE6B8DFBE6056AF462742AFB2BF9B5CFE8F71E8EEE2563BF5E701495A2C5B1EE23404914A47DA4D0086E7B4CCA497B06F29F500C43E0D62A57625817918835848CCD3C9A7794E52EF60B8EEB39219A1D9FCFF3C133831AE7811C2EB20C4FB7E8F3E35FB5715D591D61C50F6492A4A90CF9B9298807541466210492D29D4021C131A20029E02709AA94A85CB3F185B5E858BD21B17A4837C877B4A40 sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE3860413C06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D80423C9B5C3CEF34344ADDD53B40A7AC18F7A620E9427D4E372AE517A2DC3DFA7DED1F5F8C28F36B3218264C92B0E87DB0F8AD2BF369F0F951B3B141EA627E42C5479C10A4315CF9AEA9BFB16CD81B7DBA3E39346158C2D997C98D46E3AFE7B5879C29888A87A972AEC9214009FF433FD716DC9E3B3E70EBF98A3055ED5952831B3E503F62D2B41CC6DBF2690514DB13FC137EC41B9BE3EEA69E8B65EC00A783720363F9F6E43263B3ED2B078B0B5A39BE0A35B330B3D09FEA903A8C8900A484FEDAC0AD5CDD11D22D6726750A05A90B51E64BB1E66627E9D86132505F831008DE6B8DFBE6056AF462742AFB2BF9B5CFE8F71E8EEE2563BF5E701495A2C5B1EE23404914A47DA4D0086E7B4CCA497B06F29F500C43E0D62A57625817918835848CCD3C9A7794E52EF60B8EEB39219A1D9FCFF3C133831AE7811C2EB20C4FB7E8F3E35FB5715D591D61C50F6492A4A90CF9B9298807541466210492D29D4021C131A20029E02709AA94A85CB3F185B5E858BD21B17A4837C877B4A40 ct = BEE4161A2C48A54BC154BC5B284D7F87532C362F7ABABD6F968C58FB5F058B219ADC756E60F5FDDAC45B5A826826B72D9CF3C9C9C7455E819EE3E00D38B6175CDBCE0F623CE5B6947803F0DD1780A291CFDB0793A1BA9E2938445477A5FCB641E4B25DF61BBDC16B8DC41AA971ACFEDAA8C3A64B969279AD24C4576A8F2583C4FC6B71514E008E13886CCBE102BAC64F1DF84E1F5A298A481CAF632E39791E7582A69BEC356AE4BCE2D29B044FE6E4B2C48D914EC0A97E6E5096A7691584BAD003E2C84494B486626544C05E696A027AE0CA59BF1FE555A5ACD6CCEC0771275A19BE7203408DEC18F82C718EC20C6DF9BB7A721B4B26A370419D78201D8779E08A7E636AA685300F0C4559178201DF55E72D2BBBF58099CADB8A6879C2D3A1BDCDFCDB74DB8EF9DFAD07114F213E9577002D3316AE379154C5F40C45D112D2F2123D54FF0535C6E03931B163318E0557B84FA6642E9510C7327637E141AF4B36A41850E5A1CA00BBD77E7A473DE1306882FE84A0E81BEB2D7E3167B859262DABB7D17763FCA642A46CEAE868B097F4683F5A ss = 9D82E096201465C407349177A7EDFB94 count = 94 seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 pk = D913232981DE98DA969E91F7E4CA2BDEB2116E8D970A1AFDCC33B102B77D84A4DBAD8D97E8E2306C324C4C9CCBB2CC1AE8E186D5915C909829422847C2D903BC27578F9756CBA4BDDF40E808F68D4435A227A39CAD0502E00DFA4B349171284017C70733DDED3E6098A26559B068CC6BFC5B23380DBA76CFF845894ED3355C0A44B16733D8EF57D96080DB419E24D9B97FEEA6F20587471964CD0C993F2A2B795AFEEDE32E98D21F88193A530B3EED16E989774825E05CE8B75F1B5E01E364D1C9E1CECA15A33488A53D479C31EEC4CB9C9FBFE42ACD57601AE53255F0C6A89D662C83707C6CF65651757D63C26C7D0FB410CEABCC1E826387AAE229603DFA0B1A5142A4C99B607E1BB58BBD913207B1A949B0A381D869C67E159EBC39F409885E8092AC1D935FB968C8C701BC016DDD044592E7A79029B5108C032A21A2FD634C7DB5CE0374BA18B528B6F2ACCE9843F0F8A6D6266B0F07503C419AE35359AC9C2B7A0D5E3672B04A6F74873030DF6FA4C9961DA58F0370122C sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F54F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C04D913232981DE98DA969E91F7E4CA2BDEB2116E8D970A1AFDCC33B102B77D84A4DBAD8D97E8E2306C324C4C9CCBB2CC1AE8E186D5915C909829422847C2D903BC27578F9756CBA4BDDF40E808F68D4435A227A39CAD0502E00DFA4B349171284017C70733DDED3E6098A26559B068CC6BFC5B23380DBA76CFF845894ED3355C0A44B16733D8EF57D96080DB419E24D9B97FEEA6F20587471964CD0C993F2A2B795AFEEDE32E98D21F88193A530B3EED16E989774825E05CE8B75F1B5E01E364D1C9E1CECA15A33488A53D479C31EEC4CB9C9FBFE42ACD57601AE53255F0C6A89D662C83707C6CF65651757D63C26C7D0FB410CEABCC1E826387AAE229603DFA0B1A5142A4C99B607E1BB58BBD913207B1A949B0A381D869C67E159EBC39F409885E8092AC1D935FB968C8C701BC016DDD044592E7A79029B5108C032A21A2FD634C7DB5CE0374BA18B528B6F2ACCE9843F0F8A6D6266B0F07503C419AE35359AC9C2B7A0D5E3672B04A6F74873030DF6FA4C9961DA58F0370122C ct = F2D57C4147393BF0C0373BBB8283B729D1051C2A71649D023874295758607558A548A6C6378E557D0A9061D2FC20CA0144273D4ED0307DA344D7BFEA1E1102095CA2EE728F1A1039D97A0A02E10DBA755547D5AA96C7F61245D62B3AA755E64572DBA8C779DD12E1710DC276317A8405B43E643593237E9E77C934B76B374BADA574D735CC0EB1C51B06B7DAFA69C814076B9F8B8FD9F930AC7035B1AD5B00B00BF6CDB1C7253660A8962080AB504C54E65CC7C8D7EA7B540F4B408E03F672F25E73BC8ED4021D053995EA1F2281B5AE8C54FE0992B15377E5D6AEDC26878F312C30B94C67208594E3E2A5A6C52C2379B0C0E0AF0B5CDD179E802A03A0573326C9EE570D1D614F2B2841B586ECE4A48E60E0E36436161A75DBB8712F5D9DF66E33CC474FE8A961703FA7E32CBBE07EB19EC2AEF72C4CF957C67516F84B166E7FAD60B6E37849B873ABFE9E785E3BE4AD5C7A0F45B4CE30057CB7F7C72BF70E8B6849505C91BB57087215B9553B8E51D3A31B80E228559CA18315703C7E8DDAF0818EC89378A01264B5EEC2AC430581394DA8 ss = 61B9BB7BC624F9CA9CE12830CE844AA7 count = 95 seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F pk = 3922C55C30B5A26A7AFD74DA9FFC9D75E626697F3E0FC5A04EAB4F87A05C5237C5BAE2F90C2B05712A915DC201C011B22D00F232D913E430D7BFC1EB0FEE360ED5C54E961F36C4152305B30B89483E7F7E0C9E5D6752AF092F8A50AF7B5273044D11D151914A871E8C6749976FB12DFD9CB3D01E063B8A6D25B364780B21EE533010A92B12FD6AF30928722B5C2FC82F7903D38A72B80FC93AC6AE623593EAA3064111E1D940665CE2598EF2F1F63890E447083CB816649C50CA87B929CE5926721A4A1F2A939293A6F3AE4FC39796548ED080EE97B2A6F1A826B8EF71171C599B0D19281C86665D26B90A07EDE1DB472AF78318B2CD9DB08FD8CF00ECC0819F90E07783A797CC5F6DEED95E340FA726E050EBF9C736DE4DE91CC4FA072A919B675898EEDB66C6479507D191C84058CF0E98C9A79FA66F5FA74D30B290A8F271A512C9EEBAE39072960DAE6A1FA1EC1DCC938283E426CB2EEE3E6A87A3EB1C2F5F5C379E84192DDAD1A868B5C89A3342FE4E46828821BC9EB31F sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F6E32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C80C3922C55C30B5A26A7AFD74DA9FFC9D75E626697F3E0FC5A04EAB4F87A05C5237C5BAE2F90C2B05712A915DC201C011B22D00F232D913E430D7BFC1EB0FEE360ED5C54E961F36C4152305B30B89483E7F7E0C9E5D6752AF092F8A50AF7B5273044D11D151914A871E8C6749976FB12DFD9CB3D01E063B8A6D25B364780B21EE533010A92B12FD6AF30928722B5C2FC82F7903D38A72B80FC93AC6AE623593EAA3064111E1D940665CE2598EF2F1F63890E447083CB816649C50CA87B929CE5926721A4A1F2A939293A6F3AE4FC39796548ED080EE97B2A6F1A826B8EF71171C599B0D19281C86665D26B90A07EDE1DB472AF78318B2CD9DB08FD8CF00ECC0819F90E07783A797CC5F6DEED95E340FA726E050EBF9C736DE4DE91CC4FA072A919B675898EEDB66C6479507D191C84058CF0E98C9A79FA66F5FA74D30B290A8F271A512C9EEBAE39072960DAE6A1FA1EC1DCC938283E426CB2EEE3E6A87A3EB1C2F5F5C379E84192DDAD1A868B5C89A3342FE4E46828821BC9EB31F ct = 7B02601899FFF4BDFD0239FE924075CEBDFEE6EC1B8F67748831107487FF564A89353B669643D67DEF334976F3896547131D5A237C8F533F2DCF62F751301690B3C138F9912224276A47AAEB91A6742A3CB0DD03DF7572652B5EE7841C586F601F53A620E20106A7FB80F02848C76190BDBB67C2776668C01BCC1EB96D24DC2D91C8C5C27F59E154B78008B556E9C71B2BF4B6B7F74ECF79D18F280D734649D7F032E3E88654463122FECE207945A91B8248E887FE74D9B2B75E8988038AA856407502EEE2A10E4898FDDBC9811FDCB28EEF9921E65304285F0B35E211522306DA2871E4C2C2184705C160728A723E086C10550195A7FEF6105C812477EF6830351913723F484B51B2B7D8360C02194C26950264C66EFEEA8F2FEE313537AE8F3B26F2C912900748C0A9A5C363C2D0FC441B3173E45F454401102C08B00DBCD7334BD09F2AEEE6A3083FC96296CF5648DCD6AF956694861DAD11E94651FA35E9F07072EF39CBCD2DD9BF518FA5E3BF71E613746161E8685FC8155FDDE292F967D94D0C5FDC56FAE3F6B772CA46BE9572B144 ss = D497BA97E27D82FE6518B7D0EC8DC5C6 count = 96 seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 pk = 2FA5055424F34F8A109F21003007E710FD34A036E827EB0F7185F84863A660ACE7071F31149C8C70DCEC3A54F1C30C6698989B69CF58F1CFB7F48094D42C0AE8C244600F65C5125B7673A6A3E811BC87D30028D207E2A8127F791B530E58E9F6B3B5D7BC0FD93BBB9825760A525761E42AD39B75C3D21119CDE47EECE50F3AB14A21920AEF1DB71706EE6E8C2834D9F73724EB48A85793668D4A16404285577DEB174AF4180F25A1E8C447FD574A3345A0CE02BE47334ADEA0058BA214175B5A228F710DDA2AE09828EE0FAEC36D54CB5E81F240F7C57C1497C26B67D64EB1FF70AC361632DEA6FB44D4E1CECCC691E42DA4C07FBA872CFF54A9C73D03CCBDBDD717D1C47FC5805571EA087F89AFFB85DC9EC46EB549A58A5FC80F510FC608E111E6955F6B9D8FE8D7AC51E0FDD5FAA68BB4E5D78232D9F2EBCA11AD131000AEE93970CD892400E41E8BCED34DD5747EE274A78661EF85B1509C3E5E33A8EDCBE961D8D07725B2378C8A41CDA8E59332D6AB43903B1059111224 sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F5AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA110C2FA5055424F34F8A109F21003007E710FD34A036E827EB0F7185F84863A660ACE7071F31149C8C70DCEC3A54F1C30C6698989B69CF58F1CFB7F48094D42C0AE8C244600F65C5125B7673A6A3E811BC87D30028D207E2A8127F791B530E58E9F6B3B5D7BC0FD93BBB9825760A525761E42AD39B75C3D21119CDE47EECE50F3AB14A21920AEF1DB71706EE6E8C2834D9F73724EB48A85793668D4A16404285577DEB174AF4180F25A1E8C447FD574A3345A0CE02BE47334ADEA0058BA214175B5A228F710DDA2AE09828EE0FAEC36D54CB5E81F240F7C57C1497C26B67D64EB1FF70AC361632DEA6FB44D4E1CECCC691E42DA4C07FBA872CFF54A9C73D03CCBDBDD717D1C47FC5805571EA087F89AFFB85DC9EC46EB549A58A5FC80F510FC608E111E6955F6B9D8FE8D7AC51E0FDD5FAA68BB4E5D78232D9F2EBCA11AD131000AEE93970CD892400E41E8BCED34DD5747EE274A78661EF85B1509C3E5E33A8EDCBE961D8D07725B2378C8A41CDA8E59332D6AB43903B1059111224 ct = E19EC3A2A5DEBA18785B43BF3DFD3C5CD42437E8EE05CAD1E90A1E31BB29B702E7C1E9816FDC69F63316DB52A202E7AAE87182DC739876CD6F15C9E431161992D59EB24573011F84794E86ABD5C3CE984005A3A0BC6C119E981B966BA62A469803F99F931CF1F0A60824F9CF911F12A9310BF1006DE0DDF536B03D4A0531C95D266D041ED42962305C0B94E29CECDA3310E18AA5347F0CABC4C83263A9A9EC9545EB039E432407C6A38EE6609596E6A4342733EB679B055043AE1DBE29EEF46A4EF9D5F2889A18BFE9FEC639FDF90969FB81EF301142582A11F2B4226C5378AEFB8D8B7DAAF5971C1D634C1538964BDAEBA2FE0CC0B15250A18D700E5E487F0207CE260491C18DE6A51D400C57527FE1B2B7554D2EC92F07D0B6FF0476FD10451A61393D1A7B0B17D5E4194068968AD771E91E01228AED91BAFC028054C7AFD8D9DFE84E4402D28EC1EF590333005C2C56DB5FBA1C96F2444CB6C87AF2C3A3B6597568C70174314AEC9E6B0E029C3C744017135511A5F52FB3121097E644A195C04BFC3486E5AAD1BB4E8D206A193CBC3C9C ss = B64FBB053B17B28CCCF00B1248F2B8E0 count = 97 seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 pk = CDF0B6B1DFE7BEAFD0ABF3A9733364DF7487CD3DD3E1801211F0D65CB72DE2EB644219CD8A9843D0A03B9655ECCE0DA9E30A957DB9A6B462F4BC10B1406D1D0C6E69CC488790762F16F107DCF66FBA43876153FD49C13F69A07CE77E36D7961932B192BFFBD36B789ADCE88959B5879FF4A84D523D8356A1F03BDAA8B53A24039DDA5063023F255340D1A856D364E0082630623B518AD30803ADE986415C954C4BD7C8BAA17A864F36F767612515FE1C2119829213D4C8BEC185D81F30B2AF7F8528BCE3A492E3E99B5A1295F1136D12E101622174952FA60FF96FF75EF371B63956525EEBFDA9D203F9934BC823B2C4584F35839039C661DC912A0A392E5FC6A81412D807E1BAF56AA48D4265150AABA871A6D6870739214D0B209E5F64B06440FAED4867AB33935B12EC30886CE37E15B5E07D4062FACDB1D406B44266039B02AC5B18428767F96C48E7518304C5035FC4F436EF251FBF1C4C408CE639F222BA0F24E28F8D72E0A67244456DDD3D0301B45A6F0A339DFE572F sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83E63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83B0BCDF0B6B1DFE7BEAFD0ABF3A9733364DF7487CD3DD3E1801211F0D65CB72DE2EB644219CD8A9843D0A03B9655ECCE0DA9E30A957DB9A6B462F4BC10B1406D1D0C6E69CC488790762F16F107DCF66FBA43876153FD49C13F69A07CE77E36D7961932B192BFFBD36B789ADCE88959B5879FF4A84D523D8356A1F03BDAA8B53A24039DDA5063023F255340D1A856D364E0082630623B518AD30803ADE986415C954C4BD7C8BAA17A864F36F767612515FE1C2119829213D4C8BEC185D81F30B2AF7F8528BCE3A492E3E99B5A1295F1136D12E101622174952FA60FF96FF75EF371B63956525EEBFDA9D203F9934BC823B2C4584F35839039C661DC912A0A392E5FC6A81412D807E1BAF56AA48D4265150AABA871A6D6870739214D0B209E5F64B06440FAED4867AB33935B12EC30886CE37E15B5E07D4062FACDB1D406B44266039B02AC5B18428767F96C48E7518304C5035FC4F436EF251FBF1C4C408CE639F222BA0F24E28F8D72E0A67244456DDD3D0301B45A6F0A339DFE572F ct = BFAF1FBBC477132CE35A5EA50FE891A039D62F16FB8C388D5139547A22721473AA348DB790EE5B24D8E5EE8F7BC535005CA1C26475F407A323BCC6BB349E0CC27B03F1769D8A08DF48F5B5D4389CC42C4C06ED44BCC7096B59ACE0DCADB79FDC127FDEC2E071545072D559C0262626F6414B956C4F1567E954446896B5293DF91F7DF8B1339B8B882C01940F8A3F7C55296B574695C53A7DD3E192644EE91A81C3ACB65C65D7BC3856F14383C2FD2C2C233068404FDF251011D5AC0229F8A07FB9BDD9BBBC861E2DA38F0477864139C37D2308DDE1DE8423E767226707CC5FE72CBD44164A2EB46B1E1418BBDCBE3214B2B47107B26A29F2A73247305970F082036349E5B30169A5F8BACFBF54C56051BB73D3BD7C1C3C0501D58CF7FD27135592FB70B79A3CCC04252E6A601945F6AAF19239EA713F8260E5AE1FED463476A86DD33D18FEF1A94A16B75286AF54B4934B0D57FCFCE4E8A053769FB6BD01C0443DB52F0DAEE2F7A38630B245A99B0D445B2DB1698F6915B064034F93AFFE5C7F8C8647F23B05433C7E60C830F8BE077F3A33 ss = DF4D730A8B11B7332EDF0E3476537C15 count = 98 seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 pk = DE2856B4723258A97190E2B84633B573FD9B39E1DCB68DA025208B3250FDCEF6D42FA1A58BDC4CDE6423131DF793FEAA7D66A9CD0EB6D48765CE3D1A9FAD282BF1DBB7B74DD1A4469B0A9F73115107D0DA8A09078A29F81D715BF95115D33C16EFA857B54801CC99A64D5E1B40D65A3E8C7D5AAEEC9B1CFAEFC01158BF1E6485618B519EDBC680FA96B43ABA058392D7F7FDADAD49C0A1751F58CA0C3EBD2948DC47BF4C4AD7ED1D43720BB2816AE1B3E1A39435FBD5C07922E443F930F33375E6090B1246BB18F20B10EB882F658F0CD4A9D18435D7B632A9AB86807030F28B349093EEE0B2A5949BFFFDE709BC0817F78B570AADC5B6679DF4C4371AC5207F9261CB846171F477C79E222D770857E0AED2009389F2C3EDD0F582F3288E0DA9D915983938B04EF904FFFA3F3E94BD4759C7AADCA4C5DE16E03D18C535B4DD464032DBB3A85122F2E18CF53CD3D0897C315AFDE007FDFDBAE158D0B3B81A71684CA3EB3E20904E6EB931F51D2522F0D741FEFE46113B725B7320 sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21ECFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD35609DE2856B4723258A97190E2B84633B573FD9B39E1DCB68DA025208B3250FDCEF6D42FA1A58BDC4CDE6423131DF793FEAA7D66A9CD0EB6D48765CE3D1A9FAD282BF1DBB7B74DD1A4469B0A9F73115107D0DA8A09078A29F81D715BF95115D33C16EFA857B54801CC99A64D5E1B40D65A3E8C7D5AAEEC9B1CFAEFC01158BF1E6485618B519EDBC680FA96B43ABA058392D7F7FDADAD49C0A1751F58CA0C3EBD2948DC47BF4C4AD7ED1D43720BB2816AE1B3E1A39435FBD5C07922E443F930F33375E6090B1246BB18F20B10EB882F658F0CD4A9D18435D7B632A9AB86807030F28B349093EEE0B2A5949BFFFDE709BC0817F78B570AADC5B6679DF4C4371AC5207F9261CB846171F477C79E222D770857E0AED2009389F2C3EDD0F582F3288E0DA9D915983938B04EF904FFFA3F3E94BD4759C7AADCA4C5DE16E03D18C535B4DD464032DBB3A85122F2E18CF53CD3D0897C315AFDE007FDFDBAE158D0B3B81A71684CA3EB3E20904E6EB931F51D2522F0D741FEFE46113B725B7320 ct = 0A82BD0E9BE858268FD4D3115CA21C18E3165F358BA3707C879716A31EA982B48C4D263AF5072EBAC1217D0EDC2DB39EFF918F26A27ACD737689E3D189B515DCA30F8A87F0917358E92EC1DC0965C30AC36234589CB459017A3D4A2D7209F1A98E27D850C4C254128C6E534DAC504E3A2BF50CF622D0B8A766CA97449906841F6668E5FB8A5EECF8AB7DCC83450DCF672EB7729AD3A0949A4B41A6D3AC2FE2200E334887E6F233BA76E96BBDAD418D8D436F64E173616C1875A4485C2D87DF5D0B1369A75F708437041E1A564F7FA4A9CCFD0FB9D9C54A24F3DADE58B780E492C19EBD95FBE10F5D6D653F53E20061D675157BE787DB17C9CA403A1123200A242F690BAB5F483D69822B7095E2D3B6C0F476178E43CF7D849FDFFDC72A7A47D8E49A54AC566CD91C0A87FBEB03B9E40584D0375BE0D38FE9B76A149C7B1F4FD333488A05985F8205918759A4155F26FDBCE293370E2060EADDD0DD30D5409997561D30E3417C0F4EF54168C0D4F7C3B8314B9CFBB07744DEB7292E6D675B0281F69AF84A5BC932E6E284DB8316AEE384E0E7 ss = 06AA77743FD0AA114A1556E07703D7D7 count = 99 seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B pk = 6F09614D1FC5D9E28D415C5199D5FAA6AE43EAF4B343845013F8686E1E9307622E5DE10B33FAD352E39DAB1DEFD80CB4303B5A7313EA2975BA7ED2499C1E31BB5AEEB38D5D42DF335121A9E605C442A61813DD263B0CBC569531B6B528F2F5AC26EF0F4D527617F438DBCFAA2278A4453EEA82AEDFA34C04882D7F7DFB3F5BDEE600F836E745FECC7E29017039F3FBEDCA257885CB6ACB4F509C7575FBCE8113EDF43B35189E4EAA109359FB7504D2939D4FEE94716E574677B5CEF307A234E3B053A952805C18526D6F7C10CE4E81A8C2BF2C91A5BBB2F7336825B048F97EC989B0AFB5B3700AF3E7C187A67332E2A9D646ED2698779C336373FF1EED37A7AB93C38BEDED373599F8EE9920200AD9D7165E17640F5CAF72F3BCE13D3690CA0E9167015247464AAA855A7487CA2D8CB92962863D1D779FB05EF41B5F9B651E7C2900BA3CF648CDF449CDECA443A139ECBB910D82C5FDF5B33CF1BFCFA629B4874BABE33038B23C049E185C75389F92F0EB6E04FBBF4F396FFD06 sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77FAE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC016F09614D1FC5D9E28D415C5199D5FAA6AE43EAF4B343845013F8686E1E9307622E5DE10B33FAD352E39DAB1DEFD80CB4303B5A7313EA2975BA7ED2499C1E31BB5AEEB38D5D42DF335121A9E605C442A61813DD263B0CBC569531B6B528F2F5AC26EF0F4D527617F438DBCFAA2278A4453EEA82AEDFA34C04882D7F7DFB3F5BDEE600F836E745FECC7E29017039F3FBEDCA257885CB6ACB4F509C7575FBCE8113EDF43B35189E4EAA109359FB7504D2939D4FEE94716E574677B5CEF307A234E3B053A952805C18526D6F7C10CE4E81A8C2BF2C91A5BBB2F7336825B048F97EC989B0AFB5B3700AF3E7C187A67332E2A9D646ED2698779C336373FF1EED37A7AB93C38BEDED373599F8EE9920200AD9D7165E17640F5CAF72F3BCE13D3690CA0E9167015247464AAA855A7487CA2D8CB92962863D1D779FB05EF41B5F9B651E7C2900BA3CF648CDF449CDECA443A139ECBB910D82C5FDF5B33CF1BFCFA629B4874BABE33038B23C049E185C75389F92F0EB6E04FBBF4F396FFD06 ct = 64FE6121722672B67D0D46C164937F19029CAD597BC6A4820351D818E6AA4A76F480F9C26BEDC07111FB18129902AB2C47463FF34A0956D07E2B91B465C23CA86D6C50F8B7D057DA700C2619ACF1D97947CB288D26927B620D8D09673F195C08BFDEB261B39DF0BB4182DA8FA025BCEF386FD8A3E382EA36198AE2EBB102EEDF335FE54F2B426FC2C98B55C21A61C8D6C053EE7149825A8E21D4B282CF99DC5456579428DAD837CA1C9292B4FD8011FD3C6D9BD1FD3578F6FA3AF40123F8EA2293BB0728D3881F5AFC60150243D8E7C4E67CA1B208754B7963DE32356A33DD683D30133FEDF1B876A153EA08FD8139CD3B492969438771F122EBC93E8F19599EC7B41B8BE30268B2ABD00564A12E04B3E89B04921423DCE927F84C6B6C4BA0030F722A68662CFBF5CFD61CC6FE7815469FACCD9A210FFA8CBD6625C02F8684152C63C07DB242C40503168C173D3B912E93DEFB76F17E402CC0FC233DC2EDDA2A9432B0574BB71A90358FE3438811B889996D885B7B4E45E895078EF1B0E6D8B61CCA4E33888107C93ECFADBB5D7D973C9485 ss = CFFB43BF3A34E38EEA47DCF8A87851E8 golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/PQCkemKAT_644.rsp000066400000000000000000013453221365325520100251550ustar00rootroot00000000000000# SIKEp751 count = 0 seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 pk = 7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57 sk = 7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D8626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C5002017C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57 ct = 36302536F3B06833D5C3CFFF5A4A16107232C6BB7E6F304E5BEDE23A85DBF3B688C5F617B6F5676B98798C8C4B82F522C55E903351B1AD1DACB224210728C8A2ED2FB86EFA6833987435B1AD207B6B220418D3ED031D6F133577B7B97F3DC10BE721F049A23E2452EEA65A70C735A38EA796C1175E126CE74532C62EF55D817009A8B5B4AC898DB033A461C84FA9B0C87B90BB8909DC2597EDB150E843EA44407338882CD0846C50F268E37942B7EFB4E1D6D56CE443C27C939A9349B52E7F94FC5C08F36F6D5183F8EF6D2EA3CEDEF5AE5ECEFCD7F56D3B52DCFAE148EA3D32D31F4A5661644930DA4B13D86B404E20A4E2C484435BAE601AF297C77C33015E7979E8F5ACF71A4947D7FE7A9C6452EDD9EF2E26E5C7DD10BB37122670BF838E0D741961AED4E8375B06376F84AE46F4A92691CD9F2EC9FF4B2EC230C3CBDFEA2530973A0DDD399D195A768C931BDA6F66FC858CC6B06B3633119FFD641DC754EDB11F050E78F8727CD14E27324C89EEFBD0210A363C853FBDBA92226FC7BE186D0C4F9CE881DBC11914576CB34FEA1D9FC57CFD566F760F498C8E3BE50AC7B65420CF5E29E230CD42D7202A4AC55D5A684681CEDD37D1306C5AA9FBE5E7CF32269B644E0557C9AA67A0681D1045FA1B1FAECB6F2F01B9B84442144BEECEFEAC1397B57C6F368CC8297E0C5DBEC8685854E23935BE64F3D29855EB8253F560804536E16F219752BD9B9BB8E5D7002E7267CF0D187DF52FF38737E0730D4220DE26F2E492F3F9B31C21C154349DF4AA43B291ED6B5BDF4EE685E993A1D700C908C4DDF13E6D0EA2CC2FF6F62363EA8D9163C526A0 ss = F8D828CC5D615977C076CF6CC43A45A861217A4B0111C0C4 count = 1 seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F pk = AC6E29FF400C6DDC9664D5DB1EEECF79C05A1180B648E348862E6654B7C72B2A90ED83C9C01F6C3554DEE8E77F66CD90C5DDE53C632E40BCB3B8D5C58A6C66C67A1232737CBE403ED18B4E7151AF1E863FBA0CFB292062D5109C87E6774690C067AE4FD58792FA61D796802D09EA5055868B09ACB7FA0FFD89D565F4BBF0A5004A7B9B519CA1BAF57E49D6C3779D6A2DAB7134B12F9177E4DB1E625A36CE44A8A08B3C29155D9E756472055CD0421DA8A4ECBE020A603109C13666261CA4551C839790D68AEEA8B5D4DB209C837E0B1660B8DA8111899FD7B396FD1BDDA69E1BFCC097328579F597B0DA1226F93AEDCBE9ADE2B44FB2438E22D4FA4452C69AF0404FE971BC7C7453D28B5DDFD1E82DA5E6EE30FB62947E403551CE1F6EE99C356CEC8A4BA3BC4D742FC07D430A184E499C97AB32DD51732519985E94400334752DEDE6B34D77D5758B3439E019393CFEE20849FC239CDF079B99FFF21B338DE2657F174EA4EDF272F44E6B45A3FC4C8FFEB4AF4412D90C160BC23442FA08315E52A416EF72A05EC0AA3C197D53C7C46BAE403BD3BC0BD22427843F0930F59144D128E9E8324240139F804AA0C6B53BA94AABF13C6202BCF6F0D3F14426E53E784116EC16BB3E7A85137A8D635A064252707AC23ED2422549C480242C3DA583975AC429339519A94867020838E99F8BC7246F88B6389FA09C5C3B83FE1C44B6C3E6FF9620C6068884FA0D25CCAF3C8DDC1DAE83C3FF03F12181C966A6829485F0AAA0C5D60626E7084004EBF996DF42BB747C755D sk = D60B93492A1D8C1C7BA6FC0B733137F3406CEE8110A93F170E7A78658AF326D9003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF6723F327918FF97790AF87AD7C2F6030303AC6E29FF400C6DDC9664D5DB1EEECF79C05A1180B648E348862E6654B7C72B2A90ED83C9C01F6C3554DEE8E77F66CD90C5DDE53C632E40BCB3B8D5C58A6C66C67A1232737CBE403ED18B4E7151AF1E863FBA0CFB292062D5109C87E6774690C067AE4FD58792FA61D796802D09EA5055868B09ACB7FA0FFD89D565F4BBF0A5004A7B9B519CA1BAF57E49D6C3779D6A2DAB7134B12F9177E4DB1E625A36CE44A8A08B3C29155D9E756472055CD0421DA8A4ECBE020A603109C13666261CA4551C839790D68AEEA8B5D4DB209C837E0B1660B8DA8111899FD7B396FD1BDDA69E1BFCC097328579F597B0DA1226F93AEDCBE9ADE2B44FB2438E22D4FA4452C69AF0404FE971BC7C7453D28B5DDFD1E82DA5E6EE30FB62947E403551CE1F6EE99C356CEC8A4BA3BC4D742FC07D430A184E499C97AB32DD51732519985E94400334752DEDE6B34D77D5758B3439E019393CFEE20849FC239CDF079B99FFF21B338DE2657F174EA4EDF272F44E6B45A3FC4C8FFEB4AF4412D90C160BC23442FA08315E52A416EF72A05EC0AA3C197D53C7C46BAE403BD3BC0BD22427843F0930F59144D128E9E8324240139F804AA0C6B53BA94AABF13C6202BCF6F0D3F14426E53E784116EC16BB3E7A85137A8D635A064252707AC23ED2422549C480242C3DA583975AC429339519A94867020838E99F8BC7246F88B6389FA09C5C3B83FE1C44B6C3E6FF9620C6068884FA0D25CCAF3C8DDC1DAE83C3FF03F12181C966A6829485F0AAA0C5D60626E7084004EBF996DF42BB747C755D ct = 5D26E02F856531687416AF6091B67621D5EB23FB333A4747C210223D3F0704A59714416D3A469870EF9E4308338015D9492882425705C3CACE1EA61206654E0DFF951D1840D0993484AD35E33D350AFFCE66FB248DEDAE748E9ECD3BB32266075A9F8F3B4BC2A4C333BBA86A75E6918060C2A177542837F486A4909F3541348D5A53B3EA8C54C6538C1D3C2EAA0E00610E7E6F6A2A15C8DD1C8486482E64B9A75031561A7ED30B3FE0EE937C0D156124F05A9A86D847CE043F07996BF4505E8B09321403BB277DF82660C6095D9B1F18BC4D550702744A1B357DB980DD65F06E43464B1FCC31CF8C613C70D74CDBE10D8D435B0400B59A996D80B5EF97044023887B4432D79F0FF0B09AA4D402A94DB2162FD96E27B419425E4B520FCE1347DE9D7B272CFEC4FA4B4931E30672FBC4B737086082D55FCA3DB11F066110CA464F55919A696040195B0788364FD26D6B80D21EAE3E5EDFCFE467C83961DD8183E03A0ED2B11F9F0AB8000CA57AECAD0AA9EF02D20DB0B58614C7C7777A49FFADE9D112C95C7F7520821DC102A71FD3A67B2B8B96CDD5A41C05190E42082AF75F6B2D7DA32B724CC61DE53BF6ECF766E314AFD818D780556DE530C523154DD2AE4955028469160A12BC978AF13F0DEC9705C9BBE1938D62C75F533353A8C35ABA2AF43D21AA0D7AA88CA1FB1DC2EBF2EACE657EFC1747BCCAC43A7A940851FA80F21147BDD1B24F212F78B5DC9D4CD78CC21D774155DC2BC09BE65A2D335FCE08390A8E320BE675844B24B7C2D7F80FFE32883FAF48AE082F88A2A0A95E7C1CCD1C77D0CC62B569FC41C8502B154DBAC0DBA18E8844 ss = 70C15A90385D4C82B69BA40D21609F2C1A3E1002D1E65FC0 count = 2 seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 pk = 07C75180165FC1A44F09E22F2F17A7360953998E0E79ECA850E75972FD2424D7DE00EA5D4847EA22BB467ABE08831969C59B676A69A168103C42AD41B2FF058F413E84DA2393C918FE561B0E72FBC22AF14A3A1D173DA0B7D4D923E1FD24EB440FDF01D55958811F4A1A9F622CF720C4AA708D00A1D8ED1F65E948F2F89F714910C87DCF8A0CB2737A9760A5509596EF59B12CBC36F3752E797AD7ECEF35E93947F8EC4FD67218C4DD36651581B5015CA57E600A8484ED44DF9E0F607DACE55275D1707E42C20DBA8BD0CF06B0F1AF28C5D8EF303E31A4B54861A2881DF02446ACD8B84B6201CDED644C0976F45F6DAAB3BBBC40B5DA312288F952F873F362C9679DCCED9B643319240CAD5DE8E6E726A819E1CE3AEA427EC930DD878D96ACF6D37CF33A34B0601A0010497881C200C0288D5B7AE0AC6CD0BD2DF45464DAE862D941C726C70E6B9A309CEEB61E9454A325C02AF0A5DA2E6339468CC8A584E470A12BEC219B86DCB14313FBAECB9C2B2C79FF8E249B8C7B4A558760451507E095C211690909D3D335C8D376D190DEED632BE98E5B24C4BB43FD07D39296EC4E5E9429F4F564E6D18F212CBA119D8BEE6848E190FC8D9219DE1F6BA83AD10956B8586DB623BB4A5139E3E340024AAB7AB86564DFDD1B0968B03C24F2BC5DEB737D5D0F69E4F7FCC7E2EF6887D7EA8AE3CB410BA839A1873AAE9CA5556D6F4C6A8E8DADA11518EDADCD4DF7E63A3C05C4EDFCCBEA01A29EE7A9B9CA0B667726FAE70EC8B22358BDE935B6B1E6A4C72BC4A7E8FF6535 sk = 4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64C81CC7CC2F513345E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219ADEF716FB6E3CCBFD9ACEED34DB628D420107C75180165FC1A44F09E22F2F17A7360953998E0E79ECA850E75972FD2424D7DE00EA5D4847EA22BB467ABE08831969C59B676A69A168103C42AD41B2FF058F413E84DA2393C918FE561B0E72FBC22AF14A3A1D173DA0B7D4D923E1FD24EB440FDF01D55958811F4A1A9F622CF720C4AA708D00A1D8ED1F65E948F2F89F714910C87DCF8A0CB2737A9760A5509596EF59B12CBC36F3752E797AD7ECEF35E93947F8EC4FD67218C4DD36651581B5015CA57E600A8484ED44DF9E0F607DACE55275D1707E42C20DBA8BD0CF06B0F1AF28C5D8EF303E31A4B54861A2881DF02446ACD8B84B6201CDED644C0976F45F6DAAB3BBBC40B5DA312288F952F873F362C9679DCCED9B643319240CAD5DE8E6E726A819E1CE3AEA427EC930DD878D96ACF6D37CF33A34B0601A0010497881C200C0288D5B7AE0AC6CD0BD2DF45464DAE862D941C726C70E6B9A309CEEB61E9454A325C02AF0A5DA2E6339468CC8A584E470A12BEC219B86DCB14313FBAECB9C2B2C79FF8E249B8C7B4A558760451507E095C211690909D3D335C8D376D190DEED632BE98E5B24C4BB43FD07D39296EC4E5E9429F4F564E6D18F212CBA119D8BEE6848E190FC8D9219DE1F6BA83AD10956B8586DB623BB4A5139E3E340024AAB7AB86564DFDD1B0968B03C24F2BC5DEB737D5D0F69E4F7FCC7E2EF6887D7EA8AE3CB410BA839A1873AAE9CA5556D6F4C6A8E8DADA11518EDADCD4DF7E63A3C05C4EDFCCBEA01A29EE7A9B9CA0B667726FAE70EC8B22358BDE935B6B1E6A4C72BC4A7E8FF6535 ct = BD927B1C2AE047858330F98EB256497A38D034F2A857E7BEB989D9C8FC0B781BFB462065E600E14227C491828BCCAB0396C6C31CF957C3900A0CD97D220ADCC994D919EE3D7275DEC75F57917887D34F36467FFF4E7598281AEEC234E62F040730ACAFA2F8E58E7F34ED8B405FC0C0DB27E87D4D0553FA9468813937D6E1E7377643C07BACE463883B01A4E9638C3132205F6DFC1159273D2FDA8E8B5880FCDF550CEAF91C7EF7A4AD0D952B6F61707894AEE80EEF7853B3DB7A08442DCA4ED0D5770FE855B31B4DD4F0EFCA50657B6C5B45572B45CB35F6515EA679D44607E070092D708CD74B64734A97445F285A9FA9813F7A15E7A1E84199DCCE64B43B00FBAA5E78A8F6DE5F833D22235096375238D69E70080A14A4EA5FB0F3D5A13983CB4F80A02E15A2DF8F5B08CDDDD1F13A1EA1C856991A2B53984903901D88315E9BAAA1C02DF97FC9DC64B90D1E512CEAA58B522905135B996B7031BC06EBF63B23043204440738741C9DFAFAB90E86A0DB0020ABFAC5BC4ADCDF8FF286F659D573E7AE7FB28DBB2E7DB27E8BF71E85621C67B92BA3507441F9D8F9DC29C53D4E1174E4A671A9445EA847D8AEE3DDE54F8E09FBA1009FC61FDFC61593EE78774E315706CC78E05BA8073C1F0BDA215DED5F7128FBFD63264C45F998EDB51F28856C040DCA1FB1586FA87F76D3C466817972274E3CF6C002CEDABA12CCAB6CE2759D39524D8C865617F162236C50273AAE0910D21773C6F2FACF5598D62D67CBB862117497EEF3D1A41E698D53A97EADA4BE8E13069A573DDA9A3F48E2A44B6DEF678CE0CEC09F9755DC04A483EA78ECC26261CC62 ss = 3B62D33E7B4571484B09C67504F6B7291A7D1E31A9305258 count = 3 seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A pk = 4B2C2AA0D99F58946F80264383658668C3E90593D8FE39126B39709B4B084542E86375E9BC31ACC9AF691BCBD1ABBE8168A07863E9EB1E9808A6E5C26B052BF53767B915EA855CE8B8A2D08E115071AB29A5B45B42B065711C3A43790227071686F1FD9FC0993535E800B96B7436A0C285D34863D2E91C497CAEF072F29C123F7D9450C77989DA42FC1945DE3C4C4B77F5489D959DADD655D7507017A8CE63FAEBDB4F0B7B9A8EABBFAA7E59474E759C2F7408646891B5AB833BC66424DFB4C9B6A4C52B5F199678B4D99F0E317A10AB773DBE63751F407829E39607B98CCA7E08B5865F53784B7FD674160C2462A8871834279F6F067289A19E686CD28E54AA7304F1FA4E4DAF81FA344EBAE440D0B4132E4086000917745A2ADEFBB07CD294F2879F028A625A0B8B9D9B6DD6749324522B9BA76BF0A759FD43F37D26F37925C73798A0D70584746A924B481B5A3DE88C28DEC74AC42FBD0F39F44AE3AAF0794AC62AA18224B2D5C8971467841539124339AC197685EC29A0FE674A5CAD7FE394044350FBA836F9585694B06C70BBAE4BB727BBE2DC07720055E66ACAC603A5D63D9B742A1841EF846F400D32A2416AB3CA514D432A3629E6C578CAF7E8D09CB0B67BB0CA02547A99CFEE0D68D600B0387581A16A14FE5192047B3D34AB3D321C1F4DA79385AD6F01B2000F75EE3EDC89777DAF28FBDD0053EC3B5FB5388FC60D9A1BA0F02D3E10BE25650F3BA08E5773D573A48D651F8DCB0660B3369E7E5EC03D21DC31C8B93BDF83DEBA78BFF04E18385632 sk = 050D58F9F757EDC1E8180E3808B806F5BBB3586DB3470B069826D1BB9A4EFC2CDE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF60FCA764BCC227C19F847822FD8FDF36034B2C2AA0D99F58946F80264383658668C3E90593D8FE39126B39709B4B084542E86375E9BC31ACC9AF691BCBD1ABBE8168A07863E9EB1E9808A6E5C26B052BF53767B915EA855CE8B8A2D08E115071AB29A5B45B42B065711C3A43790227071686F1FD9FC0993535E800B96B7436A0C285D34863D2E91C497CAEF072F29C123F7D9450C77989DA42FC1945DE3C4C4B77F5489D959DADD655D7507017A8CE63FAEBDB4F0B7B9A8EABBFAA7E59474E759C2F7408646891B5AB833BC66424DFB4C9B6A4C52B5F199678B4D99F0E317A10AB773DBE63751F407829E39607B98CCA7E08B5865F53784B7FD674160C2462A8871834279F6F067289A19E686CD28E54AA7304F1FA4E4DAF81FA344EBAE440D0B4132E4086000917745A2ADEFBB07CD294F2879F028A625A0B8B9D9B6DD6749324522B9BA76BF0A759FD43F37D26F37925C73798A0D70584746A924B481B5A3DE88C28DEC74AC42FBD0F39F44AE3AAF0794AC62AA18224B2D5C8971467841539124339AC197685EC29A0FE674A5CAD7FE394044350FBA836F9585694B06C70BBAE4BB727BBE2DC07720055E66ACAC603A5D63D9B742A1841EF846F400D32A2416AB3CA514D432A3629E6C578CAF7E8D09CB0B67BB0CA02547A99CFEE0D68D600B0387581A16A14FE5192047B3D34AB3D321C1F4DA79385AD6F01B2000F75EE3EDC89777DAF28FBDD0053EC3B5FB5388FC60D9A1BA0F02D3E10BE25650F3BA08E5773D573A48D651F8DCB0660B3369E7E5EC03D21DC31C8B93BDF83DEBA78BFF04E18385632 ct = 7CF6FE51A29C58A61F602648B9D3D3DF1A4B02D5579C7AA9BE4DDA129282F4CD6BC058781290A4FABD9C5133AE12C95FEE731E8C0561CDC5FCA9645ADC33E9FE27A87E13300208E123FABC6AFA7268B795F1835A75DE838C2F53AD0F496DA553276A539A35B20B1375BC1B7653C933C8F4141A1ABADC6D14424F446D4EE42CB2FCD7B6EE6C54C19ECD2D86DE72A69A2262DCEEFA6E529E3886CF577CA257D3471EC4F22366090BF2086D90CD3B61463D69BE40CA553851A78C457039F8253A1F3AD020CCE779E5A338CFDF84AEC0AA54D08BF942F99EA80D9F7D6EF4CF346FDE0469939261BC22366DC6D87D870BD08B5040B251F084DACD0F576940AB0D819C823435892163CAA70D641182196B8B520EB7AEF55CD777722B412B33DCD391E990E0B4B797C5BB363C2A354D88DEE067C064431C7EF23A56BC1A4135EE74EA6C0A8F2C812DBD5966DD13C83FD9C912B5FB262ABF91542D53CECBB0B1A2EC21C2E43840790FF1388614A9A070AAC0893DED85E3D9C966543E6B2EAB3B954B26C42DA79EBDE88A09C52E3252AFEC4829809F664ACCD3C2EB25B243ABB71A07FC02741177E76D50D221FABAC4B15F61B60C22B98474B5D443DFAB155E2FC7BBCEF7FB0FFF277F69CDB667DDF299A94296D217D02D9A0360F723336E8BFFBAF0435DDF55B30C599CCD8B14EA034BD2255B51C08C3B18C1EA2695E13FA028A2E7F9AC4790DDDE0283EFB21BC077869B77BC18AE4441FC8AD89A1F012B0BAD1B379D0968651F373AB1B646BC70F0FAED4358F625B2C236614B27D3EDF5B82EA7AF3AA0AAC6B7D16850AABC5B25B23DA749AF32C25930AC ss = 2167B2E394F095D7B2B94CA405DA04F6E0B3DEF864D90D04 count = 4 seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 pk = C5A9C23A3C86F6B79975F2009B7BA6CD248D3244784056BFEB88D4328DD28801126E41188823BA401EF37BC4CC53024AC1FFE348C9D568E054982317C1583CD14565866F49C1A3F7250062DBE374B59D82284CD529304FDF808BDF8890656AA3621E272DD5F707A4A68A56EFC65143F6066D0238F2BEA89D7019FA383BF5508303A2AC8D23ACAB998D67F51C438FDD88654BD1A2884EC50AE61B4C51807AD9BB20A1F3DF3803EC3D96FD63EAAADC4A542AC3490ABA2070FE31E2CA58A8CEEFEB557340321180AB46EDB5AA15CEF5D1BC1558B17BB634A61D209C21BD1C84BB563A9419593C5E8547F19A5E93733CF7AAA422339AD8EE7D260B58D0DD17824229C25AD3CEBA540D5885F0F0392F189764ABB56734327FF9E44D13AE856AE049B74590192C40BC0DCA7A2F13149BAA07CFA6AD2A42119619E5C5D2C8DFA6DD14180A8276DCCEF5F0F01218BC16154A3F14E7DF3CD525B0086BC507ED5E6CC273FFB21B2C1E29FDEC6974B5619284D80622C81520A9F18CAF2B29ED4B05CA45740AE2333ECDE6630BAD22A38851FD90473BB846B88BCC59303B13CC97A813ABA9C7FD07798BA49AC4F7A217B13A832AC6F2628D8CCB3AAD9E9E2FE2FA5E02DCBE25A26340EE3312FA0A003F00EDD3255766A468A2A6596B33079A303FCA5F1E84EFE7043E0E6A7D153469D394064CDFC35B5507136C33D1B68DC2D11513721ADA02849845B0C68BA613113901CD4DECFED2AB774C168AB17191BE8DC209B87DF38DB8E8915545E2057B4E6DD5EF4C4AF843FE9D7E32 sk = 66B79B844E0C2ADAD694E0478661AC46FE6B6001F6A71FF8E2F034B1FD8833D3BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813854019994AA948403F5C1BC1B3BC92E6C01C5A9C23A3C86F6B79975F2009B7BA6CD248D3244784056BFEB88D4328DD28801126E41188823BA401EF37BC4CC53024AC1FFE348C9D568E054982317C1583CD14565866F49C1A3F7250062DBE374B59D82284CD529304FDF808BDF8890656AA3621E272DD5F707A4A68A56EFC65143F6066D0238F2BEA89D7019FA383BF5508303A2AC8D23ACAB998D67F51C438FDD88654BD1A2884EC50AE61B4C51807AD9BB20A1F3DF3803EC3D96FD63EAAADC4A542AC3490ABA2070FE31E2CA58A8CEEFEB557340321180AB46EDB5AA15CEF5D1BC1558B17BB634A61D209C21BD1C84BB563A9419593C5E8547F19A5E93733CF7AAA422339AD8EE7D260B58D0DD17824229C25AD3CEBA540D5885F0F0392F189764ABB56734327FF9E44D13AE856AE049B74590192C40BC0DCA7A2F13149BAA07CFA6AD2A42119619E5C5D2C8DFA6DD14180A8276DCCEF5F0F01218BC16154A3F14E7DF3CD525B0086BC507ED5E6CC273FFB21B2C1E29FDEC6974B5619284D80622C81520A9F18CAF2B29ED4B05CA45740AE2333ECDE6630BAD22A38851FD90473BB846B88BCC59303B13CC97A813ABA9C7FD07798BA49AC4F7A217B13A832AC6F2628D8CCB3AAD9E9E2FE2FA5E02DCBE25A26340EE3312FA0A003F00EDD3255766A468A2A6596B33079A303FCA5F1E84EFE7043E0E6A7D153469D394064CDFC35B5507136C33D1B68DC2D11513721ADA02849845B0C68BA613113901CD4DECFED2AB774C168AB17191BE8DC209B87DF38DB8E8915545E2057B4E6DD5EF4C4AF843FE9D7E32 ct = E0BF4BFBBDE0A02A12A82F5F78EA9C468041E79A2117ECA1F8F9382BBD8C0C55517E7A985885B3ADD3B147EEBF77A6FE1AE81A96EEAC5F9BA2B7DAD58D2DBC8D194B01437FD95FE3838CFE88C84FD7969162C892DB6B982639AEBE2F54693F7393058FFFB41FE0EA33E8559C3A570100A41912228746D6B0C93261B685539251CD6FFF8D5F19041D7F4592AFDC6C5D251D94C622E2D2AABF506482D9AD4D731B50A5987B5D505B3340E22D38B673279DA01BCE801651542836375B650948BBC5853C9ED61D20A8A5027875A38AE46522E648F01B67A91F0ECFA9732DE667B547781A810B47E7FF1CD367E1FD27830C0F345C997CD030E80368542248264988C25D8B7B7F3DAD0D2202B4387C211D8AE79C77513BBA72F84C59571C8AC8335947A5F57918A0511171BE7682B233FFD1FB8797699181FA77325A5A139C891F290F250C197FF7994BB8603195780AB1311C535A9BBC5D9290AF768B67C3F04D9AAF75BAA889A6DFD54A5F8092F02B426A84F354ADB7DE66EA6B08C64668F86A7921ED95A4A23D9662C239D307484892CF633E54E951B731ECDA2EF17DAAD5C4B0BFDF82BDD7015A3A5500585D1C49CAE21BA1E30CEE6D3402F2EBBBAFBDB0053FA84CE9DF1330D5711915D57C04C20379248828A714953FBF72BB161F29D942D7BDDD03FBE242BFEC583752D13B520785AC1625988FC6930A31D714B78D5F7DA3AB0BDD1656D01C700EEAF0DDE2609DD2E7DDD1E526D534AEAB6E18ED577052CA7FBC117209A4B32DFB2735474CBFF6A87885C312012E9A2A7F2E0781B74595365A11243F62A8AA50834AD701A03DD636BB7502EFAB ss = 4899938248FFAAA765012343720D0C4088846053EB5EC438 count = 5 seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA pk = FBFF32FBD52BE1A79DAF6FD0771D5D915C74E146B84B5F218035866EE37ED8A6D6BC623D1BC1B786FC9C87EC77F78A278B91EEE329E21672E3FAD834644A17CADD905DCC6B84C71577DA49D2603A4E3F2B5BF8DCE5D9E0D2F5D34C9AA85F0ECEF429ECE5899E585F8FC255C8C18865D5617E66D73D5BB335129958C5F57EE3938823A973E90E37961033F7889FDB6266A6F674D4EC1CCC320B20FB9202509E292453911676338872CDBCE22D04A6B4DDC63160F6D40B8FC816E80344F12C7A14624BDCE9697F9506B3F3DE3A8EAC271C2802E0095BE987D76C9FF1367147434D3CA2C6983B10CC16DE898E2AA1A1D79F3BB0F4E73F887334F5C7F911976F2B3E292514E873A8237C714BC14FE02D170CC70D39C35002BB68460348EE6FA0A138EF90226CBB6B775A27578CD40C55754622B57059E59486625D4FF9EFB8CADD0B2D074E305A8BB1DF93C557F3367968BD91E4CDC64E9E6E6E61B9DA607A44EC2076AB0D544F522306E6EF63E10567F310582A75AA6872462D0ED8750E1F795B7925E6628F5BA936AF428D835D7E8E665998DAEEAEEF9FF8A8D6358B0D08501792BE24BA21FEC8217360A5C0E2904DCF416C3799BC9CE4FBAEC2B653BD06379E42DD9BD2C121C13418355500EBDE9149145859C8FFAA3DA649197623767F85EB9463E336A7D4263189286529C37582B45DA2313DFDB664CC4A36A9A6512BAD5CF62DC9D5BBB184DF1F9AA0F70F9712679ADA8A0EAC68EA6DB296B665B893E40DCB820792850A531CC64A81D0F452EA3D3794B2B30B sk = 7EC408F52C9AA723D0C41D9987682A5F4CE6C9DA7CD0215AF60BBAF5484AB353A08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823082575E0CDE12B4B3A846F639EB82204901FBFF32FBD52BE1A79DAF6FD0771D5D915C74E146B84B5F218035866EE37ED8A6D6BC623D1BC1B786FC9C87EC77F78A278B91EEE329E21672E3FAD834644A17CADD905DCC6B84C71577DA49D2603A4E3F2B5BF8DCE5D9E0D2F5D34C9AA85F0ECEF429ECE5899E585F8FC255C8C18865D5617E66D73D5BB335129958C5F57EE3938823A973E90E37961033F7889FDB6266A6F674D4EC1CCC320B20FB9202509E292453911676338872CDBCE22D04A6B4DDC63160F6D40B8FC816E80344F12C7A14624BDCE9697F9506B3F3DE3A8EAC271C2802E0095BE987D76C9FF1367147434D3CA2C6983B10CC16DE898E2AA1A1D79F3BB0F4E73F887334F5C7F911976F2B3E292514E873A8237C714BC14FE02D170CC70D39C35002BB68460348EE6FA0A138EF90226CBB6B775A27578CD40C55754622B57059E59486625D4FF9EFB8CADD0B2D074E305A8BB1DF93C557F3367968BD91E4CDC64E9E6E6E61B9DA607A44EC2076AB0D544F522306E6EF63E10567F310582A75AA6872462D0ED8750E1F795B7925E6628F5BA936AF428D835D7E8E665998DAEEAEEF9FF8A8D6358B0D08501792BE24BA21FEC8217360A5C0E2904DCF416C3799BC9CE4FBAEC2B653BD06379E42DD9BD2C121C13418355500EBDE9149145859C8FFAA3DA649197623767F85EB9463E336A7D4263189286529C37582B45DA2313DFDB664CC4A36A9A6512BAD5CF62DC9D5BBB184DF1F9AA0F70F9712679ADA8A0EAC68EA6DB296B665B893E40DCB820792850A531CC64A81D0F452EA3D3794B2B30B ct = A709B6CEB09E231BA1634399171C78653D53FF7DF5BCEDA59F5428D1890B6F9878542771EED3EE1BC5EF0A2030B0FCF092336D52B52E94ABC96F9A3726BF7306483A8F4657E79238A3FD82E3FAAFEF6981C760ACEC51B6DC6AD4E5E8F62EB9D0C49FD9C65FD2F25E79756453082028F41542BC2FA473C7C9F2938DFA151DF5729B999E8C2D1A91FEE5AC9C5DF99EB3EB60176AAF96A7EBFDE8C223987BB699995994C962153AD3489E6AF98574DFE8E9BFFCAE4997718EB5FB3C884FE9087C71FC54809B3BB34D5449F6060CFF2165FF5A9DCCEFA56B9AE51470328FF2935EB24074AF75E3ABC801BF71111BFF91BB21BF9797953B8CF98C992367CF5FDC4F6CFCE1580CBC2B4257DFD4603FE3679B0FA4989703DE51680BDE3334C9B3E8E3FB388D7A10426F2117B08B0E8683D3E9A5FCC3060FA748D2670E2F108980C27CCDBF5688141AB32F3BDB315CA68E5A57A884F31BE6890154A2A18860B230BB7A5EDE5605D152F529664A9E47269B1B4842E24117DEC68DCE012C698C652F26EC51B9D1914DD31C5D0E68D23E7FEE8859B11F35C04C746C7A93841B07D9EBEADA15EB2EC90054535BDED9C5B7A402E27DCBEBC8535D87D51F01DFE599984F26C9DF3D3331964D45CBCF59566D2BF80AB8C8EAF1FED13420C550FD7AD9FC3A9044FF23E821A0B4BAC82205ADE0826E844D21E32744C1F272D0D93A880B233CE870A8A592E4904FBAF42D6512DBCC41CD87D90DA84996C1833660AFD298DD01A8800F634C5EA5EFCF0CDA7D8EEFF1CA6360D0C45CF61B25A4964327275E84A4BAE274CF8ED2AA65D4EFCF3A8C95592DDABFB47C795957 ss = CAAD9C4C75D9E7E6AC744D70B5F8A5BBC8D911E4BCBFEA03 count = 6 seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 pk = F847D83D5BA91C37185ABA06751309B1C7C3FBC3C0A6D08E92DDB83310166D81B104F4C9552283E8CF6AE3F6828C5A9CA260F915A55BFACE5590E019D81855D1888F500F562C84903B7430347C5A7147BFE107C2179996D918538361C9624E82F95CC6F985099C10A71BC4B547666749CBC16BCD1857B1513FF3FF4B54A7D2A7B7BEF57755B62B23280330744BEEC0D8738968FF066BE1C9144038FB10A226B43C8C2E3E2AB36C4B8D9076F8BE975151DB7E9E8760E9676FEEBF7A17A882F0FA9DF02E0AAA3AE9F66346B4DC73FF037B055BD32D5434017D11A9EC0839776154EFF5E3F85E1F77B7E727139ECC8E2D12C88722CEDF7F46EBAA62233044917AA64AC1E4E9ACA850895AEE22FB8A77E00D3BF8FA444E29735E332CE7BC544963478352D2EA5A4D2B1B4C2BC78A56D72A6AA5B07F2241EBE9B0A2606F75D4B8C6F746E0A0A5DEAB8136A70E5635E4FA8BCAB08C7F6548AB553592ED2FCEA8A7950AA2F10CD501AFA71B546591807BA6973A5DDB6FAAA269F837528C065B2AC9EC9535CAA4BF55579B9A8A2067A86ACE05152BD90EDC19E5E062B659011A37760ADAEEEA05935A94B869F9F7F99ACD73BED6FA345B94E69F4566996702B71FA502070FA656C98B2E4BA4F7A4609D3D2199B46A01B5760156ECDEE4703A0E4A0EEDE096CD1ADF2F73F89CC33CA67F8C5C88C92AC0575D49A33FEBA00C66AE0E3372B5A5E52CBA4CFDE654878E512E16FC7DB7A467A6EE5ABEC984D98C1E87FB2D239AA3F1B99B62BA57D9E811B72E578A087ED9C51D1F sk = C121915BFEF6ABDFC177DAE2F5A24218F9ABDA2559AFC6741B08E0E61AB433EB84EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B9633D9228485C117A4D4C78E14F0C54803F847D83D5BA91C37185ABA06751309B1C7C3FBC3C0A6D08E92DDB83310166D81B104F4C9552283E8CF6AE3F6828C5A9CA260F915A55BFACE5590E019D81855D1888F500F562C84903B7430347C5A7147BFE107C2179996D918538361C9624E82F95CC6F985099C10A71BC4B547666749CBC16BCD1857B1513FF3FF4B54A7D2A7B7BEF57755B62B23280330744BEEC0D8738968FF066BE1C9144038FB10A226B43C8C2E3E2AB36C4B8D9076F8BE975151DB7E9E8760E9676FEEBF7A17A882F0FA9DF02E0AAA3AE9F66346B4DC73FF037B055BD32D5434017D11A9EC0839776154EFF5E3F85E1F77B7E727139ECC8E2D12C88722CEDF7F46EBAA62233044917AA64AC1E4E9ACA850895AEE22FB8A77E00D3BF8FA444E29735E332CE7BC544963478352D2EA5A4D2B1B4C2BC78A56D72A6AA5B07F2241EBE9B0A2606F75D4B8C6F746E0A0A5DEAB8136A70E5635E4FA8BCAB08C7F6548AB553592ED2FCEA8A7950AA2F10CD501AFA71B546591807BA6973A5DDB6FAAA269F837528C065B2AC9EC9535CAA4BF55579B9A8A2067A86ACE05152BD90EDC19E5E062B659011A37760ADAEEEA05935A94B869F9F7F99ACD73BED6FA345B94E69F4566996702B71FA502070FA656C98B2E4BA4F7A4609D3D2199B46A01B5760156ECDEE4703A0E4A0EEDE096CD1ADF2F73F89CC33CA67F8C5C88C92AC0575D49A33FEBA00C66AE0E3372B5A5E52CBA4CFDE654878E512E16FC7DB7A467A6EE5ABEC984D98C1E87FB2D239AA3F1B99B62BA57D9E811B72E578A087ED9C51D1F ct = C957745386D94B2EEF113EB1EADD2EEE26E05565884C3F0E353A01DA4580999DFB10B81ECBE809084676EE51FF083248C1355300A89BD7F5D8B14A492A7D0442EBC0801A3150AB860C92F5A3A8378AD0632EEA1EA120E1ECEF2A0AFDF969381BFC8B0FF2E517BCFE7419A6BEDA94B7E83F4F65152EAD55B7E8171568973D75341C14333AC4A02456261A2350317654EB1538E0BBA1455019252E52F0CE1A2F60DC048912F723CBD75A3DC6FCE688BB7708F890C7695B2122D63FDA08F1173B4CF17C815A8BE814C49B7B9C3050B22217E7C611A759C03D40261460A73594A953B1B416490036EBD66A4DF77505E1A543CC9A8C2F84E3FF0FA544328090FA29DFE5DDAA0B5B47FA1BC845114429ED243529FC0B60887022DC8018B3A633894C99B498AC60D3FDD0DEE031521D87CC378CE12A1CADE104DBEEC5297360ED5F14CBC519DFAEF6296302EDDA582B93CD689C45037FE98BFA830114792CC447F789BEBE60CCC06FB3F2F773ED31DDE91503650903F6C54A77692E23A241099FBC833F70044A2EF3B7123321E212493E4AAF245369633FBEF0B5F7F8AB9FB7132DB16E0C20921861D843DB8A64B9F25E11D38063F4B6033FA74B42BC87A6733B6FA4B5B04BADA91F3524AD4FB67AD963905890A034A636775558F7EC0969B10820F4855FBF64FEEBE916461A0464F0275314604E0AC7937926D335D08A0A54639B464B39C5608424B138437F83BEC977A8153F90E1E661F1192E801D6B41AD2FB357DB3242E72E5A4553C7B0FBFC83E6FFDB4A9DDAF9623F787647F8F5A7AE65422458FFE022F4A13E6E67733005D3020F581022CF5F88 ss = A2EA4C2E8DC4B7548FDDCBE214DF944B0D1E9FB773D24F98 count = 7 seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB pk = 62D6677A1D67455E8C014C582B8C237B14B6C56E628A42017F33C2383B56A9FB3EA08576A6C82D21EBD968C85B9C9056E661128D886EE585B59FB3522ACF1A210A33B5BE3919971237C1E7A86161F500D0ACD7B6E21DE2AF533611D4D2576355DBA58AC14AB2474C77741827EE86EB04733A15DD5816532D46892197EEB70FDB9B8D244CAC0387B50CCE3C2343F1815B5C26260B27A5974D16AD629ABCA6B1874A6C3B448F7655A9F10A8B5A85F9605EA0D6551C1F7DC74FC06DDD386ED5395E57679D60A5F79C32B6BD135C892460F873BCE412A735B3C7E72D55D5BDB2134029A713ED57883BDF7E624AC595DBCFA8B792B40155F0F6DAD5BB729B13A5A75B424D55E98297F14A06B268CB172DFD54ACA53D508EB30CC4FF000A898A55CD25FC1542E613DCB0547DAC726F03F6247A5F44AED68E06BC00BDF045FCEDB7E57CCA2054B5DCA31A285764C3750BF75D427664FB7B18AE7707852CAF01FCA685007E221CDB055385FBC034695B639CCFAC239BC61FF93F3C34ED51EC4FF3C68A70331A0AB155EE3B0F704735EFB149DE759EC2647B2823E72B89451B3FEAE240CAE95D959EA1B9191A80019CFD62E55F6B7CE86B940C90479002AD876A438FBE78D48FDFEB09962E642862D2B1FA5F356AB0738CF68F295EF5C4E5E6CA1134738A293E4333CD8CB5DA8EE812FC86EB0F8BD9D769B30FBC247B31C1877D0BDC69FE8BBF4FDCEA8736B192F4836540FB880C5772A9F426F0B56A470864B5E2B11AFE5F71E2DEB93A54C9C3D39281B980D7CAC8F21009 sk = D86634ECF96CC2603761E284C0E36734CEDEC64E7FF486469E38539C71141C5A99DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD1209C584B1AC41A0F81C33043A9F815D8D0162D6677A1D67455E8C014C582B8C237B14B6C56E628A42017F33C2383B56A9FB3EA08576A6C82D21EBD968C85B9C9056E661128D886EE585B59FB3522ACF1A210A33B5BE3919971237C1E7A86161F500D0ACD7B6E21DE2AF533611D4D2576355DBA58AC14AB2474C77741827EE86EB04733A15DD5816532D46892197EEB70FDB9B8D244CAC0387B50CCE3C2343F1815B5C26260B27A5974D16AD629ABCA6B1874A6C3B448F7655A9F10A8B5A85F9605EA0D6551C1F7DC74FC06DDD386ED5395E57679D60A5F79C32B6BD135C892460F873BCE412A735B3C7E72D55D5BDB2134029A713ED57883BDF7E624AC595DBCFA8B792B40155F0F6DAD5BB729B13A5A75B424D55E98297F14A06B268CB172DFD54ACA53D508EB30CC4FF000A898A55CD25FC1542E613DCB0547DAC726F03F6247A5F44AED68E06BC00BDF045FCEDB7E57CCA2054B5DCA31A285764C3750BF75D427664FB7B18AE7707852CAF01FCA685007E221CDB055385FBC034695B639CCFAC239BC61FF93F3C34ED51EC4FF3C68A70331A0AB155EE3B0F704735EFB149DE759EC2647B2823E72B89451B3FEAE240CAE95D959EA1B9191A80019CFD62E55F6B7CE86B940C90479002AD876A438FBE78D48FDFEB09962E642862D2B1FA5F356AB0738CF68F295EF5C4E5E6CA1134738A293E4333CD8CB5DA8EE812FC86EB0F8BD9D769B30FBC247B31C1877D0BDC69FE8BBF4FDCEA8736B192F4836540FB880C5772A9F426F0B56A470864B5E2B11AFE5F71E2DEB93A54C9C3D39281B980D7CAC8F21009 ct = 334BAD6A78514EE684DDE43F290FB0440185E49D83923A619425DF140B95D929A23B86D8960A0775926C2A76BA420C9B45CC628745D70DD51BDF2EC4C1ACF1A66E260329D301C7BECBF390A5BF2CE288D53473E3F360557B1CE78C7BFD52024C80ED9E1CD5A3D6861EE339B1B84EA211BD41A5F2D0D389E0FB1B6EC96DCB3199CFE60CE1327E6ABA8FCB5041A499EA68347118B5F757DE52D1CFA9133E9C4071223D7BDB9D492435E159DB812235513D15115D11A9CD107E6AC19D239B3511DA239926292C1FF5AB223F4C1E29BCD1E5C69CB4DEC91EAD10EA64D5F4EA71A9E5A28D87B7BF9F485A2D38B6DBD09CBECD2397D05FDDD0F391228C7E47B32AC82C38B74B6DD5FB0634C0A28E369D16A88364649CA6840354425D098065BE4B5E48EA128AB2299BBF7DEF6B981DE252F0E7CCA5995AFD5A1A055BB7794023AD032AFF9478F5A4A07AE83ECF473727D9B61EF1C438DB4EF3C019BA2539F315AAD30BBBAC4176F94F940DB9D2CD1777883BBDA3DD33D9185EC64CA8207F64B040627638EBFE803C609BF859CCB13EE461DB73617B82BE38141985C2D72F4D4102CDDEE42DEF24F95A5304644568803318168695DD4D898A8758B38DC2AAE2740D892A105D93E77E9F02865C23B76784EFC3F2D4AE56714E09B947916881B271A5416E930EF95DD4602A89C72ED6563C04499F1E368DC988E32A6FC88ACD1DE79E6D80EB7FC431AEC40A95AF1C3E11F71E9A5F1FB3F3CEDCE46C7FEF120D7389AFEBEAA98CCB503C82C49BC55F4C3994672506D28B1E61BACB902858B02D09D92402D85A9FC73123581F45BEAEA0CFD79362FC632C23F2 ss = 82B5164AB4D6E5BC7DEBA0390D9AC94F6150147371E83AE1 count = 8 seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 pk = F8230A69DD6FF2E0FB4FEF0C49BA42589BB10BF8B954DDBFD5176F16EF7B0034751D1B0ECA53716F61B0AF0C6760965F3E7CE712B4D108DE4A24C3F240F38A4744F4CC327E54C5184CE28A80116B30866A28F7489F57C0F09E41A4B83C59CCBCE3F071A0AC711F3F8BC83F0EC0B4DFD1411077C9B178D4751421C3BDB4521E9FC1441358F155E280EE76DDC197962F4352BF447978EBDAAA650CB8358EB0F97CD69C26DFB08D1B9AD5F843BFEF3A39DCFDA8322B369AEDDD2899033CE5FB4EA8F4642FF4045E960B17B23A2D9C20878FA148476D10F90B18182608DAD8C9D58D5AD0F50B4AB6DDCB9CD6E7ED3F75912A5E0006F5BF8961AA362CF1CD15E9785790CE24CA7CDB148B33B66BC5FEB637660E90F9C54CDDF3EB7745EF5E87C59039748A1A8912EF4E8DF080C1E39479BB04DF7188EFB8E101853F29E628FC2032A4F39D68A94954AF62F7F20E2E329486751B1963E72E711EAEA8310D4F1A117A3510EC38179BE52C82D2463DDED7FC1AE53511EB29667A1C40BE2AF484204B46A999C05F45A1308DCD4CCEDF7CC7265A623B2903E069B9AA9874856E7FABB20B11E1B19E4601ADEFE114CC33FF46B02B3A4F34AC2974CACA365C673C6D6FC67DA1A60F8F5117F99C22670C249ED9245101C98F0A9B686A431B6F344EA6A5BFF881E703B902502F9E53169BE63752EAF2AC4449E8ED5CC86258671329D74E64E689206F451DCC3778EB5FBF6219A5B8D63ACF8CDE0025D27CE496E0BAE99E52CEA8A2DDF0A585DEDC5129E23EEB3A5B9D4CEB8AE56E sk = 0610678FF4DC3128E1619F915DC192C220F8FAD94DA1943B90AAEC401683A492DA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A67710049BB97233D6B26DD19845A98D1BABD200F8230A69DD6FF2E0FB4FEF0C49BA42589BB10BF8B954DDBFD5176F16EF7B0034751D1B0ECA53716F61B0AF0C6760965F3E7CE712B4D108DE4A24C3F240F38A4744F4CC327E54C5184CE28A80116B30866A28F7489F57C0F09E41A4B83C59CCBCE3F071A0AC711F3F8BC83F0EC0B4DFD1411077C9B178D4751421C3BDB4521E9FC1441358F155E280EE76DDC197962F4352BF447978EBDAAA650CB8358EB0F97CD69C26DFB08D1B9AD5F843BFEF3A39DCFDA8322B369AEDDD2899033CE5FB4EA8F4642FF4045E960B17B23A2D9C20878FA148476D10F90B18182608DAD8C9D58D5AD0F50B4AB6DDCB9CD6E7ED3F75912A5E0006F5BF8961AA362CF1CD15E9785790CE24CA7CDB148B33B66BC5FEB637660E90F9C54CDDF3EB7745EF5E87C59039748A1A8912EF4E8DF080C1E39479BB04DF7188EFB8E101853F29E628FC2032A4F39D68A94954AF62F7F20E2E329486751B1963E72E711EAEA8310D4F1A117A3510EC38179BE52C82D2463DDED7FC1AE53511EB29667A1C40BE2AF484204B46A999C05F45A1308DCD4CCEDF7CC7265A623B2903E069B9AA9874856E7FABB20B11E1B19E4601ADEFE114CC33FF46B02B3A4F34AC2974CACA365C673C6D6FC67DA1A60F8F5117F99C22670C249ED9245101C98F0A9B686A431B6F344EA6A5BFF881E703B902502F9E53169BE63752EAF2AC4449E8ED5CC86258671329D74E64E689206F451DCC3778EB5FBF6219A5B8D63ACF8CDE0025D27CE496E0BAE99E52CEA8A2DDF0A585DEDC5129E23EEB3A5B9D4CEB8AE56E ct = 3FF09A1A538B9148CD8B94507F5380D70D64AE8FEECF9E09A20D28AA5A6A39CA9D9E435ABADC51EF94AD6A81DE31B7BCC43F0220348D86F7E4D29F68F46B8470E771326F67EB2764562E48C7701ADDD3714D3BC0CBAABF9DA30B7713963F2F58726A7D8487D9FC42D631096EC0517BD49FA2D4826263A82164DF3B72E11F6BBD59F1E90181F64D2C70343DB9CDBE7A26678B4B66308339F7B5E2E9DAF0D949C8B2DA33158470DD13B4331A641A8CE938CDFC0478CB87D7424F29352B3FFC30052D7C2F669DE702B110592804CF3311DBC4435CB80A9CBE0D123ABF8651F96CC0CE833910A416C67756983C6821D988992554F8506851126FA3664646BA257249CE23AE31BD787F6E84DCFDCB8F223C9757F12568A837B8E3010FFAF0731BF71A68264D203D3CF675184F499097C57E282EEF3B36A4F8C90CE3BD94C8B128D609FF3545732A417BCC5260D52C1E530F489B5A6B8AC58423F81656F111ED3A92399620BF97D299797F301B57C4AE7A9232C64378E9FC096D50078D4766E9FC72A474AF4A9E5D579F31F2DE88191D4F30D61C1706BBE12599771783E14094E72B203CD89CDF57BB5FE76F6356D7ED86055CA6CD02513C8AACF7C54C55F6B4E56ABCDDF569113E96D468CE39CD84BAC4733FBC6D8B09574EA39E6C61BEF8FAA355551672BA2D773E526B34525AE421461FC896232A8519EF499DBC4209C2F35CFF375085B9E0BEA86FCFE61B80C12A7135709AF20219654F511CDED71BC236462B2AFF2AC5E3EA9BCDC0D73B8FDAFECAA327D9B66040DEE0B39F52CB1F78EF7BCB13A567C1A60ECD9751DA23D855A61126281544791E ss = 9A500CA52CAF4EE788590A25C142968C0B3C1CE53463EC54 count = 9 seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 pk = D87235B65F09DF1D7FE1E3250E78AEB2DE11626C493E9C1748A50A3CDD40F2F4BC2030F509031E34DAF7E776927F1123C028A83A45C2E999D768FAFB1512A092B8B2F43D4CC04A2D358F659BD16272897318651A4BC835AA08AA725E153C8A3CE54F760DC4C4759AD30E08BC0E880245E5E0F6CBEB7C2A9EE1705BA442B564845AB83D769BD7CE4FF5A0AEA098A7ABB50E9D82856F137F733D638EEB4BCF0427EAE3DB6A4C8FFBDB13E68ED1D1022256CC1E4A25C0B4B670CEC0744AACF8AA6F4A29BD4C3FEF084D76550EEA4AE53DDA22D91A7E1A40A6F88B7ED77622590D0DBC22A2DA1AD6E9F11C7866BE084F376D096BA484F2B83A376AC49E8D38985F6B866FFDEA4A010B14600A2826EE7BF5FEEA25AD4BE39FC50EBF630188ECE9A4B024E6856B58A86B1A1922227937A94445B3F6C22656DBDE81CAD22F33DF50D678F9663D667CCA262A8EAAB9FC045754CAAA85B5F0BCD702C534B0A03D42163A7730A59C683F823C17216D0B7FF861332095CBF483BB29AF36DAFB9E784A548DC1EBA7816A4255E588039FEE28FDDE06521665E35DEB60544E8DED205320585F353CEEFE58CCF7679B40C61879756CF5E0C5B414BD12E40CDAA5BF8CFF77BEC1FE78823A879B94EBA402901F82DC91C3D60B43CF3C716C855A9DB8BBA52C5808A91A69C440D258F42D479CE7B8E280D51D5B425984197C7D36B04901F58C96E27BF157851D2E80BB31BBBC12278CAC72743F14E6FB43CD45332C224D2DA9C6936305BCEF851188464E1DC96F6CDC191175D565C42F sk = D322D56D8EF067BA1F24C92492B9C56DF3A6EF54A304ADC1B69913766A1CE69756047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E51B936CBCEE9FC343B70CA3795DD04C06202D87235B65F09DF1D7FE1E3250E78AEB2DE11626C493E9C1748A50A3CDD40F2F4BC2030F509031E34DAF7E776927F1123C028A83A45C2E999D768FAFB1512A092B8B2F43D4CC04A2D358F659BD16272897318651A4BC835AA08AA725E153C8A3CE54F760DC4C4759AD30E08BC0E880245E5E0F6CBEB7C2A9EE1705BA442B564845AB83D769BD7CE4FF5A0AEA098A7ABB50E9D82856F137F733D638EEB4BCF0427EAE3DB6A4C8FFBDB13E68ED1D1022256CC1E4A25C0B4B670CEC0744AACF8AA6F4A29BD4C3FEF084D76550EEA4AE53DDA22D91A7E1A40A6F88B7ED77622590D0DBC22A2DA1AD6E9F11C7866BE084F376D096BA484F2B83A376AC49E8D38985F6B866FFDEA4A010B14600A2826EE7BF5FEEA25AD4BE39FC50EBF630188ECE9A4B024E6856B58A86B1A1922227937A94445B3F6C22656DBDE81CAD22F33DF50D678F9663D667CCA262A8EAAB9FC045754CAAA85B5F0BCD702C534B0A03D42163A7730A59C683F823C17216D0B7FF861332095CBF483BB29AF36DAFB9E784A548DC1EBA7816A4255E588039FEE28FDDE06521665E35DEB60544E8DED205320585F353CEEFE58CCF7679B40C61879756CF5E0C5B414BD12E40CDAA5BF8CFF77BEC1FE78823A879B94EBA402901F82DC91C3D60B43CF3C716C855A9DB8BBA52C5808A91A69C440D258F42D479CE7B8E280D51D5B425984197C7D36B04901F58C96E27BF157851D2E80BB31BBBC12278CAC72743F14E6FB43CD45332C224D2DA9C6936305BCEF851188464E1DC96F6CDC191175D565C42F ct = C7304A9B2FA472FAD7F27F4BFAAA6A65B88F8F62AE249FCCAD8CE9FA98377A89283926C73348111A8CCD0F7F63C17041481AB486E7B27813A57EFF4E9071DF627C32E7D9E27531F17C257457486CEF6CC3F404765628069E1F50DC90E854AF18C8C6E400FAFE636D7D16760E69205BC2109693C2DE8A67E9371EE194C51F2B27F28505D605E0947ED80D57A078FE4C202DA5DADC5ED6A37188B9D774022F2D602BCA7E1B074A236B34F9D25329DC03A0B42C93241B861FE2E17F7C4A7D056394B9D92EA40FE4B2686A5A5E5170AD236F4F611CB3C28D24397CFD93EC778314ED97940924BCDF9A022A4C3D7CCCA4665792837E54BE700719C8B227727B013A4D865C0B6E99A0ED768749FA1A3666B862BC0B8F133A1B1A1A5B57F1D9AFF6EF12760B0C49443509E9DDE709F6F4113F554B7D8C4BB8587B94890AC05A616A3B30EAF7260E3DDF86ECC48C132922F7B7D02721A133491BDAD2CD9E34D3ED64F6FDB5226DA243FD97B26A5635E8B3405989D4318751FD44F81EFBA009E64B1F33967DD5446813181CC7605F862ACAD41CAB1626D8797979800B52F40C2A7E2CC697F46526EBEB06C764753E838B63E903C4A6300ECDCA4496D743B08ED6EE5F17A2DC235A05B9AEDE04B5FEC27E29FBCC1A2CD5FDC85846CD950477EA382BA11677325901BB02D5BB8425A8E325AA0B256D39A824B7BF2A395F05CDBC2058ABC90E57256355A236C96DED766F6808DD07AD0A836EEBBBE187ABFB2D136821ADDC49679DCAB6F81175F681B27AE49B180FE478A824626B751911BCE5E84C84803BE4DBC35F9F2118073782F8AD98E7F24B51DCD964E2 ss = 60D025E770B82EC0302116BABD027CA5E14B918BD774FAE9 count = 10 seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 pk = E082AF0B0372DE8A2D931D568F3CA1D0C687BFA19A579F041C39AABE31BDE33ECBDC4F6CF81EDBD7E901AE654CFEA296205A4500AEEBCE898663B4740A28AC721D072EEFC06038A8DC321C069B1B301FFF4DB18B3D48D085E06BBF4B3F37930973BB5DF3F5C92D68D8B7E35E20AF84C13EF7F3FD7A7FDE4314177AB1C25D48C714DCF0CF821796902325EE87DC5EFD215AD1F76578F51DD17997751BCF77412F2FAE51F9FAB376ADEC8A35D8A44EDB68EC6161C2A442819DB4536653011453B74F785F30C2CDA24BB22A4561E9C94F22145711CDC1E8ECD80C8AD1D9B64AEAD7FD19A981B62576130B503539997ECB13E12049B41AA4FF85E8E724825FF89FF6361BF80BC49E6CF68BA95590E23D5F08BD63E374CCC98D0B415ECCDF1DFA5327542B356B81603196FE54567355903C4FEA8758739005C01F615784B618A7EA4297B681021B68570F8F174142B6244EABFD2B32667530DD41ED616499E169C4EE9626E7C7535FFDB37EE0EA91AF835437086E4CCF317ABE42F81422B935FE2BD084EFB3C4E168E3AE4B14E4012A2F8A69F7921FC7DD86DD33F85B020FBEAB7CA5D0B5B7FD3054EF7DEBBBCB44ED6B4B9D3B7A065D8C2ACFA8E55198EE1CBF5883F1C29C298FC8481CB2EA68650ECD730AD90D81CF954C8AF8970A7C4A31B0D2F3A6370D74C93EFB4C28CE6E524A9AAE141D0AE2B179B6ED7658EEDECC620D0A20FC6D70D88F88854414B4B55C0DCC39CD41FEF4219C0BE3D0459FEBFCCE714C3BA2B522570FBAD67206E25A6889BAB2E2D7CD5001 sk = 2F1D8A3BEBB34540324B9485FDF3D5BE3B858F544ABC3FC641B5728CAFAB03BA8D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C97164436326466AD9341E61870A84C6A1C7679F01E082AF0B0372DE8A2D931D568F3CA1D0C687BFA19A579F041C39AABE31BDE33ECBDC4F6CF81EDBD7E901AE654CFEA296205A4500AEEBCE898663B4740A28AC721D072EEFC06038A8DC321C069B1B301FFF4DB18B3D48D085E06BBF4B3F37930973BB5DF3F5C92D68D8B7E35E20AF84C13EF7F3FD7A7FDE4314177AB1C25D48C714DCF0CF821796902325EE87DC5EFD215AD1F76578F51DD17997751BCF77412F2FAE51F9FAB376ADEC8A35D8A44EDB68EC6161C2A442819DB4536653011453B74F785F30C2CDA24BB22A4561E9C94F22145711CDC1E8ECD80C8AD1D9B64AEAD7FD19A981B62576130B503539997ECB13E12049B41AA4FF85E8E724825FF89FF6361BF80BC49E6CF68BA95590E23D5F08BD63E374CCC98D0B415ECCDF1DFA5327542B356B81603196FE54567355903C4FEA8758739005C01F615784B618A7EA4297B681021B68570F8F174142B6244EABFD2B32667530DD41ED616499E169C4EE9626E7C7535FFDB37EE0EA91AF835437086E4CCF317ABE42F81422B935FE2BD084EFB3C4E168E3AE4B14E4012A2F8A69F7921FC7DD86DD33F85B020FBEAB7CA5D0B5B7FD3054EF7DEBBBCB44ED6B4B9D3B7A065D8C2ACFA8E55198EE1CBF5883F1C29C298FC8481CB2EA68650ECD730AD90D81CF954C8AF8970A7C4A31B0D2F3A6370D74C93EFB4C28CE6E524A9AAE141D0AE2B179B6ED7658EEDECC620D0A20FC6D70D88F88854414B4B55C0DCC39CD41FEF4219C0BE3D0459FEBFCCE714C3BA2B522570FBAD67206E25A6889BAB2E2D7CD5001 ct = C55227B13C29AB38901AE6C8BD5DCD13303DF4E8F53329B2B1705E5C05294268C71A574FE1142FA8F2CDFC6AAB65F1BB8BE5E1FC136AF46F39853D74D229FC992904FA2A4623FD35B8B5EFDE9B64CB44EDF36D939FD0F11A09BC6BDFFF3841E182DB24A228870C0AB036E7729234B8AD40C8F740DEF95432CB7AA5B89361713390A782B139772699394B44CCFE7381B995BE24F1DBD6AEF76D85039025335EC1CA849C8057CCC85AF7E7AA04A218C391C47B35EABDFA4D39272DE61CEAFF344280E7E62CE867553AECFF3927EADEA0BD793BC6FA287DE89C1C24BB7A278076EC1D52FC4F007EEB364A053FC2F31BDF32114EA77EECB8C20CCF96BE6AFFD93AF046BFB00562008A3917089AAA2DC2401713444A0B7E65C871373784979AE9E93E7CB3309B3DCC33BB2478DC73B37FD2467C263761F3F2CC9B65AE55CAE7E2B33277D5D815CBE503549A67E86DE7614085236E83878D33B9D141ED1A827FEAA9773B34A65E01F96C3B1443B1A474983725D59D735A4621395305D320BC5454D9592A751371939C2C670CAAA9FEA9E072A96829066EA9E309FF469C17B438CD1F4E2A002D6F9098F468ECC80D99104A6E6349A60317DC5673B4BC230E6130756F15E6AEB7C96BEB8EB0A93AB9044640DBF4DDEA52C1602BEC93B7ECE209B76232818C31C74BC34A33C15BEFDC97436008A69C8E4D324E442FAAC990D75140B7B1A881C5432A74177642F0AD03FE869DBB989BBF6BCDBEE476274D9F59BABC6EC4CFD8BFA2FCBB19062D4F31A7F26ACAEEAB8235DC4EFE6B7F2EA08F6F850EAA3002E5E241707CFC1061E445579B010CF4C7F83EC92D ss = 80302FE9ECC35A96CA12DF74F475B59B4F477ACE9282F271 count = 11 seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC pk = 945847BFA4A6DBEFBCAFD6AF4D5652261B021EB788060CAE93D26FDD2259275366302A40B7CBBBA37D68CDAF57F27FE048D38175C653FA6C52A6F32587FDA2B0D5C55C4E814832AD26B24A9C5573F18422D695AC4ABBF9A8E9BB89A6D0422A7DC4F0C0802190FD4F0AEC55512BB985A790830F4242C3FA83F4E18060D7D9D9919875966B568B70487FAFFE17FD8E5AA9B28A9B27AD0A52CC10EE1C9E5D12DF04E5FD158D9139F45427D94E9983D067FEB1B7B59BA30109F94DA21D11151B4E7308785FB39F6E8E362C7248FC055718981757A63C975E4B47FB316585A719F6466C7C2043FEA9C32EDB2892DB965A28B91F563059DDB9E02F47DDDF446CD886CA32F190453974FD03AB91AC3A101DB81061E30BCB75138382C1439C73229380BA787E40F92383F7F547C706F8F02656038C0B2782D6F1EDCF14C96102AB90D99E3A7A3CB9CF4F871EF599E69F4B6E08B7E0F21406F6A430C5C188358B52E9EA3F2B4640E71DF580FCB0901894814E294CDD408BF98CF08314C8D82DFB5896438E36C663A69C4FF4F59CBDA619285772C0212C94DD0C2A95135A3EBA67DD8FFBB806E525209D6174A18ABCFAF638A1735DB10BFD29803B429413CC69511BC762B1546D8C143D0C0DF5EB2BD8F720F6CFD9936900242050FB50960786D5BA26F2182C34FF612E3AE2700BCC2F5EB5B9882825F712E8EACF76B69146FBB98F86C12E228308F7A4EEC111600034D4E32D66BDCC8CDC8A44080D2ED8353CA24FC75050BF2402C35F8EE9D35214731A140BA3C92FF83947 sk = 31BEDA3462627F601CBC56F3DDF4424E1529C04737EF0EF2AF6D7401F653B8A1812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D1E5D2331859E2A7B4F3F9858D9D97F7C703945847BFA4A6DBEFBCAFD6AF4D5652261B021EB788060CAE93D26FDD2259275366302A40B7CBBBA37D68CDAF57F27FE048D38175C653FA6C52A6F32587FDA2B0D5C55C4E814832AD26B24A9C5573F18422D695AC4ABBF9A8E9BB89A6D0422A7DC4F0C0802190FD4F0AEC55512BB985A790830F4242C3FA83F4E18060D7D9D9919875966B568B70487FAFFE17FD8E5AA9B28A9B27AD0A52CC10EE1C9E5D12DF04E5FD158D9139F45427D94E9983D067FEB1B7B59BA30109F94DA21D11151B4E7308785FB39F6E8E362C7248FC055718981757A63C975E4B47FB316585A719F6466C7C2043FEA9C32EDB2892DB965A28B91F563059DDB9E02F47DDDF446CD886CA32F190453974FD03AB91AC3A101DB81061E30BCB75138382C1439C73229380BA787E40F92383F7F547C706F8F02656038C0B2782D6F1EDCF14C96102AB90D99E3A7A3CB9CF4F871EF599E69F4B6E08B7E0F21406F6A430C5C188358B52E9EA3F2B4640E71DF580FCB0901894814E294CDD408BF98CF08314C8D82DFB5896438E36C663A69C4FF4F59CBDA619285772C0212C94DD0C2A95135A3EBA67DD8FFBB806E525209D6174A18ABCFAF638A1735DB10BFD29803B429413CC69511BC762B1546D8C143D0C0DF5EB2BD8F720F6CFD9936900242050FB50960786D5BA26F2182C34FF612E3AE2700BCC2F5EB5B9882825F712E8EACF76B69146FBB98F86C12E228308F7A4EEC111600034D4E32D66BDCC8CDC8A44080D2ED8353CA24FC75050BF2402C35F8EE9D35214731A140BA3C92FF83947 ct = 90DE7500AF510883F6B1E61AB02BFA0A48A557A0E1D880838C13EDA26F292FBF335FC248BF7846FC8BBEDFB01AA29875AD568498B9D47C2832AAC3C1AC6BEA9A1DB7CE8BF9802291E9D288FA0B583729AD1504BAD3E78528CB0A3606384FCA3B098B5482BFEC76D1B38C428F48384E5DB61843B0DFB681F2215B85C326DCCDD1F169632C24000401F9529CDFA95BAF55967823182268B14A7B55FD245E21990FBDB236CA1AC09F38F76826BBE0D907866D5CFEFC2AEF0C331A4981595923BC5CA6BC00C02DC0AAA193D4A6B1C1B3C71DBDF01D36311D20342CFA7DB31D880B85937E9F9606DADE7ECF822AAD6B21D4ECC06796AE0DC2B6B963BDBEF75B1BA7DD06ED04E53B2C36CCF376EEB3BBADC955F8A19B591A7F312F7B611E656A25EE0DF700BE9069CC51F567EBDA826FE8884D2FCDF15673023A5D0D0B105A7B94A40A192D212D97B5D308516A20DBAC0D0E9AB37417FBE71EAE90D58B69D7BA65218721525E6F785B37BA6FD624691834608C6AD0D0F9476DD017FCA478E84092597C58B91E83C401A869DFED9A000979CED96D2AC251D35017FEDFE3B1C834359E544D57971BD8F6BD999546F262E1D2C7BB0A0376DEADB4266D3472C106E20E02DE42A4C7760A9CA97E64B334E7F43A2FA86544FE68D408F4338903E824358601021592969545302A58652108C6A27E59F2842C7D3E679563588A1A27B64A35915CF856D04E78CEEACED2EDD0DA84C53F54FF51484D97AF33710AADB9C1041DC28D815B9A0935EF1495DB89E83C54DA7009D172DC463EF5E5FCF20A214EB53A025163FA00C7BAD1E8A5538A16F78E15EF040B10A1FE ss = 537920527EE02BDDFBF995FFEAD6CADC65C7FE562FE21B54 count = 12 seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F pk = F78D6575382D1F35F600853D6D02A2B8EE1BBD1F5D77469E134F2A88F8BC338383B49C150B8E55A4AC9D946A104698316159DDB08071308BACD28DDC46F09DFBC2FD7D2CBBD18FD211ED4439ACF1419A6612EB409C11AD305816562D2520895F5ECA57A20F0B083C918E9002A2668493F0BD98D04FA9640C66FD2EA37AE7CF7F2BF41650F9926077210535DDC797BD9B84591AA08775225BBA3E971FE74028E5A5E0F71E5C65643263164BFCEA0003D9980D8E1397B02514BBCF9E59875A546874FA3A70192E08F33AA40A71C44431040103A23C9087DA67D49F599A9B4DE675D54ED789E425E9AC0AFA3D0826075AE8722E3E936ABA7E8979343B29314DF10020127ECBDAC9503E397A3BC4490CDEF997693304F61DEB364F510720B7595D727CED5525029851B2DC7E74B062AE89F00369E32165CE06C2FC58FA69BA0A58B04DF0F926B435198E05B5EB7953A8D9AE113123E4DACF6F55273281811F5D3DAD867567E4B89C983973D21BC4642D137573C44E90E64D104F257395971550C6D8A6CCF8489B22A186B59177F3333F09BF1B2D03B3C8333874C968ABAFF4F77F74ADAAEC13FD882FBB8A6B590630BEBFBAF3FCB8D1E9CE48B72A0F6C6C505EFE52D14CF606EDB2CCCB38EA66EAA3EA4304A42C4E0A2263D5653181F787B02C4B95D5EA9858F27560A02FF91CB1502C4E8CF04E8AC2CBA7C8869C80F890A4D837772CA2B45CABE9A0635AB56357EDF1DF4B6B2890B64896C60BA9DCC110D500CD09164F533EBB8723F678C354042D194C706B1B0E07 sk = CBDFF028766D558AF4466EF14043A1A9CF765F7748C63CC09DCEB59AB39A4E4D8E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A4C555A3DEF09A64C09E9EB370293203E03F78D6575382D1F35F600853D6D02A2B8EE1BBD1F5D77469E134F2A88F8BC338383B49C150B8E55A4AC9D946A104698316159DDB08071308BACD28DDC46F09DFBC2FD7D2CBBD18FD211ED4439ACF1419A6612EB409C11AD305816562D2520895F5ECA57A20F0B083C918E9002A2668493F0BD98D04FA9640C66FD2EA37AE7CF7F2BF41650F9926077210535DDC797BD9B84591AA08775225BBA3E971FE74028E5A5E0F71E5C65643263164BFCEA0003D9980D8E1397B02514BBCF9E59875A546874FA3A70192E08F33AA40A71C44431040103A23C9087DA67D49F599A9B4DE675D54ED789E425E9AC0AFA3D0826075AE8722E3E936ABA7E8979343B29314DF10020127ECBDAC9503E397A3BC4490CDEF997693304F61DEB364F510720B7595D727CED5525029851B2DC7E74B062AE89F00369E32165CE06C2FC58FA69BA0A58B04DF0F926B435198E05B5EB7953A8D9AE113123E4DACF6F55273281811F5D3DAD867567E4B89C983973D21BC4642D137573C44E90E64D104F257395971550C6D8A6CCF8489B22A186B59177F3333F09BF1B2D03B3C8333874C968ABAFF4F77F74ADAAEC13FD882FBB8A6B590630BEBFBAF3FCB8D1E9CE48B72A0F6C6C505EFE52D14CF606EDB2CCCB38EA66EAA3EA4304A42C4E0A2263D5653181F787B02C4B95D5EA9858F27560A02FF91CB1502C4E8CF04E8AC2CBA7C8869C80F890A4D837772CA2B45CABE9A0635AB56357EDF1DF4B6B2890B64896C60BA9DCC110D500CD09164F533EBB8723F678C354042D194C706B1B0E07 ct = 68FBFAE40DA77F4DA2A7183E04B47ACAC4879CA5E018F31BEA35A4E898A78214EF0152481C63682A003949861D070F0EE0F60E390752DEC72B40A95036944A6A17854DD56CB9D3A5B951706028A36C235B1044129330AC801E5DC19953231A51E27D2AEE1DB7112E64999CD222886A891D88885EE6B19D9EF2079113065BF40B1A7C43049C5E4C2A12E64DA7E5BAF8A6515A998A12DC16D1F147CE33FA8A5FFAA48369EDD2195835D9E81E347EA0CF936414A00B90969FD1C075195E8625817ABDE77E364C8E73EB17C9358558387BE0A89E61FBCFBD295CA05C2887D0A2CE22740248641581265E22A2D2D147091A0E5ADF530BD583FC2422A25F23190B6CD78F5E8C3CB83E9438FD05366A6F63C04753FB584119A3AB2C1D1EF34438FF43AE0F943267EABC2321A433F1CAA016FB4EBB2FD2ED0D193AFA7146E62578790C912609A8CA5EF875CD166A331F8085C24576936E4C1F7DC9D80F1F1ECCEF04FCF955C01BAF5C084EBA3D3ECB959CA0AC0E70AED0C9CC785F042C9DB5C42A7E5396F28DFF086C9F325FD697991BCED647EBA7A27644E6D98F1961F24C34F8BD940B4629CC8660C8D69CB1B8B927F2DA901009DE681357000019B8191CF0FA3C22A4CAA093A7F6AE03C8E7DF095BB60F0A0A1B97FB41E01E78C60283C8E7C89C7327D68B05CF583883FC44418686A65BD90321F15E7872F38C83A4DE9467588EB6E8CC5A0C5A97BED5D1A9C27605B5DAEF59216007BE36430F6837C915F0DB5C02FCEDD0F1F02E9DD3ADC68B736AB82C99443A754F2C77C4A63ECA8731DF63F19E7F691D9D1E047EF5D48B31DD319844E068C6E2133C ss = 5B2A946E9D2A58ABE065CA470F48F4177CB3D1743597573A count = 13 seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 pk = B5633A39F5A5C6743992B9853D955E033080BB1124BD4EABD70C93687481074FBC1F41048F6A1250602BCF79E812FBB82DE51F723B011DB8E357D9FDFA1E655E789B2A38C0FC009907BCDF663EBE8ED3EBA9F4CA1BB53E9007419ED83C0A3C22167BD1BEED93B2295079C2DD5FC30003BF0C4AE8621264B6988112719A7D5E4A0B22920F65D443B3A3E9B3E5BCC8A499757F0496FBB10E104B9CE889962CEB6D639EBEE309910BDBEF8FF898DD033CD12D58F67DFB27537031B6661D853D9B2D4BB0D583D325A3422BEC874D2F47BCF57C83748D3F07E2E9DE56ED9FB1CDE4B0635301A5C205C14994F8F5018609EF1819C66933D4F0C95E82B134B668A97503CD8354A1BEAE71C0CC1BE877FC2C63A6A111200D90FC9AE8673795C6103C2539D21106A795C03AF6C332E9EFB18B8575BD3490B32DFFDE24B5A233436ABA57B0045EF32360BD9F7AAED53A915124BFBBEA0CB3FF95772B79DB68CB25FBFBE2F6BE87E3F0C54C898D0BDD9479F1A7A91BDE64BF83E8FF86484BA77629E806E18701ED9C55C1166CF09252EC7B0DFEB0F456B57E961B68132A2B422D9FD889210B84AB0511D0146C5A7CD1A90A32C9A9D7A72E1C012BA7B759D3E643F760D0303759AF56863A7D9C1A56D3B486CBF512D22DC535067F36AA8DB3BDF7BA2412067D9AA8BCCF1AB1EEE3EB564B372311A6CF82482AF01A93A98EB512046D76479752283FC5A241F82FE157C0D373DADA9B3664E2CCD80A12F371435E5FCB26FBC6135C3D448220D44C144666A4AB3B52A2824F737E51 sk = 4C04310BEA66305C6CA8BA6B8F61CA96257A67663AFC11761F13FB5C7B324B6B8AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E3B8F1862A59F55A7C0859D28B7F2A8E703B5633A39F5A5C6743992B9853D955E033080BB1124BD4EABD70C93687481074FBC1F41048F6A1250602BCF79E812FBB82DE51F723B011DB8E357D9FDFA1E655E789B2A38C0FC009907BCDF663EBE8ED3EBA9F4CA1BB53E9007419ED83C0A3C22167BD1BEED93B2295079C2DD5FC30003BF0C4AE8621264B6988112719A7D5E4A0B22920F65D443B3A3E9B3E5BCC8A499757F0496FBB10E104B9CE889962CEB6D639EBEE309910BDBEF8FF898DD033CD12D58F67DFB27537031B6661D853D9B2D4BB0D583D325A3422BEC874D2F47BCF57C83748D3F07E2E9DE56ED9FB1CDE4B0635301A5C205C14994F8F5018609EF1819C66933D4F0C95E82B134B668A97503CD8354A1BEAE71C0CC1BE877FC2C63A6A111200D90FC9AE8673795C6103C2539D21106A795C03AF6C332E9EFB18B8575BD3490B32DFFDE24B5A233436ABA57B0045EF32360BD9F7AAED53A915124BFBBEA0CB3FF95772B79DB68CB25FBFBE2F6BE87E3F0C54C898D0BDD9479F1A7A91BDE64BF83E8FF86484BA77629E806E18701ED9C55C1166CF09252EC7B0DFEB0F456B57E961B68132A2B422D9FD889210B84AB0511D0146C5A7CD1A90A32C9A9D7A72E1C012BA7B759D3E643F760D0303759AF56863A7D9C1A56D3B486CBF512D22DC535067F36AA8DB3BDF7BA2412067D9AA8BCCF1AB1EEE3EB564B372311A6CF82482AF01A93A98EB512046D76479752283FC5A241F82FE157C0D373DADA9B3664E2CCD80A12F371435E5FCB26FBC6135C3D448220D44C144666A4AB3B52A2824F737E51 ct = F1D93D2B95814A7ABDB82CF36BDA245B559E58B844DBECAA86774CB287D8F05A4F75FFE26D4D362D2C5833FC6FB09170A9CE0A2771B94CF7A71F1AA872BCB1AA06FCFF95FBE0B36BE041382BB9F3CF8DB94C20473C7AEA61E9DFA7C31A4E89B99CAA0E1D6965A346A2538F2AB983CA17695B890987B5EE528E50844816391B0BB6EC887FF9A01318254CCB6EC844505AD33802A3B1476E144381094ECE24834D4F4C933AD3EBD1051D0AC669D70325C9F9169EB783C686DACD40AF1A152FDAEA2A5AD1439DCBF7CAF7C07031427198C6CE6DDE160BABAF7C9637259AA4C616FA6DD57E7AE42AEC5C6A80964A37F1111D11879EDEFBC9BB8F8B4168B5DC42FCD9654C243A8922443D89D360D4C21ED153FF5F04B3741DDFB162486AD96EE5118C23CEF1E51B31AC9EBAF2754C649C9B2F1E4B5F1575653141F11D1F5D422EA7BF9ECA5673CD1BBB08282032066E8107FE13574BE59706D9A2092DB17F4EADD67C3010E386401DE67BEB6C0F7AFBF161CDD7554EB8A91EAF2C13FD8DA921E86A8AF360495FD10CC4524BAC0320449FB110FA5F3F2E969C174127572BF2A4F466770C1A60A9C3026DC8B4E05360716CE1E144DE202F645A169428FCE8C79AE224A9DC2A9D83E3DB812BF50F90D129729C6805F0DC796437FDF2317A1E0095920C5DB9665603D7B02D0CA5E0930E8B0519525EA1E7C4BE71E55D7F19544C20079CC2014AD9C6A3BE8E06EDCD0446E3B3D745B4208E22B0B73BDF25C2D10434BB6A4772E5FDA67F2EF1CAD1D955C582B71823FCD2E85B15783CD1572CA16361D73DCE5C875DC4E7DA0597F5A6345EAB7C191D543902A3 ss = F975D58DA8FA750E0103B3A85B9224A5A7D133C56F6324F9 count = 14 seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 pk = 89837033F02DB78E320BEF7D0FA6A889B5CAE2288401DAB41D7F64CD618AF8DB82095980D6344061179984F134A718437FCB3D70AAA4241DEFFC9D3E818B785B8B5F2E4AAC00BAB225C5F499BA3F1B75F6BA3D9B3632FD6797E4D308026434C5917AC02830E258CCCDAE59C0E845FB6404819D21695D44365FA3C396D45F87618C0895B4D3C14718913994F1A2919FFD66EAEF2AF2EEF6F2B2FC36B4B57236A7F8EB37A9E20EE49547175B4701B016F7C03782D54305844CA7826D28B083FCBD03CB7234F11D2F1151C92FB72B3D38E6E2F1B756A6869B2BADC68300C8D7231889834A4BAC3C718C4D054948BB38A3DF74898C98536EA91C98A0574345059F71D09E7480B3908275EC80D2369358596456D8DB5C3ABF99FE141215AA0A1B1826C54B1478B390186B1A8152E901CDE0D311B2FFBDE9534932F7BC95D5597E85F37474D39C440220685253F4D0014D84F209D07A5C5F6044A30F0FA13806717D1B5F481F39BE32754D06B90B6964B8C02C886562478CBF973F98C66E6215AD788A2B02571731E2811903ABBC288CA323268CB29374A22D2C198C67F968F31DC92DDE2062CEA675F85B2E410DE73644BC255CCB8DD6EC6ED9C97306F0FF90688F7557F13C8C2220E1CD85D6EC3CE2C3A1C5872CA80DC74A300B677059425E601FA66AF32EB153B4910BF3DB2FF431F0EAA9D9500E1B2A07B0612C781663CE1DEDD9D8FE02AEED922D5859A936C3CC9F9899A43478F1CB887F15B1891A0F9628B10CDBFF0CE2BE41501BE22842A254C60DB361AA1A6F sk = 38A0D5F41D7DC1896EFD1B45B0485634CEF149828751B96087A0A6DD81B4D58AA2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253383A0A0A185738805628063B48C2EBE37D0189837033F02DB78E320BEF7D0FA6A889B5CAE2288401DAB41D7F64CD618AF8DB82095980D6344061179984F134A718437FCB3D70AAA4241DEFFC9D3E818B785B8B5F2E4AAC00BAB225C5F499BA3F1B75F6BA3D9B3632FD6797E4D308026434C5917AC02830E258CCCDAE59C0E845FB6404819D21695D44365FA3C396D45F87618C0895B4D3C14718913994F1A2919FFD66EAEF2AF2EEF6F2B2FC36B4B57236A7F8EB37A9E20EE49547175B4701B016F7C03782D54305844CA7826D28B083FCBD03CB7234F11D2F1151C92FB72B3D38E6E2F1B756A6869B2BADC68300C8D7231889834A4BAC3C718C4D054948BB38A3DF74898C98536EA91C98A0574345059F71D09E7480B3908275EC80D2369358596456D8DB5C3ABF99FE141215AA0A1B1826C54B1478B390186B1A8152E901CDE0D311B2FFBDE9534932F7BC95D5597E85F37474D39C440220685253F4D0014D84F209D07A5C5F6044A30F0FA13806717D1B5F481F39BE32754D06B90B6964B8C02C886562478CBF973F98C66E6215AD788A2B02571731E2811903ABBC288CA323268CB29374A22D2C198C67F968F31DC92DDE2062CEA675F85B2E410DE73644BC255CCB8DD6EC6ED9C97306F0FF90688F7557F13C8C2220E1CD85D6EC3CE2C3A1C5872CA80DC74A300B677059425E601FA66AF32EB153B4910BF3DB2FF431F0EAA9D9500E1B2A07B0612C781663CE1DEDD9D8FE02AEED922D5859A936C3CC9F9899A43478F1CB887F15B1891A0F9628B10CDBFF0CE2BE41501BE22842A254C60DB361AA1A6F ct = 9C687A6F7344099E6FB6B24E35C8F70100D87327E5ADFE04EC2A5CEB2909BC5A5B7966E4F748E7BB87CD9897B21599EA1EBE5AAFB8E447D8C238685DEB23D262DF16E175ED4CA2203E1BA8154CD5CFB807202897FC12E2B8A2496085461499B15831123FDBC15A1CB6C08E415D3EA40C230647C3B174D296079B9E3AE80CABC701A75399EAF94D3BA792D463C76D85EBE7AE5DA8385BEBA4FCE11CDB8A1BF1B074CD1489677E9B3F8C300DD8310C7BD45F14093FFD9DA42C9812BB6F43B7C4CF3D01DBF7343FFE1DF4D16E79183A1AE9B530C29456A313A90F1B882D047BB18EB6789A8B7B834D76E7943910B7636CAD506226C9528C9BA7276626E9B070A16898FA056A07F7AD074F3258DDDB4A6E2D5A9C6337BF0BA180C608EFC707DDB44FD0C72BA6BB2057DE1F7B33EFA3FFF596DC22C9C71B4BD15C49EBAFA4B3C8E9E3FB9E28851DF515E472EB4D9D76F60FAF6502C13F21066EF3FE43290441EE3BF00F440411899C11B60033F71FD98891590625EDB37A9B293BBBB64B1722E538AA84CB990DD07FD4F63B42A26E50BE69DE888819BC7E5E26F549CB249BE9D8CA3FF0F2E92DF04A0985A2A34722F9922A47949D747539841402509F3636BCF5F8EF2E14CDE749B7BF4999863FB29A5D60F4209735035D4996BC3AE8A76BF9342A7557B92BBF2378B8AC425090CEBD44EC91ADD5F87C0BD754A0792DDB3E8D9441452B9EAE05801B3E37A0E569E7930D72F73E94FBA347754C2BC35A4213E881E92D60B7458C1F482FE80C6819D61DBB37B31DE2D655A8DA9335E53DC35C5E73835D00C689860228C76F9A0162257185547046CEB6BC ss = 81C1CB4FE6A79370BA5582B4D89EDF54FA1D7C04357C2BFA count = 15 seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 pk = 8A907563EF1191976E5781C50F454640397CF6BE7CB2A4AEBB86917108944D1C3F1AEFEF2CD4794C4DDFFEFDC1BE8A4FD4075DA71EF31CA66D4FDCFD046C212A06F4302C32C50D2F03B7A7818C47AAA263489BAB1ADFBAB80FBCC120EF5AB0B86AADC9A1C7CF80E60DBF4371EFC62909C44EF85C669DB848E0CF5F220B9F5625A73FD05962B03F4627144E0A582255B890B3E5EC82B084EC12523EA2D9D6DAA31FB6B5015B2B3FC1F10D9BF205D1BFD6BC21BC7342DE5291048F4154CC09672BF6A40560760FC9411AE226D5D925A1CF7BEE7E48BA8A5D33708F6DCFA2E7E2F48AE607B555659FAA1068E1B9ECDDF467A0A49D6D06597DD1E6F35707486415FEAC4B0C08DE85BBE7F7DD3FA7043491FDD922AA2B69601013CF21F9122F4CC144F4FBA967B65C480CE6ADB76EC1EEACB46DAC68CC938E8C133B75C5C829EC209A02F799CA34B0FCA5BB4940FB1B01668D44F1A23FCFF16D676135C3882C2FCCAE85ACA8C7B705403548BD47B83D0D8DA24B5C09DF43230F31C57DD9B2E6C6EE02BF2AAFC6EBB523C9BB03ED3BEF4BA3A73F0BC7707A11C8BEA3923128CC604FD0A1012E421078B942451B3B7D62949CCC17FB077DC4EBC4E516B540D9A652F447D47964180FBDED48AD851023292BAEF1A503A4D60920F4699623FB09514076078C35B625B26CD15F703F8EB1B3B8EF730C541119C1E6D711104368599E48DAB6A87D10EA974640B2A143DA5BE1187D37DF814DCEC46103BA3137A127A89583FBB8D72259956DF1AD3C53659BF70EAB61A9F8B26A sk = 97B5665676E59E3538EBADAA8CD50DF1F9FDA1502D9894C616A946078E56B621DF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD956C55EF849036D6447BEDB6010EE65403B028A907563EF1191976E5781C50F454640397CF6BE7CB2A4AEBB86917108944D1C3F1AEFEF2CD4794C4DDFFEFDC1BE8A4FD4075DA71EF31CA66D4FDCFD046C212A06F4302C32C50D2F03B7A7818C47AAA263489BAB1ADFBAB80FBCC120EF5AB0B86AADC9A1C7CF80E60DBF4371EFC62909C44EF85C669DB848E0CF5F220B9F5625A73FD05962B03F4627144E0A582255B890B3E5EC82B084EC12523EA2D9D6DAA31FB6B5015B2B3FC1F10D9BF205D1BFD6BC21BC7342DE5291048F4154CC09672BF6A40560760FC9411AE226D5D925A1CF7BEE7E48BA8A5D33708F6DCFA2E7E2F48AE607B555659FAA1068E1B9ECDDF467A0A49D6D06597DD1E6F35707486415FEAC4B0C08DE85BBE7F7DD3FA7043491FDD922AA2B69601013CF21F9122F4CC144F4FBA967B65C480CE6ADB76EC1EEACB46DAC68CC938E8C133B75C5C829EC209A02F799CA34B0FCA5BB4940FB1B01668D44F1A23FCFF16D676135C3882C2FCCAE85ACA8C7B705403548BD47B83D0D8DA24B5C09DF43230F31C57DD9B2E6C6EE02BF2AAFC6EBB523C9BB03ED3BEF4BA3A73F0BC7707A11C8BEA3923128CC604FD0A1012E421078B942451B3B7D62949CCC17FB077DC4EBC4E516B540D9A652F447D47964180FBDED48AD851023292BAEF1A503A4D60920F4699623FB09514076078C35B625B26CD15F703F8EB1B3B8EF730C541119C1E6D711104368599E48DAB6A87D10EA974640B2A143DA5BE1187D37DF814DCEC46103BA3137A127A89583FBB8D72259956DF1AD3C53659BF70EAB61A9F8B26A ct = EB6542AFE5F1C9C32018BB1AE06C589D1F70CA2BE5C121466446E5C69FA776756C26B74D725B9CFE5796A5FE5B9B178FCA1E111ADCA9C2204A1074A0A805C9747F0D46A444F9DFA819871371473C32E106A3C5F47C9BCD200AF36F5A251F1309F96A30355E0815BE1BD76588C38B503F1B7A2AA552D7A3895848158E64680473C361BDB8088D108C2B599E147E1CEB734D3D44505E05246B5458B6D82584FD9D7A26F29A9A08E45BBCBCF1678FD7A1B82C3AA007EE15F1D0AA1F1D179D9A8F31C64CDCD8F800CF90AC5F4B9A53C3A1D40868E223F3EA75395A047185E2BE07B048436C9B54360E1F58E037A1E7B6F8F5487E773A118AD248908E394AFB84B61F68909E0D582ACE5F6AB7633C6F7A18263C828510040A4BAEF93795A544B124280737E3BDE88D56674E7DDDE813EED2EAC0FE28D3F80EFF1EBD071CA1B116C5DA091241C499AE68025C789F6013B98DC7086FA0A687B32BA94A8FF9E3B084227722FD2638E4060655FB13F959AA942D458670C985A5C0EF4AE7F3E136426F417AF598DC297243FCD252864589B3864CF42593581EB36E84215502DAA8E9A97302CC52EECE6226EBA08231CD761EE2A0262B7437355463C47C9F119C10ACBFB2FE787445F94B5B5C6482326CE5FE7FA5D6CDD2CC684E5A2E45F7D15C1E6BE17310B4F002260A4746B5939E0BD3A308E3EED2D0BABDB0744456D812A8F4D782AB66E0B630BC2EAC0C085BCDE752EF7108915899759EEBE5134041EC9363BCC6D33D0BECA85B9FD41431F2565097CC274872B600230C5C5E91AFFF9F93714054CBB1E75A1E86C54D2F40B85FCB9C074A1A070399F806 ss = A805204251DB7AAE8AD623F8E308676930E52002AA402E99 count = 16 seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 pk = FE77653B5AFFEEEAD7AC8ABAC2527E59DF75281B0532B5A528CA4D3FD232FF3ABB280A1CA705C48AE2D432DD2654597C56E24B60533455B88ACA8B5924D1A0FBC5B67BE1DDC2A7E3FEBD467D3848824D0FB7C2C58D1FE6ECA7D1FF9E29698AD2B0341E31E891ADBDA68180648EE6792AA3F67900262F25AFEFF70EEE44FC86A99AFD747F689FCB2047507491D3CF1509BE210BD8FF80D88BB864D339D114B985296EF43A952487270CC3AADF09DFD9A59507B9B9464039CBE7838228DDF2966B4242F14E664F235DAA5E9B14815062255B105C38F10AABD9067BDB170CAFDCDB43A04A2DBDBC208C49D8ABE82B4A1EC5052EB9D6D6BE8BDBFAA155D7D55FDB31D02342A06D22F2AC36C6C6811090625466DE558DFBD12A3381097BEE54A5592569668B89E357D9AC63F23B07143E654806296C716E06D5D2280848FBD97BB70814CC8F407D355E2C435771FEBC568F2E289BDE8F78714BAEB81609A8B2830AEC44543A6FC13BDCCE1A8A9D8923E40472A83BF45D5011995B08694F903DEA4520BA117111AB1E69042A20D463B9F0678C5D14D1EF5F0D1293F9B434034E49C7877DECA7ED72BEB82D96963A5A991E3A1E6BDBB121E4D2112A77421BFA3C2F6843BDA6407E2887D7EC2422B2D000D6C69B2AC7AD3CCB2BAD981F83D7D33EAB0479F6F98488F739B1D0F5320FDC1D1E097327C73C025EFBC9DB081ECCC40A7B049569A433F9203C62D5BBACB997C1134A7B4B7865ED184C26503231ED1CF7BE9945FB827007E544A03C58D4A0326D290ECA46EC0418 sk = EF99224A03A85A46EF115474EC5B5D620DA6795D6EFCCA4C9135D19958A9DE62DF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12528E90150F7F22A2EFB276D6C4FF6DDAFA02FE77653B5AFFEEEAD7AC8ABAC2527E59DF75281B0532B5A528CA4D3FD232FF3ABB280A1CA705C48AE2D432DD2654597C56E24B60533455B88ACA8B5924D1A0FBC5B67BE1DDC2A7E3FEBD467D3848824D0FB7C2C58D1FE6ECA7D1FF9E29698AD2B0341E31E891ADBDA68180648EE6792AA3F67900262F25AFEFF70EEE44FC86A99AFD747F689FCB2047507491D3CF1509BE210BD8FF80D88BB864D339D114B985296EF43A952487270CC3AADF09DFD9A59507B9B9464039CBE7838228DDF2966B4242F14E664F235DAA5E9B14815062255B105C38F10AABD9067BDB170CAFDCDB43A04A2DBDBC208C49D8ABE82B4A1EC5052EB9D6D6BE8BDBFAA155D7D55FDB31D02342A06D22F2AC36C6C6811090625466DE558DFBD12A3381097BEE54A5592569668B89E357D9AC63F23B07143E654806296C716E06D5D2280848FBD97BB70814CC8F407D355E2C435771FEBC568F2E289BDE8F78714BAEB81609A8B2830AEC44543A6FC13BDCCE1A8A9D8923E40472A83BF45D5011995B08694F903DEA4520BA117111AB1E69042A20D463B9F0678C5D14D1EF5F0D1293F9B434034E49C7877DECA7ED72BEB82D96963A5A991E3A1E6BDBB121E4D2112A77421BFA3C2F6843BDA6407E2887D7EC2422B2D000D6C69B2AC7AD3CCB2BAD981F83D7D33EAB0479F6F98488F739B1D0F5320FDC1D1E097327C73C025EFBC9DB081ECCC40A7B049569A433F9203C62D5BBACB997C1134A7B4B7865ED184C26503231ED1CF7BE9945FB827007E544A03C58D4A0326D290ECA46EC0418 ct = BC47AB5A8D3449E642D8C0EE9038527ECD411B3C7CA00118E3D15280E3DDC58B6ECBD87EE63B8A70D7144CC21B825C5D460357275C69ECDCCBAFA4E8EDF7786BFBD4D7A126EB709430599ECC0BC4FFA53946C83759D2CF4770B18CCB1547A772E2ACC4B86A8BD676EF8C791BB444AED4EDA2864AF875E924B3FA032C3BB3B33B4FF2722A7E92B3E41356CA248F9715BE720FB6773DDDF6DC913553B8B047FC4CD388659086EE58FCDCDB6D0D7FA44742885ECBE8F79A67AD6C69EC668514D59E989F60CD1B262623A798C72D0BD0751022852267D65495A6091CB640AD9783C6E6A8634A560636CD4B4C7F4861D9CE9F370BEC770A28FC1846854D0A10159C1AB183E8EC3D8E4C2604B6E9018B50DF6FFB735543076C8370032234CACB03926A0205343128A3A553F7B6BBC43CA3257272353385E97AE1F530DE840D552832F977091095887F2FA17B1BDE8400B32DBABC24E20EF3DEB4DE8702A58ADBA0D50342EF3E7FBAFF23BE62240E6D49183DD6A10A4A8E5744A503D07E31D1EC8578FE9663C6F0F42959FD6C88F880F70CF0E5E13C63EA8A79FBE5F108984407C969C20CF2E91053125EAAEBEF3C11936308D5EE542271D7542A4DED989C57DF952F1C3C4AC81CD7D5CA3FF08E06542869D3AEE9079CB25A3861B81420EDC1EFBEABC91547C72CEADEEE1E1448FD5A9AF59817A0D60239806311F1A66A066603B9D9CF6621348891C5AB095F75C0C2CBAF734A3C72BD04E478F61823CAD7ADEA73282EB1837988E4799F60D7E6609CD169C7C54A596E549E44E055CE0AA9FF49C6FB2CB0E186060DE0DCC64159EB010A18A4E971EA54FA ss = C073538230F727A87719AD8B74255824999E463DFA677227 count = 17 seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A pk = 97B2806F49F70FFC78EF248C98B0BF1207E16FAE47C6A9D79A637C733613D506B0FBD5E6C3AE101C80CE86D87EFEB5F71B78B1D9208670139C099CFA3BF2C2359E579623648459B8F9B813CB940B6A8CAE8E7B7B3D8B002F9C6D216A88629145084C51C8798756D8EBF64D53B2CA8F49BEAAE96F3F0491321578E0E1BEFAFF22D6A32067A26E08ABF674B949B3A81C6E4729522B0207E6CAD0E553EE4C716907C976E93067C8FCE1ACD01456DF8DBA349E6991B962E5658B64DBD531F8320609017F7A6070065D904776027BDFED3C194E096AE59EB0B4750722AB2F1190681CA7E60B19A48B853438C1B37385AD9AB2865AE810A5B58EDBDC44F18DF03C560B683A122389509FA8E4937D61F8D20205B64A8D3708B96AF8D62A1F22D40110905DDD6BA9BDF48E05F09267F42475C751B508ED24372619DE1717EB723CEB7F25AAC588C1385FF3558FC6B7B9DB53F352C08F61BCE6A918F13D7511DC5AA444C95D4EB2D9AB7831118B82BAEF7CF21D16D5EC1C216364D947F2212DD9D25FDDCC15B9C424DF3FBAF1732A861A3094B3A8E60B41393972DF62283310A9C3E20D4F25968B6CFF6D9CCB65C71BEE0EE5F7F7A64E9A60E32B747B774AF31E69F22CBD990E5EB67C009397008DDF59FC592C1A8E4F12C1072F1B6695D9751EAEB691CFD9152E0C7FBF1B5CD3E72F6A16C06AEB91176145290DD8F5915DBF13F132B4527560F2BB56AD5A801FFDACDE80015474D5E30C0915F764B5589EABBA95B75B08528F1950A70526803D5D8F950636E4A9C3864E18 sk = B12F6FD965EA9C5B947DB80FC60C83D5E232DCA82E7263027C19BD62E5A6FF550F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C302520E0A9CAA76F59A0A6B1638B301A8710397B2806F49F70FFC78EF248C98B0BF1207E16FAE47C6A9D79A637C733613D506B0FBD5E6C3AE101C80CE86D87EFEB5F71B78B1D9208670139C099CFA3BF2C2359E579623648459B8F9B813CB940B6A8CAE8E7B7B3D8B002F9C6D216A88629145084C51C8798756D8EBF64D53B2CA8F49BEAAE96F3F0491321578E0E1BEFAFF22D6A32067A26E08ABF674B949B3A81C6E4729522B0207E6CAD0E553EE4C716907C976E93067C8FCE1ACD01456DF8DBA349E6991B962E5658B64DBD531F8320609017F7A6070065D904776027BDFED3C194E096AE59EB0B4750722AB2F1190681CA7E60B19A48B853438C1B37385AD9AB2865AE810A5B58EDBDC44F18DF03C560B683A122389509FA8E4937D61F8D20205B64A8D3708B96AF8D62A1F22D40110905DDD6BA9BDF48E05F09267F42475C751B508ED24372619DE1717EB723CEB7F25AAC588C1385FF3558FC6B7B9DB53F352C08F61BCE6A918F13D7511DC5AA444C95D4EB2D9AB7831118B82BAEF7CF21D16D5EC1C216364D947F2212DD9D25FDDCC15B9C424DF3FBAF1732A861A3094B3A8E60B41393972DF62283310A9C3E20D4F25968B6CFF6D9CCB65C71BEE0EE5F7F7A64E9A60E32B747B774AF31E69F22CBD990E5EB67C009397008DDF59FC592C1A8E4F12C1072F1B6695D9751EAEB691CFD9152E0C7FBF1B5CD3E72F6A16C06AEB91176145290DD8F5915DBF13F132B4527560F2BB56AD5A801FFDACDE80015474D5E30C0915F764B5589EABBA95B75B08528F1950A70526803D5D8F950636E4A9C3864E18 ct = 3BB61617B616E420859FECB09A333B3F9D022F028D433FEDC4C5F49CBA86F033D7A496F7230FAECACB8570AE90611B13A9EBDA1E05A188B3BA9CC795ECDCD879A4475CD4859D6040ECC757B7C0421DF25ACC027718A7511D485CB2092A4D59B8D6E138B9EE96D4C1535FF0815967FF5569420DD9DF035FC723BA0DF406E8C76C6F9EDB5788F839F87D86997F4756EBD6BF31DECA1846CA019FA18D54848F9EA317D5EC3C158C47D3954E3DDECDFE408F5791CC662F805CCBA3C01F1A643D52E6597035E840EDEFF5E7ED940B25BAE137AAFB1B0956ADF6D8BC5C7D2A9AF7AFBFDFC3D99C59249FCEB4D2456443CCCE530820F5C211685C60302AACC33BB7EB8BF5D8A493A06D86C908EFE6447402AC3D63C33E35738AA853122F008027C5E5FAFB27E19794B37F61E309F1E8AACE8682C5E8A038B5F373C24A9EE37770CB610C1B40E2772BB220F018AA162B4753EAC633978A53523E6DBB576814D0856201572BC7DC90B89B0F684DE3011835207CB473DC33474C717E14813B41CFE83707E9DDE3872E9FDDF90437D7562F36809C1C1354987F78C65D97FC7F30D148E26FF58466725387C54C333E67294DB2DAEFD1739C8F5DB2D6B5756A46322D82E0D6013BC91E780A6B9C87389AB709FDFC650E98F5F2580C60C0E2092A1A39C6CA7184F7F2D2031B27F8D6D9B69EC01340DEB7375D3E97721F31A1E8B36ECF71F01AA868A25B304F24D823F25E80655B83A11F2207A6EF216779881087786E89EE759FCA01EF9F16D150E1E63FA3D407C969234832D23F384F4C43674E31FA7879520EC94D20EDF58242FAAB5DC382A772178DFD42BA0D ss = 751FB574CA608EF66A7EEB2580EB0A2A96C30ECE6BA6DB34 count = 18 seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 pk = F16B0BCB4C1C1826E0A6DB37AC51CFF516901B972045AA6C7035C0D2CA94C2533515D0A07453E9FBEEE4676632DA59D94D1A25F260C4F5D116823CED2C39CEC648976F8111FCD0D8C59C8831E58199DC6E485FE677BAB431097C953DDC5BE553B0D57C0FCF0363253AC1B57856449F3E51C537F71B5C30A3D0630D023CF73F8223DD176DBA4026320169CB2CC9D0A65F20EC1F7A555C338126703AA02CDB2529F7D1601362BE7060B12D54F37D29369FE7BDD552FE685F81C2A6AA33537D162AEFC6DD6FA80627331C195388FC8D5FC264EAA21AA6D40405134AB32F2485DA2CFB52CCCE7AC3A9F243CB729E1D72E6E574287CAE94BBCE0451AF7D9CCE6AFC64FE6083EBCD662B23B5AC090A31B6D39F4BEBE17087349E576C6F28DC31F1F8D91B137D2503DC3FC81A90D33F617D34AABB997B99D73E589D8B5B5C9849F974FFD40F10BA4EFC2DD62EDA44343F97F703969321E3AE22BB91E1B4B2FA022616A527D763295B9D82641EA5D8B32C6DF6CFB03269A4305DE16D76CE4D1B3A4DA890205E89CCB4A99551AC6DF5B428C0D26A56A139762B05B18689932B9385B6207F884963C0DDC06E9912B7770C59441F9B295BA2BD28573EE4F4180A8A7C17728A166CF1BD60E0B6D0F4EA2AB292642D29C4856211B91F1A87EF3585C265B8973473490D1E510173950BF980B035DD8851B78E2161748555589ABF57AF461BF3B8198D6F2D6F90484FDBB46DB03193158BDF3D7D187A5F7AA18FC4F39F7477733A56BA743A296CF10A569A18F81E3231972F460C0F sk = 9F52AF92CA165FDC38788F2B59BA02E01C8281FF7C1E60504688043A5FE814B04F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D26F9580704792E5BA2904B75298DD866603F16B0BCB4C1C1826E0A6DB37AC51CFF516901B972045AA6C7035C0D2CA94C2533515D0A07453E9FBEEE4676632DA59D94D1A25F260C4F5D116823CED2C39CEC648976F8111FCD0D8C59C8831E58199DC6E485FE677BAB431097C953DDC5BE553B0D57C0FCF0363253AC1B57856449F3E51C537F71B5C30A3D0630D023CF73F8223DD176DBA4026320169CB2CC9D0A65F20EC1F7A555C338126703AA02CDB2529F7D1601362BE7060B12D54F37D29369FE7BDD552FE685F81C2A6AA33537D162AEFC6DD6FA80627331C195388FC8D5FC264EAA21AA6D40405134AB32F2485DA2CFB52CCCE7AC3A9F243CB729E1D72E6E574287CAE94BBCE0451AF7D9CCE6AFC64FE6083EBCD662B23B5AC090A31B6D39F4BEBE17087349E576C6F28DC31F1F8D91B137D2503DC3FC81A90D33F617D34AABB997B99D73E589D8B5B5C9849F974FFD40F10BA4EFC2DD62EDA44343F97F703969321E3AE22BB91E1B4B2FA022616A527D763295B9D82641EA5D8B32C6DF6CFB03269A4305DE16D76CE4D1B3A4DA890205E89CCB4A99551AC6DF5B428C0D26A56A139762B05B18689932B9385B6207F884963C0DDC06E9912B7770C59441F9B295BA2BD28573EE4F4180A8A7C17728A166CF1BD60E0B6D0F4EA2AB292642D29C4856211B91F1A87EF3585C265B8973473490D1E510173950BF980B035DD8851B78E2161748555589ABF57AF461BF3B8198D6F2D6F90484FDBB46DB03193158BDF3D7D187A5F7AA18FC4F39F7477733A56BA743A296CF10A569A18F81E3231972F460C0F ct = 053DCC9B437AFB09C07E7A6B3900A4A732ABE7CA494BE958F5853790B27B346F74371FA1EE2E1DE61655B742EAC18C37AD19E9B4E965EB3FCA65FEB6F93044D024A132A021475C7BCE2857FC253AA6DD5EB0B7495572E4A2E6641C42D21E7AFB7C8B59663F456E05F4466A0CBBD31E68C9ED22490471CE1866E43328F96EF20BD0EB79BDEBF286994F25D58C7141D55A5BD087094E8C8F592F3E7F9115A5760B95983AA6823589E2BE606BB1AAB319643228C59019BA22CC489FBD2434A5767E7676AA344472DD98190929F762105575CBEDDA9DBD0F8F83C321BE4C89E1AA44540B870A0C5B5604A37944083E5B685F684D34DDD555CD15770F8C29B20021E5CD4A260244C9051315514444020822FBDCB4A9B5634CBAC1B003B9D342208AABE36DDA0A866BE595E3E6B7EA9445931BB14048FA81DCDA1E4C36DE7EDA8A1B3C6B8B5D848A8981E9DAB5DE8B07DB2312D8E01D489A4C71F886C910438497802B41D49D8C0C1D026FCF14A3B7B7395F658901008E3A291011CE01BB7179B2BE430BD94FFF0D70750937B6F83B96712FFC87EF9E9772B7E6F54FC33E718DBCC3F10E6E2D0478B308F4AD30C902C87361E39288FDED85353E8C74F704E8F7643D018F486ABC0250921BBAC51B5FC420E77B3C3F3FEFE50EEB0D4670A5FA76B94B2283ADFDABC66820B0229802B84FD1742F688A86419824F3E4FAF8520A2EE280C02326376FE459FA369C4402E54AD6529CDB9EB40A0B0DA4A650776359FE84D3BCFDB73385966361F51FCF75D3D76C7EC319F12B24267A94FBBB06DCC416F02F438BDCD257F72617BC452FDB869AF7421021B7D146 ss = E358093EF74AF52F049DBF6144FB7A2974B6F113C5A07C38 count = 19 seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 pk = 104C5F68237DAC5EEFD98AEFFA69D559586AAD878050EBA4549E9FA496FE3C3C77DD7A679C1FAAD8940A9AC334D87513ED6C7C919CC5465D59935E114A87EE9C5EAF6F49EF41A694A0BB20C5E1CD13736326F29A66F9906977AEE5619A1BC28F7A57817FACE0CC749B56F47BB7657308AB095696EE235B6BAA72E02F9B7A93795F48DF468CC02C4458AC56C379CFD6301FA096B1A0FF27F9A4338966856E36551B95E9BCE846514A55881E320A23E15512151CA1941CCB43A505A0531EF2AB1DADC3C719C4F85110C6CA34C5A2F9892614941D302769C42D661E73684D13EEA42F49AED8CD7EC961D8948D4EC2BBEBD7C677188F4C84F9825D01BA699C2E9A61CAC7FEAF5BA8689FEED63655C6AB2DBFEE068CD20DD23B444156BAA7B4009AF69F0325F001E3BE1426933C77DBEB1B1F4938988A33A6FAFDD9B8DFBB5C0175234407AE94024217A239A9DBA6EC06CA374F49DDEEE7D059E0BB7B9C26E0E95472B830C36911A9C3DB52866181A71C916A8E0A38679909776E8522B531C06EDBC17C2603DACD7B57F89242436D76C56F32AFE756A6127313C6E84FC7DCE35F013B3D545EFD544E19B7399926FCA42345A06E4130E75BC7E9E93AD5E87F7F3E1CAFF3FB6736C59F75444EB6288BEADFEC9212FB37D6490BA8BA545B6F47B250C0B751B931751385821B399CB0F9C036DEFC761E38C19420A0801F34AEA9B82763907C2096030DD2E2BFB3540F90DA58C21249CBBC3455C13EF3F31A17AAC8788795B6547E5316F0E6A8A9CB806E8CF90C4924EBD40A sk = 851EA90FD3854CBF28FE39FB81F68E4B14345CF0D6EEE7EC4CE772513DF8410D1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D03CFD77A9920C166C3AFEACBD5D979279900104C5F68237DAC5EEFD98AEFFA69D559586AAD878050EBA4549E9FA496FE3C3C77DD7A679C1FAAD8940A9AC334D87513ED6C7C919CC5465D59935E114A87EE9C5EAF6F49EF41A694A0BB20C5E1CD13736326F29A66F9906977AEE5619A1BC28F7A57817FACE0CC749B56F47BB7657308AB095696EE235B6BAA72E02F9B7A93795F48DF468CC02C4458AC56C379CFD6301FA096B1A0FF27F9A4338966856E36551B95E9BCE846514A55881E320A23E15512151CA1941CCB43A505A0531EF2AB1DADC3C719C4F85110C6CA34C5A2F9892614941D302769C42D661E73684D13EEA42F49AED8CD7EC961D8948D4EC2BBEBD7C677188F4C84F9825D01BA699C2E9A61CAC7FEAF5BA8689FEED63655C6AB2DBFEE068CD20DD23B444156BAA7B4009AF69F0325F001E3BE1426933C77DBEB1B1F4938988A33A6FAFDD9B8DFBB5C0175234407AE94024217A239A9DBA6EC06CA374F49DDEEE7D059E0BB7B9C26E0E95472B830C36911A9C3DB52866181A71C916A8E0A38679909776E8522B531C06EDBC17C2603DACD7B57F89242436D76C56F32AFE756A6127313C6E84FC7DCE35F013B3D545EFD544E19B7399926FCA42345A06E4130E75BC7E9E93AD5E87F7F3E1CAFF3FB6736C59F75444EB6288BEADFEC9212FB37D6490BA8BA545B6F47B250C0B751B931751385821B399CB0F9C036DEFC761E38C19420A0801F34AEA9B82763907C2096030DD2E2BFB3540F90DA58C21249CBBC3455C13EF3F31A17AAC8788795B6547E5316F0E6A8A9CB806E8CF90C4924EBD40A ct = 2E3B44B155E57778234CBF18D0412CB33183C6C72A4129BEBBF6A8C9C2EF4118B39CCCB008B6C9AE6C9275FD6E4157C43E952A2B20EBAD4A910D8877E1D85C077A098E3B0B343DC271A68AA2FDD5B78A8CEECA9B0310E32EC3AAD35AF52B3297F0CB13D3FC1243E5AE2032D63A3D5AA7DE56276F3D8D582A102D46101FC528344A450BED11B96B56532287CF966C57036737F619D3D88241BEBF4A1DA22549879B035829DEF0677C9BE1B2F822EC578538661845EFA9F160D2636201347402D25EF15EBC1729039E7834906CD9D15745542213F1470A5F979E822EF1A3E4DBD7E157A16B29D5CAD4DE960FBEAE7AB279E25ACD3B76B8A2F8BAE77C9ABDDB8E5F2084F69E2D38F7714E0FDB2AD16B79A8741577486862CDF8AA0ECBD509CC758C31DAAE29B78A765F2EC61E76C27F16144FBB1EBD34F53A03325B2DD03EB5A651A990A4F806E69E2826C1A25A2BE08EC6E39380B7C624658AF77586A45F2901142A648CFD0B048A82DF73FC5DA648D8EA2144E071AAA1496BB5810AF2394BDD54E5F368DF237B0D1768CBE4723FC1EB4C8596E352B8EC0E482366415203818757204FB3EB806693D57BC1DFC564E23A59487474E0D3614DECE571FB846BBBF80F89CF044A69CCECD7C36B5C432637B37229882129E332E6932590CDB4567962BD8C71F80E96E7A12E542E54A8CA63750A02F9DD58CF8EC3782BE28C4254FF60EC2A16110FB06F025A5C155809930124CB2B18E56E5050E4B7B870F43B64D9988B34A4C5935C70C4AAA2EC21C935F8298F9D21025B2DBB411D014A8F87FBAE06560A472C7424B49FBBF025059100C01D4EFF9E9000 ss = 79F89B2F78E1A0A4F622133B07D6DD057D3281CF960F45C2 count = 20 seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 pk = 0C62284FD17042DC8DEDF238A9D72472B231342A18D42CCE2B9BD350AF67309C7672565586A2F26AB6B89EE8493C23798230CD31301B1ADADED0CB2D86ADEC8E01AA75C44CA7D72F7FA23A07CCBDD33295DB7071ADB6F884EB4F2A757329796650839C98E3F04AC54F2B25E839F9A22653123BF5C6A2999F73D5EC85E04415A03B19536A141E2BBF2F010777D1342E44D523F4AF56C94989103E145C5155934586A240C6B5299ED7095B3A684972682AAF4215DAAAC83654F22DF4202DE37D5B51AAA93155E9A6A1CC4C1EB678269133FA7C57216E379E1B63F8F79A83E43ABE134B0AC207132751220AB2109B7472D541636EFA2EC58084D6ABE9B2880A68C4BDB5884E44718501CEA4AE9DDA24C0A4017900C23FEA7179E347FCE558C62DE22D0EAAAD90940F08C32CF42B57F581B066A90B5022EB53A8FE0F22DBC05F99FC3BC64D469EA5D10E9EF6BEC6443B898F4BADF7FB3E6304FA81E3D23ED15380789D0AEA12820D1F732D065D627D3C425DD66B728BEEA3E55A8DBE49AAA633C0E2D78BEF6809DA621EF6318197D9E42E74152CB30B3B7ACF97ADEEAD6BC98C8C35691AA7BB8451562CD6A99A933FB45B84A3C5F7498C5E89A072FAF5D6E0BB5B31721E733424D447993137FFA95EB87FEB9DAF49EED13A0F82310F2B0D0F8DDC0A0585811133DCAB41DC8014FF91E0AB9AFA0BCB33CA17BA2C22B7C0769ECE6D6E5AD9061969ECF4DD6706A56F73651AD3660D9E30DC076B423520D45C7C4DCC7746154C56149BBD3F0D2CEDDFB199CB820809C221 sk = D304C9389CC973477F169788ABCB9D511F843219D246A9B587822F422A70C2386590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D73AFACA1DF98112891F60E2BC740C99E010C62284FD17042DC8DEDF238A9D72472B231342A18D42CCE2B9BD350AF67309C7672565586A2F26AB6B89EE8493C23798230CD31301B1ADADED0CB2D86ADEC8E01AA75C44CA7D72F7FA23A07CCBDD33295DB7071ADB6F884EB4F2A757329796650839C98E3F04AC54F2B25E839F9A22653123BF5C6A2999F73D5EC85E04415A03B19536A141E2BBF2F010777D1342E44D523F4AF56C94989103E145C5155934586A240C6B5299ED7095B3A684972682AAF4215DAAAC83654F22DF4202DE37D5B51AAA93155E9A6A1CC4C1EB678269133FA7C57216E379E1B63F8F79A83E43ABE134B0AC207132751220AB2109B7472D541636EFA2EC58084D6ABE9B2880A68C4BDB5884E44718501CEA4AE9DDA24C0A4017900C23FEA7179E347FCE558C62DE22D0EAAAD90940F08C32CF42B57F581B066A90B5022EB53A8FE0F22DBC05F99FC3BC64D469EA5D10E9EF6BEC6443B898F4BADF7FB3E6304FA81E3D23ED15380789D0AEA12820D1F732D065D627D3C425DD66B728BEEA3E55A8DBE49AAA633C0E2D78BEF6809DA621EF6318197D9E42E74152CB30B3B7ACF97ADEEAD6BC98C8C35691AA7BB8451562CD6A99A933FB45B84A3C5F7498C5E89A072FAF5D6E0BB5B31721E733424D447993137FFA95EB87FEB9DAF49EED13A0F82310F2B0D0F8DDC0A0585811133DCAB41DC8014FF91E0AB9AFA0BCB33CA17BA2C22B7C0769ECE6D6E5AD9061969ECF4DD6706A56F73651AD3660D9E30DC076B423520D45C7C4DCC7746154C56149BBD3F0D2CEDDFB199CB820809C221 ct = 324B0EE51F0FD301E3B0395B1A91896B01385C5CEDB918111A3C19137CD6B773D9A38C9629E83B710E9DB780C34BDDEB070AB50250E2EBDE60D7B6D5E9A278BBC63120AF653E8AD30DBEF839A4655E50BD538D79F6F7EE97404BC8F618576D0E4617ECB265181799B1D39F09D93B77E3AF4C4E10563DD83DA8639FA23B67EEB006E17A6AFBE1C15B8D2C7C7EF6D8B2C967A512391F640D9C21560B1B12A55D1FA6B89D20AE2A40DB68B805A9FCB452B3B73D0A1726E1F700007E1E10A21381F79B1D84CFB8CA0432E27809F01C30CB0CEBCA8DF9FB790295A03760FC2DBE70E80FE305DB03E4CB9FCC4D21C944F205C6D8E1A392380D2DEE83BA8DEA3DEB74982A163F8371A891CCE04C64324B671F77E317F81F62241821683C1F9E248EF3524B111FD6FA6BC46BF754DC5885D45E99A1F6CECCEF1AF81B6242AF2566398555825FA6E0156220F8A083ABE53A2461542524CA2B31A7B48F88B5319ABC8207E7B183663C0A037B2B4A76BF9746BF35BD112E2A7187E2A72342774F1BDA146FA9391DA467B107A0BE70A32B59A260352024EC2405F2338799B48F7A237ECFBFB0EBEA84C46517360EF6CD7FB10AC0169B32739AEAC6B40AE78CA190F353C8C724B2F18641C64F39889F1D5F1FB0670218CAF03B93BA424E4DF74F076E152ADC2E5711A0E85ED0A467BCC91ABDB514F576632402F00581C79508A92EEC8CC85CE595E5068B2E15CC8D73387B63CA3FCFE1661EA5EEDDA32AB3ACBEA1192D27C9F1BAD84F54195BC2E20AC4D20EB39B9BE6D57D953AAA6BDD640EEDFDEFB3AEF1A01DA0EBD11454006FB9CD09CA7D45CD8C139910C1 ss = E4EAAB64C432FB26B43A9D751E5B155A866F63EC1597A54E count = 21 seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 pk = AB189E31BCD8B8CD0F4029BB4D1BC72A42BC3F659E7F13840C52A9E31EA52E01FA747F74A2724C947873CEA1EA0581A813D0874724085C3497C5382691789C334A7B30F8A76A04FB3BE7D55354B45F640C03CBC0B42116BE1E7E5877906B1757FEEEB28612CF1959154327685A5C9E7D1DA85E8061FE0DDB66B42CC4CDB12CF644F836516D83ED517B1AD60228455563A0478A358C2573539C983E2790749D4CDB9FF5C7027A475F31A1399A5D538ABE039ECFB072EE873C33E1C86896C27648C95192D207E78C81B9A78AED8D2253C1037DE8EC219D58F5785C188B69BA00EF16073F36DC53EFA87DA3C19F34F40F9370BA7943D61218B989C07C5B95D2C69AE06B17C5407A6D0F7015143ED3B76ECACB8215EF7DD9385F1B51B44C055702791B7671ACDF74E273CE6DB96A8F83AD40F3BE1764D3ADBAA82D11EAB71554680C0558D47B6509BD9D5702BB07178FF7CB136EA425F43E6E739D40D176BEE8340EA270CD78FC3A5720DB699BD011ACA79D57A8CEF07BF2364ED65854B41F5CC72AB2E3AB67ADA33C42BDA175D10B9784C3901475464D6F711C4C65F9ED64668A58108B52D210AFE491CFBFA39E6FDD9DD4292307323E02633B1322331E19432E603939CD47889B3DFC0BBF910279300540EC631CFFC33F1298997CA6C4C69F0D5547FB6FF1C205D4658C8AB422F3A5E75402F2BFFAA62CCAC88116CB0FC93E4FBDE2A253227BC7FB577B19695E310792A9FA09D42C82576FC1FE6D076F51E5B3A21F571419C1315AD7E5CBB1D76F98ABDA679EDD39 sk = 89A6E3BE304A3518FB82B18CA730F0B359CD6BA90664A493FB4F8EDAF965B9C3B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE7104656018DC349AC67563849A29C50DB66103AB189E31BCD8B8CD0F4029BB4D1BC72A42BC3F659E7F13840C52A9E31EA52E01FA747F74A2724C947873CEA1EA0581A813D0874724085C3497C5382691789C334A7B30F8A76A04FB3BE7D55354B45F640C03CBC0B42116BE1E7E5877906B1757FEEEB28612CF1959154327685A5C9E7D1DA85E8061FE0DDB66B42CC4CDB12CF644F836516D83ED517B1AD60228455563A0478A358C2573539C983E2790749D4CDB9FF5C7027A475F31A1399A5D538ABE039ECFB072EE873C33E1C86896C27648C95192D207E78C81B9A78AED8D2253C1037DE8EC219D58F5785C188B69BA00EF16073F36DC53EFA87DA3C19F34F40F9370BA7943D61218B989C07C5B95D2C69AE06B17C5407A6D0F7015143ED3B76ECACB8215EF7DD9385F1B51B44C055702791B7671ACDF74E273CE6DB96A8F83AD40F3BE1764D3ADBAA82D11EAB71554680C0558D47B6509BD9D5702BB07178FF7CB136EA425F43E6E739D40D176BEE8340EA270CD78FC3A5720DB699BD011ACA79D57A8CEF07BF2364ED65854B41F5CC72AB2E3AB67ADA33C42BDA175D10B9784C3901475464D6F711C4C65F9ED64668A58108B52D210AFE491CFBFA39E6FDD9DD4292307323E02633B1322331E19432E603939CD47889B3DFC0BBF910279300540EC631CFFC33F1298997CA6C4C69F0D5547FB6FF1C205D4658C8AB422F3A5E75402F2BFFAA62CCAC88116CB0FC93E4FBDE2A253227BC7FB577B19695E310792A9FA09D42C82576FC1FE6D076F51E5B3A21F571419C1315AD7E5CBB1D76F98ABDA679EDD39 ct = 5CF612B89B756FE3C69E12D3B25CBBB437C55E7B1ED239B906FA6CD10A9CA59EB22349EC0E146F271C75D03BABEE84CE6679DA2576F3F424E8A57D3E2177A8EB12DAAAF7069A9C82F1CBFCDC7D80101C4B0029181146E06735C1F0AC3D1659BFA31038C358B426835BC5EC0FED24BF8A2BB5DE533F928063AA3FADA34AB4F4C81F167005C19D21D55756E29878B3AA6117305BB8B00B19998782F41631CBB93C7D8FDBE4DB346A503983040F892AFDB36830C08492EA40397BF91F415596F9043AA99238EA900316479CE2A5A74CBB01809AF91FA10EC52DD81C24C73D2C601B27204D8BD4A0144F6A9FAD667570CD738F58986E305E58F651E5B081134CA991217B5D1208E705C352B1906FDC94BA47EE23AAB4FA86AE03F0280EDDD32A8C066F60876EFB3D239B67B9D8305898FE5CBF7DD1499F77263B2385AA728F2D4EB3BAE9855788C70811409F6917378811F7BB3894F855E007C2B8885F25A3B9B17CE8F79FBD460465D1F22761D38174A38EC1F4DA7138674137A00DA4C1C258387F8CA3602BBBF8C48B7DDB093237E8B594FD64CD5DF99224A39576DDC06255823FD4A5F031FC18D7FE41792C8E706ED2787085DEF6A4481C8E40FA1EB513014E747630481046BC535744C68961DEAFE44B882C57171B1413FA780A56AA0ECBF819E641D9DEBC8D8A9C4858CDF27C67FAB1ECF4D1DEC8C19075E3C897776537C01A93EB91D5C47EFDE56B32A122E0D9542D0340434E3EAA92A4FB66AC49675537F120801134F327827BC511E31C8502B5209377244BDD028EB30FADF263BBCD06160757D80F4A659FD24D7C5331238A0F939A95DFA6 ss = 230EEA81065392B1A441782E666D14454C21B6692DA93CEB count = 22 seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F pk = 066B794F45B538BE463BBADA64400488B376F71855140F90E892B91312EFCFDC7A41B96902C64C7257B13420FD93FDD1490ABED72BD779A6D81AAB7A557D7DDF5D284F269CAC1E12A9DF8E500EA91CFD57688E4EDAFA43731AFA30781C2EC415AC70B28E913EA4AE6681BA9C3AA524291BA77597D0CDF0D067A6B4A4AC8BD5D9F585981D399E471E8A59E73828B9817E37D888870E3891542E92832628F19F72254EE476BFF5191BB61F6E0623112353B45F47E6C712C4413C4D24643C86B63B898F0AB59D06E7851784F2C0697502CDDCAB39490D88286479AAA0F457C6844417E3FCEBB9360F0D6DD98EF39DD596DCA8EC0A0252680CB438AC6843949357B2CC12A8444BEC56D1965A23087AD2DEDDE17A9B0EBD973EF6180B98C0F340DCBBDCB36F3676F5CEB75B8D0E5998C7452247130011547D2BA59221F205F58318B19CC1EFB6268AE9FE676D9CF88E8FFDCDFA01ADC30174B11C5661FC5F4630EF57829676925BCC0391B0C2F19FEFA895554C3326024718A83F3794404464F4F10F88DE65595A9A07F0C3FD47ADB3FD0F24DA538FF9D202FFA4E021C60650E5690917D1A0E5CB3BC0452021E18A4A11E1E9E7B708641754003E4170DF86622BECC59874157CF75824A2B4701E710CCC93A3ECEEDC541E0D3C19119F06FA75FDAE28C33A8C1F313FCE627C6D43780E7838353E0069CE892FFAA35B1279B3761748609916D494A5FCB1A238342C07CF19CC2AB84D05D0BB5394A9B8142793B1FC29D4257A589B16BFE0EA6E9718D6F72E03D6EA58945E sk = D569B935CE015C85F792F8F7FB0D83C4F53B492959361DD4F75FB764D656450176EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A8788CBD0C65DDFB25BCBA0941A944F63BDDB00066B794F45B538BE463BBADA64400488B376F71855140F90E892B91312EFCFDC7A41B96902C64C7257B13420FD93FDD1490ABED72BD779A6D81AAB7A557D7DDF5D284F269CAC1E12A9DF8E500EA91CFD57688E4EDAFA43731AFA30781C2EC415AC70B28E913EA4AE6681BA9C3AA524291BA77597D0CDF0D067A6B4A4AC8BD5D9F585981D399E471E8A59E73828B9817E37D888870E3891542E92832628F19F72254EE476BFF5191BB61F6E0623112353B45F47E6C712C4413C4D24643C86B63B898F0AB59D06E7851784F2C0697502CDDCAB39490D88286479AAA0F457C6844417E3FCEBB9360F0D6DD98EF39DD596DCA8EC0A0252680CB438AC6843949357B2CC12A8444BEC56D1965A23087AD2DEDDE17A9B0EBD973EF6180B98C0F340DCBBDCB36F3676F5CEB75B8D0E5998C7452247130011547D2BA59221F205F58318B19CC1EFB6268AE9FE676D9CF88E8FFDCDFA01ADC30174B11C5661FC5F4630EF57829676925BCC0391B0C2F19FEFA895554C3326024718A83F3794404464F4F10F88DE65595A9A07F0C3FD47ADB3FD0F24DA538FF9D202FFA4E021C60650E5690917D1A0E5CB3BC0452021E18A4A11E1E9E7B708641754003E4170DF86622BECC59874157CF75824A2B4701E710CCC93A3ECEEDC541E0D3C19119F06FA75FDAE28C33A8C1F313FCE627C6D43780E7838353E0069CE892FFAA35B1279B3761748609916D494A5FCB1A238342C07CF19CC2AB84D05D0BB5394A9B8142793B1FC29D4257A589B16BFE0EA6E9718D6F72E03D6EA58945E ct = 23EDD1860AB1A1288D6A1FB073ECB71898EABE79D009459B30ECCEDB130259250B7945FD2C0DC618BAAAAA65522C230853A6B7436E90B48CC48E18E569F503B0DCA7B9F59336A8A8FCEED8470E990861D4D5DA3C8CD8F20650D1FDD4F1582544696CC0DC2F50C0B2109A884BB93A415D8964A8FED436A4A0C7A7159F752B2368DCF583AEC354F2C51D41CE6B1B5B3AD7D9BF176ED775CEAEAE370289557D2C98E7ED0EE2508EAB98EB50712448A6DF134970F1FACACD27B8C6A7292727345B804E38BF271EB49BEECD19358AB9FCEFF810EDE8D308DAF635C564BD583BA1DBF76E6A3A7F25681AE9F2C3D6C030056A4CA7807BD90E8B9D675CAB7359A0EDEAA4E384BF8C7B031B4EABE3C3A23D425A97393654E7AF6D1AB6AC63E10B5332081487C84F4ABD493965301E86ABCB0DA58F83B63C53F320D113B7ADF8548BFAE2AEAA6B59DF76C55E323634EBCC05E5043CD03353426647918C82BA82961648A1184E44543B52BACCFC6693EB126E520DF0C7B37567E2DBEF44F7A731E02A97572196A895F87BBDFB96E7375157B8D6399D612F7C6A3A667AA87DE1977F2F181799C7F550A200A65E37EAE6D20738E4F1B15C92F6977A66BD2DAC0D54312984705CB6E18251EDC511881B770BCDDEFC1F15694CD0CF0029BCD44CC874BD9CEA02D4997C982C3B7BE623BC376401B8F2F684CC92D8F5A97D46D3A2F776D1758B2F5E80954FF8476A88379070497EB71AE90F841CD7C03CD8A7C2E91FBB5BBEB4F30FB0E8A4887FBAFC05C6401B700BC96D460CACDF191E14FB9A50B3B26F0F758B17D3BC0721FD9624610F8A5EDE5279573F7C5F42E5 ss = 3438C79DDF4C4EA5908DEEA2F7F59124C065CF7B9C5CC245 count = 23 seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D pk = 5948716591E7610B13C33FF3700E77907D713CD732D2A6CDAC9029AD6C02FF7CF461BD627662E5E33DDD9E005B6D4A6B60187E951C5FD35101D1EE9BD58FC1EBA6598E14315E3A4A83643C1DD383E63EFD38921D3A36077C37860A37A36FB351BC4CE1BFCBE6BC80F4A17F43BD7039D4B88131CB71CCFB26BF09DA9A02653F56D2FEBB7450127F0021500DA54F3F4556F7B44A1237E9B55DD4FB5A77022C077756A3855360D831CD8498F6B77E7CF8EDFD1883665ECB0A7A762B86273A9A2B952FEB223D1DE3FEEBC7031D4B8A37AA37C1B46523E4DE38BB7CA69151E19B4F860DD0B1776E59EB39831BAD33726BC67D7088BF89D0B607E48B027A556844673D6F39461F566131534324196F43F881ECB46FF1FF3ABE3AFF2E63392375489BD6401AAF1D47A5B9D69ADF2B3FBF351A90F5BD3228A887C6A857D09BAD6536CDBFB27D2550F440E6D15CDE8156A31E4656C9F01EF7A26E9EDEE25219C0125759EDE12D01896B9C891761454A21A37AA934A738DA144C9CF26A17F10072811A5435F2F7FB4CCA8441EBDBA871E47F73BD54A08BAE7D80172711321CB761E78DC9F79D46DC2BA5689A5CE882844704DB5E6E1D670AC52A2E05B4FB5158E6223F1D2C50DB12963E101A76271CBEA210E4A83C09AEAA4648391DC8AC78F38F245472D96E18C288CA820646309C9CD0273F3B95E4E63C1BD93F4D760CEEB10F97B2DBFC719B85ED8F31BE31F4E78BF4143D7000AAB14C16310CBFCD3EB2149F5A93D1B1C469454DF77E7ED6C2857BE73A8C9D28FE6EC714 sk = 5CBB141C2763425C274F7404FE530D9116E08C33F9F200A20B011CF563A28990FC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D0402378155291D745C4BB3A03D40D4A65330CFDAB005948716591E7610B13C33FF3700E77907D713CD732D2A6CDAC9029AD6C02FF7CF461BD627662E5E33DDD9E005B6D4A6B60187E951C5FD35101D1EE9BD58FC1EBA6598E14315E3A4A83643C1DD383E63EFD38921D3A36077C37860A37A36FB351BC4CE1BFCBE6BC80F4A17F43BD7039D4B88131CB71CCFB26BF09DA9A02653F56D2FEBB7450127F0021500DA54F3F4556F7B44A1237E9B55DD4FB5A77022C077756A3855360D831CD8498F6B77E7CF8EDFD1883665ECB0A7A762B86273A9A2B952FEB223D1DE3FEEBC7031D4B8A37AA37C1B46523E4DE38BB7CA69151E19B4F860DD0B1776E59EB39831BAD33726BC67D7088BF89D0B607E48B027A556844673D6F39461F566131534324196F43F881ECB46FF1FF3ABE3AFF2E63392375489BD6401AAF1D47A5B9D69ADF2B3FBF351A90F5BD3228A887C6A857D09BAD6536CDBFB27D2550F440E6D15CDE8156A31E4656C9F01EF7A26E9EDEE25219C0125759EDE12D01896B9C891761454A21A37AA934A738DA144C9CF26A17F10072811A5435F2F7FB4CCA8441EBDBA871E47F73BD54A08BAE7D80172711321CB761E78DC9F79D46DC2BA5689A5CE882844704DB5E6E1D670AC52A2E05B4FB5158E6223F1D2C50DB12963E101A76271CBEA210E4A83C09AEAA4648391DC8AC78F38F245472D96E18C288CA820646309C9CD0273F3B95E4E63C1BD93F4D760CEEB10F97B2DBFC719B85ED8F31BE31F4E78BF4143D7000AAB14C16310CBFCD3EB2149F5A93D1B1C469454DF77E7ED6C2857BE73A8C9D28FE6EC714 ct = 794BEB82D771F6FE16DB3181DA9F2FE38AFBE619BF5E3426DC23429B4E5493DDAF9FBD925B4345B2D80AB7933385C8049FBE09FE44725A0D1B7495E0F39EC70E29CBC3B0607BC205B97887ED4DC55A01B0B45C93B40F38E045C7671CA84A15A5F3A6F2E980A1EAAF6A3FD42782A8DB7B482027051E29DCD96FD96C05A10F0A0A247301C9E12B780F386D6D8D01011EE86A5C54B98C725CB1AFBE9AE393B62304AD650C15356BBF0D614E7E564ECDFEC6D5BC6C1B87466C21C0048769AF71727CBF8C4E68C4E701451BACDC0DCDABB357DA96A8FAF0CB85C830D0924AD60444075EE07D89B86D2C6A1DC76518C4A12F0A7621B3DE8C5FCDD7CC4DCCF5DB986562EF9BB2D485CB9692688DF2F03EFBE1E5A34FE08C38FB6F7AFD1F40DB315941D9D1C21ACF4C8553FF9A71343A541557FBBE0C5F212B671163F8A415B02737001B90AE999A59F7F35E0128FB0B99A91B92E0CE8023A433A913F03E4101B8501108A4EAB2ACA2B011F19E0D1B19C4092335E59333A7D998234E8A44D7AE434C41E9627D79A6AAC1CD166C297E7BD17338BC32212214FD793B4F05D8A93D555C7207A3C28A2AB54E2EE72993D038C2C0D7F886F06E6757914723E8076767D02D6AABB99A4C439097791AEDDEE7E4C073DF3C87F3F0F45A03873BA04D92C0C2CA3F749AAFA240680C54A71ED1B3DB0795A0D7AF569644F0D23C6660C98FDD3DC9D025799B00F0032EAC1F533D42B6452B16483623D37D27D01B5DBB10F8321CA0A225389F245B0A2157D60A7FCA0008D850B1C08D893BC9FBD3BD662B5F77CBE783403C61E7339D9097731504E4B4F87552FD0ED04E92 ss = 83C993D07323FCACFEAE0465AD9E2AF26408AECE821BB8A7 count = 24 seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 pk = A91C117DB0A567F7526D62D721B89450BCCC6A42A1D1F9D9C708613104EA64D7C04773C0896975FA5FC930398A1CFFFB8DEC230475711C02A24C58BE9D94B2998289D558F881AE02BD7BAE2520864C87E9132926670D24C7F6AA37497C153E5732E039C830E074A1959405F2F25C5AC5BDCCD60CA392C2614C990C2B2862A5BD2CEF08C2B95F76676F38FEB4562006E3D905C736069A96A94749D9627EF4E22DA58B6AC1A1A38ADA6ED6DFE2653DE6E7C55879500F7A6D688DBF2A5CDC779A3CD66315124C2279A4B20CE41A2A060AE5DA9557686CB20CE4CDD6BDAB1FE38449ED26F261CCDAB75C7580404EDAE5F1EF4C6DEA2824C7B9F42BBE73B8C6B34DF109AFEADFB8CD28807BBC1EC2B7FEFF1665F8166E7EF9AAA0CD592C50B959C3BEAC9760FDFAFEDCB63793D4665BEB346891EA8EC1D4C1559D83777B29E6A915033441C358B367136C09ACC0E974470176697DD4A4683C353DCDF4B5586195433E0AAFD6E33D2E139185AB779E095869CF1EFE8CC13A73AA6CB642BAF29A9AC8BECB65CA2128800ABF8EBF3750BC11720604D776D59A65947EBA20CB2286CB70CF7DFA15A40420A213B25A6F2865C89CCBF98B242425250F820713BE9B94BB1C2D005284F61CF014849CCDDD57E5968BD7B08309B2AF093AF2F474421E0AF395B94C0D438A9BFF35E016C820872C5DC449A5F5778A5579D1B1B01B175159C200AE26DF763B35D7104E792748A02544C32659581C305A4F38DA2B6336E0E6EA7857D19F58D0597C4DA35A0BB2478B369A0803BFDF20 sk = 293ABB6D1C207927945417CF84883EF010823E11B487ED55239E466E83696D0CFF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A558FF5DCFF670AB5482D6734C622BDB0E03A91C117DB0A567F7526D62D721B89450BCCC6A42A1D1F9D9C708613104EA64D7C04773C0896975FA5FC930398A1CFFFB8DEC230475711C02A24C58BE9D94B2998289D558F881AE02BD7BAE2520864C87E9132926670D24C7F6AA37497C153E5732E039C830E074A1959405F2F25C5AC5BDCCD60CA392C2614C990C2B2862A5BD2CEF08C2B95F76676F38FEB4562006E3D905C736069A96A94749D9627EF4E22DA58B6AC1A1A38ADA6ED6DFE2653DE6E7C55879500F7A6D688DBF2A5CDC779A3CD66315124C2279A4B20CE41A2A060AE5DA9557686CB20CE4CDD6BDAB1FE38449ED26F261CCDAB75C7580404EDAE5F1EF4C6DEA2824C7B9F42BBE73B8C6B34DF109AFEADFB8CD28807BBC1EC2B7FEFF1665F8166E7EF9AAA0CD592C50B959C3BEAC9760FDFAFEDCB63793D4665BEB346891EA8EC1D4C1559D83777B29E6A915033441C358B367136C09ACC0E974470176697DD4A4683C353DCDF4B5586195433E0AAFD6E33D2E139185AB779E095869CF1EFE8CC13A73AA6CB642BAF29A9AC8BECB65CA2128800ABF8EBF3750BC11720604D776D59A65947EBA20CB2286CB70CF7DFA15A40420A213B25A6F2865C89CCBF98B242425250F820713BE9B94BB1C2D005284F61CF014849CCDDD57E5968BD7B08309B2AF093AF2F474421E0AF395B94C0D438A9BFF35E016C820872C5DC449A5F5778A5579D1B1B01B175159C200AE26DF763B35D7104E792748A02544C32659581C305A4F38DA2B6336E0E6EA7857D19F58D0597C4DA35A0BB2478B369A0803BFDF20 ct = F71DC266D48D667183975F4BFE79FE594837F9126CADB08B2F54EF1BE1F59DFC38B71FCDD8D0F48E2C3DE373271189EF8119C96C32258C6464038EC837C5B22702486D6542D2C35ABA4556F950302B001556DA9C3CCD928BB5DCA3E2A037F2D7A8911BB5CED5FBA09CA0C45E8C9A8E47674EBA4C9D56D703E91522E8D91CC10FB277E89B82D24700B4AB1BAD69BB162AF0F0D425AA6772B9950C06322393D685946FF4468DF652841EB1ED0AF162498825770E6C4DA48F99F1C24E1E3DFC45B114BEF2D17D4E7231608052911B1A82A695E08EA4CA52AD288C7961231007419C432D398F2548560924991AD3E28C11907E634C60461602DA554360CDD1C990817079371EF881E1F239AA17BA0E34709EEF7C655212F3CCFE8C5427437800C8F69922AA1898E1CE2A2E2A94B72D1019D401EFE4BBFA6950491979AAA7B0D01FBC73D42222E8838E293C9913EC1DD01B74F27253701C75DC89947F05B814500A3095BA283D2C3B9B636DE7C25C94CA8E936667C2FEEB9DCE32642F62F87C2BFE88EAB82EB4464B3631C88F766992A3BF75EA47BA2417C8B5F54A216BB1C77EE4D87E640F0C9C1C97B74234844B97F1FA109906D3357A214FCAD790868AC0ECF11168760C83E854796ECC0E11215189857C514083C04A53311074886D078AF6676AE56450C2765E8061E8980CB20184E10179B50F17D620BDD321B8909B561C2FE15B59FDD3A430A24F6CBE22720D317AFC6D8AF5F55383A8E38F92E8FE80463320E6C5AFDA2ABC9233F7C7F31DE46482EA9F0BC7694D75B10CC6C37D4D6BB5298E1A4D418DABF0C12EF3A8A200B6AA6AD1CEB8701C ss = 43C0FB7D80F2D51826D968214A9A2F25E46E060682B283DA count = 25 seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 pk = A30A7C745A1C3137DE697F84F3AE60FD6C069ECE9ED32A43A931AE2487D78BD35453B9BA755AE1004F75E759F5E0FF3CA4D80E7710686DAA6C59B15C954CC47C18514E06341C03CEA29F9F58B6B966E17785D8EF3E3A7B9846E6304290311E0B624E6227A9CCAF064CDF4275B213899951F1BF27E508A7E0FB4B5A6EC0EF700D192E02B8A917774D779A744C9358BCF78F123D88D8BCBDA4264E5FA661C700DE8C23AADF25E4E97E7D7EEDEE0B4E7B52425D1474389B7ECAB96BA059894B32BCD5AB804197DF5921447DD4C3ACD007EABD8AC376873BF048B8CEAF9FE9B21C1946C6A42B25E7694398B7D06CB6A6E3139891639D36F4E75C325FC73B5F7A0BECD4BB5C0F75F316DC287F7D4BEDC87661C4BF247B1535913C7D211F03ED23C2EA8D57961378B75FC2F266B4CEEA79A071C7770A6DBCC2AE78274E089F0E903232C01DAA79D2C4B19ADC20CD2BF9488B82977A8B96BA2F37214A7289CBADAF3BE904879BEB5B75506908370E69DE587010AE6FDFBDB688DC6B1DB63937F9A838F934408D668BDD4C82D366C2B172CF65F9127BA4FF20DC7022CA6C7196F70BC73FC683F6FF4AA0CF6A35F55E287A222CA4B3E7B77A29E6F25CDE46F915084F34E1B050C022B8F11D8CE833093B44D94FD75F1D1D5E4217355C29811C3BF5FDF1AD4229C06B769571023AEC5112B0D830ADB4C999FBF086C1A7976AFB9568940923C5A804DED3BF1AC7A99CCBB8FF73CD399E72C5A6CF6272EE7E4392D4B7C6EF8E4394014C15CD500BD883ABB86751159B3000E202 sk = 74D87C7556F2671F2D666854A4D6E073E69F35421E6E1A428CCCEA49C37F972CE1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141EB99850E03CA7F436DEDA9D54E13BBA0203A30A7C745A1C3137DE697F84F3AE60FD6C069ECE9ED32A43A931AE2487D78BD35453B9BA755AE1004F75E759F5E0FF3CA4D80E7710686DAA6C59B15C954CC47C18514E06341C03CEA29F9F58B6B966E17785D8EF3E3A7B9846E6304290311E0B624E6227A9CCAF064CDF4275B213899951F1BF27E508A7E0FB4B5A6EC0EF700D192E02B8A917774D779A744C9358BCF78F123D88D8BCBDA4264E5FA661C700DE8C23AADF25E4E97E7D7EEDEE0B4E7B52425D1474389B7ECAB96BA059894B32BCD5AB804197DF5921447DD4C3ACD007EABD8AC376873BF048B8CEAF9FE9B21C1946C6A42B25E7694398B7D06CB6A6E3139891639D36F4E75C325FC73B5F7A0BECD4BB5C0F75F316DC287F7D4BEDC87661C4BF247B1535913C7D211F03ED23C2EA8D57961378B75FC2F266B4CEEA79A071C7770A6DBCC2AE78274E089F0E903232C01DAA79D2C4B19ADC20CD2BF9488B82977A8B96BA2F37214A7289CBADAF3BE904879BEB5B75506908370E69DE587010AE6FDFBDB688DC6B1DB63937F9A838F934408D668BDD4C82D366C2B172CF65F9127BA4FF20DC7022CA6C7196F70BC73FC683F6FF4AA0CF6A35F55E287A222CA4B3E7B77A29E6F25CDE46F915084F34E1B050C022B8F11D8CE833093B44D94FD75F1D1D5E4217355C29811C3BF5FDF1AD4229C06B769571023AEC5112B0D830ADB4C999FBF086C1A7976AFB9568940923C5A804DED3BF1AC7A99CCBB8FF73CD399E72C5A6CF6272EE7E4392D4B7C6EF8E4394014C15CD500BD883ABB86751159B3000E202 ct = B8312BA209074667213C95F13F30E60F20E36A13B385E95D8EB0575168536294BE2F54A0D495C83EFB291FC51B941868C4E8C9278AAE9AC9C772BFD56D153FDFEC0EE0E4A23FCF00ECE036AFC8D06CB636050AFF384F33AE196D07929E0BEFED858BF3EF65524BEEE00B5A9C289D74E809D4DD5EC239FF044A7256CCD1CEDEE98E075A57AF3C57DCB431A472607790177F9AFF12DF26869CBD53A55B5571B5EE0745D96EA2B1B0A9476B01368F429BFC41CF359D764F288750975E05FC8F6D7E05A643CA79AE87903DEB51353764403AD381A5C3AF52137EE7C88F572EBD4CC9A0FF98203EA58A7A4C5EE2821868B6AF708FD8E2CF4634ABAF1B17BD18746E0D0C4D343F71C6EA54B46B3914651B64DECCD2E461BA99678A02140DEA7A100C45378E5A89AEA46FC88827FDBF02799B90A0BE0505910239840E5D53F115A0DD5291E80C7C7BEFE02CEAF1F3C942CA9F91C71112B9AAED766CF2E3F6CA1D88B534219D7F73FAADD8BE31648E82C451B277BD2D5F125609BD1EE00B8C7FED7751266E18DFBEFFE3162C24E30FC98409DD77A301322BD85913B83B882B12C119E0849783BDBC38874C5BE783315110C857CF2FB1189E2092A4EEA03F28DE6F58255150F72D6904D3190C328465FF1ACD2EBD54E3DC97BA044EB836FFFE31D3596009D4232BDCC43951E211B731FA392AAE364FCA98D8463F12C9755C115EB59EDFB062504176200FDFDA713CCE4BF7F8275BC0E41428F41272201DA9281D472B4CAAF0C7C05E72F34BEACF68FBD4F08FCAFA44759E0B9ED37E262C42B6B201BC9E9766834A7340ED4E5FB6813957236EE6471413342E ss = EC5599389D13B01A0A09A300F44C5ED7C38BC9E1E1D02FD8 count = 26 seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 pk = 337137C0E36BF4BC3D8C5E4B13C8FDD533F511523D3DC44DE3BCA4AD58F9000C4B4D9E29834BCD528BEF583ACE2B14582F820A225712CE6FF7A1D33A92702720A450348E22989F56D73E21ED0EA5CE21E963433A07831257C1F31860AC568EC5E1831D3D802A8DE861D389F0201AD503C6870FB5BD1E6F90615B511CE1628CA0F4A52A99B948796ECE73626086EF99CEDF1C1C7CC6DCCE45ACB77C95DD96BB0011EAACEEE4CAF305E20260B61A14B3F306FF97F54FE5BA7E9492F843E28A7B0E4A01AAB2B201C9C515FE13D580AFEB32B6B152B647D814F927D7BE6C7286BD6749B26891B1ADE0BC47203B9B0EB3D73066FCBC4FA6E3983A61DF71007C3F9EC5EC690437511C9F90A1B5832DFBB2877A4F2AA7374B3F28B6E74D1F68887CAF50C9FCF374F043907359F5157CDCAFB8083CBC11DF400E6F972F5BF2B4B48D2E7CC45D21F9D614DCF432ACA2DE030FE7DA490FCDD25F2C202E23C5852F41BCD4DE53D787F9E2891836EEBDFAFBE13E02B363C74E7A6309DF6DBC2166C28321F962A2B4D9841576CA4878105B7EF55D3E76B087DDA3A7A5666013B879B41D3E67ADDE7794C277BD055E52DA26514434070CBBA08D02F6E5397FC4677D77C17AF7BF2BC458A2ACDC1556F2C169248A67B077F1881F26302189E3613DD5FEA65F619D22B538C9A20F06C0ECC8B9FEB65422BE4D534E2559267AAA93C6787E54D2591B7E2D0AE32A1A37B42C34C96A93A80FAC2C4340EE19C152130E90C787BF8AB2025561005452BF31A40CFCA066DC6F6728C680160B sk = 013BAB0212D04ECD54B478DAF72748003A25E2CB060BA6CC50BF95C292B8206B9DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA72D4C62F5E42E737D461B40043E6C8A800337137C0E36BF4BC3D8C5E4B13C8FDD533F511523D3DC44DE3BCA4AD58F9000C4B4D9E29834BCD528BEF583ACE2B14582F820A225712CE6FF7A1D33A92702720A450348E22989F56D73E21ED0EA5CE21E963433A07831257C1F31860AC568EC5E1831D3D802A8DE861D389F0201AD503C6870FB5BD1E6F90615B511CE1628CA0F4A52A99B948796ECE73626086EF99CEDF1C1C7CC6DCCE45ACB77C95DD96BB0011EAACEEE4CAF305E20260B61A14B3F306FF97F54FE5BA7E9492F843E28A7B0E4A01AAB2B201C9C515FE13D580AFEB32B6B152B647D814F927D7BE6C7286BD6749B26891B1ADE0BC47203B9B0EB3D73066FCBC4FA6E3983A61DF71007C3F9EC5EC690437511C9F90A1B5832DFBB2877A4F2AA7374B3F28B6E74D1F68887CAF50C9FCF374F043907359F5157CDCAFB8083CBC11DF400E6F972F5BF2B4B48D2E7CC45D21F9D614DCF432ACA2DE030FE7DA490FCDD25F2C202E23C5852F41BCD4DE53D787F9E2891836EEBDFAFBE13E02B363C74E7A6309DF6DBC2166C28321F962A2B4D9841576CA4878105B7EF55D3E76B087DDA3A7A5666013B879B41D3E67ADDE7794C277BD055E52DA26514434070CBBA08D02F6E5397FC4677D77C17AF7BF2BC458A2ACDC1556F2C169248A67B077F1881F26302189E3613DD5FEA65F619D22B538C9A20F06C0ECC8B9FEB65422BE4D534E2559267AAA93C6787E54D2591B7E2D0AE32A1A37B42C34C96A93A80FAC2C4340EE19C152130E90C787BF8AB2025561005452BF31A40CFCA066DC6F6728C680160B ct = E54A7BFD8093567D5E24BC22571AF9AFE29EC09EB4A1394564B23A52071BE16AA9B8E10FBEB4F8B2033BCF286767B018E10EB3DF7454EE757018CD3C4545992C5AD6C6F067021B83282FA6C077DFF64E342C046DDF507C7265B45DFFBC2E4CF40D082793A6D836AFBD47A41157CD88ACCF7E99152E96DD93EBD9B0AE7ADB2CADB90CBD542D449A6C40BCA108FB8CA840135F197187F40371D722904A193D7F27385BBDA84CFD9F41A483E40B7D0B9071D2AE0A94288C66F3D4B3E4424504105061FB8E0B451EF079765A54C4AA3661A33A63D206E4AA61F6CB1F082712F8DB0A29490FE9509A51546FD1857755EF339678BBAC4F3A0F5D1563C1D1E75EC054A74A82C3629D726F22C40A874F93C271C0A2E78D0E4A6F1E16260FFD580B8BDE948722E5EF2FBD062D3466B2BFD16BFC70C607F57D6C3B6A19ABD9561AF6175B7923534E78FCA71435DE22CFAD2ED65BA171265171AAE050A32F718BBDFB8817F4E786EFF4C7C72C4FCDB3E39D00D1F07548566BF30CACEB1B331CCB3B9E54FCF609A96A0ECBA77B63A866074453A23745FE1671F57318D9483EF938F462EC47652284F7E4753A0AD69C1250C2C509AE78AFB9B497920FCDE259874DF1026C651D3827417B64126474865A4E5126AF1A10A5412A675D1C3901D311763C97F89FCB6CA9210026787C49783BAC643924C9E5AFEB8772B32D541E511B7229A3446EF944D00EFA31C4FE5C49F243933ADE3E56572596A79E44A62AB1BE96B31CA6CD12994E95513878B626F42B6609FF06F1BEE57773574DDD60A54CAB328B3820961A57A0780CCB82C8A93B30C192F79AF6678FA21293 ss = 8A7A3BEE504F92B64A285D1E5653889DDD97BAD7DED61CA2 count = 27 seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 pk = 9E75EDDBDC1890B0A0555414C6DA2BCA213E0B84BF2DE8AF36B8610152F823A1D25FDD1EAE35CCC477CA54A31AFBBB9B5387DBD9791756E528B5A2BAF566EE2230077CB030E48E5C0A8ACE5B94A4ED0E63CCEE1F527CAFD85F3B22B58C3390FD8BB4159FDFE8190428DC140BED44B18BB2E3CBC822408A9EAE7F4997822A25080262B2F8077E388F6AE5D2C4B5881C740F1B7F17045A59CBC836B85837A4FC16A7A72DCC4702639608D13C257AE631EB2AEB2F602CF6982B918AF348569D250ADCB7F18CD1BADF86B5050C88B55D692B4ACFD5B13B22A854871E22EACBFD31DA84413CBC8FE94607CCD71BC43F029046100D1D4F85A6A97F677D9C202CEF32F9B8C3D3FFC19921851A95B4C40BEB90084F25E84781C0E82F79563B0CF3F36DE445D99A374B6CB425FE3D9ACC4979385C8A93CAE21E391A0DCE0598D9D387D28F4CA35EE9D3A8E76BA7FC6E037477A61C92EAEB631D599B72B602C0B3B0AFE732EED5E6D5DA87DAC540A6E4F08DEA8EEA630BE82289FC175B8470DDC8AFB9595E1DA37B3BB1A65583A73448B9554EB8080E4ACE899C6473BAA38353A303F4505BE3A38481656BB2BD72F7165EE6C15FE6D308AF834C8AC69ABC4CFA808E13B0F4BF991C6FA47BA6FFEEDA825F1D125DE762637F4DAA03959D2E0DEE8C4E958E2B3140C1E342737E33CE3D0C2931B26162944ECF5F876C703F23F4E830B40174197BBA7DDA2738597947DF82F7AD4C1BEEFAEA5FD142971A4B4AE9DADA2EE24D6EA745596FA10273BFCCB394592666B18D45BB8E6D sk = CCB073C4B90BE0AD746E26FB093B60C70110BD1DCBCDDB566A8CFFB7B3CAF80E71600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB64F8CCD7F321635F438F55A1BBA934FEC029E75EDDBDC1890B0A0555414C6DA2BCA213E0B84BF2DE8AF36B8610152F823A1D25FDD1EAE35CCC477CA54A31AFBBB9B5387DBD9791756E528B5A2BAF566EE2230077CB030E48E5C0A8ACE5B94A4ED0E63CCEE1F527CAFD85F3B22B58C3390FD8BB4159FDFE8190428DC140BED44B18BB2E3CBC822408A9EAE7F4997822A25080262B2F8077E388F6AE5D2C4B5881C740F1B7F17045A59CBC836B85837A4FC16A7A72DCC4702639608D13C257AE631EB2AEB2F602CF6982B918AF348569D250ADCB7F18CD1BADF86B5050C88B55D692B4ACFD5B13B22A854871E22EACBFD31DA84413CBC8FE94607CCD71BC43F029046100D1D4F85A6A97F677D9C202CEF32F9B8C3D3FFC19921851A95B4C40BEB90084F25E84781C0E82F79563B0CF3F36DE445D99A374B6CB425FE3D9ACC4979385C8A93CAE21E391A0DCE0598D9D387D28F4CA35EE9D3A8E76BA7FC6E037477A61C92EAEB631D599B72B602C0B3B0AFE732EED5E6D5DA87DAC540A6E4F08DEA8EEA630BE82289FC175B8470DDC8AFB9595E1DA37B3BB1A65583A73448B9554EB8080E4ACE899C6473BAA38353A303F4505BE3A38481656BB2BD72F7165EE6C15FE6D308AF834C8AC69ABC4CFA808E13B0F4BF991C6FA47BA6FFEEDA825F1D125DE762637F4DAA03959D2E0DEE8C4E958E2B3140C1E342737E33CE3D0C2931B26162944ECF5F876C703F23F4E830B40174197BBA7DDA2738597947DF82F7AD4C1BEEFAEA5FD142971A4B4AE9DADA2EE24D6EA745596FA10273BFCCB394592666B18D45BB8E6D ct = 9A4211568817FB5C61C4079D9E798E36C44C1FD1960729B8E0F544CB41038857F5B9BF37D4C62064991F4E7ADE7F8E8D2B6864B3B06F2A3BB640ABEE6BF0672B05654046F68172BD13112EC38A8F69AE51D1766E46ECEEF815897F7E9102D90AE5909E5C0343A35A50A4699C55EB5A63F7AC108449F45183EFAB69DAF81B9ED22687DE36867200E80516031097868533DA879504C356640994859E5EF936515467A4685034459AD93D7C425CF1AE3511EE6DF8F4BDCD03D394454F1B0751396BB406B232DC4003E771316B41124232A6DABB6D79A6481B669647DF652B7297BB3CB4539FBCA61BD4793E56AE87EC2D881B3AB3492965DE845C8CBE44D0716E50EA5F30ED53AE68DE707FC0BC31E93A14F6499EBC1D78A534F4563CB17CF17EFBA8F2DD3DA006894B4DC315D43D906D58E217D9BC9890648561C6BBFFB4071F0AD9BF8CD33276CEEFD45A3C30FAE80522F24B646C9EFB3D9C67001C17BEDBFCBD67C842C878C081E306ACE3C2761E7653AB54BB597C317930300CCE34D78ED5ED4A2284947A08C21AD104DC6AE44F30254B7E4D9C9BEAE87E0168D35C5AABD57A8D65384DB80DEE97047850E32BB46C8B7ADCFC7866EB780EC8B0788406213737DB763FB0BD50379E47387E858DC77872980E4DB6C335C2F899541F0F88489CA413D9E097643B2DEF6AD3939BFAF573304C44E1AA48F8B24648248BFB40C6661EDD8D6631D15D329DAB67CAED1059AD31722093164780A237BE405E9A91FACC8538162F0CDA86548DBE51D24ABFD3237940149D69E327DA5ABCC3FCC9F6B67DEA727892B88FFC47E42EB5DB6208F0090FEE73312E ss = BA0D62BB991131EFB1430398AC5C2C2421A2ED8302B0D50F count = 28 seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 pk = 6ADAD2D9FDFB71355AC2CF01CB17ABAD58C164EF6D85C1F4F144CBD1E09A112978FC700718BA610D04505E4D51A8135F6CE586C6B89652E047316EDB8402E969587F8F85A05DB95C4D9AD5BA66E3850701F7A61787FEAF992FF18B5A330668977F46403E74CC7524D5206587AC92A748EBEF78A4F91B8C22C410CA656F4DB4B2843CE937A7DD1346DCFAF769D6E911318DF65B41EF73957A8776CC2A8EF0551854AB774C632F6D6E110CD445CECF533024C458172CC2693EA8350C683D14E84CCC8B8BD00B810C2BF6B89FF75165F87DE288A9AAD455C3050FA4D4556F6A9503FDF31F63FAE89032583A6CC6BCD2C19A61CA21AED49BBE9CA82507319241EBDEABB92C6B67C8A22DE3F9720C92A6149BAEF0977CA1B4AEA44462E58B309251A3DCB8C3D60818573AB72ED486D977BD0D18CD9AD5C67ACB10236ECAA3518F66D64AD6C6846FC3840401980FAA09DFBB61E0746CD430E23D9179A0275FD57F4A5536A7FB2B915D4F2DF1E093A7EFE195A7BE074650E30710414588C3247EBCB757B39D47F4A30A99A8E1C000A31A6A7AC0B773894AE58BF25DF5C61A5E6C6EC3C4CEC8ADBDABAE8C9DD14C566481168C673E677E6D5C58D21FDC1730F825600ACAF9304576F9C7F1435E325EDEF36266DE669463EE7522576E64EF3BEA194535D8D80B72D63104899188CAC8F48F2F1E8290B78729616ED0BF59F10969D1431917B465149C04B68140E51B3B120E555C6DBB9A683FD88FE06D939F8AC4E6CA436CFAE078BE1DED5231CD5B89E922D569541BB4991D sk = 2E889F44E28901E9AC7CA6B2FFFCB124C8979401B17064D7E1D51A7E3C3ADBFA0E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F449F48E7A944F02FA15EAF23A543AFAEFC036ADAD2D9FDFB71355AC2CF01CB17ABAD58C164EF6D85C1F4F144CBD1E09A112978FC700718BA610D04505E4D51A8135F6CE586C6B89652E047316EDB8402E969587F8F85A05DB95C4D9AD5BA66E3850701F7A61787FEAF992FF18B5A330668977F46403E74CC7524D5206587AC92A748EBEF78A4F91B8C22C410CA656F4DB4B2843CE937A7DD1346DCFAF769D6E911318DF65B41EF73957A8776CC2A8EF0551854AB774C632F6D6E110CD445CECF533024C458172CC2693EA8350C683D14E84CCC8B8BD00B810C2BF6B89FF75165F87DE288A9AAD455C3050FA4D4556F6A9503FDF31F63FAE89032583A6CC6BCD2C19A61CA21AED49BBE9CA82507319241EBDEABB92C6B67C8A22DE3F9720C92A6149BAEF0977CA1B4AEA44462E58B309251A3DCB8C3D60818573AB72ED486D977BD0D18CD9AD5C67ACB10236ECAA3518F66D64AD6C6846FC3840401980FAA09DFBB61E0746CD430E23D9179A0275FD57F4A5536A7FB2B915D4F2DF1E093A7EFE195A7BE074650E30710414588C3247EBCB757B39D47F4A30A99A8E1C000A31A6A7AC0B773894AE58BF25DF5C61A5E6C6EC3C4CEC8ADBDABAE8C9DD14C566481168C673E677E6D5C58D21FDC1730F825600ACAF9304576F9C7F1435E325EDEF36266DE669463EE7522576E64EF3BEA194535D8D80B72D63104899188CAC8F48F2F1E8290B78729616ED0BF59F10969D1431917B465149C04B68140E51B3B120E555C6DBB9A683FD88FE06D939F8AC4E6CA436CFAE078BE1DED5231CD5B89E922D569541BB4991D ct = 48F7A877456D6D5AA4BE8CAC3B04C785A53E76C88F5631251581B579CB3A84B50249572B4F5E16408431BAE70B8B921C55F4303CD0AE25534687E042CBE81FB0E59850D8F84811A474BC70714C7BBF9FFF4812C14C3792A1AF1182327F6599A919CADC8CA347A3B4845F3F4A184E3A01A84F39211CD191D17105B97EC7B2641A9489D75995D8F012064B82C8E0BD45698F9CA73A847AF2712FF3BAB21EC8FF0B402EDC0C65C31E51297F454C692589464B3C43C54E258BE0FA7E6356F57B07E38C46CB4AD2E7462E0865E4696672AEC0A75ABF94671FA47C5E48A82CAFDB27CFAE551BE3AD343C6C2F3BD3658BD31117607F2DC70ACA4A35FFA343BC0B574E4392DF279C7873C1F88DE81726B3B17FB3492C76D627182561094355B7EC0A2519AA0FFD959909D025D46DD8540DA282846EBB99A8B783DBF1A00CDA35EE16DCA4C71606CE0525573BC8253BAB77796C3A083201E53B3B83227DAA4E28A078CADF4EBEB49CEFA647A2DA33EA64A9F87DF091B0AB0DB90D67576204338257516CF9688E7ECCD21F9B193A9995E39B8E93F915ACF35E420A95B12992324097D0E89CAE8880015AC3E26C4F186296DF981C8EAF9C0EE0DAC56A17AF1C8D691537389EAA3DA50CC221A46570B3DB8E10E5259DF2821C8C5A5DF04851CCE0AB58FB08D7FFBE168D65229ABD733D0C8CED58273904F870B03D1745FEF7B7FECDC8114017337633BBF61CE4956EBA9E8B9C0A0E275AC12B2E9CC348F08C54B7EF3EA931439D2F81B45BBC2E1147BE1F934AE263A82C6A932AB58D3780D48A04C56BA6393A7CA5ACB2049E671AECB4F5070EE6CE428E233F0E ss = 224834E943F7E7E5237DD6CB38BE151348C83EFEF1B0704B count = 29 seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 pk = 7AA7ECE0FE2C84ADE8F7F52D7ED4B6D09D20491A075BBBA39882290CB9C0C9C4F8D4BF397C60F34E5732139CC7A4C5419501F989795AD34505FB4372F845BAA6013008FD4032AE3FBE5EA5C341C0028748E8D8AE698D85EF6F3DC8C69A4E2557EB73B46379548CD51ACB0B3E3152678F4B19FDF9702011364830C437159D3BB738B6F03849D0E2587B825527919F0E274F7F609DC2244F1A967E7E316E602B5ADC1F4401E4C35E6A8730D1AA6B3BF5D8EB7CA15BBDB1060076649C04FED4A2BD73FE31B850B87018340F85BB71A7A5A411121A285E8AB98812CBF8DFBB1B23BB9886D9FED4088B294234E38BE5F488F61EA4E84C97A71C356FE1DFA65768972D93124CC011BA1AC8C2E56A0A5D22EF2CF6290D15AA336B73954297E63076034267B4C5858BB4FC7DF9910C0C4E5A96BB3271E978C964E3A6929AE536F1DEB75AE12073EA81F71C85713D3960138B6B7EBB9B5CE7A5800BD48E56289DFF10E7711E10898FE1736A49CC790F3B6225F2A2AE5E97C2A174815973D19377F3B86F5D7C3207494D91C7BF2B076C7BA3E67B61F5F4F46F7F9354A66DD4FDF4D1E68316FD41B504677865DD7AFA55849D7E87A7B0CBC02030BC19323245B4CF1904D771B5B02CE921120EDEE47A29BEDFCE1B7544F7FA71B0208C668F402DC93B4AE9CA7E9D7069B7E07795CFA2E88D668DD52D091BFB8F6692A99FB305D0EC7AF638FC41E02D0C71399B916DAD94B68874583B0B707435DFEF4B6B7978B887583938BB0B92A0349BDDC388E9CD98BE41FB45224A12163B sk = 174AAA36410566DC15A5E62874218D7ABDDE0B2C0F30D877BB80B1ABD5F5A0A450A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C4ED186396657F35AA3708568C07E71712007AA7ECE0FE2C84ADE8F7F52D7ED4B6D09D20491A075BBBA39882290CB9C0C9C4F8D4BF397C60F34E5732139CC7A4C5419501F989795AD34505FB4372F845BAA6013008FD4032AE3FBE5EA5C341C0028748E8D8AE698D85EF6F3DC8C69A4E2557EB73B46379548CD51ACB0B3E3152678F4B19FDF9702011364830C437159D3BB738B6F03849D0E2587B825527919F0E274F7F609DC2244F1A967E7E316E602B5ADC1F4401E4C35E6A8730D1AA6B3BF5D8EB7CA15BBDB1060076649C04FED4A2BD73FE31B850B87018340F85BB71A7A5A411121A285E8AB98812CBF8DFBB1B23BB9886D9FED4088B294234E38BE5F488F61EA4E84C97A71C356FE1DFA65768972D93124CC011BA1AC8C2E56A0A5D22EF2CF6290D15AA336B73954297E63076034267B4C5858BB4FC7DF9910C0C4E5A96BB3271E978C964E3A6929AE536F1DEB75AE12073EA81F71C85713D3960138B6B7EBB9B5CE7A5800BD48E56289DFF10E7711E10898FE1736A49CC790F3B6225F2A2AE5E97C2A174815973D19377F3B86F5D7C3207494D91C7BF2B076C7BA3E67B61F5F4F46F7F9354A66DD4FDF4D1E68316FD41B504677865DD7AFA55849D7E87A7B0CBC02030BC19323245B4CF1904D771B5B02CE921120EDEE47A29BEDFCE1B7544F7FA71B0208C668F402DC93B4AE9CA7E9D7069B7E07795CFA2E88D668DD52D091BFB8F6692A99FB305D0EC7AF638FC41E02D0C71399B916DAD94B68874583B0B707435DFEF4B6B7978B887583938BB0B92A0349BDDC388E9CD98BE41FB45224A12163B ct = 4A5DBF6788130B275178DAB03F3E35BA8C6F2406EC606471A98805976AE11A978B0420CD76E223DAAB491A958FA09B056ED55765EBB8109CD328119E2DD948649464225028BD4D1D2D9157593C779D5E785BDEE207127808FB232DE6815BA3EEBF6E08C7192132D632709EC5029241C33E5554F2B825992B554C3D6FA312DEC9C6FE90915F1D7471B985D988DF61AF7891553D50419A145ECB6BFC6E38F8AE362C9A95FCEADB6D6210B368623CEFF5CFBB3B331F607A4D673353953E11FCC2385434195D3F2E18AA491F516415CA12AAE8770B4ABC7C480016F73084C7DD4B8B56ECABE929E96F2D2C10D9A94C1AB45FD0353DEAEB2BBCE5F2B163C442D6842ECA28C92947D6A24A6D597BE137DFE6AFF51B12C88466AE6D6E360F7CB39C294F969C79F13006B100B94C98F9C11DF7068D7DE20996782EB55C7D69678717894159E356E670B9732BDED2BD502B3806EF6F962E2591D1F692E1F253BD00BEA085BA1E3CA7CBB7175A28E88CA3633C4EDD5C789C901F6E61002506D7E3D8E6F1D7D8BAD4058648A98425B6FF5FED90BBB60AB06483BD70A2863015E9CC11D3F278CC28CFD117F622C7165A87203EA4D803778F37CCDAD297DEDC400D15FA5475C1B6874F17854FFB10043309489D45432971B9A7A3FF68AF4A8E6D1FEC771467574B51F53107867DC2F0FB806DA06FCBAB93AA8AE530FF29AB43C7CCA5C9C7B428BBB4179193EC4E8FA7526422BAF286CD1FC0652AFEDE92EDE12CF4152DA43C8492875F07DA9171336CB84B713883DF318A5D580B57C1E464F3CF48953C60AB83991E4BCD1F54C44D92EC073702FD39DB1F85AE86 ss = 56DFA28E265939EC9AD4980585429EEACC68DF18C2EAF892 count = 30 seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA pk = E8EA7D979396788910C8F06294BA892191A988FFD792E6C542A159018E100301AB9E568A45C8F475FFC86E41C0C675EB0F59150DCF5F1D510F92CD54CA0BA2AFB8D5E8BEE32600E7FFAB16AC2321C1DCF5F65CA1100D0A88581152B5F76917FFBCDAE3245940222E9C21862E911861D168F162BE507171C643CF4FF26D0DCB17FAFEBF028448A46EC978E4124B4AF7A23A9665F34E0E87ACEDEB11AD2FDC3BC524B19D45212E54A078FFC8C38E4248E9339FEACCE2E8BC22F376F3021288688230181EF0F422780D0563446D9F4193779D6B326BFABAF18E7DC3AD0B974AEF59AAB5242F724C57B88C6671EBC1F33058911ECAC40091E4C7C5146DF0BE0D6A9931400CE41A9BCD3F0AE02B826CE81E7E0B4F23BD81B0E66BCE541EED245AAB2D738F9997450A53A8EA0D32ECDA9D078100F57EFF4F68D496BD012E009D2FC4AF6BCAF782C6395AA3574576829E773B11C9F15A4D7EADB35EFB16945AE85AC7CEC246DE7B5214E744CBB1D5DB3639271FAAFA391EA40BE727831243D9DD3510DEE1AE5F8A491506F5F377DD9125E8D2C679A8A2B1A008F0321A01D9AD7A8660E6BB3B1BEC56895ABE86945DA041AA0683FD645E53AEBB6E4AD56D88A499CA71400458D1781872444CCCB20FFFA156056A6523E1B2C9322C127B1A565282850EEF24287ECBCF6EBA7A38EF942376FBADF40E0261DC6DB5B9A674784FB006329543AA8BAE5AE6098757B4648231AD0C762F3FA5726567F40A91963B8AEB4C0764BB56CC58B5FB9BE48E65C7D6A386298ED3240C626C sk = 351FE4313E2DA7FAC83D509F3103CAF7B4C64A4D458FEFDF636785AC361A1390F072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5EDA0FAC43B0E0050838815746054B9C5701E8EA7D979396788910C8F06294BA892191A988FFD792E6C542A159018E100301AB9E568A45C8F475FFC86E41C0C675EB0F59150DCF5F1D510F92CD54CA0BA2AFB8D5E8BEE32600E7FFAB16AC2321C1DCF5F65CA1100D0A88581152B5F76917FFBCDAE3245940222E9C21862E911861D168F162BE507171C643CF4FF26D0DCB17FAFEBF028448A46EC978E4124B4AF7A23A9665F34E0E87ACEDEB11AD2FDC3BC524B19D45212E54A078FFC8C38E4248E9339FEACCE2E8BC22F376F3021288688230181EF0F422780D0563446D9F4193779D6B326BFABAF18E7DC3AD0B974AEF59AAB5242F724C57B88C6671EBC1F33058911ECAC40091E4C7C5146DF0BE0D6A9931400CE41A9BCD3F0AE02B826CE81E7E0B4F23BD81B0E66BCE541EED245AAB2D738F9997450A53A8EA0D32ECDA9D078100F57EFF4F68D496BD012E009D2FC4AF6BCAF782C6395AA3574576829E773B11C9F15A4D7EADB35EFB16945AE85AC7CEC246DE7B5214E744CBB1D5DB3639271FAAFA391EA40BE727831243D9DD3510DEE1AE5F8A491506F5F377DD9125E8D2C679A8A2B1A008F0321A01D9AD7A8660E6BB3B1BEC56895ABE86945DA041AA0683FD645E53AEBB6E4AD56D88A499CA71400458D1781872444CCCB20FFFA156056A6523E1B2C9322C127B1A565282850EEF24287ECBCF6EBA7A38EF942376FBADF40E0261DC6DB5B9A674784FB006329543AA8BAE5AE6098757B4648231AD0C762F3FA5726567F40A91963B8AEB4C0764BB56CC58B5FB9BE48E65C7D6A386298ED3240C626C ct = D17981E2B5D9C56015E26B725D2EF39DC274FF275A237761CEB4853E6706B6820EAA80EC31A515B64E3EA1771C6BCF4751972CADA7D1EB0A679CB2D09F9BB007B3B8D1F8FF770F330CAC68C882B96ADAA35DC427FAB76135D7925050EA2FA1FA026895C844DACA330F8A85A193252D8E6C75F85F7E6A2C2EEAF0D283908AB0D9DC947B192035061C5CAFB3F5F70417D546F7998FB1DA041951A872CE26318B54697BD0C40CF455CAA3C1C744391B0C9F5E198B22B38E1BC22AF9C04BE98723F16F255C368762A0D731159E8D1834D0DB38D8609ABC05A9BDA40A74F0E148C8542E66CFFDE67E7F9B8BC2763892756A569874440D885B175C53C41F74123BDAA37F4E2B22CB6764A313FE314D9DC4BB07F83F3E721FD15F8C1D52E4FF4E2AE5DE258276B1E2CC14591DFA673170EDB3D28F6C03A341D325F5F6A388D334EB879DBBC4F157A69E3E7A33FD7738AD9DF88B27C4AEDABCE90AE66E3896B3285C3140664A13EB1F8D41637585CA54CF35B0A9226C21B69268193DC2E7D6BA89F32D6B392DB56B7C7514EDAC125704419303DA86ACF9356C6D4A9BC7C9A7D7764F3BE8E4BE9B4303F27D67C5C2A41629A0B1BBED2EE9D385ADBE6F42841FBA46EC002C87794564C7A1DC26F94CA6099BCB0D4D3E85B02BF43482B70DCA6985B4304498D5735B72D5CD840436D96426EB5A5186A78D2442E5DB6FDF5D2C6A3F85C3DEC21BC829377C8B7C94CE7C8419505836821C5D30B9940E8D5DC583FC8B1CF82A758D0C708D2B67B2C55B051925FFF2FF1AF96CCC6A0F6EC654FF2E695BE4A1F5B523E683698308527CE25F0D1368A3C5140B6E12FB ss = 92C8E1B28C0C19565ED8481E9C7E3B6CDB1A57668CE12451 count = 31 seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 pk = BB329BC12EB49CAE2F2D4D8106A60100D17E8D0F452387B8F9385380CFD0744EA30A8FEDDC5F0A9C38A79935FF33EF7ECA52260FAEA4619BCDE768CC476FA5E7B85F0AB187E2B2ACBEBA02AF3A0A8C5D74C60EF9E9682A2DF21F9345A927FCCD2A0B2C116A0C140D9B44EDAC1BAA4306F668E6DD657235C02059E380C206758992F354A652BDCB8EA773C76A575C7A8F4D2143FAB64A33E8914F5825CC06B0FABCA71F6CCACA2DD9B5A48F78E15E9E9E7ED4CC3129119243C47706287DD52305583E4A18792583B900F720A2E99853D2FDC88B51A5308DAF88A62079E95DC0B6D1502A340CE4DD95D8AA507636E01007D49821557E6EC3B2DA138D127D6A25DC519B1AEBF73516555340372EC46618C1BC422E97612F1C944B222CB74DF40A6A1BB3A8B2141241FA4EE56EB016FDC7641D3A3C03FC9222D82B7A2B3E58E901C9BC0B6691CD50A20ED25A8FB7A3938CC2C2AAA7D844F7647F6B4024E9917B9ECCEA7E223A9639E0A952AF99763916CF70DC913AEDB520402EEF7E8C4C36B761F003280ED2019391DB8B051FB02D2A275685E5BB4273F274C406C2F323A9B6B2A2967DCFA33866BFCFBE7971FB2592B604086AA95D70681C57F2C92B7ABAD33152DD8F4390E595FCCA6AD2224B70EE9ED6300ED25ECC3B9F4C8C57B93F520B8FAC56ECAD4F855B2D220D8E2CE761DEAE3DFA11975664B6F4E38FC86A1A4ED395B81B20A9A8DBB01A369825519414968468E2271AFFD243F63E26F8981FD13281F9841FB83CE4C6F3FF59AA629CED1C49A383ADBF5A sk = 9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6733E62F799068AD23D5A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DDAD03868EAFC78673F68DF9B1128BCCB600BB329BC12EB49CAE2F2D4D8106A60100D17E8D0F452387B8F9385380CFD0744EA30A8FEDDC5F0A9C38A79935FF33EF7ECA52260FAEA4619BCDE768CC476FA5E7B85F0AB187E2B2ACBEBA02AF3A0A8C5D74C60EF9E9682A2DF21F9345A927FCCD2A0B2C116A0C140D9B44EDAC1BAA4306F668E6DD657235C02059E380C206758992F354A652BDCB8EA773C76A575C7A8F4D2143FAB64A33E8914F5825CC06B0FABCA71F6CCACA2DD9B5A48F78E15E9E9E7ED4CC3129119243C47706287DD52305583E4A18792583B900F720A2E99853D2FDC88B51A5308DAF88A62079E95DC0B6D1502A340CE4DD95D8AA507636E01007D49821557E6EC3B2DA138D127D6A25DC519B1AEBF73516555340372EC46618C1BC422E97612F1C944B222CB74DF40A6A1BB3A8B2141241FA4EE56EB016FDC7641D3A3C03FC9222D82B7A2B3E58E901C9BC0B6691CD50A20ED25A8FB7A3938CC2C2AAA7D844F7647F6B4024E9917B9ECCEA7E223A9639E0A952AF99763916CF70DC913AEDB520402EEF7E8C4C36B761F003280ED2019391DB8B051FB02D2A275685E5BB4273F274C406C2F323A9B6B2A2967DCFA33866BFCFBE7971FB2592B604086AA95D70681C57F2C92B7ABAD33152DD8F4390E595FCCA6AD2224B70EE9ED6300ED25ECC3B9F4C8C57B93F520B8FAC56ECAD4F855B2D220D8E2CE761DEAE3DFA11975664B6F4E38FC86A1A4ED395B81B20A9A8DBB01A369825519414968468E2271AFFD243F63E26F8981FD13281F9841FB83CE4C6F3FF59AA629CED1C49A383ADBF5A ct = 6C742DD1A3651F60B4546A55A87592403F889CEA3FA62AEA8F5CEAA6D5781AA0EA5DCF97F77A8728B50980CFF9BEC8CCBBF1A2A87B10138055F3AC961C560B16A5D20BFF2852504BD33597DA83B3E4B2B1FABA4F087CF2764DE1933CF0315185D896D3E8D09022A98EE09E18C570BBF541EA0D5E266AA9ABAADC29EB9ED632AB2E9871C148675D9305CCD3FAB16FEA45E291E4EE21159A72D7AC2DF02A06D8A47A687636369764A6BEBCF893503E1426BDBD77D6BA5152AE91C90B28030186335742208B87927889E6BFC41D794B09A6ACA5047AF2F1293BB5FEFA929BA8352D28C04B21DC0AB1CED4FDFC31158536D99920FB77B7D68F5AA35462E9795E9872348C9ABC1A239CF60C8484A24679A0D41DD6D6DA6437BF456B2ED25A781CEE0E86834855167CA1172B45D685F485D689942479254D1E4DC4FA01B7D4E1B311A4A27AEC6F33B76A302AB4BC9F5E45E0CEA4E3C08F70756EDE9685F48291948663058AC82D0010C3612058F660A1A46B7922B2B6D712551245290659BF115CA49436AC9A7146E231DC4526A266A9CCBF5C90E01332EC971AC9F73918FC645C4BC8DDAA48EDFF8046AE23B5BEB717FB2EA0B4ECA95932A966B5A283FB6A0EDB28A5112DFBAF37426E53AB1F283986E5813D73A4118B215C840C4183A461F370D7247DC63D664BB0414D669ADCF7C76F16CE632751AC35D7F2B2D14072BF64D0A847110B676FBF64AFF43C7FDA2C98A4EA1F90B2157FF85B3CA3123638AFCAA257AA20015FE2596C775EE98BB8F69AA4F5C1C97B37567E7876395C1B6872B5B45B54744161D644E41F3BA6AB7C77F6B92D1806C0BE18 ss = 4E17498F8015110E640AFADF74959238FF1345AB26101DFF count = 32 seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 pk = DB64F4424CB9E13D49C7FDF53C98EEF30A85C31BEFF21089D5B7C8EA3AFB51CBC258C0C4B11C7EB9A4CA72148B530D5BD4520F9A9D4616E0D20F57EE516E7D9524BE8110A9BB78558520A35C7C7DE33D48F280262ED512C5BC4849B447070EAB2D5A259174ECB81A29A3CD174583ECDCD0846E3EF6DD6D849B9FA14D88D775DE98CA121F2EFC8FB0E75C64B6BF1F039B05331C38F9DFBCE467F0BA81EEA8004CC30BEFAD6E32E3309A9353FBA9085EBBD5770B8ED9BB9075011B1C6B0ED149AC726F78129F5EB7CB9FC9788A4F6C5423E9745B6B2E5DBE1E813E826A6540319B7D8AC5BD8DB14A2F55F418B3829389F1733C75981D8E1E0389E97B09FFF80BAE84D0C655722304ACA3D5282211EBEBE45EDCC82104593632F3294B6564EB73D5035B912C5080BE5EE40E753515C677B7DD9828D14A3064DF40A2A50A6F2E4A24C94871E9ECA4D050B394C89F7B192ACB8EDE0A1239C37CB60F2805E299AECB7BB8F7B5BFF383D0318DDB896CFE2C4F058913B26DAFD3F24A58F053302C800CCBCC6F4D301A2C22A56805293141AF738EB3CB022A5D764D27472F9BE55E6EDD4A829825815E5D99687C966E4E5AC1E3A738C4DCD432E74F9A47714294ED088C2112BA77CA49A97BDCF1A44379FE7B45350EF5EDA0633B8F84152025509A718639E588FFCD74467F0DB4BC3A6739697CD0315BA83E7150F2CDE521A276B652BCFE99697217DB2EB98FC8E8E138F7F2C0430DC798E4BCD6FFB8C0F50F3071A64D381D40D84EAE3BA9E4AC08ADA0C29B84B8A559EF5A sk = D8B907B34D152FF8603B73051F772DAA71EB902C47B7E2F070508269D757E02E36B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA28A947AF66FBDDFF91068DB66AAC4154000DB64F4424CB9E13D49C7FDF53C98EEF30A85C31BEFF21089D5B7C8EA3AFB51CBC258C0C4B11C7EB9A4CA72148B530D5BD4520F9A9D4616E0D20F57EE516E7D9524BE8110A9BB78558520A35C7C7DE33D48F280262ED512C5BC4849B447070EAB2D5A259174ECB81A29A3CD174583ECDCD0846E3EF6DD6D849B9FA14D88D775DE98CA121F2EFC8FB0E75C64B6BF1F039B05331C38F9DFBCE467F0BA81EEA8004CC30BEFAD6E32E3309A9353FBA9085EBBD5770B8ED9BB9075011B1C6B0ED149AC726F78129F5EB7CB9FC9788A4F6C5423E9745B6B2E5DBE1E813E826A6540319B7D8AC5BD8DB14A2F55F418B3829389F1733C75981D8E1E0389E97B09FFF80BAE84D0C655722304ACA3D5282211EBEBE45EDCC82104593632F3294B6564EB73D5035B912C5080BE5EE40E753515C677B7DD9828D14A3064DF40A2A50A6F2E4A24C94871E9ECA4D050B394C89F7B192ACB8EDE0A1239C37CB60F2805E299AECB7BB8F7B5BFF383D0318DDB896CFE2C4F058913B26DAFD3F24A58F053302C800CCBCC6F4D301A2C22A56805293141AF738EB3CB022A5D764D27472F9BE55E6EDD4A829825815E5D99687C966E4E5AC1E3A738C4DCD432E74F9A47714294ED088C2112BA77CA49A97BDCF1A44379FE7B45350EF5EDA0633B8F84152025509A718639E588FFCD74467F0DB4BC3A6739697CD0315BA83E7150F2CDE521A276B652BCFE99697217DB2EB98FC8E8E138F7F2C0430DC798E4BCD6FFB8C0F50F3071A64D381D40D84EAE3BA9E4AC08ADA0C29B84B8A559EF5A ct = 495135BE176B606A2BC81D026C5BB79560902AA7286ECEBB9EBDEAE456741173BB718B1B85277298B765AF685DEE9A5E759841D1B9E6E56A45B6027B505724C8DF701F9C9E16ECC6E41655B3ED98C53377CD71EF941392931B5FC5D7E22577B6539B5ACDEDE43FA35E8DFAD9BD28782F70DEFDCE2E58C899D234C0A69F0607BD59676079A2DE1FD79122FE307285C8DF1D84DCFF92C0C75CB95991DEEEDEB9231D7914E2A1227CBE3AF70DB5E89E208C7F32516F06C14A67EB04705CE160061AFA192672D1BD59B4152D5A8A854AB501A9FBBD55FD9D199ED55061EEF4622EBBF783685FD4BCCAAC39E8CCBB90A9168C54B2F447ACE701765F45C7E2960674FCAD26EF12102B5F9D8AC57F1403C5BBBAA67B8D1ED6C7A5BE22479AD14BF7360AC3837799BBCBDA7785FC4EDC0C67EFE30EC7E636F5A3AB2B15EB050CE4CB81C886FFACACBEE09F926915A9A80D403754F5B4627EC6943CB786A21EA86588D199B528C87BEB384490979E4DE4E9802C869EBB5DDF7ADE683C76629A19AE72F8B8C13D246D41F9D49FAB97DD6FF9F7EBA9AFA86EB3D534B7F415FB639512B6F32E30B073C6AD107E7D6617CBA1FFC7143E2B6C6BC501DBF0706DCA44ACC7D86BD1BA37EC34A9CB3DBDD45C6EF817C8EFE8862E075A8D1575EF55758B6B4707BD9DE9AE929652EB1C1AF3EF3ACF56930F31CB8EA08C075F51A621DE806F54A26A70AD0FCD93ACA807D5C9373126B6CFC548DA1D1F67C3EE154CDA82F64A780604ADC7AA2A53813B73F54F1A9F995E5D149574B1BE4EDF837DBFDDE7FAD612D9BBA91976BD8D124F16ACADD8AA6F4CCF0E652BBE5305 ss = 0741F7257C3097E2C0095F0FF18D9ED80F50B9BDCE406494 count = 33 seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 pk = E42E57801904C54DA604276410E59336E8E2BBD8C73D736E9DC332545C3954115648E9E3ED97452653098F93D02E2DA0B347662CFB06C82C0EB8D501897488F1BD5785B6D5CF5F0B79FD1438BD8BCD8D33D962F292DDE285953209E98241551324D44241EA1CE22EEE09DF8EE177D75EDF478A79E905ED5E1CB67EA341302EB2003EE0A91F77C45884A74377F95BF88A3E30A159695E1D3B5BB319C803D935EE6EEBBBA06BBCD7DA32D06627B5D80F42152B856B12952E86066D9C5C039B6B6BCA6FFA39C769BE98459D73A4DFAAAF31CF1B8076A7822B5E30926C6D0E5211B66B3D518C9823C25C2910461A44F0BD3CAA31EA45E8DCBD516A30DAE550655FFF7C9E258426D91C5574AF2A6F1E0898EF81C0D9EC0239DA627E552837AC03AA6CE0465412FD357EFCD318EF1AABC8359F2510258FC24EEAF3E0A5EE7BF133D7074E9B59D0D4692B823D2E251A13014846FD9AB5FBC9BF80F3EDC705D75E58F406978432E2A85F54074DDA18E20244B72232E7091E5E24D63E8DCB7E22F66D2D50665864780AAC009BD0CF198A04EC7CA1C869CEFC661E04644C7B2F853FABD45CB46663804A04A294478502E95C9D22A703CF6FC4FD034EDF0AF1693E86C041EE0FDF3DDC34E44925554FC0A1DB1644A53C08EF63D14EFA902DF0E2FD65A013863A62D3DA99B833352A449355E017B39D2255D16709FC5FBFD82F5EF2FFB12DA9FCD6BF627CD5D9582A28CE045A0AAA37FA558645CBABFF172CFD98C9A5A1A9DA5891E8B5199C8CEE37C73A88D7F916FB374F156E sk = 684A29E4E5480A5F2533E1526B5FAC8CDF5927F3D85087C71F928C59690EB56575D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2EDD630128521D62DBFDF5BC133D4EFF12A01E42E57801904C54DA604276410E59336E8E2BBD8C73D736E9DC332545C3954115648E9E3ED97452653098F93D02E2DA0B347662CFB06C82C0EB8D501897488F1BD5785B6D5CF5F0B79FD1438BD8BCD8D33D962F292DDE285953209E98241551324D44241EA1CE22EEE09DF8EE177D75EDF478A79E905ED5E1CB67EA341302EB2003EE0A91F77C45884A74377F95BF88A3E30A159695E1D3B5BB319C803D935EE6EEBBBA06BBCD7DA32D06627B5D80F42152B856B12952E86066D9C5C039B6B6BCA6FFA39C769BE98459D73A4DFAAAF31CF1B8076A7822B5E30926C6D0E5211B66B3D518C9823C25C2910461A44F0BD3CAA31EA45E8DCBD516A30DAE550655FFF7C9E258426D91C5574AF2A6F1E0898EF81C0D9EC0239DA627E552837AC03AA6CE0465412FD357EFCD318EF1AABC8359F2510258FC24EEAF3E0A5EE7BF133D7074E9B59D0D4692B823D2E251A13014846FD9AB5FBC9BF80F3EDC705D75E58F406978432E2A85F54074DDA18E20244B72232E7091E5E24D63E8DCB7E22F66D2D50665864780AAC009BD0CF198A04EC7CA1C869CEFC661E04644C7B2F853FABD45CB46663804A04A294478502E95C9D22A703CF6FC4FD034EDF0AF1693E86C041EE0FDF3DDC34E44925554FC0A1DB1644A53C08EF63D14EFA902DF0E2FD65A013863A62D3DA99B833352A449355E017B39D2255D16709FC5FBFD82F5EF2FFB12DA9FCD6BF627CD5D9582A28CE045A0AAA37FA558645CBABFF172CFD98C9A5A1A9DA5891E8B5199C8CEE37C73A88D7F916FB374F156E ct = AD4D8C02D800D6709F2D14B7C0898191899AEB5B19A98C09CE866D70EF9CE5E7B431CABB16B5626A6D6DF8B26F3BF8BB2F02AB1F7FFF933A4F2A3560AEC9FA5B87786E9896CDD1CBFBF351DFCD1F0921D6292CE739434A307A2708EC5E3D2674B26B6D584579DF465F11933BF93E05C22C548AAA8471173D8F11545E11BC56804B97E668EA443BD588305BA491891F6B104D0D60F332D8ACA5BF09E2F21721FAB2C6DA1592D5164885069A626FAA0BCB9101C1D6E3942C5ADD09836322FDDF4800BC985DDB85EB504E15D8543B2DCAC5482AF804EC1E88853648F91A3CB8A781C04185D8E8E4894907B4EDA8751765454ECB1DE2627004E40C13A60798E507D1F6F6CEC60E974305CD3C32D8D26D37730C954E2425982E3F3B151269E535DB0A76F975C4FBF7E0D9836DD4705053FB94E455AD93B974E0008E3FEAA0272C6EA26F604CEE26CD837002825385815AD525524070618A78A57D618D5ED4332D0838EC2661CECC189804878577053CD998B076BA562F41600017EE8089193D058F3960ECDB1867C3CCB4ED6144B81E6CAD72CDB8FEF60FC4937873988913984FAAB47777868DAC2E21C2C2720AC47ADDD480E019CBA196B3359285133EE10A28C4097C8EA356892D2873C53ECEFE5ABC38CCDE198ADDE01E5D1323B199F81633BE6A52137B8CF30E2F77FD0B2469C3EC686DF5DB61CC71C7667D2F63B11A46514F54A2D7D508FB936964613052D8DC69614AA9266F1D3DF00BFCA633D63D3B0CDA41FF9544392844D5DD62971FCD3CF3CB583C22EC3A8BD2D5076B81CEDCF2FC89B623D9B0382537C1811F4E329B2A32DE86E103C1E5 ss = 5C237ACE434B359DC6C949369D0E74A213CF1074E164CFFD count = 34 seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE pk = 7C4DDF275A829D1178A0270C4AB27C18D54C3FDEFA783E73330A03606C8D3E5EF2B85CECEC47A00C0173DE615D2137BF3C6E0969EDA345EFCC0F7E18D1B30B7772DC1E650F0E95C3C15B20C42DB1DF61EC6E3C9309F6460B61C6E104BC63167FBA4CE69B33B361275A86E3622F49227D7D452A60A1F383DA7FF888BF412D5F1E6A30E14FA3FC01E195F79F1C15F9E629894ED8BB0878EE74DD3D140EE25EEFB6295B89BE11B578B685438F87BA94A20AEBBB8120C00AC4356A9E1E261003125605E9F43DEA266D2DF206FF38CE22B99C36F08DA13E6ED8F3298EC17C274AB6643634E03CCC303C73FBAD1F94BAE9C5A602597C13DA4FC586E7C6B0957B3082268C1DACEA7F8DBDD3704BC0FB95361F49E263E9917F4EF1FABB0CE61EE4F92B2DAE05C61EC2D6C3D6F5A1C37C88887F39861E0C548738820973BFE3F54DA5FEA435A7D1946A998980C6033D4B44CA0B6801924FD709BC31F75612BB748D6A8E09A1219622F7A7F92F15D8D09D4CC38A9958507439D1807C3FB6E3F1A95208733BA249BE71C588A47019C04E5FCDD5C1AB90EE80EF948589ABDD889667D09D0317AFF05C1DA988288B3BCC8437331F4B4A12BA45A479C5606B1791FBE1D44A0CBBAAE1D0213B03191A89B1B8997B1FECAD20743B1ED0468E00B03E446E186BEA1E8776C63FE954AE5564CDEA0AE31D7295E6E0EF2777DA68583DBDB1F89AB6D524C8F572EFD356A354BD747B004BC14B60809C9F82A96C1C5E161EB7192D7E30B5B303EDC891B3FF2CD848E5B441600D101767F06D sk = D76B3573F596EB286AB5231FEEC7499686B13021BE36CB126C7EBEB9D7030DAF248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB8FB2894654A15EBA3520C53320159D1C037C4DDF275A829D1178A0270C4AB27C18D54C3FDEFA783E73330A03606C8D3E5EF2B85CECEC47A00C0173DE615D2137BF3C6E0969EDA345EFCC0F7E18D1B30B7772DC1E650F0E95C3C15B20C42DB1DF61EC6E3C9309F6460B61C6E104BC63167FBA4CE69B33B361275A86E3622F49227D7D452A60A1F383DA7FF888BF412D5F1E6A30E14FA3FC01E195F79F1C15F9E629894ED8BB0878EE74DD3D140EE25EEFB6295B89BE11B578B685438F87BA94A20AEBBB8120C00AC4356A9E1E261003125605E9F43DEA266D2DF206FF38CE22B99C36F08DA13E6ED8F3298EC17C274AB6643634E03CCC303C73FBAD1F94BAE9C5A602597C13DA4FC586E7C6B0957B3082268C1DACEA7F8DBDD3704BC0FB95361F49E263E9917F4EF1FABB0CE61EE4F92B2DAE05C61EC2D6C3D6F5A1C37C88887F39861E0C548738820973BFE3F54DA5FEA435A7D1946A998980C6033D4B44CA0B6801924FD709BC31F75612BB748D6A8E09A1219622F7A7F92F15D8D09D4CC38A9958507439D1807C3FB6E3F1A95208733BA249BE71C588A47019C04E5FCDD5C1AB90EE80EF948589ABDD889667D09D0317AFF05C1DA988288B3BCC8437331F4B4A12BA45A479C5606B1791FBE1D44A0CBBAAE1D0213B03191A89B1B8997B1FECAD20743B1ED0468E00B03E446E186BEA1E8776C63FE954AE5564CDEA0AE31D7295E6E0EF2777DA68583DBDB1F89AB6D524C8F572EFD356A354BD747B004BC14B60809C9F82A96C1C5E161EB7192D7E30B5B303EDC891B3FF2CD848E5B441600D101767F06D ct = 3270BE61CF9F41990F3C535B6F0C699C34129C05079391CFEC721DCD3984CC559B6380BFFD6304EC438957321858A2DE91EAA0499B331D69CAD25E680C4DD57FB7847B44ACECBF6541CA717662344FF79A2A5B25551C07385A4FD823A002C1322349A42B2A54494C346DD88010764D82B2CF8975349C1B1DA9A1FAE3FFD8FF90C1CD4DBAD3B5D05012052DCEE6D49538B8851F3091F58A1EF8118928047FB3B6AF75A56B333631FA6816354F3CDE435F87E4B49ED8EF35D5DF84CF66E585DAA12CC891EF5B61677794055AE269F76609024018417BED94B5C729D580B653115104E277EFB1B810A76A1CB5CD54CD3D0B50F4E255DCD4642A3B8A4EBD4C6222C7A2466C2C449B7CDA282AD4B534BDF288E8A0EF4343DF82373E586CF0B341B6C4B11565132A88FFA781E99C416AC79B7C176E820255535C2B4A4E12D00473C5A117947BF1A50676CADE9B585F2F8B581071954316F6CDF788184E096179AF9E2AA9343C95C04AB8FBBF8CBB1FA604390697C57CB04553B521E981DFF169B840A3BC4FA2145607CCF39706695D677D331B6F5567746B86BECC2BA2854A1E94137D9610A43A1742653D45D40757685F05E9FC32549FF1B3B186D03756F47DD6AFC2D857893F5FFF0C4EC4F4AE54E2333A635151750C9911E9C32DC8DBBEB2ABACE04CF2AD383A2600A7B33B338A9E32AC9D55062ED26BF408AF3BF3AC6C570B98DC7DFF94669F5CEED4D22015E7EE30F3D523ACECAC7C9FA3EB6AB658E7DB74BB46BE792F234FC653F6572DC46871A0864A3B9B9934AA5025CF65CA72FDBC5A2B169473A111BAFF2A6B4478B36CFEDE8D531BD582B7 ss = 28ED30C12048410BB96664F82A5C3014B15949DBB5757FE9 count = 35 seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 pk = B3A4EE771F7BC17184BFA5314674D83D597AD5AEE63BBBDD9A0F202DE4BB482323087A45A44F52CCFB3C9352AF3E2DCABDE6C1C6FD76691B8D3505E44484B93263F087FF6872E8EDBDBF7A67344B84B6BD8CC8EC6622367D849A0C27111A1CAE25FCD10BE225DCF0385E70D17A13A212556B5427EAFADBEEE33A3EA90FCC7D102101F10D469636ABC5F7653E56530A142853FA5FD82291DE6A439A603076B11D67337B39152E638ABA5D22BE3DFBF5B407E91902057A9B1188B22F23575C51881620AA67886DAC2B9501F7FB87F5159344FD24B7629DA775DCFCCF7328813A86F1D7FC2572EBD96B1742F5998825EA72F351B79E1B3D50BE53702889DCC29848F778CFC63428235548021A6323F224655E0D9F9F2D572849AA69FB2CBFCFEE6EA5691DE3F694C23209D4D3F040BC7B5699AA7715AE1C7076087D1A50B9E7842CAA0452CCACB31815F47A631582B468AE35877F28201F2041473841334818D12C7B5DDB0A26F1EC21870292E9ADC7385697B71E66B38F53184357E0712BB9E081E4C2C6C96F4E6FF568430949277A518EF5E839E6EA0CC79D544757C7ED8348C0044CC48957013B3F6E4963D33FB6164C10E440AAF9A617B916275FCC695DB71516E6DBFE6A8392F93F7D944AFA1F3F47C7C7579D096DB356E30C8808872B35A037DC4E35851C12B81D8EFF18B920BDE8C4C014850B1B3C7A79A196AA52BAE9DBF8D9C031837856DCBCD3AB9C9B4656A51756610F7D383C8AF5A5C6B5B9E4283D1FD1DD4C0F282E6B8CC555DC4AC4CD1BE3534625 sk = B87439FDE81C9E39EEBE7CF741C685785532C1DD23E8EF868B9CE7A541010F3D1646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF7100815AA831A61B6869EE6E7B2CA63702B3A4EE771F7BC17184BFA5314674D83D597AD5AEE63BBBDD9A0F202DE4BB482323087A45A44F52CCFB3C9352AF3E2DCABDE6C1C6FD76691B8D3505E44484B93263F087FF6872E8EDBDBF7A67344B84B6BD8CC8EC6622367D849A0C27111A1CAE25FCD10BE225DCF0385E70D17A13A212556B5427EAFADBEEE33A3EA90FCC7D102101F10D469636ABC5F7653E56530A142853FA5FD82291DE6A439A603076B11D67337B39152E638ABA5D22BE3DFBF5B407E91902057A9B1188B22F23575C51881620AA67886DAC2B9501F7FB87F5159344FD24B7629DA775DCFCCF7328813A86F1D7FC2572EBD96B1742F5998825EA72F351B79E1B3D50BE53702889DCC29848F778CFC63428235548021A6323F224655E0D9F9F2D572849AA69FB2CBFCFEE6EA5691DE3F694C23209D4D3F040BC7B5699AA7715AE1C7076087D1A50B9E7842CAA0452CCACB31815F47A631582B468AE35877F28201F2041473841334818D12C7B5DDB0A26F1EC21870292E9ADC7385697B71E66B38F53184357E0712BB9E081E4C2C6C96F4E6FF568430949277A518EF5E839E6EA0CC79D544757C7ED8348C0044CC48957013B3F6E4963D33FB6164C10E440AAF9A617B916275FCC695DB71516E6DBFE6A8392F93F7D944AFA1F3F47C7C7579D096DB356E30C8808872B35A037DC4E35851C12B81D8EFF18B920BDE8C4C014850B1B3C7A79A196AA52BAE9DBF8D9C031837856DCBCD3AB9C9B4656A51756610F7D383C8AF5A5C6B5B9E4283D1FD1DD4C0F282E6B8CC555DC4AC4CD1BE3534625 ct = FBABD3EF3EDA6C64722BEB37FB80CDDCF6AE125AB903CDB21B2D060EAE96DB887C5313853B3ED94F4C967759456F7D5B83A4D2E4394FC54EBE89BB35C9B052B882FDE9FD9D4D59DC9D7CB1450067987B4817017B233EFB8AAE92D2BF53660454449D29480D87CCDF8F6E57A24E4F74F2EA932EC75D864631632F32AA83139310A1566403644DDE189105C7249E546E9C66DA3E5A24DCBDF57CA8A587DDBB3F24D6B0675FF0B5B05A0B1DE288D5CE81782FC860F973C033F9E528451D66762FF60223BA8CC194B1F0615FD72BCB8FDE0FD847919FA2D33B746205E29443BFA4319718B54CE91671371BE5F0A16347CA844CDB3758B9C03A93B4E22D790AC34DDB17E8F7E9513C9D8C1D0D185C90C89A90E6D4547225DAA01B6D58CB2C9355D17F8D8E57E1CBEF0CFC9832B200D7230BCDDFBE94BA2B970A837FA131ABBD395EC1962B54B9BF6A10837001D5C394354B28EDAAC33EA17A1F0F5C44BF3D11F0DE62123D4B133C5BB2F4584C8EADA27FACCB90C18A76E3105D43AA9854843AC6804E184500BDD5A44C1E290D60A00FD7347409A2AEBC65CF99E6C8FD9320C96CFA06BABE90780D854CEC1AA5A8175F83E3828353298193384A15FB1CD8AF01354CEE1B20306FF581DE7FC4142D68A50EB2C9D093582EC8040528028C13717EB27B1217E586EB7A126491CA2959F7406620735BA155BAF180FC35B922A8C802536FC9BC15492AF3E6F63B3F2A18F92B6E14FD71A8540E80679AF4E79F9A4BBA43900AD6A7B6F26A611FA9F5FBE0AC4DA4F660341F9643DD67ECFF0ABC77E056DEB87BA5F5DFCE483A8BE7C9C55799986C52B0A9D3F96E ss = D423CC1CF194DF75EA0102E828869B9D14253852E6698AAF count = 36 seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 pk = DD1A4669378BF5DCC795DC3E1FB33FF1EF03E2D7ED3399760EBB1B7DFA9FCD0B93D67B4B054181FB70185C17C0F6DE38A1D95B8505AA28C42D1BFC2912BB4969B74622A8A5D22A891A290D8C6F19C9529DA73AB188DCB70FD1E725B9AE4210B4786DE75B296F56020229E4828C3D603865004DC3D0E0F345AD2D65AB9B18061B5B5F0E71E6BEE8239C65B34C7D56FC90649A7328B7A6EA827ECDD01CEE079CBE633CCADAEEEC3837A584EB084746331E38D5CFA20D139BAAF42E2C435820B6BC15FFD49C5351DF4CC95D6A54797C70B12D651AC1AD454AC5A5F1C04ED285F5AA9F1FD4838B6480604BD823C49B62115F7EE33EAB2004915C5D28F8F92D0E2D1F6CEDA60AAC4904F4E96716AF0B61FC617CE8BEE84D297E658A5850020925025939F40A7B688DE5A0FE63E7C8E325A00BBD453826CB7341CBA613403F26B14A2D1EE7F572567E5AA91068FE6B25FE75A39B7E9CBA5DC6083D7816E3BC7D920B94B9BE94F57D753A57A50D0D0D90F2BCF31A6924D76E6CBD206F8A4A5453D8979AEE4AD755CE6FCD68DA8A57A603AE91B61BF9467B57B1C1C44EC1D209990D5D6CCE10743EA05216301D9AFF620370C4B73F53958FC50008CD0321BFBD456C413346EF968EF1512087DB70AC248F6E3BE2203C05D24C2EC5CCDB6984C152648FBF52967866BBCD18B66EADA25B53DF9EA7AB629B1F2A737779BA1DF7876D8B58F4293D39C35E0F308F6DA45EE1BB9F7C8F086321FE713A7A1FCF136291D8670844417CE71E7A355BBB81AFB659C8E0BA7E1DA8510C sk = 056661B38038DA4FDD7426F32A81576C73ED84843B305168A374F934E27A4E1B79238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC548411A77127B247925850220B0BE970AA3500DD1A4669378BF5DCC795DC3E1FB33FF1EF03E2D7ED3399760EBB1B7DFA9FCD0B93D67B4B054181FB70185C17C0F6DE38A1D95B8505AA28C42D1BFC2912BB4969B74622A8A5D22A891A290D8C6F19C9529DA73AB188DCB70FD1E725B9AE4210B4786DE75B296F56020229E4828C3D603865004DC3D0E0F345AD2D65AB9B18061B5B5F0E71E6BEE8239C65B34C7D56FC90649A7328B7A6EA827ECDD01CEE079CBE633CCADAEEEC3837A584EB084746331E38D5CFA20D139BAAF42E2C435820B6BC15FFD49C5351DF4CC95D6A54797C70B12D651AC1AD454AC5A5F1C04ED285F5AA9F1FD4838B6480604BD823C49B62115F7EE33EAB2004915C5D28F8F92D0E2D1F6CEDA60AAC4904F4E96716AF0B61FC617CE8BEE84D297E658A5850020925025939F40A7B688DE5A0FE63E7C8E325A00BBD453826CB7341CBA613403F26B14A2D1EE7F572567E5AA91068FE6B25FE75A39B7E9CBA5DC6083D7816E3BC7D920B94B9BE94F57D753A57A50D0D0D90F2BCF31A6924D76E6CBD206F8A4A5453D8979AEE4AD755CE6FCD68DA8A57A603AE91B61BF9467B57B1C1C44EC1D209990D5D6CCE10743EA05216301D9AFF620370C4B73F53958FC50008CD0321BFBD456C413346EF968EF1512087DB70AC248F6E3BE2203C05D24C2EC5CCDB6984C152648FBF52967866BBCD18B66EADA25B53DF9EA7AB629B1F2A737779BA1DF7876D8B58F4293D39C35E0F308F6DA45EE1BB9F7C8F086321FE713A7A1FCF136291D8670844417CE71E7A355BBB81AFB659C8E0BA7E1DA8510C ct = F668A8431B3F03F5F70A9E28A063410A2BDF6C739DB6F31E7777F58551EA71BAB049B5BFF630D33BEB283E45BD98C3E6352CA866DED88C510AE1256B3887FDC29EBA4DE9AC90CA050A5DEDD1A9CABC4FA226ED8549738098685C238377317135E7D89C131892DB20957BC2463F0BF14A70FF02F8229C3EC6EB8D681DF6A9A26B5DB663511492FC3B143056E39759C71354C3D37E35E487C3C178FFE571B8A1912645086B9666C4A9CE378E45C17EDEEC4E9D3D63E1487634931130121901734DF37D21D2536121A86C91BC38FF697B90ACB03A173911FD6E79935FFB0E72BC414D28656A826AF328168EB6C92178CB1E70651D4A2C33DF5726337E48A6338D4AF92B145218E411AFC7ABFFEDF5254DEE3E58CFF6942916401C0A071DC20F0AF51749062B4EB26882884ADCDC84E364DDB3A8A66572478ACD4CEADB90530F969A9997CE2A0381FC73AB72431D34D78DB61F28A3E5DFD69EA6ED1C73676EF8CADF40DDB2BADBA6E1AB4800093A1552D61E33C6C9FB1B7CDC61AFBA6224D265D60F1080E7EC860AA7DC6DFD003975FF0B8DB40E5289DB45B6668375D8FD87F0D0786D7D33556EC890513EFDB89C6714949CED388FB352B921648310CE6FD038AAC5A4C8BB42DA68551E8457466AB8F781F81DB17ED8F4432EDDE8C5FDA0B98B62E4C1A94F13CF8210FB60C476B98AC2ED362DA51417CF9F74C67FFFCB16E4AC6D9363A81BA05D2A2124B10D83FA133E87DB9BAE9BAC358C8DEED8FB0B40AED44CED3EDF77D4D1BD10F56364A05B9D45AF03C29C55322317018EAF9CF87DA9B8A0A2979279A0AF16A41AF1F23E9680F4295C9C46501F ss = 3F17024AA5F0D7444AFA1109B97FB41FF183E0D9BD58E40D count = 37 seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 pk = 050BB34F3238CC191B138A47CF741A711D6054E5B1120EE27B5D4B4E06FCC04F788E0FC5281B7DFC072CFB1884BFAE6B0A45CEB6003E4944C09050ACDFECB0894EFEDEF16DC001727C06352BDAD1CEFD4FCBDDEB73932F746F4817B2E450B712C06FB2DEB79F825B6C77B18565D045B05C5429DE416CFE495E15FA89B42F279CC741F11B0A5E437E6D3D5C4882ECEB1497B8569D7AE233AA30FF3ECB8F8C2065D81B4FE47275431580B27FE46C4A0CCFDF551503327B542E7C9B892394884BBC28270C4B46A93B361E4DD78866630CFF4F90C59695B27C697F9C93A5776F06906D62C0C04135355DB63F146ED2C3DAE17A5578ADF0106FAF9919338B5DDFC606895F5880F8235B37366A7C43722CF556256B5EB11290C3986D5B5B68BBF1B062FBB2414A08FBC6DB80C881E926F68F23F5396F5AF9539761FD24142BE02D8459C08A596C476452F63619AB2A791C58244DE3A7639B62B5E7AF575ACF59F395717407E2CCEC285FBF43255454F39F2236796C82387C038F68B5278788440953B8303234347B37677354D2093D434BA3DD2E879099647A59B83E540E27D0EDD3FE715193BE52166428D77213258F63AE7454BCE15CDB235DBAEDF3F5C1514254C69471AD90B5C32BCA5BCF01C0918BE8687B945DCD4A0C2E8B689498B59BDE3E187E646724CBC06C29A3D6FCA05C3920DCA923CF9A45409B4650E57EE900EF2D2A8F75909A9FD82928C57097EAB5F099CA05C5AC45B6980594FEF7B3A78556380AE7A3FAF286014462555A262F65FBE38BDA1BD305 sk = A1B52D871612A1C611AE0944F9E71858F35D3BD14F20E96A931720668BDF0A6B1F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F37C130BCFE031E637AE84406A08F8C6F701050BB34F3238CC191B138A47CF741A711D6054E5B1120EE27B5D4B4E06FCC04F788E0FC5281B7DFC072CFB1884BFAE6B0A45CEB6003E4944C09050ACDFECB0894EFEDEF16DC001727C06352BDAD1CEFD4FCBDDEB73932F746F4817B2E450B712C06FB2DEB79F825B6C77B18565D045B05C5429DE416CFE495E15FA89B42F279CC741F11B0A5E437E6D3D5C4882ECEB1497B8569D7AE233AA30FF3ECB8F8C2065D81B4FE47275431580B27FE46C4A0CCFDF551503327B542E7C9B892394884BBC28270C4B46A93B361E4DD78866630CFF4F90C59695B27C697F9C93A5776F06906D62C0C04135355DB63F146ED2C3DAE17A5578ADF0106FAF9919338B5DDFC606895F5880F8235B37366A7C43722CF556256B5EB11290C3986D5B5B68BBF1B062FBB2414A08FBC6DB80C881E926F68F23F5396F5AF9539761FD24142BE02D8459C08A596C476452F63619AB2A791C58244DE3A7639B62B5E7AF575ACF59F395717407E2CCEC285FBF43255454F39F2236796C82387C038F68B5278788440953B8303234347B37677354D2093D434BA3DD2E879099647A59B83E540E27D0EDD3FE715193BE52166428D77213258F63AE7454BCE15CDB235DBAEDF3F5C1514254C69471AD90B5C32BCA5BCF01C0918BE8687B945DCD4A0C2E8B689498B59BDE3E187E646724CBC06C29A3D6FCA05C3920DCA923CF9A45409B4650E57EE900EF2D2A8F75909A9FD82928C57097EAB5F099CA05C5AC45B6980594FEF7B3A78556380AE7A3FAF286014462555A262F65FBE38BDA1BD305 ct = 8F6FAB11360AFF5F7EE619EBA313B18646B5BFD381ADDA31491E03BCD04A0FC1BB8EC10E259567CD311462092280EB0140DF2916398AAB264FCF6F7F04F4C4D900A38547E69DAD17455061191830924CA12ECA955D4705E2E24564C90918705A7BDD471036A00BAA19C74AC34F587D62994EB4A0F9414E62B4A7866E8BE69127474BA8DE52C247FA278300074956E6DAB0D29415D53DD853D67ABE25E5618BE1A3C9F00B997C387386FBB42BC9F5FCB0507CFF43056CE0C397882455D7DF5A21BA9377C4611E434FE1AE8CEDB27C3925250FC9FC42B7D0306A621CFEAB6A71207F1564725BB43324A1F1400C95DB5881B8AA0EB051B49A314EA9348091CC5F404E4BB42624A2001B5A1F3E1D26EE5E61611330CB5DF77B65D85067AD0FC4022AEED705986EF1D80930A4555F40CCEE2D6A2EB825F9FD967617B435BD73648AD946C645B3506AB9441D88E362B971362D3C5FC2F39F8D9A654A98109453680C20FA7179F9ABFA280732DAE2AB056F2FFDDF2FC1075F2B3A162C5E63DA1AF02451CFAAAF87B77A9780D1658ED6B799372B78304A983159E9473342F6829A3E4A95FFCEB92033986F7EDC91E68F872DDA14BBD3AB6C4293557208837B27E81F477A1A9BDB1ECD0DE3A366140165FFC9BFF4927C4DC2B15DE0D80B8AB985EA4C214DEB1756E5B7643B92468426E26CA7F961186A9A6BA5246E512494DC102DBECA035AD245A3BB2C1DB9F2A2879C96078E1978B05A482500CC8AA1DA0A1C882FA1DC06F8A310D425F78DF0F4AC8A25058BAB604D810E03C0A25B8D8E7BD6A6079BBB41989FF30D3919C22069CCF2AB77EE77C9018698 ss = E7BAA6045ACADCA9F95DE3D7E9B9946D85ECDCF683444032 count = 38 seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC pk = CD132ABB16E823073C80F7357A1B58665198F312DF9C81B77724F90DAD386CDABC3964F2D54745BC31AE53F66FD4B729A3C3C5D113C59F3E971B1B54B17CE5F15FB3E6F1FDB6C09984E3C41D901988762F149EF5FEE665699C51F3FA67075AA681043BAA87CFAFC4ED8D1DD3694B5BE28EB8A60FB6A94DFC77767187B645B7CF7A50B45101CFB15D7EBAA53FA2453A17D177F5F286A264CC5C2E411F870A45C49A033572871B766937A3C9FEFF28A81A01AFF4664A4D2197DA90DF1F51A64512D9A50F866D262ABE355159428CC7F60FE3BA8CAA3FAFAF5BEC628907D182C519C294E03E15E9D83CCB1EDDE3795A1896A1FFC3F45ED470079B0A8A49B5C491755D1153B101F836988390DEAC45CDFF504360721B48F05A87762506C340573CC817A1C5F9070310AC9E11FEF4AC39DBEA77D2B5FEBEC1FEE1A249F1AC60EBE1B48F30C3E9653D2BA5F4794087ED2968A660023C7FBA9FEF9AA90826296C1C254E4A0DB1577D90F681A312FB5E329EB56D4812A7782B895442729377E0B8683D9AB2BC65965AA56056D3184318850B609C6FFC7047044E3F397F9D014A1ED6A701C6E97F26ACBB7A83B312C80574C0EC2087E1EA59AA8B3EC2D31A53C4769CB8C39BC358E1150F8272F6CE132B594F96ED370BD3CAB44FD1A5E5E9DFDEB330BFF8449135B66C1A26E767C7E64451E17AF15AED77D4457EAC04CFFC114E2620C2819A58092BF21B0EB72D3558B166EE0E4B73FB9FC9EDBFD10CAA56CB300AFA228FCFA964B5F69D7349B24DAA0AEA2B2788BF224F66 sk = 952B49C803D6D6FBA69F4375ADCE8594847A00BCAE2179DA49AF2AED0423250262D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D8977EDC0D0914DABB32055DA762B4A61FCD003CD132ABB16E823073C80F7357A1B58665198F312DF9C81B77724F90DAD386CDABC3964F2D54745BC31AE53F66FD4B729A3C3C5D113C59F3E971B1B54B17CE5F15FB3E6F1FDB6C09984E3C41D901988762F149EF5FEE665699C51F3FA67075AA681043BAA87CFAFC4ED8D1DD3694B5BE28EB8A60FB6A94DFC77767187B645B7CF7A50B45101CFB15D7EBAA53FA2453A17D177F5F286A264CC5C2E411F870A45C49A033572871B766937A3C9FEFF28A81A01AFF4664A4D2197DA90DF1F51A64512D9A50F866D262ABE355159428CC7F60FE3BA8CAA3FAFAF5BEC628907D182C519C294E03E15E9D83CCB1EDDE3795A1896A1FFC3F45ED470079B0A8A49B5C491755D1153B101F836988390DEAC45CDFF504360721B48F05A87762506C340573CC817A1C5F9070310AC9E11FEF4AC39DBEA77D2B5FEBEC1FEE1A249F1AC60EBE1B48F30C3E9653D2BA5F4794087ED2968A660023C7FBA9FEF9AA90826296C1C254E4A0DB1577D90F681A312FB5E329EB56D4812A7782B895442729377E0B8683D9AB2BC65965AA56056D3184318850B609C6FFC7047044E3F397F9D014A1ED6A701C6E97F26ACBB7A83B312C80574C0EC2087E1EA59AA8B3EC2D31A53C4769CB8C39BC358E1150F8272F6CE132B594F96ED370BD3CAB44FD1A5E5E9DFDEB330BFF8449135B66C1A26E767C7E64451E17AF15AED77D4457EAC04CFFC114E2620C2819A58092BF21B0EB72D3558B166EE0E4B73FB9FC9EDBFD10CAA56CB300AFA228FCFA964B5F69D7349B24DAA0AEA2B2788BF224F66 ct = E712C685418105D6ED7E12B2690E3D54AA1F9E3AFDC3E3871FC04A900B8C5A6809DA6B47E3A3FE167C01C1423B992188E2EDB2E717F6E9D6504ED05654D8B23615E3CD94785B4F9CAF03CF19D067AD404B009B49FD3AA84835F24A7E0A6A285A9624F5E1E5EB0CAE697815D1A053BFF8CEF206FF98E40D92D5D689E720103C6053C72712BBFACAFE203BA2671F37CE3E0568FA79152D06263F40BC772DE3E6D5FE0F7D52969C360EADE3FAE88B1C09D8A99C0F670460C230BE40956CE9569BA87F67A864DCDDEE1657BB4F99F9736221D48CDCD667F2B5226EA78224D30DEA093ECC5D64D7FE38F7668010095B1D7FD8CFFBA6EDF228950A3EE0AFA43ED9F042E6F0AEBBCCA50759E12F5705CCBFD4228B63C40173C581B26068C18321263FA975E6AE982A6E0AD28E68980D733785A4B5E27EE39672A6768E2384332A44852ECE606B9869AEEC72102D31C34B104CD0DCB5688C0006CB1BC1DEAF81D703DDF0650FFC2FF68CE2A8989A575C52D83334A15D92687E3CCD6D7558E005B427173090138B137441D407393EE18FF353A7D4B10A283365914DAECB00366CDBE66D1211DA7D752BCC3826F9BEFDFFECAF29E5215BF308D50105E2A25995A42FCA91C667A960A5E3B919BA2B47D13EDA7912FE69848F748F164AEE10DA214D6EE4EA1BC1156D3057DB47A9A5A201C04D55C4CFBF984EECEADABF1D16B755237B0159BA44628A47534FFA8CC6909093F494E1E83FE406A5E13C4B35754D678D7E4B0823A60E41FBB9CD23D6607855D9BF8D3E178A10173E1760A85C55104EFFEDC9574097239FEEED220BE3D56DC8B1D3B07AA27AC4E99C ss = 8E8F4C17165E53DAF73252FC6A18FD83245BC647DE1AE831 count = 39 seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F pk = 686098E480E5080E41F8A5D549B6F0CD01A0D958675398CA84A9FF8204BB1B0682ED50D2CC20EAC36CCDAE30B41F5E7BA140213D5F9CF562DC62B579A4AA2C88BA78E78550F3F479CBACE041B7036CEAFEA95585804D64D4E691AC2E2602FBB6B7A72151D4D932C4C5F4B477AD63CDFCA1D8806104244E859383A91940A7CE7A48C3CE6A6D76686EDAC2BBB2E6811E959ACA72B6D3109C4EEE9722716A15DE9E8D28C09D9BF4E7D9CD4ABBFA4DACB8C5C35F0868C1A390307A87C10453EFAA3C866F3F54E440259DD83D4FA8F435DB3F67272E95F30A9BBBB36A27A16DB65AC0CC014167D1F0F22F216B7E2727879F1FC47E2499CD003B40497ACB257322705ADAF8BCF4F5F3E1C8F88569EF1FAB5994BC2A6EF7A7AB78D6875354E0151F20DA0B0F6D7984AA74F63336EBE99A143879902EA533BAEC45C3550E2373B47A457B984E019A533431957B96A557FF170E58BCFE966A77B61288B77F7D67918D8848140A9A8D17A37002A2C4B4FA70EA1AFDDCAE6C5C788E393693DBA6CAA790D395EA2DFAD973D6031509476C9D1DAB1832BD5874E2EDA8B37D21DA0F348630C3C411BF4A9A41EBECE236B28F34D7A1F7DFC4C8617C38DB7ABC5E44CE77F99F94ADD9A8C11C669B1B880E4BEC15A58E309C730B2CDB9B57CC33B30A4C68D58F77949651366E9D521785151B5F7A36952E7AB3B615A5F839C97B806C50EE53F10C803B50033B657D436215A00EF50CD01D2B5C4E6B8D8E76D3C0C08ACFCD72341BC5350643FC4C0E1165E58C6DE619D9EFB80172E75B sk = 3C815E57E9233E975FA1630208AAB206B71AE0DB37A7A8789AC683D9F9B2D29801C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164F9C6828BD9D5A20A8B9E96890A51D20103686098E480E5080E41F8A5D549B6F0CD01A0D958675398CA84A9FF8204BB1B0682ED50D2CC20EAC36CCDAE30B41F5E7BA140213D5F9CF562DC62B579A4AA2C88BA78E78550F3F479CBACE041B7036CEAFEA95585804D64D4E691AC2E2602FBB6B7A72151D4D932C4C5F4B477AD63CDFCA1D8806104244E859383A91940A7CE7A48C3CE6A6D76686EDAC2BBB2E6811E959ACA72B6D3109C4EEE9722716A15DE9E8D28C09D9BF4E7D9CD4ABBFA4DACB8C5C35F0868C1A390307A87C10453EFAA3C866F3F54E440259DD83D4FA8F435DB3F67272E95F30A9BBBB36A27A16DB65AC0CC014167D1F0F22F216B7E2727879F1FC47E2499CD003B40497ACB257322705ADAF8BCF4F5F3E1C8F88569EF1FAB5994BC2A6EF7A7AB78D6875354E0151F20DA0B0F6D7984AA74F63336EBE99A143879902EA533BAEC45C3550E2373B47A457B984E019A533431957B96A557FF170E58BCFE966A77B61288B77F7D67918D8848140A9A8D17A37002A2C4B4FA70EA1AFDDCAE6C5C788E393693DBA6CAA790D395EA2DFAD973D6031509476C9D1DAB1832BD5874E2EDA8B37D21DA0F348630C3C411BF4A9A41EBECE236B28F34D7A1F7DFC4C8617C38DB7ABC5E44CE77F99F94ADD9A8C11C669B1B880E4BEC15A58E309C730B2CDB9B57CC33B30A4C68D58F77949651366E9D521785151B5F7A36952E7AB3B615A5F839C97B806C50EE53F10C803B50033B657D436215A00EF50CD01D2B5C4E6B8D8E76D3C0C08ACFCD72341BC5350643FC4C0E1165E58C6DE619D9EFB80172E75B ct = 8391E1735EE93A75849EC992CE9235FE87F19AB98E6086B9867248E22A645E4D83F2706E635CA4FB267FAD0324EE02F4092E98F0E910A76B92AFF7733FE5C403C52A4F6CC6C0A2215047BC9E954B7E58B58B1BA05B0148FE7B772AC2F301D69827D5158FF1267A48FA2B9E3AB5CD614C727CE45C586C6F5D936B9F7FEDD2442FDAC5261AD663721183DB2344E883F75B4A4A2B0781EF3CAE94FB2D8DE09AC9B59A5B8898367F607E7B1ABD4C0BF54867F9B6576F8473CA745F86413D36122850410337EEB58EACE7F22EC7656EC7E96C2A2F91E9959964E70E8F6A113802EA08134A06ECA9DC46A4E651376A8237773D869FDCFDFDC2CA01974B4ED894D8874DB2335D48E121BA8D0A7BBADB85A86662CB313A3D298DEB787B47F557675D02912FE86F82736C16EBBAB260A987C0E42122F1DB344EABD5ED73F08356C54C4A8C35A6A46A3A9EBA0F91B8DAE8706F5245C51F547AF372960F7777C4A73CADE90F27BB510F32ACB130A7DD9040EB3A5AA9D9F0CF9D4DC21F67DECF422422CCF5256F685A70754D9991289F77F7FDD6DFF36D125A316F23A1ED5CAE52AF693DD8389F4563F576FA27C8F003E8EFD1987C32E5CABD719AFD76DE04AC06099B4039100E9E609AAA4D4C5283531D7979D1A8573ACCB052C430A18AC155FCA85E66D0D73B155298D9779D0B0DFF0B6792C8D112CE6195444A0FB334C73A9E4675674AE53A783DB50CA7694A27169969A00F3DE373B5AD18E0618DC6ADD891CC46BAA77C5024E504542AC5CFA208227AFA1C287BFC0B854051C7420254708A4A39ADD1023624B4B214C3597542F8BBBFB78C3D40BAEA3B2D ss = 573B747DBD2B5ABE4079CE9E2F04B0DF10CE11ADD459FF0F count = 40 seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F pk = AD4437E849494DDEC5420448644E4C113B7ED1C02C746603EFC66A2924EA655B00A2CAD80468916EE6995DCA3EFD59DE38582774E6CA44B5277CEEB871C0958294F6F5CAA5023FC1A552F7145F7C767F84E570207C9A585A6509614F6649945903009D640CAAC9652A455E388FE67AD56237061ED889AD6338880017CF63B19E386BC0ED7624CA3AF04997AEA3109F979EBBBD48E190A763A22E3D5C9F191E4E7211D880A864357FE90706F3E8CE818B9479F955916DC00FA921AD1EC8F191BFB62377B92C1002032297A67872E1C3445B00EB2B58508F35B2973D1E0E92D30472F3935A95A4442D9175F807EE452A8632827927AAFF130E4DD2DF896DFF3C0FB0A4CD1D5462B768D2C99869E273D2E956FA7E96089B5DFA7D189E87139D9F046922B821D09F393E13B17C098B5377D648A50AF2D4C18697825C88D4344ED1C5E62752E44C4209BFDF37DB65768D7B5496D711274AFCF8AC932354C7AA708965AEFC2DC5368D53389061454307C27C91F751847023A3560CE3D9EFA85475A6C1DD5CF8E88B8AFD1A53A7351751B7DA8ED2CE09E02F8FC4C03316DEE6806DAE1F412662C5851FC3B8F843D4B3AC80BB8128F6598E03A10DC2D8A2055F6E705129818F2A1F96D631FE061405F14577C6A5E1667768573607C4559D8746DEE36F428399BF137322878F53BAEE5EE89496888A3C978A99BCE13A190B558ABEE88F2E616A9A24AA53436543CB4260993DB0A6B32522C166950E055888DCD42E1920E51164F4D30E6B22B1D4F3ADFB55B568957AF55515 sk = 588760826DCFBD36D9ABE6AE44A669BB3EBBA6A218EAB69E30F18A3BD536576E0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D79D4F817C85D204EE860346635D4A8393902AD4437E849494DDEC5420448644E4C113B7ED1C02C746603EFC66A2924EA655B00A2CAD80468916EE6995DCA3EFD59DE38582774E6CA44B5277CEEB871C0958294F6F5CAA5023FC1A552F7145F7C767F84E570207C9A585A6509614F6649945903009D640CAAC9652A455E388FE67AD56237061ED889AD6338880017CF63B19E386BC0ED7624CA3AF04997AEA3109F979EBBBD48E190A763A22E3D5C9F191E4E7211D880A864357FE90706F3E8CE818B9479F955916DC00FA921AD1EC8F191BFB62377B92C1002032297A67872E1C3445B00EB2B58508F35B2973D1E0E92D30472F3935A95A4442D9175F807EE452A8632827927AAFF130E4DD2DF896DFF3C0FB0A4CD1D5462B768D2C99869E273D2E956FA7E96089B5DFA7D189E87139D9F046922B821D09F393E13B17C098B5377D648A50AF2D4C18697825C88D4344ED1C5E62752E44C4209BFDF37DB65768D7B5496D711274AFCF8AC932354C7AA708965AEFC2DC5368D53389061454307C27C91F751847023A3560CE3D9EFA85475A6C1DD5CF8E88B8AFD1A53A7351751B7DA8ED2CE09E02F8FC4C03316DEE6806DAE1F412662C5851FC3B8F843D4B3AC80BB8128F6598E03A10DC2D8A2055F6E705129818F2A1F96D631FE061405F14577C6A5E1667768573607C4559D8746DEE36F428399BF137322878F53BAEE5EE89496888A3C978A99BCE13A190B558ABEE88F2E616A9A24AA53436543CB4260993DB0A6B32522C166950E055888DCD42E1920E51164F4D30E6B22B1D4F3ADFB55B568957AF55515 ct = B06ECBD7AE4A0FAD8E4142EB9035B0402F8D8AA822A5541721EC057A46D8591F2630DB6841ED9A65770640CF972D01978EE3CE3154A7D9B953095FE966EAE2854AB430FBBBDEB02934A88E19BDE11FFCBBCDF73553BE2A90A174FE15D021C48898B37C08EE9C46B90F02E39F03E91EC13D70EC5DA20F9D599B8A06A01344B5C6A7782A0F1060402821123F979CFA17DF9B6E8954445104F065801BF6C4013318E960E1063D287E1924197C3C1DEBCCD71CDD644B1CCFEC4D12BAE52915BA0CD40C28C15CF05DA586D345801D6A80C417CD61542B564CE9C0718927EF7C26499824921C3F6A53F531A65CA2F8D24B4E1253E91214360E53B2B97603CCF318A6DD96617DB602D5F622396647FB2EBA38F3E6234143595E4250A8089A40D722BAC8FA801BD3ACBDFB4651E9CEF77FFBBBD4940CE88F70E5111EE609CE9F093AD91D0EA7FE391492CCEF0E2A86C77D699C0BB8A37C150C1DA6F01E2C40BAE02F4A3D3A9919879FF16264E8C9DBEF3C5F58A763571C1A13A13259C894AC26E7BC2201EB2266DF1135DB0880FF310ECA6B0A3092DEB25020BDD61011E17BAB04F2477A6B5C9B6CA6F92FB226A0E737E92BEEBC60C6E1D9D8F4E42C1879CA00D9E250B9332AA0D8FE77DBBF396CAB4ECD7D16292887DA254E0C76CE2D602B96034703CE6E19485A00CE96DB2959FD46BA55E18CF93998CB4DA24B69CB16A03E226834F2568C29845236DF9B1D1067AE4B7F54E35DC25CF96E4CEA8C456FBD1F1FC7CD03DC9FBA2F5CBDD43F5CE8DBAFB75C239ED86AB95A8095EFA07EA2EE14ED7820DAAA5D4478FED5619924389FA60EF97EE1B7E09051 ss = 9B93EFAE66422BD4FA92C9868289992C2540ECF90DA12CD8 count = 41 seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED pk = C389329CED27D42A0DAED6B4A4147BC8C63C1214F2E06CFF86F8A44F518A58FF84622060F939871D5A986671C9C292BACA0E2705622EFA294CAA42629179C7E1BA681E9F53C35A993B24896A7E379EEC81A22954787A254752B11CAD0657021451EBEBAE5B71C57D6A73A08A3D3232975DEF031005D12910F17C055B66914BE975B60CC797C2888DBF268C68373D76C7F1AA9B2BBEB62F8DF988172CE8E4C84B80B800ABA4430734723FCB1921A1BCD24512DD6623F07780C6601D1D089E2A11E8FE1A5A36AD2128EE3CE4B183895FEB3B60570DF1DC6179DA2BDEDD3E1A287A5D299D05DB2E41D264823309335D8522FFBB3E93EDD75FF083214B53F51DBE96F657708C31720D7166B7613B3034966822E8345A10F4AC242306176BA57343223604BD0C4810DAC9E861810A4DC1C37396F3B61EFFA0DD37988851516797A937B27C254B755C7B603ADF37BD521B2E000EE77F1A17833E0D823BD87E0AD76EAF3040EEF771B1B38BE65C38B64DD08102C8F4FDEB3F625F00A444093F683C9FAA422DD0756E7919C9EC8169140EB376BE1E8C25B744570C3265EE9DDC5A96B40D1EC2329CF6CFF622BEE73B4E829E2876606F5ACDC19AE84EF6D2E8E2E904AD7FA425BED6B4989818123122368E70D696347FF94961018CDA48BA7F5390C5A525CD4EBDDDA2BC38D585F0B72F94CAB655E45E10BC792DED5FFF9146E1A47D2855D9F3626732BA1E8393746041470421BE45837825A3C82C6A239571D8F8A8E1EF1433F277E5A5F6C20686048B135322F355213B01 sk = 47550E9EDACB6DDCE3D9AB81F6B61080DD4F2693854ACB05E0CCC7A4FB6390FBF89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E92641960502A4293989699C6905C9DB300C389329CED27D42A0DAED6B4A4147BC8C63C1214F2E06CFF86F8A44F518A58FF84622060F939871D5A986671C9C292BACA0E2705622EFA294CAA42629179C7E1BA681E9F53C35A993B24896A7E379EEC81A22954787A254752B11CAD0657021451EBEBAE5B71C57D6A73A08A3D3232975DEF031005D12910F17C055B66914BE975B60CC797C2888DBF268C68373D76C7F1AA9B2BBEB62F8DF988172CE8E4C84B80B800ABA4430734723FCB1921A1BCD24512DD6623F07780C6601D1D089E2A11E8FE1A5A36AD2128EE3CE4B183895FEB3B60570DF1DC6179DA2BDEDD3E1A287A5D299D05DB2E41D264823309335D8522FFBB3E93EDD75FF083214B53F51DBE96F657708C31720D7166B7613B3034966822E8345A10F4AC242306176BA57343223604BD0C4810DAC9E861810A4DC1C37396F3B61EFFA0DD37988851516797A937B27C254B755C7B603ADF37BD521B2E000EE77F1A17833E0D823BD87E0AD76EAF3040EEF771B1B38BE65C38B64DD08102C8F4FDEB3F625F00A444093F683C9FAA422DD0756E7919C9EC8169140EB376BE1E8C25B744570C3265EE9DDC5A96B40D1EC2329CF6CFF622BEE73B4E829E2876606F5ACDC19AE84EF6D2E8E2E904AD7FA425BED6B4989818123122368E70D696347FF94961018CDA48BA7F5390C5A525CD4EBDDDA2BC38D585F0B72F94CAB655E45E10BC792DED5FFF9146E1A47D2855D9F3626732BA1E8393746041470421BE45837825A3C82C6A239571D8F8A8E1EF1433F277E5A5F6C20686048B135322F355213B01 ct = ECB921DBD60CE7259E23006A76D4C1E7A14D767122A893E1D1894B3F567E44C696CFF5346B3881D0F363F3CD33BEC0F034096164D97F722E1E78D80088F21215D1EDC7B4A7A432EE8ED42C49FC5986F204AC0853C940E786496C8CB3C615BEFBD2E3C7E1042FD01BDD0C4372D50DDEB0988738C9397DEE993E8D960158C50EE10BD3F9E8AAB92C31F459250F17330ED1C73D3D9E24FE3E598A5DCA923E0D65DF88E2A25B5F3BA65BB7D11AAD8CA1B224DF87403E1FC9A54B9C2D81116CFF85A7F4F0731BD61956E3D5FC2E75270F474C7198A4950200691E795573C684B29DD3FC7B825B9121E03C79428F50EB798964DED2F0196FC46C71EDC55D00558208C5D304E67064932114AE6875B06BB3625DF20FC69C76E35680772FA479726D941E2808130BC828DF6614665445276C3401BE0283A2AC3DA697776FF34BA4AB6EFC747274ECC4BE750CDF07863797C1F510A5ED5B7E9867AE78D08AE19A567EBFA92EB3063BEE12D16AE294266EC6CF097971217BD6D24F924EA4806233F497D004F0F1F0DABCB222701138E32B54F6593F5EEBC32358D23AF813EBE786C276BB8EC491DEAABE5E709E113938CA393DA3ECE5533ECC5F8B81D1E9EA346828D62EB145CDE600AA3D16CF743BBF961A7F1E56A592CDA5AF50BA05C0EE2A42E6E5964D6F3A24A08A431EF79D2D3EF3C124C02D7FC63AE543CCDBA599066D7878D7D0CC2DE4C77214122957701B3873B4EDECB2B2D281BD517F1E4253A3D074E6AA4764DAC51AA0DBBC1E28F0D611B0BE7D9D15D6B096202D8B5E0AAC67E9FB0950C3046C70993789D022A9F8BE08542FA8F700A3FA1DA3 ss = 28890F61FA78B628AEDC13377CEFEDB28EFCB9EFEB2BFCC3 count = 42 seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE pk = 229F4CD44320FC5162A4C86C0B4323441AFFB5680350BEBD17C4926ACB41DDBED1C3D6B74B0CC2D9569BD4FF199B1CDE87979FE545D5493130A7DAC44683FE18E8A8EBC755EA009AF8250FEF434D8EAA0670FBFD64B5400ED73990DE9D37C2243768C73D0DB8377C3793B17361239771E8428AF010DC217B9BA5F83C6AF46BB92C8E57E8F2EDEF0BDCCA9B1203E0E36738216EA9032D71DB27011F353C480408DF989F36DE9DDB977C2A57231F8BFAC2FEA5A8256B8CB75BFCC2760D0DF59A4CFD8529DC9319E7C44F9B61CBAFB8C983EE32963B0D1ED34F13035F63A42BC3B7E2026456933B7BCEB816E7F47A5A0BC37F0DB395FF719CEBDF2FCCE56463DEEF5D422B581EC840587E0E5BEFB58E4FCA6B365AC89DF622C3DB4DF87E488FA2DA285336C67AA262D2D7876FB7E663250FF34B90CB39B6D087FA9665D16617948A2051A2BA0B1DA3D47E6FB45318A97760800057EC09B44F2362624699D725E74A38331794212646AB5A3C1572577F4451BB2D33FB9B4ABB0FF8AE89E64164024E28194701A829D4A4422CE4C33262FE1339F0666787F779BB960413135A62D4655749B775E053D794AF00C04F0B433927A7635E590590A5212984EA19AA64386D840F393AFC3024D45A0F1A3DCE681CDC640B1682D131DAE82F791B6C1B7DB436E0CE04D0DFD43BC296CB27AA2534D5BA40A7E5D874FCCBA5ABF4EBA7FEF413338BBD9F44E5CED8933DD4FE53A19EB474C43A0B3CF399DFC8237D71347F7C03CC697C14F4513F56EF2BDF28F5BE2896919215930B sk = 610AFB64BE8CC1DF288CFB016EE2F44C6C07113DE7F6FEE071FE0C3FE31C6215CD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C52DDE963EB230D9043216BFC31722EB2A203229F4CD44320FC5162A4C86C0B4323441AFFB5680350BEBD17C4926ACB41DDBED1C3D6B74B0CC2D9569BD4FF199B1CDE87979FE545D5493130A7DAC44683FE18E8A8EBC755EA009AF8250FEF434D8EAA0670FBFD64B5400ED73990DE9D37C2243768C73D0DB8377C3793B17361239771E8428AF010DC217B9BA5F83C6AF46BB92C8E57E8F2EDEF0BDCCA9B1203E0E36738216EA9032D71DB27011F353C480408DF989F36DE9DDB977C2A57231F8BFAC2FEA5A8256B8CB75BFCC2760D0DF59A4CFD8529DC9319E7C44F9B61CBAFB8C983EE32963B0D1ED34F13035F63A42BC3B7E2026456933B7BCEB816E7F47A5A0BC37F0DB395FF719CEBDF2FCCE56463DEEF5D422B581EC840587E0E5BEFB58E4FCA6B365AC89DF622C3DB4DF87E488FA2DA285336C67AA262D2D7876FB7E663250FF34B90CB39B6D087FA9665D16617948A2051A2BA0B1DA3D47E6FB45318A97760800057EC09B44F2362624699D725E74A38331794212646AB5A3C1572577F4451BB2D33FB9B4ABB0FF8AE89E64164024E28194701A829D4A4422CE4C33262FE1339F0666787F779BB960413135A62D4655749B775E053D794AF00C04F0B433927A7635E590590A5212984EA19AA64386D840F393AFC3024D45A0F1A3DCE681CDC640B1682D131DAE82F791B6C1B7DB436E0CE04D0DFD43BC296CB27AA2534D5BA40A7E5D874FCCBA5ABF4EBA7FEF413338BBD9F44E5CED8933DD4FE53A19EB474C43A0B3CF399DFC8237D71347F7C03CC697C14F4513F56EF2BDF28F5BE2896919215930B ct = CC29A750F319502A69C6C237316543C0CD34CEDD9332F1873E039D472ABFA5474317E4D6DA546EEB6B34AD9F777DA72BFB17892EA7B0835081F987DD1F0A3798A93106CA8D1FD23CC91CCAF738C51CB0B944408F5685B0205E66BE8D52690EA5FB2ADE8B7478F97F7B50951DC5BD8342777D656BC24CDD8B453A17D02FC1FF180CA8277DEE6216189F1DD1E2DE65ACB8588355A03E462EA2C43609D09A6D9B86BEF09474A1F37E198D8ACDFC15A71ED2024A1E7DA2D06FBE4C3B012297B5B4AB05272BFB9DB0F95296A72F51FEAF4A116F4D0361866F1FCC1AAB52DC4F95D02F231C05933DD0BF62EF325E01EEDA21B9635C770CAFF6A2954C45E836613D8BEA0EAA69C815A906299258D6F4AEDDA32C510EBA23574B2C9A4F4C0A758BAC7458C7FEB3BA2154EA086A3FB2E64C1F7E4F18CEBB9A9131957518631AEAF65ABE05D179A908552DAA8ABB71B1BB0D79C1AD82AA1C7E7511F44D42977B38CF40649F4F6D3E31BC3FDAB230193A7FC7910B4C3E577AD9BE00E46814C326E01E817526F832A354EED75346B001F56637462C8BAE569E01641D7FE456D0DE7CE534896B1533F458B83160C48027C0B94BAAAB9337D1E2D9FB3C70F20BF61527F35F787856E402C2C6672AE5D1EA74E05F039B0D948182809025F5486F6327F387C6A2A4BE8CB4CF3D456BA1FEA2C19544EBCCFE1ACE26F1FE20604B8D21B403A470B041CF4D151499B0E7BCD0910BCF81DED2D733C643225E581AF8D5E39E41AC320882EB477BFB77D309F7446FC780179D02343BD7F010ED810B634C4E1A3D747B2FB80E0A36CDBF2A3183895D95D03079C861A8152D74 ss = 65AF106FEDDCD1C5C4104DD694F6631E24AC314F757C6F05 count = 43 seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 pk = FA4AFF9316421FAA7CE9A6AE013F213945ED98612444C7D945C5372591F201DB05E3819B84FA27AF03B46CB7E304A294A71FDE1B42B98EB5E84574F6362070FC096594EB7D91707A25EE817159846BB1B07011AD4B5479C0DCEA09EE094E6F4A2B48D90AE2D1D20E7F891F578811B97D2BB0D3D143D4FB0F12F8433F445D9169125E0D54580679EFECBE05EB179F09B9D2018886513C40660AA53B71FA3485A24F1F272158D2DE5BA1BEED925F69AB913030DA8184D06CB281FAAC27F63C21B50C8ACB901AFE7FF021D6DD27AE451815297C6783B4F49A55EF27C92E9F7B4CC3ECAA7FDEFFACEAEE51116E8DB1DB39B1523439CB10521DD8F9C379F9B757C8FEC084AAF53CA0A708D2C263EA64632890590DEB1481E86DDDD655AD0A0E54A4147AC9B36E23D3A1072D498F3F554FAB8ADBB193DFB7995B653D6957417192DC8DD2D226538C432C708F342EE49A121260C2296C5D6B7245A389C81E4DDDF8A6AEB38BF3BDDC63120B9B36A488E6D24BE922C6797B2153145538017167257970CFF5AB03FD6334CB571474D609E48B6A848D83E77CDAF2391DC6B18445C8D686618170E06D70CD8EAC809454ADBE15BCB6DABBDD79DDF3BD1EEBF7CDF68E271F4ADC1B08E6344F559553C5E8F2CC7B583F39138BAC435AC016B3F6E942A2D36CCE5BE5CED62A9BF2C805BF1509F6086393567D231F44C47009713B89BFD269BEE16BDC24D2BF4E7E5FA919FA7568CE52A0EBCB65BFE8484A160755B362D7B9B2675D7DDB4CBDCBF28B3B900C4F678DF1AA11256F08 sk = E1953800ACAA85AC02A906C72CB8E8D704E8D27820345F88F71E89C1F549AFCC8C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB366C2EBA73D4AED17740C1DC2B67CA15DD01FA4AFF9316421FAA7CE9A6AE013F213945ED98612444C7D945C5372591F201DB05E3819B84FA27AF03B46CB7E304A294A71FDE1B42B98EB5E84574F6362070FC096594EB7D91707A25EE817159846BB1B07011AD4B5479C0DCEA09EE094E6F4A2B48D90AE2D1D20E7F891F578811B97D2BB0D3D143D4FB0F12F8433F445D9169125E0D54580679EFECBE05EB179F09B9D2018886513C40660AA53B71FA3485A24F1F272158D2DE5BA1BEED925F69AB913030DA8184D06CB281FAAC27F63C21B50C8ACB901AFE7FF021D6DD27AE451815297C6783B4F49A55EF27C92E9F7B4CC3ECAA7FDEFFACEAEE51116E8DB1DB39B1523439CB10521DD8F9C379F9B757C8FEC084AAF53CA0A708D2C263EA64632890590DEB1481E86DDDD655AD0A0E54A4147AC9B36E23D3A1072D498F3F554FAB8ADBB193DFB7995B653D6957417192DC8DD2D226538C432C708F342EE49A121260C2296C5D6B7245A389C81E4DDDF8A6AEB38BF3BDDC63120B9B36A488E6D24BE922C6797B2153145538017167257970CFF5AB03FD6334CB571474D609E48B6A848D83E77CDAF2391DC6B18445C8D686618170E06D70CD8EAC809454ADBE15BCB6DABBDD79DDF3BD1EEBF7CDF68E271F4ADC1B08E6344F559553C5E8F2CC7B583F39138BAC435AC016B3F6E942A2D36CCE5BE5CED62A9BF2C805BF1509F6086393567D231F44C47009713B89BFD269BEE16BDC24D2BF4E7E5FA919FA7568CE52A0EBCB65BFE8484A160755B362D7B9B2675D7DDB4CBDCBF28B3B900C4F678DF1AA11256F08 ct = 3BDDD9CB33CC6075767BEB510BF769A48382A77C7D47B25399CD6DDF108F92EAF835DDD7A82C3CF383094AB9AC04D924343148E7ECE7A7D5D7039777689664D233B0D9F684D467D55CC9FD1370326C0F9F69394629D07AAFF05FF8CB6523D0A0A12675B67B624A5E2F8C0F035089461E541223A3CD80F3A382617ADAF559D274929A015723DA7459735BA94C0DDF1276398DC9C010E4EF2FECD556B1A4FB0AC45997C9B0994C36E67823B0082C43705F10F7BDF97781B6D54491A20CE286758EE78FB4A361F3B0F57BFE8CFCEF9E66AF0CB7FA18A737FA5AADCAE7EF8B927955E5FB023C707564FC5C46E2C5DBEC2AF2A36FF97219AAB0B53DBFFE82C4C05D5FD1914BB455CD67BFDB5519CCA5B56E41649826F1F2A84238073BCECD86568E878989B6FBBE99EEE77835404EA540EFD781F2D6D2C4B07C2F8DF00592355B8BD09D65404571BE99955B3EFBB2BD712C400A6A767F01EB4B57305ECBCF356BA5E5F881462348EEAEEB8E14DA4433815A1C1D7DF19F9A887B35B6AA199FB9301EAD96E8B4B1169A288A32A718DF0B4AC81B040597ADF086F84F46EA0A9BBDAF83A11A01C18DBC5BDD54BF290EFCB951089F531C2197CF8AB3B0090D243D44DD91D434122D1BCD96D665B6D0BB4A108799AF763E2DB95501A5A9B91C20F2B4F8479742633D04D3319E9269B5F01AE7E6B43A6FE0CE8CC72FDB514C0BFB583B9E8C265F0EE14F7782ACA7DCAA4E26B98981F8E14EEBC251D429423575CF8818F31321504AFF240AEC72087A00ACE19EA4FF7A2D1749658EC3DD9F268290D908733DCF5B38F7908698FBC2896F8484E81D6442E2A77E8A ss = 35644DDE6B7B579B137DC4B58D28B46E6DE14DC504122AFC count = 44 seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE pk = 0F46BE822D7DB090AE6A1265DA749DB74437CC326B94F629C72C9BB6661A6DA4F7EAD1FB57A62B4BBAA1E8379E1665DFE424A181A8133C9C81CB104DB3ECED1E57A3C3220C5A3342711577A208E5CA47078F841DC71AF84DA13EDD673A03C2736B940866613AE47CD282AC461FB6940A307C3756D07E6626D1386759F6A1CBF7FF76C543DDB5981F4DABB4A92BDBEB808FB40CB25A5ED0673FA60FB1073258D67D1AED4AF8BDDB77F6FEF86F104DB255AA9856B83114706D51907B4EC9B6D30615788A1C51A23A80A8AF6967ABF7D768DD3F499878DC97CABF07052C6CBD80D04F5594B99802CA3C50119664660412E56F3FC8A1CD240EB8C8DCE4602B09CB67EF3FBD2933C48BA37F8DB896E8F0F848C5AFFBD590C09DCB250A7A79763C06E8901243127F19CCD423AD430B8B864396C6162030F1F3070AA6D0A8FBC1BA9A835AC93A39CBDB372D95DF3F7ED2E779CF8ED7CB5F59D48FE589AA450F3BBC1C09E601E52447C04E23E934863655F8E525E0341514E8A4FA26F82BA15481F73B9BF76BD0DED1896D07AAFD5269324F22C3451ED612DDFBFBCE6882165EA74B75F5A492B44C7B16E4FCFB36314C8DD183CDD67D4C1CE1C7AF7E4ACCA09136B891D93A354C77F395EEFE16329E226D5336286F8B0A93590BCCAC100270B51D4974295C0FC90E3BC1147D9F912EA15411BC041296D055ADCE5D55EEE75C40330FDFEF6B0230750D37231E95F0EAE423CD30B89DCDDC5914C85DCA2866B492D66DAB243AE2C49E95CCE6CC2DFB2FE2A82F0BCBAF0A1A01 sk = C719F9B2D16399B7326CE4ECA30DABEFE8FDAAB18E9F6DF888B0A134EF355570E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED69BD43ECB0987E039EEFB08896A033E7C7030F46BE822D7DB090AE6A1265DA749DB74437CC326B94F629C72C9BB6661A6DA4F7EAD1FB57A62B4BBAA1E8379E1665DFE424A181A8133C9C81CB104DB3ECED1E57A3C3220C5A3342711577A208E5CA47078F841DC71AF84DA13EDD673A03C2736B940866613AE47CD282AC461FB6940A307C3756D07E6626D1386759F6A1CBF7FF76C543DDB5981F4DABB4A92BDBEB808FB40CB25A5ED0673FA60FB1073258D67D1AED4AF8BDDB77F6FEF86F104DB255AA9856B83114706D51907B4EC9B6D30615788A1C51A23A80A8AF6967ABF7D768DD3F499878DC97CABF07052C6CBD80D04F5594B99802CA3C50119664660412E56F3FC8A1CD240EB8C8DCE4602B09CB67EF3FBD2933C48BA37F8DB896E8F0F848C5AFFBD590C09DCB250A7A79763C06E8901243127F19CCD423AD430B8B864396C6162030F1F3070AA6D0A8FBC1BA9A835AC93A39CBDB372D95DF3F7ED2E779CF8ED7CB5F59D48FE589AA450F3BBC1C09E601E52447C04E23E934863655F8E525E0341514E8A4FA26F82BA15481F73B9BF76BD0DED1896D07AAFD5269324F22C3451ED612DDFBFBCE6882165EA74B75F5A492B44C7B16E4FCFB36314C8DD183CDD67D4C1CE1C7AF7E4ACCA09136B891D93A354C77F395EEFE16329E226D5336286F8B0A93590BCCAC100270B51D4974295C0FC90E3BC1147D9F912EA15411BC041296D055ADCE5D55EEE75C40330FDFEF6B0230750D37231E95F0EAE423CD30B89DCDDC5914C85DCA2866B492D66DAB243AE2C49E95CCE6CC2DFB2FE2A82F0BCBAF0A1A01 ct = 17EDC070F9C08F22F02709B8C2423F919D97A1141B3F5CF97675BF0F3B15898B5782BEAB23CD8E379DD0127EED2B0EDB3B60A33227186BB994AA5FC4268DE7C7FA52E59915AC81058EE90B13A979E93C7D9B88ADF24C5C401555FB2E7A2DA9B1AD7AE057F57A22BD001C18007537A7B63A2BC2A10D8DF7F8009D1E055BEEBC8B9B8FC557E4B2D4EE6E1FB7FA9DA2FFA812F1509EF6C380424F55F9C9CFBFB9B385646D8C1864775B2DF6A769C7B819CA8801D54F273722DA57C99E27E5AA0D915E13BDB84DF5A6E53DCEEE8EFDBC3957DFAE9B2B63EDD0998BA12F3289F09B6A5122133120F6D0D8005F9DA724CE60F7CF0B620DCCD9AECE6A93B82A13805DB57E389027164C56C1CA560D35C8E60CEA3B87D08C17344D7E2563E61DC9C99F3D4328CCE04E2C634C1EEBDC0B2E24B6CB524B28E4D774285A3F38CBAFAE9C4A8B40963A86ADFD5477D2F80ABA351B1BA93BEB845C60CC1B55D2A28545B64406989E56DA3B1B4B253C5349E1E77153CD228E736935FC11A66730ABAC1BC68A43AA0226433F08036BD17B061F43C427F18ED91AD865CEE2EF82CD9DC12A5EE3BCCA848337C3C7A4B0EA572B595B5795DCCD59DC04525B45BF1FCCB3AFE1B3CA48B8F84F117F629559048C5440CD57AE58F3858A627F464559D6911F1394D49914A9DDD57032B84E5997A731C9024F3A54939918D6FC21B415C750ED33986E0D2C1C62B9F4F644C31A314D23A04CE9BBAF81B6BFC6F5B93C4CDA2CBDE443734085EA0D3B5700382BAC1AE5C90EB6DCC0FCF4E026186631799DE69928796767ACB0C722B2A118FE8C9999FBAC78672EDBC874B3F9F192 ss = 7720877910626AD0640126F39004EDA846FE953D2E6E4B4E count = 45 seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 pk = D9035033E33C8DDBE05B0A32CEB1158F9C01E30F978052E07B65CD5DE2229370F63E052CC1AE952FDEBBD04FDD54EB3CB508A45DE85B016AB5AAA4D8E6E867376E5290962564DA9B244171AD29E1A6FCCF2590560E3DB007FC6BDCD9A9551F2841D75913E2343D09EC63A11BD0710D826771D8D47BAD441F53E5463BF3ADD5D960F9EDB9402E4C5ED075E985A82C9B804F8B021128B009F8A8F77E03D9A01A316D71C1CD7077F9785DD9CBC1F94318C5C555E1BE480B2C3BCA3DBE55BE861BA9F72932AE7CD8AF018F961EC7D963511C10B8685735288B35805A64C7DBA79733302759F722BBF49948035388F1609E05AA75E557EDBE0E64D978C33988FE5E5A1985468AD82A1D0B003854D7832FC7F5C4161E00214279EDD13764CE912B1BD76A57CFBD211235815BC50D8062500B9CE4ABDA645E916F037578CA61E5396C000E160CFAF6375EA0CEEA98B8A58C771F8822B1127BDF3583D826E2A4A62E66E0102E85B4696B982AFAF502D9060BA60296DE9AE8D58573305BD235A90DE623CEDEEF3CD09A7F47644591ADAF300DEDE98EDC612EF189F614BEFE5F58B2EDAF674EC797D29002AF4EE4DA7E53CB11785A7325BC8C31B89A4DCF56D05823494D9E94E5A827B5B11913D6A5E481A8207EF9761D6C49B4339134E505D253800150E2F2075F7939B388C47F1269E5ABC4F8946634FB65C0C37C335D828CA9CD21775760CEC610E55C0A3F604DABC72DC8AC826B26F234B880603FD24F1136108AD4B5CE0815377EF1E656E7EEC8A78E70B6C21E795163 sk = E9ACBB774BE970206C3A738E243B420805A509FA59FA902044BE2F0D013650D2DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8BA8EEB442F8E281548F83319144EFE74100D9035033E33C8DDBE05B0A32CEB1158F9C01E30F978052E07B65CD5DE2229370F63E052CC1AE952FDEBBD04FDD54EB3CB508A45DE85B016AB5AAA4D8E6E867376E5290962564DA9B244171AD29E1A6FCCF2590560E3DB007FC6BDCD9A9551F2841D75913E2343D09EC63A11BD0710D826771D8D47BAD441F53E5463BF3ADD5D960F9EDB9402E4C5ED075E985A82C9B804F8B021128B009F8A8F77E03D9A01A316D71C1CD7077F9785DD9CBC1F94318C5C555E1BE480B2C3BCA3DBE55BE861BA9F72932AE7CD8AF018F961EC7D963511C10B8685735288B35805A64C7DBA79733302759F722BBF49948035388F1609E05AA75E557EDBE0E64D978C33988FE5E5A1985468AD82A1D0B003854D7832FC7F5C4161E00214279EDD13764CE912B1BD76A57CFBD211235815BC50D8062500B9CE4ABDA645E916F037578CA61E5396C000E160CFAF6375EA0CEEA98B8A58C771F8822B1127BDF3583D826E2A4A62E66E0102E85B4696B982AFAF502D9060BA60296DE9AE8D58573305BD235A90DE623CEDEEF3CD09A7F47644591ADAF300DEDE98EDC612EF189F614BEFE5F58B2EDAF674EC797D29002AF4EE4DA7E53CB11785A7325BC8C31B89A4DCF56D05823494D9E94E5A827B5B11913D6A5E481A8207EF9761D6C49B4339134E505D253800150E2F2075F7939B388C47F1269E5ABC4F8946634FB65C0C37C335D828CA9CD21775760CEC610E55C0A3F604DABC72DC8AC826B26F234B880603FD24F1136108AD4B5CE0815377EF1E656E7EEC8A78E70B6C21E795163 ct = 509C0CCCEBA396D2C6CCBFB12A0E56832B64E7B15A5A8C37BDD59BD429433113CB95978AD5FCB065EEC6D1462A9C3885C0663346D9E76023ED3E06CEDE8EB89B0EBF1BFE85E4FC7FE31E784223507D27D1BC5B85A03476212429C4987915EFB6D609A41480CDAA2DCB91ED73D9CB9CEC3CBA0CB80E6E54C0C22ED1585A27FF763CDB1F5ED813577EFD8638654EA6F888C5EAF8A79A870E9EB2CE8B7268331218C16C4B4D8AB50F95DFB525DFEAED49E8B3439E19586B0F94485F7329E52C26B496AF7BBF98AC8F02E996EE9B253BF8D5FCDA90021E2C7D6D0007EEDD0AB90C2EA5B8A691C4660DCDE275EBD3279B1B94CE051530849B402D863406D0578ACE05149D5AF84633ECA9C62AF7C9A8089184413DF85E9AB0027A851556D54EF6E1A4A0691EEE959840C6821921CBA8CBCDE8A59CEC93481CF8A8147E73D96CEC5BC024AE74D6D8E1388713E5336AF86C3342241975C86DA58D773FDE16E0B946E7274BD2192D8A95E2A8E1CE39460F7908405B6D06ABA30EC552C4B3CD6CC5C0F63C5EA999BEF65B5D07F065E79DA1BDA3945574F490E3CECC30E9A949F9FFF0E13EA2F1094BB1B48BF9EEA7784BBEAE006A0254A44EDCF844981F00F1B453720743B86D798C785103E45C37B096CFE3165865852D65F75BD663331E93A6BA11FB293055155D541E0591D3C9DC1D3A918C7634F13FCD16B72257AA6D075AFBD003EB45B5AB0AD5E2367686F648ECAB7F715984EDF20F1BDE06B3BF0581C9B9251D7D07FB66C72EFC58C96B8F800257A9EBB7F23F655DC4DBBBBE1AE9D28B0D82040081020F9AD06F2305F2917CB3607F38972927C54E ss = D9466545970FA9082C0EFADA01015334084CC805AE7D6BCD count = 46 seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 pk = 159F80743F1EC97C05AF92976734BA0CA80F1D1E91D0B4831A52EE2AF2862A41D9419009528A8F1D452D0760C9B2AE3F2DFBDEB95C700790FF50DD3D2B05D1B945882DD851056C630ADE192A0DC5767D0E466EF9679642F0392A8F10D72471451DCB1FCC583ABF6D43D0490CCFA0400AD125203A0D8B30AA6067CC91E974729EB269828246D6E4BA436A46C46354EF9B49DFC479A9B48ADF7EF2298D67FDC523DB7010D4BEBF0BDD3C9310B38C910939A04EC4F8685E842283B14545B5A1A719BCB32C1CF16F9593B915609A3FD44A9AC6C1A6BA483579D11D4238FF2BAFF11A039416FF9218BA3608A2C038B143E4558967C338313B9DF6688AB8A0FF3D69D2F48FB9EE48149D4F5FDA32E21FEC1287BEDCF171E97829F03A1EB76FE0349AE8E92D5404421553E7D568F67A73C968AFC462769D58132D427BE3605FF5B63AFCB007EA06BD92F510C4632BC861E254D324DFA47C6D25F7640EBC5135989CF1E127CBA42A3375546916AAB26E5E8A08DAEBBC0EC8464ED0204228699452F2304D4B88CF9FA175A567322E0289E2DFFE8F1D0EEBBE0595E12035EAA0B4C52E55EA8498E27FC5941CBA577F6590DA7E0A4BCB83C77F8881EE9649B2798E37C45696BDC77608AA36E42B415C0FCC8AB8244393B1A8A71357F8FBEBF1E92D6BEF93FE39A105FC22EE7C2F62952FDACA4C70E094F1EE8B8A8256C8F890E6A8F76F35E65B028076E52C8019D1B05EE7CF0390800587651F7A2CA9C305AD66F78D7C293F8CE9A3A1E1BF08D5C448457C680A1442D37A2C0D sk = C1B3CBFFAD4B306F9AF0CDD3028876486DBE858875C9B6497FE20172A986C82B1C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511F2F254CE4E29C707FF6C23D92678583701159F80743F1EC97C05AF92976734BA0CA80F1D1E91D0B4831A52EE2AF2862A41D9419009528A8F1D452D0760C9B2AE3F2DFBDEB95C700790FF50DD3D2B05D1B945882DD851056C630ADE192A0DC5767D0E466EF9679642F0392A8F10D72471451DCB1FCC583ABF6D43D0490CCFA0400AD125203A0D8B30AA6067CC91E974729EB269828246D6E4BA436A46C46354EF9B49DFC479A9B48ADF7EF2298D67FDC523DB7010D4BEBF0BDD3C9310B38C910939A04EC4F8685E842283B14545B5A1A719BCB32C1CF16F9593B915609A3FD44A9AC6C1A6BA483579D11D4238FF2BAFF11A039416FF9218BA3608A2C038B143E4558967C338313B9DF6688AB8A0FF3D69D2F48FB9EE48149D4F5FDA32E21FEC1287BEDCF171E97829F03A1EB76FE0349AE8E92D5404421553E7D568F67A73C968AFC462769D58132D427BE3605FF5B63AFCB007EA06BD92F510C4632BC861E254D324DFA47C6D25F7640EBC5135989CF1E127CBA42A3375546916AAB26E5E8A08DAEBBC0EC8464ED0204228699452F2304D4B88CF9FA175A567322E0289E2DFFE8F1D0EEBBE0595E12035EAA0B4C52E55EA8498E27FC5941CBA577F6590DA7E0A4BCB83C77F8881EE9649B2798E37C45696BDC77608AA36E42B415C0FCC8AB8244393B1A8A71357F8FBEBF1E92D6BEF93FE39A105FC22EE7C2F62952FDACA4C70E094F1EE8B8A8256C8F890E6A8F76F35E65B028076E52C8019D1B05EE7CF0390800587651F7A2CA9C305AD66F78D7C293F8CE9A3A1E1BF08D5C448457C680A1442D37A2C0D ct = 8E520DD6CF871B61C40E72EC70C302161C5B4AAD3CE34A3551E74CD899C3544B4F2FC27BE0F161EB21E92CBE14911AB64A7EFABDCA34DFF50B1A1738E200EC3167DCF9F903306302A050669EEE8C9330D767E3B00E3F188CB29ECA216D4AE7C36B6A7AD458570E5706D6AEDD82C2490609CE73A1EEC0E828A180879C4F28BF53636F01FD918FE17F83FD780E373D6CF8BD1D6AE7B0FFA371A2773AEB25E19E36F8F0AC6FDEE23FF8B7AFEFE8293FAD702DBE90569FADBD0155818A32547FEF2E6214E97CAE8D7EB896C0E4062A7BD89A0B157CF1204AB3ECE96DF401C8548FB93FEB29F71F9ADE06574D99AC2871AB64432CECF15045D43A505C90986A43B7C5C3C7CBA6006BEEF076C78E78790871A53FB58E498C44B188B659A20436010752DA5047ACE4F5C015EB9B4E0203278B8EDBEA39CC32423E29B0995D4548849C12CBE4D40EACF3D01D77A4685CB390677ADC6E500E9793B7434E788ABB724A8E4B57DD1D6116A6FF8EA9A4BE760F1C805F094FC3B1A1AB842B4B6A397F304CC2BDD363A7AF53DE5C049C3FEF00512D9E1687C85B656CCD8C01CD43BE0DF02F6B39E218CEE23D08B22C4F4F7FEB16FB785E9AA27F72401EF128C0307F36AF075CD7ABBC7615DEAC43322A0ABEF719F1FCCEC7E20134902E69298653E588A5221FD401A39537E3AF85ABF65B019591D5B1A89C93EBE8AFE29257409296CAAEAE8917B2DB1E4A4E1BF9FE9FA1F224A2B93C2165DB13017DB4D4E6CD762C47700D7BDDB5BCCD06DB4A5D0728ADC585DF7135CFB961AE00D87E079AF4A02EA2F1189146B24F0757D3B753F27B7AB7B5D761751B12466D67 ss = AE3AD0B460C59A237A7CE1E067674E8A28CB68901B07911F count = 47 seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 pk = 6029F12014BF8680C6961124D93E64FFAFB31CBC82795B4C0954F6D1083CF447220F3F08F3F0716C06EDB10CF0EED2C596250CB04B6C78E1EC605CE670E56837522FC8465BA3FA872C6EDD0705188C4FD431B543C4CBF6CE2B05403F1912F84702F87E5F92D71BB9BFA771C556133FA2EA0B908DCFC973266E79DD8C2BAEF78B27026A339D4446EFCB14F2AB785FFFE5DE6D172B796BD388F7795890B559290D65E5C0412FD607E926D1BE363431D599FD34D8D1946C5686C6A991587F5A6287F2D7CB323CB4F452D4F5D49D3F55C1EBBE03B5269B166A16B2EBF101AD141ECAAD0040B0BA89C8B96A779DD69E53F7879025FA5F11EB1BAF924BE5C65745C3DC68A435002A4B82DD7194197E3A0E7A1E5C9D2C597CA426682933DF89D30AA8993725C27C17499CF1A9D8FD9F5888A513066C03A19949913AAE75C4087A9165176C62A6DCA6CDC63446B8C686D6F8E2059067E67E89437977B2C91728C852EB266690543D2F6415D88B98F912228D48C67884927ACCD2035D45B6D325C560622D763EF969A9B250E15ECAD22C5F3C2A6EEC3BC3914EB431524F2DD4FD26D39796581D4664B226899D8828C0491557A9D412FD242E9E616914C5981E0578F19169AD02274CE5F9FD5460E356FA9533A36A97C362586F2B223DE9E15254FBBEDAD6F70F867299DDF725FAA26F2712D99B354DB3F073837D68DA5CC3035122F1A9942C34472ADC29EF2F7004860B9E43AD959838AB67E839B761C091AA016B4FE74793E7120944B1CF72677C595DFD23AA1705885369 sk = FF7495B8575B5A98E4FD21FB4C3E58CBB60F14BEF21AA74CF8802E3153F14807BDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B5D1079345C46623B897C14635FB5051B036029F12014BF8680C6961124D93E64FFAFB31CBC82795B4C0954F6D1083CF447220F3F08F3F0716C06EDB10CF0EED2C596250CB04B6C78E1EC605CE670E56837522FC8465BA3FA872C6EDD0705188C4FD431B543C4CBF6CE2B05403F1912F84702F87E5F92D71BB9BFA771C556133FA2EA0B908DCFC973266E79DD8C2BAEF78B27026A339D4446EFCB14F2AB785FFFE5DE6D172B796BD388F7795890B559290D65E5C0412FD607E926D1BE363431D599FD34D8D1946C5686C6A991587F5A6287F2D7CB323CB4F452D4F5D49D3F55C1EBBE03B5269B166A16B2EBF101AD141ECAAD0040B0BA89C8B96A779DD69E53F7879025FA5F11EB1BAF924BE5C65745C3DC68A435002A4B82DD7194197E3A0E7A1E5C9D2C597CA426682933DF89D30AA8993725C27C17499CF1A9D8FD9F5888A513066C03A19949913AAE75C4087A9165176C62A6DCA6CDC63446B8C686D6F8E2059067E67E89437977B2C91728C852EB266690543D2F6415D88B98F912228D48C67884927ACCD2035D45B6D325C560622D763EF969A9B250E15ECAD22C5F3C2A6EEC3BC3914EB431524F2DD4FD26D39796581D4664B226899D8828C0491557A9D412FD242E9E616914C5981E0578F19169AD02274CE5F9FD5460E356FA9533A36A97C362586F2B223DE9E15254FBBEDAD6F70F867299DDF725FAA26F2712D99B354DB3F073837D68DA5CC3035122F1A9942C34472ADC29EF2F7004860B9E43AD959838AB67E839B761C091AA016B4FE74793E7120944B1CF72677C595DFD23AA1705885369 ct = 061A86DC4A78A873E781A2C0D14463E50FE3D916D27037723D959C1BD9E9B072349C598E2D57CF11310475CB9ABA311601F32005584C0CEE57F5FA93FA0505FC89CCDC40FC970AF004D234789031F67C3D2273F759725BA281F6759EC35630947838E3726A8CAB1C7CD8EE3989714008A2C8D477DEC1C201FBAAEBD30968730EDBDC2ED32539331DAFD842D0593AFE99E457367920B0ADDF72C64451FE4A47BC42769E2045BD499A39A97659E3B584FB0B2CB4588E862FA1297C7A1AC671D5BCDB6DBB3DA2AE43B5D31DE197238DA0380DFCE0B0B99DFC8121E8FF8531480F3C33B39CF7F6AF92F8F66DF88B3225C63C2315B96E1F3DA4CD4D5AEDA6E4CC76DAE228CCCE5F7EF0E9F76A527DD3909FE27E0F491A3A9742C7862B83AF34355CE64BFEB37AC5911CC7E36F08BA97F9F060B2C7F4CD5C435E8A77108949E1735DCBDA6430873D7DE962904000824302FE20A8ED59B83C877C45DCDD095A6245FBFABCFACE3172EF1DEE76FB92C654871090FE787C1DA99EA613F2325FCD636734438BA9812753B4DDF898BBAC138ED2B4296D083572B47BA739E2D827F42429AA3A2EA46341B4DEFDA0EA3E08AA95918CDCA1B2CEBD0FDB13D67B7A05AFED2C49421AD572CA92542312FEB09D6AD48EC4F4551AF620FE6E7C0341002649B1F8D91B3AE87176F658CD4CE517E1B1EE39E76D3E243404F3091EC9A0F39035EB03428BDB64E85B6055AB328E1D50F4DB6D46B11ABEFCD92FE12A613A802A523B297DB53F5AB99006DC37F762EC96777EEEAE23854A8F61A7143FBD37EA6331329B03F23518448892BD79C3C8A8B55B2DBE613C106B5E5F ss = EC8E0712C19918D1D2724AE502AD313114EB79D4ECFBBBD4 count = 48 seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 pk = 3773155325AE7F1509AA3F09301BB61A775328C11EE896627192DE45B20103005ADDB3F2424CFB1A5A5417D8B849CF38EB8F2D8800636DDE83BF9AC8457213A0680DC4969EE4DEE0A67901DD575F0450A4211ED5CA4C7D63C5981017451A91B7252A2B343A6D3BA2A3F137832CAF372C5FDBBE6FF4C0ED34FE8DE2B23B75AF68499E71241D64E18FD6472D272F8280C67B28C503C9B2B4D595AB0CF2AECCC3492A6DA3258A7FBBCC1657E4997A1BFC4F821C9A3DA3855D71FCC7AE686C9EF5EE24B3E2BE9E90D845E1EA106B90A0888CCA613D39C169C54A567586DFEB8A6616C09F1A7480C82D10DC2698A3BE6567883317FF66C36B70D0EE09ACA8EC9153A0C7B18A3931D5A59C14B65A758A4BD2ED9F96043753633929C629737E61067657FED3F5502A6E113B57B6A0567481533C5334FA3D551FEF27E8AAF8DD5BCB4C07EDA70F652BF498B532C5154895EA68A4ACC7EFCA42BE0B3315A59811C43E85AC104B755C5A19359EEE2AAAF278F026DE2DF1C80914B724409F8D29A07B26E07A2FBF00806D857882CE400324AD000B4FA8A4151872B77BE50912431C635EA8CC845402A7C3BD67DA778B32B752091830EB80A529542BD3D9D8A1D4B2063DD81AADEE4672F18FD4181502B11C36A4C1B1B7A60F062C22C3656CF578B29DAD688F50BA0E1F66EBF789E2A7C14AF7686F69B7AB2625C9BC0A9144F3D2178B1F27578411CEAE12A735A5C4CB88DC1ECCABCE54CF5445B7A9DF81FCE583A458AF801CBB56555351159690D7F351AB88BBEB1F83249F31 sk = BDC3FBA1C32751139FC45BACFFB3EA97F26573D804A5F27A459293D95190ED8EFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6246B1C126AF949A371C0C30FF2C2FA353003773155325AE7F1509AA3F09301BB61A775328C11EE896627192DE45B20103005ADDB3F2424CFB1A5A5417D8B849CF38EB8F2D8800636DDE83BF9AC8457213A0680DC4969EE4DEE0A67901DD575F0450A4211ED5CA4C7D63C5981017451A91B7252A2B343A6D3BA2A3F137832CAF372C5FDBBE6FF4C0ED34FE8DE2B23B75AF68499E71241D64E18FD6472D272F8280C67B28C503C9B2B4D595AB0CF2AECCC3492A6DA3258A7FBBCC1657E4997A1BFC4F821C9A3DA3855D71FCC7AE686C9EF5EE24B3E2BE9E90D845E1EA106B90A0888CCA613D39C169C54A567586DFEB8A6616C09F1A7480C82D10DC2698A3BE6567883317FF66C36B70D0EE09ACA8EC9153A0C7B18A3931D5A59C14B65A758A4BD2ED9F96043753633929C629737E61067657FED3F5502A6E113B57B6A0567481533C5334FA3D551FEF27E8AAF8DD5BCB4C07EDA70F652BF498B532C5154895EA68A4ACC7EFCA42BE0B3315A59811C43E85AC104B755C5A19359EEE2AAAF278F026DE2DF1C80914B724409F8D29A07B26E07A2FBF00806D857882CE400324AD000B4FA8A4151872B77BE50912431C635EA8CC845402A7C3BD67DA778B32B752091830EB80A529542BD3D9D8A1D4B2063DD81AADEE4672F18FD4181502B11C36A4C1B1B7A60F062C22C3656CF578B29DAD688F50BA0E1F66EBF789E2A7C14AF7686F69B7AB2625C9BC0A9144F3D2178B1F27578411CEAE12A735A5C4CB88DC1ECCABCE54CF5445B7A9DF81FCE583A458AF801CBB56555351159690D7F351AB88BBEB1F83249F31 ct = 65038DA6E3CE0D10FC027A768ACD8753FB570C25A04EC30E8953E1D329D20C18A9EAD95DDCE1564B7EB5C1AE593516789A03BD04507664CE9DB58F9BDCB4C3AF619C78DB0B296C87BB1B39A96B7AB58932B80FC3F773EFB165221929742E0438F3621B73F241000427550CB2A74F71DBBB09655809FABA36A695E970826D9F95B78496FFD99A6DC9A03B56670A47147E3B65527A1D3075E64D90FBE342ACB3655F363CE341D974FF5313AAE9DC9A25CE94E5337058437DE2C1BFC05EE3C8754E7C433A26B45546811550890D9254678C2CDC2A2A60C245080A500C8A35BAB7C0EC2D7F962F3DBF0B08C9467E5C3A148C703A993A7FBBDA26E58355F3782DF0D5C2879433C1D516E8988F6AB1BDC2F948E03C177E1B0C6CE6B747A91A750232367146DED5E2049C414C7A49295ACCF65427876AC3FE226F9AB6ACF54EB8E9BA9B4005165AC5D065185B10B6732EF5F56CBB6F4AD7FB33EEE2B2CBC2C38D3072FA4A89738D2039B6D9E30CE245B1D2C71574F88EB58262476C1775887712F25EE46820B390CC8A7B820706002179D7881A3E8B5DA8C4271778E860B21735A897BD13E3F073C6D0892ADEF429D01074BA6BF9975DAE6CC433B5B6FEFFD96500A97EC2571FC51F6778DC654486FC60B3E65F48449C3D2C555E086C1B36F4F64F798EE02D2BD1DF60175AA0AB3BD14EBC45CF2189DD7BA8128B07915F16EEA521BA86A5724B7462D58A7E1DC11F2575978F116CE22539702F5547F5312821FFAD77F63D6F31B19A30D2DC592191B200FBC25A519B5303BEA888E1441262A4E36A601412581086D524A36C5C254A4152829799AECC9B1C ss = B020509ED15C5E325C817221D677E6E1F987205D2EEA201E count = 49 seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB pk = 5B6912CBBAF2CA130CA0C351091129F45D92ECA0F66F2EE9C96F072F1B4D24F04AE7E77E70FE256AE7FB6D22A3B2FE8D3C160CBC0FA5DB1AC92CD5BA0E65C20F648C08C3AA7480BC95D83119C79A89BDB843B39BD24313E976957F4F3F4B72864D62374D39A923780BD54A97E7AD750790FF4157F55CEAB06ED883E777D41D7A3891119647E5F130192FAAB245AE96BF38BEED88644FCDDE2F1EA065079C0E25BFFC068CD5E8475F654E3CF59B09ED101817325FAACBD4A0FE8C9941B116A5460139BFF774FB4AC236F33C844014C66682BDB1A9641A38471EE93913156E666E30876433A5E7D9BD3E62A7231C9AB6BFFE625C4322B3A44CE890FCD0ACCD42AC4D47EF7B70D8B30C2EC28958D2F141E714D08D7F5CA7C51B7A3B01826E3274341B4818295F7134482128C89088EF9F2EDB93393602DEE0EA323741BF0A8CF83D5FF0113930236010E55A768A29680C4E8CB95DBE719413E340FC8EFCEB6626FC82B2857C0659603D6F4C993A51D6893D0E0CCA8ED014E6531F980C2E7B20F0A5321DDC90637A411766CD7958FEDA17EFC143B674B3A726B9E93A22970A5DEB008522F14B4F302069AA33DA078AED053DAE4566CF19E2CE50F6C110CFAD1ABE6957239D2521A8B716A42AC08E485D039D5A62868A5810E02718632A251A98F9B4874629B7B06D085EEA794CB373C5206C2E109137720DD5A32E32593F22942BAEB8554F1F7EE94E4147F742F5B4820207BFD82742A535318936CD49647D4841E6D310D00D3468380A0A87B2CC4C4E7759B8AAD03E sk = 447F6076A627BBC5AD7773FBFEB14B4BA9AC43A0F8B99FB6DCD5E452AA3C47EC20A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C018947AAE799ACCE17FD368D5E1B6C0D005B6912CBBAF2CA130CA0C351091129F45D92ECA0F66F2EE9C96F072F1B4D24F04AE7E77E70FE256AE7FB6D22A3B2FE8D3C160CBC0FA5DB1AC92CD5BA0E65C20F648C08C3AA7480BC95D83119C79A89BDB843B39BD24313E976957F4F3F4B72864D62374D39A923780BD54A97E7AD750790FF4157F55CEAB06ED883E777D41D7A3891119647E5F130192FAAB245AE96BF38BEED88644FCDDE2F1EA065079C0E25BFFC068CD5E8475F654E3CF59B09ED101817325FAACBD4A0FE8C9941B116A5460139BFF774FB4AC236F33C844014C66682BDB1A9641A38471EE93913156E666E30876433A5E7D9BD3E62A7231C9AB6BFFE625C4322B3A44CE890FCD0ACCD42AC4D47EF7B70D8B30C2EC28958D2F141E714D08D7F5CA7C51B7A3B01826E3274341B4818295F7134482128C89088EF9F2EDB93393602DEE0EA323741BF0A8CF83D5FF0113930236010E55A768A29680C4E8CB95DBE719413E340FC8EFCEB6626FC82B2857C0659603D6F4C993A51D6893D0E0CCA8ED014E6531F980C2E7B20F0A5321DDC90637A411766CD7958FEDA17EFC143B674B3A726B9E93A22970A5DEB008522F14B4F302069AA33DA078AED053DAE4566CF19E2CE50F6C110CFAD1ABE6957239D2521A8B716A42AC08E485D039D5A62868A5810E02718632A251A98F9B4874629B7B06D085EEA794CB373C5206C2E109137720DD5A32E32593F22942BAEB8554F1F7EE94E4147F742F5B4820207BFD82742A535318936CD49647D4841E6D310D00D3468380A0A87B2CC4C4E7759B8AAD03E ct = 29DE586CC60DACB027A20E7D98C3D9E9952EC4DF6F73EC0FA123FDBD032C198477AB73B4B80EA35A18ABE9CDBA39EF047D39BD97F58914435C4922511FD05D42D75408ADC9B3F52339F6D6BFB9DD66A1F2981EBE6BEDFFE135AB5732A71D90806D16A43231157ADF0FD7EA262BE1DBDB21AA0A0ACCE8152E32920706E640D73FD45D99804E533E5AE4A2A8CBB9C11758C91FDC72B899D3DD454844F4DF09DB971B31B95641DCFA5756143A411777250730ED6C42696B931B58E829024A86F3C4161DB4B91CFA31A265ED0BEB474A19317A5E229558473049B92AF1B4BE90E5A5B3AB3A66247CF06965460B864D850399DFC921B8EE1C822A5BA1CDCA781E4FCA046E494BB7EDF031269CA90193B985019287F0B92F826ABBB301F09169880C63984BBC3E8B859D64C23D4662DC841AE1ED1BAF6860AFFA90641E99A0473386F4FD700801BD8263171888639C65E9A6929FA2051EC86AFE58481E6E7DD9565F7BFD0DA33AABB2653BD49159BDF2BCD9D824539A7C3B136E17BF193AEB614F783E923939BB747EE84CCDDA16FAAE76BB732F21FF8F8D301EA015E1B5D41B65BD9FA9DB0F6D700FF8AF21910FF3264B3B22A52CA65136BB1D9D27EF15A11C8A6001DBAAFDD687038169EAA4A738673B4AF79FA289AE3E5AEAA9DADC44D43E1F9012646D4C4BD004597C6CFC72BB94AC2828ECE4F5CB563C3B24A161CA79517A7C6B4B3B7EC342D6D9A459887D09F3EE81273C6CFCB4AA9E34249117BF7480E94F0B380F20EC25274AEF44AC927140FCB1E76997DF2F62C2CD8F81C6DCEA0C9EA2891C235FDA831972298CF86AE6312622F3027DF59E ss = 837E0C55476DECAA51EDCF570EDDDC51545458B4629D266B count = 50 seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 pk = DA12C51211A9DDD32F2F70239AB8F5DE24A70C6493ECCFE7AE73F1A4832517469B36E0AB5F9E2E1BD306DF88142A25A4C72928C41E47CAF8DAD1C0362D59B23532DCB3688BFD0EA017FAE46AFD0485144D1E158F9C83B15FF69E1FDB2E47AFD9D5AD92ED614DDDC191AD4CA3069C3E2BA6B2B03DA95C5BAAF0F5C7AD2091195EE6A211021B86CA3167B8C44C2E5A273125FB18A8F9BE4237D318B0B20DEABE0552FA062189DA27F00DD17EFE7315365FF82A3FE377DE5A52E6A0A8240DB382ED66BD3E3EF68158DBD5B75A7244054707959392646613E715AA2749AA3FB6C01D2B07C5A2F49EBA6D928CCF735D20B1BFEC52D88309590208CE4F87A6845F8F09BDF1D30E871D9AC674002FF465D3321DBA1DE6008255A4FCA912AE0681D9CC03D139896DA9255ACA9F980A76D85E3BFC97F557E15139739B10EE503A902E1DDC9D334FC33A9BF84E65A1E544EBBBC1489EB8DB93FA667D32B7880F5E5E3AAE6EDDC8C3CE9E5310ED6A2B7E32B7D134B83062C03535758C5D97850EBB66F85EAC2ECB6F6DB43B5DDE7709AB627CCF12E8FD61870CF9ABCFEA4A91F57BF2142F94740A07B78D0B3D4CD886DDEA3FCCC118126C6723C9091C7C02EC321C465B577C591A891E1E5CC896080064CD3E676B0FB91522A9DF3D3911651F20802FE43CB3DA111A54EEAFDE6E73082D7BF787C90AB9DC6E69D2C40579C14F90113685BCE5EDE14DCFA9F114E4FF329700BB36984054AE5C6ACD243734D11A72BC54039EC04A9841449CF863A4A35ACF9F7D30FFF388251D45 sk = 2D5DF64D62CB07FE630310BB801C658DBF3D97993E68626745DE39D37FBFC2B27B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2FD9AD11C88352139F355097E0FFB2E7EE02DA12C51211A9DDD32F2F70239AB8F5DE24A70C6493ECCFE7AE73F1A4832517469B36E0AB5F9E2E1BD306DF88142A25A4C72928C41E47CAF8DAD1C0362D59B23532DCB3688BFD0EA017FAE46AFD0485144D1E158F9C83B15FF69E1FDB2E47AFD9D5AD92ED614DDDC191AD4CA3069C3E2BA6B2B03DA95C5BAAF0F5C7AD2091195EE6A211021B86CA3167B8C44C2E5A273125FB18A8F9BE4237D318B0B20DEABE0552FA062189DA27F00DD17EFE7315365FF82A3FE377DE5A52E6A0A8240DB382ED66BD3E3EF68158DBD5B75A7244054707959392646613E715AA2749AA3FB6C01D2B07C5A2F49EBA6D928CCF735D20B1BFEC52D88309590208CE4F87A6845F8F09BDF1D30E871D9AC674002FF465D3321DBA1DE6008255A4FCA912AE0681D9CC03D139896DA9255ACA9F980A76D85E3BFC97F557E15139739B10EE503A902E1DDC9D334FC33A9BF84E65A1E544EBBBC1489EB8DB93FA667D32B7880F5E5E3AAE6EDDC8C3CE9E5310ED6A2B7E32B7D134B83062C03535758C5D97850EBB66F85EAC2ECB6F6DB43B5DDE7709AB627CCF12E8FD61870CF9ABCFEA4A91F57BF2142F94740A07B78D0B3D4CD886DDEA3FCCC118126C6723C9091C7C02EC321C465B577C591A891E1E5CC896080064CD3E676B0FB91522A9DF3D3911651F20802FE43CB3DA111A54EEAFDE6E73082D7BF787C90AB9DC6E69D2C40579C14F90113685BCE5EDE14DCFA9F114E4FF329700BB36984054AE5C6ACD243734D11A72BC54039EC04A9841449CF863A4A35ACF9F7D30FFF388251D45 ct = E8109C2E33CE8140EB0BB30F73DDA0A90EA234E885DFBB92C7F0C5CA04D3995FF397D62D2EE6ABAD07D98724CBF2FB63DEF8BBB4CFE40B6F7D788FB5FB06FD74FBB011981D976C73192CF3C0D425A19D40307A1305ECBA0AA97C863173023805357F7CA3F5F6511ECB1D272BD6DD3FAEAEB2452BF32B3CDE86E47B54DCEE5658CB831573C491A3AA5729EF63278DA7DF3DDB6A9639B17575EFB3BA2F9EC1DDC23C42318F91772CB9E798CA3D005613F45AFD83156B639FD6D1FA962D5EBBE45B618907FEEC0979A9BCA111772395023408E2ED5BA197A3E30448FA3AB7943CC3FB7FA5720E787DFAFBD052B6EB003DC1D89364DF55CEB32663F9D9E367794768D41B61364D0E693EB9E515AA68A2682ABA449FE941DC5A90931299FBD495808A6401F2CC239FDF3EB5313D311772CB4A3A7162D97E8FA0ABA933736DAA2C5742456CD88B9FA5744780278680DBC27BA432F40B4B976EB7089E95D90602B7F69222BCD902D9831FCC943AC974F744034430714813EF15720A3107F47B6460974990A2AFAC23D1495E9A30E4CCEAEAA51704A4ACB6AB9C64CE9DC6D9B5CC309923883319DAA22B66351253370AF3754B376EEB83671A1CF8EE7D91B571176BBEA50CE6FF17BE3AB67DE8781A9DF3957ACEFE06AC16A95E291E174DF392BC70D863F14D114628135A225B6232ADBF2D5659F44BE487EC0B61A426C7A89DE1F156447E9C3316D345DFFC31199043AD47EA6B93F864E4B84768CDF135A4C900B0A7A74D7FDEA8BE351CC47145CCD580FFD4CBCBC8635B0FBC7E9A0878AA34ADBD9457C92D3E7C823610DC3589199DA1A617FD3F0E1190 ss = 38F138B31C1448AF3ACB769D33B9ED0768BE9EC6C6103D96 count = 51 seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 pk = 897AA793FA1A343C94FDF82B1F0B989DE87AA710CF2FF5209D90D4224677736D0F7EADC8935AE7178594E9666FDBC0FFC061C9AD2C2FF26A29D77E104286E7A5F152DBF765C50619AA3FDCDBBA3B1CC5E8F138176DD7AE40574560F4B72B33260675FBD98CE4889C2C4DD2116C475F2BF4FA4B3D9DD4F1DFC683F0190D912B8BE7A31474B5547EFD6949C750D37CC2EE88E6B3010929216C92596C3B82C3479F12DEE86F684047F897D86C55DAC2507D19CB44A8C7275496B0FA4104A123A4352733F1BF0C9FFE82B66731A03448FD6D7FA42DF000EE70FA26F5198A0A58C38FD78E45DE7089058377E811D0DE7F61509FF3A0818F7E7AF1A5D7559ADE708BD48E9FAAAD477C0C85CF3A44250F5857FBDC1F60ABB975B8BE480922B015D0EF6B603B7F4A3AD39A668E425C33850990F6CFD1324B5A16A7E7CD2D45DBEAEAFC49F4BA5B735AB545B634A675BBF141B0CE04523A8666EA57F5A2325EA768C9AC719055485C68B26DAFE264E0B983D78CAED33EF33F781F3D36B63963B8EAA600F055E601670C207276D5F2C32ED61D2B9E6A62DD9C0A230C518D09F0D3238E47F58A77B132EF1D81BAD59FD8745AEBBC6E5602081643B6E19069368DFF0EA44BB47D57B25C4168E654854A71F10BDF91E868DA5891E253E2CF8FFA81560228F20A08963E6C6218BD85B79E11662B4EF2992396C9BF6639B01C88FB535A8007EA505EAED0135B5FB1C8416F2989243627DEBEDC6A90B52C3F4C9B8CA9BC51FA4736899FAF0689ABFFE16B967CDE2DE643B9B6C01A24 sk = 25056D1B8113BB362DD979D98643D7A7AC9C4F95994C0BA060609B6D07002FF3F48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC45129C76D04EEF82CE39E21F4C96A5A6701897AA793FA1A343C94FDF82B1F0B989DE87AA710CF2FF5209D90D4224677736D0F7EADC8935AE7178594E9666FDBC0FFC061C9AD2C2FF26A29D77E104286E7A5F152DBF765C50619AA3FDCDBBA3B1CC5E8F138176DD7AE40574560F4B72B33260675FBD98CE4889C2C4DD2116C475F2BF4FA4B3D9DD4F1DFC683F0190D912B8BE7A31474B5547EFD6949C750D37CC2EE88E6B3010929216C92596C3B82C3479F12DEE86F684047F897D86C55DAC2507D19CB44A8C7275496B0FA4104A123A4352733F1BF0C9FFE82B66731A03448FD6D7FA42DF000EE70FA26F5198A0A58C38FD78E45DE7089058377E811D0DE7F61509FF3A0818F7E7AF1A5D7559ADE708BD48E9FAAAD477C0C85CF3A44250F5857FBDC1F60ABB975B8BE480922B015D0EF6B603B7F4A3AD39A668E425C33850990F6CFD1324B5A16A7E7CD2D45DBEAEAFC49F4BA5B735AB545B634A675BBF141B0CE04523A8666EA57F5A2325EA768C9AC719055485C68B26DAFE264E0B983D78CAED33EF33F781F3D36B63963B8EAA600F055E601670C207276D5F2C32ED61D2B9E6A62DD9C0A230C518D09F0D3238E47F58A77B132EF1D81BAD59FD8745AEBBC6E5602081643B6E19069368DFF0EA44BB47D57B25C4168E654854A71F10BDF91E868DA5891E253E2CF8FFA81560228F20A08963E6C6218BD85B79E11662B4EF2992396C9BF6639B01C88FB535A8007EA505EAED0135B5FB1C8416F2989243627DEBEDC6A90B52C3F4C9B8CA9BC51FA4736899FAF0689ABFFE16B967CDE2DE643B9B6C01A24 ct = 06F255002A4804965B98F51635165FDC299ABF9B48B78EDCC75B4DD8E227116B72A443A5995175EA5C277129B7422A9B40CF619A3D765A314CED58B110DDCFC6BEA14DA9436CB6C5233FE818BCBD6BC6CA38E84D381D2503DA734D9FDB15015BD5AAB8BA2B74304EAA7CACBF4DE63DDC69A9646151ADDBCC3070C49DC10F92D5FFDD4018818921BC94306C06BC2DC517795BD6377D3AAFBD588F6B4BE05A59B286DEB6C419AB39F9EBD4BE8D8DDC27F5AB720439AE4D5E8CBD548E60E90BC2C112F8242311948FD79E50D9D4EFBEC5FA7F82B0504FFFD3F7EE793B560992432891F8C2418B8F11B851372A36CC8C0598B9FE436D4C4573542A536913E1EDF9895C4AA8D2AC893F7EB362C5E3A84BFB70458002CFE13D379BE25D9E67C342A6D780A4A4D8B891862A0E10127783F04F90F8CD324D11366AA62DB2EF85FD4475391AAE811A2AD2CA2DC75EBA5B4C12FDF124229883C81C49A652A0CC232BCFCCE586900FF9F843A2294B7B89373861B9C7C87BCE572619232E0B673AE14AF7AED7D4935AC2F02E48C01A4A1D6E82F92E0A36CA6E77FD5A6C7EDB7C957B400501B2B1E5F34E861D151F0B18E023881D987E8628CE04D4337664B942F840905D473252D0F2F2F85E25922A78E8F8DAE3296179CDD1FB362DFB09FAD3218F7B7CAF618E1AC2B8F0D6B812C40C4E681E9AAAD75C16704B0F0C59BA1AD2579FA5E8E1E3ED17F3A8DAD1988DBDFB13D015870A167890D51BE496EC81F7FA781E175EFB2EED6CB9FFB41DBF57073FF98E3A58AF3B8506C010C8378AD5A3003E4ABFC0039E57ACC2C4D4E4483F7735BEA0922C9D748EC0DABF ss = EB35438CF570CDD33B6A4D31300B568291F53F327EC3212B count = 52 seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F pk = 4A2721A92E1FCE486A619554F3FC33B1B5E5FCC4C18D94C181E75AABBB4ABC4A39DF640C214B3D173484E88B327EBCD886041368F018218F898EBEF8A8E378DE8B6B1F0197D7CD7ED1B2317EF9EF0C24E037F304D1A5D5206852EF4AFB659DBD2940BF820FD15424E85ACFA2FDCC1BC94EC7B30C8D5E1E64E62FF065A34B1CD58CD56A8F36884B5391B53A7B9AA591922BB12DAF22518543B4CB82E9137CDFEAAFF2C3A875927005E6F7362D01A0C03DEFC16DE526154FDBF6B1D26AD831D635BDD0C7665965F3C20A79BE548EF25B2B7C1F63AFEDA215B6BC233AA6B131A8213FE683BB4EA1E29B089C763A630AF7E20C99CA47A46B01E400345155E03F7A39DF9A4F57A008B1531492C0E61F52E9A23DF490FD054D9902DC3C553C57EA0AFA621F86282591DFCB09C164DCDB7EDC28528104EC574EDFB8A5B148CC477F9A51C41AD54AADFFAA0D1F9CFFBB4185EEDB3046852D09D23D23540A6DAFD940A10703871027E348705D801A0045C21A1B7D5EEFA9E096823C4F916D73E6BF6F1E526F2AE2DA7C38485E379F676FE0D68B564656F1062B0C4B8801D9A24EAF2C8C6711DC08A2E589DCF60E8D7B850A582F56DBB0A57225561A120B60C8C161AA80996C1AD7ADCEB6DF4B81870013EEA9251ACD2F3377ED0F0FE61907F2CE5FCD237B8BB813E9A80351AA14BCFD28911AA98787E109DC5906BBC7FC740234E2A06075ADB6C86FE8B7E51D20F5FC7797C88482DEDE36662268CC85903C5D7B22C95CCC32192C68BBDB3840FF802BE954213CE5CDC1BD47 sk = E4D34E12982AEEB1D62FD488D9B9E28557ED3429292239FB4F76FA9098009ACAE6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A141BE969CCDB4A327CF359BF5A383E2A90004A2721A92E1FCE486A619554F3FC33B1B5E5FCC4C18D94C181E75AABBB4ABC4A39DF640C214B3D173484E88B327EBCD886041368F018218F898EBEF8A8E378DE8B6B1F0197D7CD7ED1B2317EF9EF0C24E037F304D1A5D5206852EF4AFB659DBD2940BF820FD15424E85ACFA2FDCC1BC94EC7B30C8D5E1E64E62FF065A34B1CD58CD56A8F36884B5391B53A7B9AA591922BB12DAF22518543B4CB82E9137CDFEAAFF2C3A875927005E6F7362D01A0C03DEFC16DE526154FDBF6B1D26AD831D635BDD0C7665965F3C20A79BE548EF25B2B7C1F63AFEDA215B6BC233AA6B131A8213FE683BB4EA1E29B089C763A630AF7E20C99CA47A46B01E400345155E03F7A39DF9A4F57A008B1531492C0E61F52E9A23DF490FD054D9902DC3C553C57EA0AFA621F86282591DFCB09C164DCDB7EDC28528104EC574EDFB8A5B148CC477F9A51C41AD54AADFFAA0D1F9CFFBB4185EEDB3046852D09D23D23540A6DAFD940A10703871027E348705D801A0045C21A1B7D5EEFA9E096823C4F916D73E6BF6F1E526F2AE2DA7C38485E379F676FE0D68B564656F1062B0C4B8801D9A24EAF2C8C6711DC08A2E589DCF60E8D7B850A582F56DBB0A57225561A120B60C8C161AA80996C1AD7ADCEB6DF4B81870013EEA9251ACD2F3377ED0F0FE61907F2CE5FCD237B8BB813E9A80351AA14BCFD28911AA98787E109DC5906BBC7FC740234E2A06075ADB6C86FE8B7E51D20F5FC7797C88482DEDE36662268CC85903C5D7B22C95CCC32192C68BBDB3840FF802BE954213CE5CDC1BD47 ct = ACCF5F25E420466691466EB6E0B52D039F88C6D58DCD155B74A16678780EF40B7267EE20AE994A1465BA8D78543D70A5909662B840EF8D59075335CAB4CC10DEC25B6CA3591DAB4AFEA17EA30860F49EDC183A479788F071E27C7C162D2033F3F5494D68020CB54305421BF7ED558A1ECB71C745AE4EC1D67194C5180037AE5C847A0278473A8BDB84B40AD79343A1FB98DB636E753568F4ED678601504B9041651C39D60C7027D5E0E578B05FDB097EC01B70D5807FB1A61F6B7D2C3C4632568DCBB78F47CE5A7171596D182AAA12BAD205638CE78FF8510B64F9BF1A14F7D47732B8AFB56E975868192760EE4757162557754E7079722B40F24BBDD722904C39B4EF9424E6864F772D5D130C9C01B8973F1A1C905C01564C009CEDD8B34C5746018F3A5E6C81CA4AD77811CC8BBD5B5BF448955EE09BC78315D7739B094F16690DA8D567B237D933DB02DF22343FB2CA3FBF578F1E23D3ADA6DAB1BF6A128984E2414CEE5B5FB2842E37E5FB59C63212F05ACDF779A83F8D2A5310CC4A36472EA288A52043D18E7D9B4976D3BFF6F03FDF06FD25FC25CA88DF2E5E3438F48C186867D98C8B7BFB4EF3A249C68C9D92BB1250C73D24774A7B6F7337E050989D6717B9615976E4A50663A5437FF9AD0BB7DDFB62B81D71887438E34A603D9BA0FFAFE6430F7F95F4160D63052DE867730CE4CF3488B020CAD2632368C9E78C4CB42C8DA96C8D617E1E172C2DC6CD3799D810853362ACC6AA77EFF149E7EFF5A1B7FFB2B750670E7B9C358445F59D792E4201755D79E08D94B684530252F7FEE85281A83A4ACC0477F0E43057B1F195733876375E ss = 431B06B9BA969D719FE1FB4583CDEF9BB973F064FABEC7F4 count = 53 seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E pk = 0AD6B8D5DDCEB9BB5E401804A84124CA7E20881CEA38D00AFD1EDD5948348D1DA94C9BE9C440A5B60EC2CC72C8EBACB8FB170322E71528178D924410D0C5B90EE6A5938E28CB72DB50AFD78B9EE1141A9136CF3C49FCFEFDD8481E2ABA37C006B872AF673EB1036857AF21EAC5DF72EFCE88330EE516F5ADC4FFB6FCBA442774D3197BBA57C77FE187FA8BD0F0CD3513C214490402FB8B7254425CBDF0243C2E0A67209435911C18A96FF50E9006A57714C37702F388B681A1D62D32DDE526574B1D105E4EB31B31089CDC522026A5D874AE30D3775AF707903E70258D9D788D1DB95D482A8A47A9A24D7DDD8FC82841ED7E3A25975F86FDB0F3021D5F37635413E75F0E4500C94FB1B26C4719D4834354A07F8A98F2D04D2D663164C6272D5C5BCDF58D83A6FB1F86B6467C9AFD6C8944CF6AC51A58DB5835A6EEBACA31A847D1206F80F097E7E672DF52A43B1A70B6976CDE91F6957447FE4B21F5AC3C2FA757313FCC9A3FDAEE8FA0143F6751C393878D6AF979297B464CD0002EAF1C7FDF8EF6BE8780FA827C3CB95CD7E3DB2660DD53BF4155BF160F725C806491C7FE0233B8847022A5C01256C957C1A41A69BA4F9B58F5DA7DA7FB6B8D76E509F5C293F6E07A574343A1357569AD610DD3088859CAF483E641C04EBE1354141C4B13199DC2DE68726180862345AB8A18F1316AEF4C3D5E07E468E0A67E1EFAC023C30A7D37678C65863427B890244FD0DE658D5ED9B05A8E1D111492AE6AD5DF906268D8B2040C65153108FEE3039323A0EBCD89A63319 sk = CD6A99396EB3539CA663A51E42063A3A262CC1C5A5FCE1566F0597B52AD9FA325A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F89224C20F816F1146AA1493A0CA6BB1E1F020AD6B8D5DDCEB9BB5E401804A84124CA7E20881CEA38D00AFD1EDD5948348D1DA94C9BE9C440A5B60EC2CC72C8EBACB8FB170322E71528178D924410D0C5B90EE6A5938E28CB72DB50AFD78B9EE1141A9136CF3C49FCFEFDD8481E2ABA37C006B872AF673EB1036857AF21EAC5DF72EFCE88330EE516F5ADC4FFB6FCBA442774D3197BBA57C77FE187FA8BD0F0CD3513C214490402FB8B7254425CBDF0243C2E0A67209435911C18A96FF50E9006A57714C37702F388B681A1D62D32DDE526574B1D105E4EB31B31089CDC522026A5D874AE30D3775AF707903E70258D9D788D1DB95D482A8A47A9A24D7DDD8FC82841ED7E3A25975F86FDB0F3021D5F37635413E75F0E4500C94FB1B26C4719D4834354A07F8A98F2D04D2D663164C6272D5C5BCDF58D83A6FB1F86B6467C9AFD6C8944CF6AC51A58DB5835A6EEBACA31A847D1206F80F097E7E672DF52A43B1A70B6976CDE91F6957447FE4B21F5AC3C2FA757313FCC9A3FDAEE8FA0143F6751C393878D6AF979297B464CD0002EAF1C7FDF8EF6BE8780FA827C3CB95CD7E3DB2660DD53BF4155BF160F725C806491C7FE0233B8847022A5C01256C957C1A41A69BA4F9B58F5DA7DA7FB6B8D76E509F5C293F6E07A574343A1357569AD610DD3088859CAF483E641C04EBE1354141C4B13199DC2DE68726180862345AB8A18F1316AEF4C3D5E07E468E0A67E1EFAC023C30A7D37678C65863427B890244FD0DE658D5ED9B05A8E1D111492AE6AD5DF906268D8B2040C65153108FEE3039323A0EBCD89A63319 ct = 660FB1D85B4B64859C6CE3C893E1C2F98D258A63CD8BA8C3E3CC20DDCC12B6E376CB3991863C760D8A0D01FEFF6FDCB3EEE058035AB7EF5D322E60034EE960FD9E431582E6F97960CABE687A92676B100C7728FF7DA824E37FC8BBA6B42B6D99321E03D9F2B877254687DDB5665D5B8E6779F48642724BEC56CC89A50CC54D0D81391A206756F15C106993200C767FA8F72B0642D30D12601B670F5B0952FA8138FFCA54478C34DB31013AB90DF57CAD89553933FE7A37775012E4349D12EF8BFBB25D705F8678C90E794469EB78A08C4AADAF559D4DB6644FE85918551A68BCCF932E6D3FF1F8024A0DB3E64BF1C7A518D986820DFDFED6BFDCEF3EE6F9D6D3E78F73865C10BAB3220911B2FA53B33040BF572DC4D8858F870F9DFB5D9E6D8AC8390B40690A7DADF99E57B4B09183196D153C0232CD25021CE3E17C1741EA92AA0520C0D7237C585AF2FA650495CBD7B9F036AE05549B0F42C36DA0ECC56810E9B6DEF33B91F3B8A9CF9F675136D990BE5A792F8C0AAF6034B623A2098980C75F9D53DCFDAC2FFAD1933814BA2109E74B468CC450A07DFA942EA68D60E2F5B0B5E38A826F6CD2B228BFBC81B2E0E0ADF924AFDA54CC50853D83EADF63F055AC1A7CAA96D804ED3881E45ADD1A16EB94DB1BA694D1368D7DA55861A91661041EA7C83EE3D9D7D6C7F7914861913F688644FD587158854EC01E7548997C9E102B15CEBB3DADA4BA6F627FF926E37D12A260013E40D3407412FF21DEBF6094FD1C4D0032C75C48A537F44C8763183DD356E8606535323E2294E55F7CB1A59D57E5073E4FCD9DD0A233276D9A112D729BC469662AD4 ss = 466C6057E939E70CFFFDA8BFBF6F7CD1A0EF894923C5E09C count = 54 seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 pk = 5A12A92930AF9BB84531E06295C65BC86CF993689CF345642966FF736171ABBBE1F9587BCC5A0CBC231B5CA5B300569F2316A57043F59BBB6CB0ABCADD12713245B1AE45E19C401922CE016A2C04109D869FB97A0A016959EA9BE75D5317582BE0CA1E4EAC7684FB276162CB2CF62D3B1F529AEB8383D8D26A4A9DCFDE50F60BD71C705164FE013D37F2A5790B8E7311964895579DD34BA4B03ED3E1F8A2F0A5320EAFD6FA23A3495E107C1078AAA9F3560BE9DBE71FB451805F13439A5549885B3122B89DF0D92E0F468E924A9A0571B39B325EBCECE2DB6346BD9B8F06228DE3B6DDFEDAE46D19D7C3FB3165FBF0353717E1A3DACC0B5B06AE8593141BCD06D0FC22BF22D3F8909E4D05183457D053259882FFAFE0860E4800FCBE88124C59B242C5CD896E92ED01000F55EEBE9CC526529CF4FCEC46C7BD44F6EECAD4330F7F6114588344EC00D9EEF1F0510A8A1E96A80908867B6215C260A4D29DC35D69D26FB78C8B271348D009AD13D806BF376DF644192DCA3A01CF42DEDFFC0370F184FE9854D5E7185F4100443FFB5309C883EC8E70D03F79182019535C96BFA07829A627C94E8525632836724F426D1F7B09A06B57B6BFAFF3352110A713C82DA356896909D78A4B7D657FB8D1FA317AC5C6235ADB7A3E5A6FA016AF690823F0C7A7D2D447FB8120E6E597D0B41EE30C92D73C8002A67190683335C81B9231B84339EE0EA1021DA63B8E0AE43FFDC25E30124F2FBD0D7399115578E3F7E6B5B080D4272BCD1A1BFD585EF635406E29B4A792EAEE35 sk = 6C8C53ED6F65E6B2E324B84364E10DE42D1C26A106D4D1C99EEE79C78586FB55B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA8841AC9E53A84C4F6E854A8394306D42015A12A92930AF9BB84531E06295C65BC86CF993689CF345642966FF736171ABBBE1F9587BCC5A0CBC231B5CA5B300569F2316A57043F59BBB6CB0ABCADD12713245B1AE45E19C401922CE016A2C04109D869FB97A0A016959EA9BE75D5317582BE0CA1E4EAC7684FB276162CB2CF62D3B1F529AEB8383D8D26A4A9DCFDE50F60BD71C705164FE013D37F2A5790B8E7311964895579DD34BA4B03ED3E1F8A2F0A5320EAFD6FA23A3495E107C1078AAA9F3560BE9DBE71FB451805F13439A5549885B3122B89DF0D92E0F468E924A9A0571B39B325EBCECE2DB6346BD9B8F06228DE3B6DDFEDAE46D19D7C3FB3165FBF0353717E1A3DACC0B5B06AE8593141BCD06D0FC22BF22D3F8909E4D05183457D053259882FFAFE0860E4800FCBE88124C59B242C5CD896E92ED01000F55EEBE9CC526529CF4FCEC46C7BD44F6EECAD4330F7F6114588344EC00D9EEF1F0510A8A1E96A80908867B6215C260A4D29DC35D69D26FB78C8B271348D009AD13D806BF376DF644192DCA3A01CF42DEDFFC0370F184FE9854D5E7185F4100443FFB5309C883EC8E70D03F79182019535C96BFA07829A627C94E8525632836724F426D1F7B09A06B57B6BFAFF3352110A713C82DA356896909D78A4B7D657FB8D1FA317AC5C6235ADB7A3E5A6FA016AF690823F0C7A7D2D447FB8120E6E597D0B41EE30C92D73C8002A67190683335C81B9231B84339EE0EA1021DA63B8E0AE43FFDC25E30124F2FBD0D7399115578E3F7E6B5B080D4272BCD1A1BFD585EF635406E29B4A792EAEE35 ct = F8A20F2C804FCF31D68899D384CA8895F4D0276A090C28542C2B1B0F04836F6F02C2599660BFC182010458B8C0FB63D31ECBA156B349C37989BAC0E9BD98222CCA5168173ABB704A8F6FBDAB6A8E50898C12A0FC19F64B1FE504C33F4F4B4D2BA1B54147A6193E03B4FEB7B369D3C2815A2D8BA2C6219C1B07BABF58FDB976CDA85DAFA74D6C84442D685A44997D72D8482E2EEFE79C4436C5ABFBD9D8A0535D03EC7ED56147F89989A2A04FDE2961790872257A4EE9CAC24AB207348C2961B6792A4B14E7CB2703D8B6F818C3CA3845AC4B582C6F22906D7BBDC08923DBDB8784C850E4909D3204ED7809C7B888741A35995943776C439173DBC6E3BE6CB5E1BE30668011987482D609BF65A2026C62FD376488493E8094E355B5607F45430EFE10EB24133697DCDC0F95C458DEB8D328B376B73DD266E4B58A72F80B0A4792BA4FB2C3BB038E49967FAC4C4634D293A5B669224F4FB5FB0BBA7A9ACA01CC35D83D4728139F4BB8EE186B6800FAA389750CFA8F34A5FD35EB5B72B648675803972A3D429480BA688C0208A42758BD0F5D01E1D1FB74B9175E16190366A4392F0A75C36BCFA4790307373A7653408DA859AEE5CB974AE861AB0D4EE907647D9E388087DC87005E4FD37E5FC507684D0B2D7B05BD1F504F802EF9A33AFCBE190F77CBE92AADC46B4631410E58C8BC66E99B77E5CE43D0056D18DBBC92831E2879F50292D9790CD57B11B2C0BDE373FFE30D81EEFEAFE034977A3130CD458EE44917F064968AF2DD7419528321D2A8AAF0778E2635F4BD500E0FA9FBE62DB16ECBCF0B2695C7D00F392E30D0066CF70F3ED76FC95A ss = C27CE7412A33AAF035768CFEFDBEAD3FEE2D1BF252832288 count = 55 seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 pk = F8AC7A6A0B244941653282AF21A248C23730F04D5970545DDC45F5FCA9F065339861344F994118D665286056AA98356CADF016B67B177C7DF4765E3B173E5A69F78A389429B037A91572E8CA5AED88E57A6E9C053BFB8643997E626007223F57C6E4B0A3AA0F599BA98C4FBCCF7C35A80DC999216CBE08E91EA6E55B2341AD43681EF9D0DAB211F5959713E51D0DE9859983A34B0007728666CF86FD91D53F055DC3D033CE617E59790A68405361015457DD17C19CFDA3171D16446D38ABD6DF850D81A8916A98550DD386B24D8AB168FC0417CCEEAC93836B02912F0DFF500698472EE19D75204E672A766ECC5BABB92EB11D09968B769F4149596AEADE1678026031D028632231FF9ABEA46F819A542029F74CD2CD6590C81803F5343E6D6DB5D2983DA73CCA4F45F87EF5794593D19980449F3D947ABC7F27F457865F96BB25074E55C2C57F7D0FB2D9B406B11F2365264CCB785B0226CCA86B3853BB99FD23CE23CBB7C78B843B91677245083CB39137B12F3735C75C0E3B0B5D19B5508ACB6F9FF4BA89EB607C2B95266EE7AE8A6463EE7E6489BA90BBB2F6AD2DD31312CEC7A44571FEE86256CDCDB385C3B5046CF6D9D4867E8ED4E667C7D5D7C24856AAF27AA3A54CEDCF30ECB605F0803D876AB8D3CE283E621CEE71EC7C189E8F3183DCCB6F2DF701E509CF0BDF2C592FEED8417F89B8F4A466809C93E38E6F836CF7CCABE0398F86C45BCFD2C004977E48A76D57CF23C61EA6657EA66EEC168F8071A57EB345AD38A9823BF6AC628CA4FBCAE8DF6E sk = 2107204CD995F1DF14314D5381F8C5440F09A347502E161CFFC0A2EC3DCFBC7324C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991BB4F9E267712F97DA8BFE5A32BCAFDF9203F8AC7A6A0B244941653282AF21A248C23730F04D5970545DDC45F5FCA9F065339861344F994118D665286056AA98356CADF016B67B177C7DF4765E3B173E5A69F78A389429B037A91572E8CA5AED88E57A6E9C053BFB8643997E626007223F57C6E4B0A3AA0F599BA98C4FBCCF7C35A80DC999216CBE08E91EA6E55B2341AD43681EF9D0DAB211F5959713E51D0DE9859983A34B0007728666CF86FD91D53F055DC3D033CE617E59790A68405361015457DD17C19CFDA3171D16446D38ABD6DF850D81A8916A98550DD386B24D8AB168FC0417CCEEAC93836B02912F0DFF500698472EE19D75204E672A766ECC5BABB92EB11D09968B769F4149596AEADE1678026031D028632231FF9ABEA46F819A542029F74CD2CD6590C81803F5343E6D6DB5D2983DA73CCA4F45F87EF5794593D19980449F3D947ABC7F27F457865F96BB25074E55C2C57F7D0FB2D9B406B11F2365264CCB785B0226CCA86B3853BB99FD23CE23CBB7C78B843B91677245083CB39137B12F3735C75C0E3B0B5D19B5508ACB6F9FF4BA89EB607C2B95266EE7AE8A6463EE7E6489BA90BBB2F6AD2DD31312CEC7A44571FEE86256CDCDB385C3B5046CF6D9D4867E8ED4E667C7D5D7C24856AAF27AA3A54CEDCF30ECB605F0803D876AB8D3CE283E621CEE71EC7C189E8F3183DCCB6F2DF701E509CF0BDF2C592FEED8417F89B8F4A466809C93E38E6F836CF7CCABE0398F86C45BCFD2C004977E48A76D57CF23C61EA6657EA66EEC168F8071A57EB345AD38A9823BF6AC628CA4FBCAE8DF6E ct = 3956C3D17E9F764B8E229B237A0959484024EA3522EA79107DF92DBB4E7BB1A36534C24DFB545D95C340DE89F474C2EF5298B7367C7285D25261522012E02E49D6AA520D275FFEEFEC9B8875F25C605703F4B7A385190121D8236FFCFE1ECE3BCDF2B74CC01F5DFD96F974418CB783F9ADA3D4EC2E3D1302C01205EC9BFA6F402B59A7640905D309228F9FEA040B48BF41CBF3D9EDA095AB5D6366A40D8755C0D758602E6EFBF13EEAAFDDCB97663A75A7A1BAB77605AF67B8DE2242BF7FC6AEE58C2983043C9652C0FE3563D6A043FD421344B74726352387A23CF7A0BEBF424F64FB26AE8B67944A44A9EE1F583B314EF900435028BD461673F80A054E4AD0053CB0740B7F81CA8ACBB9A63F3EB4C62864348588189E1D240607449A64FCEE07B67FCCFD605C3F64DBA48C983D8273733290AD51005261010B6C8EB68D2620BDC3AAD1B09137ACD8281C76C263DBBFF305E7EBE08674996B12C5A12117FA05D6CB1564552ADF56F72964087F010B033D0785401DFC7A474B0A18B21888D15EC27541C6B57F6A7CC57D9D7C7210EECF63AA53E0DC0651700304FC9ADA99FD63FEB8985011B73D73257654E3053B1E875209E6ED7D812F32DEC66E5C9038FFA256F884BF417535C133A72376E2E8288B67FE74F2DF5031D73C1890627B7E847873FA312983AF8B252BFF082F66E94B153D5B7502D1FDDDC4521ADEE2D2505E59D0E7838F0A8F464C79048532B7AFC4EFEC26FC94CA9C0AECDB88106C2EC106027C9B6219175364C16971CB81650836FCCBC4ED2129B3DD5EF54DD8BF24AF7E094DC6ED3815DCEB7DC6310187B732E446E87F5CBE ss = 05F29FB6A3B72AABC5E50CC5BBC05BBB4BE16E71286993E6 count = 56 seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 pk = C61ADC08F3F0A2A8BF252B0307FEE17EFAC1A04ACDE74DB3C896A734710C33DF58C68598A64B3E57AA3223E2E957377DF4315242988F33EF36D5B7C2E572DDA2266CABA125C77F181E2F3C71F9234C3BF89E261BC41C82E98CA1605D285C587605ABDF5F68C7CE22A2319EC8768C0788A513C6440F5CC1A34BFEAE2013014BB9B2CF853CD506055C6832099FE1530BE5927FF68C3AC18926FE5E056BA9BFA3546DC7D170104BC03F94242A8DFDDBBEDFB7717D36B487406C8AE59F286483EB32AB2F13213BA18BCD542F333582D01EF53729436CB3B8912E5B17DB2A17915B670204982DFBDE7DA9D78D991A1AADF614B80804726288F8202FA0F8D0D7F9D647C53EAA9F4EC4326BAC7067ECBFB2BEBD9EF190D50AFA7D0C8A31DE1760F9EC52A131FBF0DE0D8C002F870010CA9B89F2027D8117091B4E4EF8C633AD690122841A52FD61DDEBBCB60E4B1A997D70F4FE541D2D8D1FC50D8EC3A55CE36C3469265C329864812305F12AC8E9F17BDAC1093D2B49E8476B9F5DAFDE0FAC8D69B4E1146F4F6615F7B821E98D5F0675F70E5EFE3CE8E097DECBE6C188ABECE819F6C60C3F3736EC48AD41A8204D3519FA84C19F76E49CB27160D532DDC9720CD917B834CB65A43B31ED6616766F7228CE5FB96B7E5177094FABAE3ED534D76D77EDE40F467B7A44B4D1E803AA26E522C65D6095465D48D6EF66A7A2FBE9FF22273BD1B9F7ADD24FC6E31E5CE2A22B58DDA8D01FEACF551AE02382A23F8BEB08C7FAD283A87268850396B21D3262FC8265759A596BC04A sk = 63A925685A8AC5BBD918FAA33AC397D1FFBCF99135D9DA7C3D6FF7AA4C50AF3D3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F93057CAD9DD9E0AEC1A30AE1A0635DF901C61ADC08F3F0A2A8BF252B0307FEE17EFAC1A04ACDE74DB3C896A734710C33DF58C68598A64B3E57AA3223E2E957377DF4315242988F33EF36D5B7C2E572DDA2266CABA125C77F181E2F3C71F9234C3BF89E261BC41C82E98CA1605D285C587605ABDF5F68C7CE22A2319EC8768C0788A513C6440F5CC1A34BFEAE2013014BB9B2CF853CD506055C6832099FE1530BE5927FF68C3AC18926FE5E056BA9BFA3546DC7D170104BC03F94242A8DFDDBBEDFB7717D36B487406C8AE59F286483EB32AB2F13213BA18BCD542F333582D01EF53729436CB3B8912E5B17DB2A17915B670204982DFBDE7DA9D78D991A1AADF614B80804726288F8202FA0F8D0D7F9D647C53EAA9F4EC4326BAC7067ECBFB2BEBD9EF190D50AFA7D0C8A31DE1760F9EC52A131FBF0DE0D8C002F870010CA9B89F2027D8117091B4E4EF8C633AD690122841A52FD61DDEBBCB60E4B1A997D70F4FE541D2D8D1FC50D8EC3A55CE36C3469265C329864812305F12AC8E9F17BDAC1093D2B49E8476B9F5DAFDE0FAC8D69B4E1146F4F6615F7B821E98D5F0675F70E5EFE3CE8E097DECBE6C188ABECE819F6C60C3F3736EC48AD41A8204D3519FA84C19F76E49CB27160D532DDC9720CD917B834CB65A43B31ED6616766F7228CE5FB96B7E5177094FABAE3ED534D76D77EDE40F467B7A44B4D1E803AA26E522C65D6095465D48D6EF66A7A2FBE9FF22273BD1B9F7ADD24FC6E31E5CE2A22B58DDA8D01FEACF551AE02382A23F8BEB08C7FAD283A87268850396B21D3262FC8265759A596BC04A ct = 6E3915BDF2576ADDF03B19C741BE8E802FBC1E27E42634576423D358DCA3791344E4A2E15D79DF70B5C36E06B467AED58B6CAAA4179D961F028559A0E1284D232CD99C3B1483DEE80B69217A97927FA04A2FD9098339B2AAC312B40B8401C477FE384C6A70425884FEE001B23B8E6602C1784044E166DD5C9031549BE48606E1DE13B65DA104A343BE68A6D6EDE9B9EB4C8DA0B8E30BF7EDEE338CFB9AA3ADC4450F5514F8BC33381671691A4125184F32A7AFD5F3E6BBCA2E6CA442286698B1864D15EDE953EF0BEFC40CBE2ED6862B146D22CC23928CBDB48779A9B01C0B482D5CEF7EFC7871E67F6A61D2C4CE537CFC1E1734514F39F39F9FA46428C3352590D0D95A39BC0A292A53FB976BAB479137B1F414C24E7A7F2F3DBC4D3E2A58F664C8028DA34911A2971564B2C1CEDC7E3F049C70C7A49374B2A78AA9C2D5C4025BA71C79BB66978E2C075EFCBF53D6B39EFC82B9CA95A12A7F25FF2147FAD64A37667036A6C03F793101E6E5740BF801DEC444C7E088CD4B1C63FC8313D7F0ACC4685B2E20EDE515C4947F675BF32FD6AAA266CFEADB8AE416162EA60B8EAC868D71A4140866AA646E64F2219F025E48F23CED11609B0EE7B2E9984766712C26A64C2AE49A03F7C668E543F3F8CED8293138C3C17B15FF94FA90DC0B97B90C1AB5E40A4838ACD70D492D2ED3FE2D04EDE661155DB93A409C91B340FDCCCAFA5D0FE75269B965DDF2F8E2BA7ACC7374330EE027FF63D7C9800BC54ADC700C2CF7B187DC200E9BB69942061C2C4B5012F52D405D1865D55A1663E6A8A5409A5F6F33391B996B824A423C597F6A65B36AD08C317DCC ss = D83DE2B0FD815F242B35A514D308C65081E65DE68D7FD5B6 count = 57 seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 pk = 3B93C150CEEC75DC6AAF7332531B59BB09C13ACD75F4DE1B7314F63131EDAB0E558F711A761CCC5F57F030278F95A0BC153F1F35507AB818058789C1EBE6E216600576467B24B3C005B48804B4BA2CBC3365CC67249C5AB07F2F1283D26E641ECC504288325B426430810C470B1F883D22C0AC350D14B36FB3AED43740EA8B0449BE023D90C246D9FB3458495D2D8501F4E828CE555C938EB4F8A3034A0E960ECE5A7D5C6C7F1367398D85FC8072F42EFDBF5CFE57A554CC12AA302B1C0B3A858711A31FBF3375132F5E42BC803074C7F8D68C9A45195B7315C25ECA1CE8ACBCC1A0F8AC32B8BD4A114F10235D9F512DCC948FA3CCF5AFC7DBEF74C02A567ABF7CD7DBA8307CDE6D94584C1E550A1143D8EDDE2070ADB9EC5536EAAFB1582B26CBD8E862AEBDDBF1FBF7C88176E731B289228D0BDF87E545D0E13EC06BD05E2D799E347A9809A65E214BB988301996389EEC1D4D0C750D1A71F19EBBDEDA852F6ABC969EC540F1FC6BF2E489AD4F921427DA212C15E1D206E9199510582B494EE78EC02F5A174330F0DF6DFCD371565F0B0D5DC9C7D4F289D03325AC9C5C8CB0AF63851E09AFCF4A9763889153BBF01D58030552FF1AD79A80B2243E4C913043DD76588EB8E0E911BF81BB467C9F397CE13F83FA756239E56370467D51BC39DC888EEFC9004E5F8C96878F034B32233758C2B5F87DEDCD4358358F4675CA113B3CAF1670946C85C285AFBE93E79B2EDCFA997D599C0966EF7475BF23311949F742B1C667FD97C4A8C842A1255AC611D76B611844 sk = 6A1AEE5E708C1B47F02BDACCE4F56C860F74FC7CFEC1EF3B58285B1C8AD7FEC2230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50D7B992373F9086C7AFDBF4B44A96BBA8023B93C150CEEC75DC6AAF7332531B59BB09C13ACD75F4DE1B7314F63131EDAB0E558F711A761CCC5F57F030278F95A0BC153F1F35507AB818058789C1EBE6E216600576467B24B3C005B48804B4BA2CBC3365CC67249C5AB07F2F1283D26E641ECC504288325B426430810C470B1F883D22C0AC350D14B36FB3AED43740EA8B0449BE023D90C246D9FB3458495D2D8501F4E828CE555C938EB4F8A3034A0E960ECE5A7D5C6C7F1367398D85FC8072F42EFDBF5CFE57A554CC12AA302B1C0B3A858711A31FBF3375132F5E42BC803074C7F8D68C9A45195B7315C25ECA1CE8ACBCC1A0F8AC32B8BD4A114F10235D9F512DCC948FA3CCF5AFC7DBEF74C02A567ABF7CD7DBA8307CDE6D94584C1E550A1143D8EDDE2070ADB9EC5536EAAFB1582B26CBD8E862AEBDDBF1FBF7C88176E731B289228D0BDF87E545D0E13EC06BD05E2D799E347A9809A65E214BB988301996389EEC1D4D0C750D1A71F19EBBDEDA852F6ABC969EC540F1FC6BF2E489AD4F921427DA212C15E1D206E9199510582B494EE78EC02F5A174330F0DF6DFCD371565F0B0D5DC9C7D4F289D03325AC9C5C8CB0AF63851E09AFCF4A9763889153BBF01D58030552FF1AD79A80B2243E4C913043DD76588EB8E0E911BF81BB467C9F397CE13F83FA756239E56370467D51BC39DC888EEFC9004E5F8C96878F034B32233758C2B5F87DEDCD4358358F4675CA113B3CAF1670946C85C285AFBE93E79B2EDCFA997D599C0966EF7475BF23311949F742B1C667FD97C4A8C842A1255AC611D76B611844 ct = 3B8B820F139C99678D1B7A1D6CFDA81168F914C9205BC971A8297A2D83DE5E7CE9D129C91F09FE301D38A5BC13A40F42129750EDD114B47175E94222C30C72DFC9D1B8E5C70AD736FDACCA8928ADAB42FF6F96EEB9AFD15DBC06625B88479E72B7BAD61EF802ED1AE568F2092D5B0425DD0C7CA3BFBB8676FF299B581D7C889EAD1224FD22FA436339D71E4685C3C38062E7417B8A6E745B3CB89A936CC0652999F50242B569BE678DB043EB9ABA65CDB582D6E841FB2E15FB4269575047A69A738B8399197FB6B69083C727D2A86BA931C4543001693A5AD61DACF8B17651879D6F813B953C14777A2799205E4AEC408F99E52C7999EF5670FE493C71197AF3B8C90D69A2334FE333665911A1C9AD50144355EC60903930FB573B811BCB37BA796D15BFC8CA6F383ED9A09715AC6AA045C38AC6620BF2F12EC9B00DA65FF66A27040E1A3E1822898855B0EF9BF2DD9782CA0381D4084B5FA08CCAFC19AFA9DFFC21862EF323936E9D4F3D47A2056D68A73500AB671F756894144864905B7236FA1284BCB3D3F536DA41268546AFC5CEC9C24BBDF3195E55CBB54C7CD0F7B35F7262B7066715EAD42DED38DDCEC76BCE273E13F57A73AEEF8D21E8105586E791F3CAA0FD05E6CB6B3AE8FD5FEF67D3816D65AF0EDF20476DC04917755170FDBD61E9C2ECC9CE6C7B287D5A01C9143535440920E7004D685F292209B047F81B52AEA2189775F4F5C40B555EB2453D66A7D281A8D882343335A45F8096A89693EFB54A675A1F757B4635C60832D110625C9F6F955C3C5A6306835DD68407F162DFDEE3AF6331F1B13A2B3A9A5718FF7289CCD6BBAA ss = 3102DBC7FCB6CE73FC711F0493A26DFDFD44B3D63E871D73 count = 58 seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE pk = 73C97A72EE619708D10F429E79208249870B983EB4481896A56E988D96C49821AE1345A1A56D301C7AAADFB011C33A69E2444B0338574C141B076A9AE5E8D91B5DE0F0A76A7BFF42237C2D93A68C78DF65EA19096E60F5D418D98BF3974C440107874695D43E32E3C2CA92EC09BFA01F2270B31393564B275A8D8B7C23C7A2C6E87B57B79E0B50E4FFEB9F9830C3BAACB422D6C8CE13DAA08C0FA4CA2A5E35960F8B94DE2D5D0D8023E47D9E01F55FC1703452421FF12DA0435CBF215D2C188C2B0A36E38D71CA8FA9E6E9F0CF882E0992269728874B441FB0636AFDDA7FF301C9875FFBCA04AB9C6E3D22A12EBD54D4E55944260AF1BD9FCF52AA1FE56DEB96143978C3A341C663F3A3D91D9C547EF9A4110DC0C6299C372D283E9DC08F9A49048A69CF5DB5D9702DAA9D1AF97F8D42BBA45700C660567980FE3AEB71B076D43808A83714CBDFB52D5251400E3332B69F846883902101AFF8B823DAEF50B94846C2FDDAC6769D55B3E4CF1514D33007342EABDAC2203F40BEEA5DF44C3D108634CCAE48DCC58393BEE7321BA1390C67945C248D2264B23958409B47E339DDA449D871A8FD8DA2505D70D3AC51B4A39A439ADF5A947DAE7264C6EEF3846D001D3AE26D54C3A0D9C4182862A4324115533C10F30F642FE59A23FE2BF3E014D06D066CF1A11F4EFB86756B5C9205973F1135845D56454B7A3A012BDDC9A953EF144C10F08BC5AA6BADB22DD3B5EF55A76DD8B76136C0A1E3B1A5DE89EAA228461258D0F4C40481233ED1645A480C9A46E169131D11 sk = 6396B328B100E4C7F4BCAE69875EDEA1A1982421558C608C13C592BF7B5D0FEF1100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DEA99D44DCF0E06FE406A8484BD3CDF0240173C97A72EE619708D10F429E79208249870B983EB4481896A56E988D96C49821AE1345A1A56D301C7AAADFB011C33A69E2444B0338574C141B076A9AE5E8D91B5DE0F0A76A7BFF42237C2D93A68C78DF65EA19096E60F5D418D98BF3974C440107874695D43E32E3C2CA92EC09BFA01F2270B31393564B275A8D8B7C23C7A2C6E87B57B79E0B50E4FFEB9F9830C3BAACB422D6C8CE13DAA08C0FA4CA2A5E35960F8B94DE2D5D0D8023E47D9E01F55FC1703452421FF12DA0435CBF215D2C188C2B0A36E38D71CA8FA9E6E9F0CF882E0992269728874B441FB0636AFDDA7FF301C9875FFBCA04AB9C6E3D22A12EBD54D4E55944260AF1BD9FCF52AA1FE56DEB96143978C3A341C663F3A3D91D9C547EF9A4110DC0C6299C372D283E9DC08F9A49048A69CF5DB5D9702DAA9D1AF97F8D42BBA45700C660567980FE3AEB71B076D43808A83714CBDFB52D5251400E3332B69F846883902101AFF8B823DAEF50B94846C2FDDAC6769D55B3E4CF1514D33007342EABDAC2203F40BEEA5DF44C3D108634CCAE48DCC58393BEE7321BA1390C67945C248D2264B23958409B47E339DDA449D871A8FD8DA2505D70D3AC51B4A39A439ADF5A947DAE7264C6EEF3846D001D3AE26D54C3A0D9C4182862A4324115533C10F30F642FE59A23FE2BF3E014D06D066CF1A11F4EFB86756B5C9205973F1135845D56454B7A3A012BDDC9A953EF144C10F08BC5AA6BADB22DD3B5EF55A76DD8B76136C0A1E3B1A5DE89EAA228461258D0F4C40481233ED1645A480C9A46E169131D11 ct = 58656AFEC3D50F0EC1FCD1ED3DFA03E339B0AB8049EAE0083A46DFDD27B1A042CD0C75BEB152FBD5CEF874DD8113FF46C3E753767CB9B4C445FB1A8D7B782BA7CBBE6B9C1663D5DA956CF96FE1A54E8E4551D37932A17C0C4BA94BFFD72FBDA032E5F773CCEF9F5F77E43CD0810EC99A344CC9DEF3FD10D2B876DE02AF2FC414B93987EB97809DF1DA982C900C0F25D6C1BB94027E86E9DDFD9B2D62B250BB5724A2343C2D8FBB221024F1C5FFC07542A070B9B0757F12DDB811236928DB886ED7386F5A7F22D0252DA44A5810477CB5F3D050A0BBC806464F1BCD34DCFE6892B9CC84276898F7303E3344FF202E7C7CA386517A67212AFA238B9D170353BE40C0B7E3C234D8842F4C698DA01EF022167060D4DE7FD3674E19678E5AE61CC42C6D85EDF768911D024F379886E2C7EBB796579B5E8E9C53944EAE3EF587B667BE72A0B52FEB520858EBCDAFBEDEEE8089CFEAB0338B9EB68FF302619EB14B89DA52C2D04429B2040E8A4E29BE27FF41221A0241E532864166026417B69CEC9D81BDAFCA450AAB98C65D39B406F5B9947EA7A1EB9A9FE617AC46AC673D08CCA599172CBBD0DFDB200D6EE422BA00E11F08AE1343CD9A2ACED2F89D436065FDA5E9CD6F6FB865B1856E283E690D9705917EEB000371FD0607FD89FC2F95EE55B421C3EB81486915D91F06299FB88807CD7E8FB3F29A03BACD81A1303252B6CC6D02638E6BBEEA8F3C4D5444000B972EC321563C5F6B5EF521CC96EFA783C610B51541F5DB07B1F9A50DBC67DFE641F622A19793F24669BD02C9471BF0DEBA052005D698145E529B4751AB9DCCE15E6636BAE06A87E7 ss = 30337E8CDF34EE191ACA66DF825C1DF63849F25ED19E179B count = 59 seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 pk = 26FB1E827C91419DD4992B30D8D8DB28EA7C2F63EC31147159A29951AA174459D66E924D2426293B6F9722154E6EEC3D269B41F7D5AB5AB96D82042711A9D7FB2A777D0CCDE7EEB3C0E97C8EC723C2552CBA0CC81F3572A5F3C1E44D6B4BC230D34B8CE0D82E3E6A3019EDAD0F48ADA36F319682AAC255612260F89170538DF8F6A08476D944BDA4966850F4E7639E782C19B84DAC68F1702A6EE078CE1815FC492C90D09D825F6AFBC1AC1F40A2F3923A5CD321DED0AA8FB2201C519081585F1E098D1E4E49B4466656B77C44BBB9C3F948CE9DE220486EBE306211294F46B506FC16CB2EBCC9BA70C2ADF43FDE6EDBF1BEFBAFF2C9809D226F419BBD84776AA514A3D4193DBB3E306A10B03576661D0CC0D7E882B4BFA5371F366490071D2B7F489BDBC2204AF539ABD0696CF3D024997831D8E3FB948399D2068E0F862C562C88145155A9114254BF567F19AF0312D4659AE37779963C608EEE1CC3F278F5131CC229F9E7B0D7B106086F87D0B6089DF514EA523B0C1191F431EA62132BAC743F58FD584ADEBD3D1BA5C48D7222E0F510A3510004A78BD975B2F7CFC922EECF4BA203EC1E94EA2777EEBE39488DF31BC5DFB2F9444924198D44FE00B8CAA4749C8F70275FE61B4603D1AB44CE979AD678FF675A1A21DB1579757DD5928C7D77D8152A27BABC08C2DD98E5AA44C492ADC55806AF17A5B44E9C0876E1E7C7DB6C6D6F8DF2278E0A9B1FD413A412DC55D214FCE7C3829674E58A5EB5A9D453451620ECDAE5D0523CB8C9A34A5EC4CFCA491A2666 sk = A453BCACDD2B0D4646009E5ED451C3C45F08FB827EF733DB3C517A9DC1AF93E67A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFDBABFF7698FF728119CEFE3FA1A6BB2F80026FB1E827C91419DD4992B30D8D8DB28EA7C2F63EC31147159A29951AA174459D66E924D2426293B6F9722154E6EEC3D269B41F7D5AB5AB96D82042711A9D7FB2A777D0CCDE7EEB3C0E97C8EC723C2552CBA0CC81F3572A5F3C1E44D6B4BC230D34B8CE0D82E3E6A3019EDAD0F48ADA36F319682AAC255612260F89170538DF8F6A08476D944BDA4966850F4E7639E782C19B84DAC68F1702A6EE078CE1815FC492C90D09D825F6AFBC1AC1F40A2F3923A5CD321DED0AA8FB2201C519081585F1E098D1E4E49B4466656B77C44BBB9C3F948CE9DE220486EBE306211294F46B506FC16CB2EBCC9BA70C2ADF43FDE6EDBF1BEFBAFF2C9809D226F419BBD84776AA514A3D4193DBB3E306A10B03576661D0CC0D7E882B4BFA5371F366490071D2B7F489BDBC2204AF539ABD0696CF3D024997831D8E3FB948399D2068E0F862C562C88145155A9114254BF567F19AF0312D4659AE37779963C608EEE1CC3F278F5131CC229F9E7B0D7B106086F87D0B6089DF514EA523B0C1191F431EA62132BAC743F58FD584ADEBD3D1BA5C48D7222E0F510A3510004A78BD975B2F7CFC922EECF4BA203EC1E94EA2777EEBE39488DF31BC5DFB2F9444924198D44FE00B8CAA4749C8F70275FE61B4603D1AB44CE979AD678FF675A1A21DB1579757DD5928C7D77D8152A27BABC08C2DD98E5AA44C492ADC55806AF17A5B44E9C0876E1E7C7DB6C6D6F8DF2278E0A9B1FD413A412DC55D214FCE7C3829674E58A5EB5A9D453451620ECDAE5D0523CB8C9A34A5EC4CFCA491A2666 ct = 58D51DA9B68F30085AB616D4C2A74E2A5741FED676E589BED9E60229C42F82B5E8B51CD8858D87886A94415CC1CFBB77858E5785EFFEB8B7973B60F9FEAA98990C1A790CE876473BE2FF8B9DC93B8C5847F406F2BE88CCAB22195131D53B7F0AA0777490B170BA8448B16003D6F212C4E71E71DD98BA6E3A0D22936FE473A2A779F9924E2F3B68100891EBE6ADBAEB1753761EA2D76D7ECEEA76851A43A7DABE767ADCD5336B5E200E48801F7DA1A74560A6BEFDF4C36C2416D1BB0E4FAAD2B884521A1AEE4EA6402607E2652FBA6CC37303F50F0BF225BB89C724A387140696FEA3FD3BD90440F4496EF8FB21BFC507CC6F3461E2D6C806EF0ED49A3C9748FE29E4117BFAF982CADD597C0D92FDE5A16491289270F15994A012AE4DA6194C6F48BDC86913FAEC4D2601ACC707C14333A585D8742C4135DDF390337F8B6DF45094E9A1562AAD342DFA05CA05134934F2E3B113E9ADBB6931FD1B855F631D88D9477187F975B23424C40D456E78EDFB6C61014E4445A4715688AF645107DAE6664D1E6F2A442BBF27D3C4F8F990C3784719BDC3507B545D28EFC83EC0157859F81E2990163BEAD6DE95C36C8FFBA941101B0F2A6E3C0B39B7AEACDCE25DDDB2BCFA329EB7950E593CA5B4766CFCF78C92F774C224A54FF3BF22B3BE4ABE5704992800BDDF39DB5FB0CA4E5BF1AE79860D4F63F98A9C80F64C6D9ACEFFFF0F513FCCE1776E17E3410359D4A76FED7C8F93A4D87877CDAEE4EB0A668358CDFCFCA7D5013E16E27A4F74A73EA0BC780237C1B73C8B47E95565EF22CF1BCCCD38B906B2F3ABE407333B35021AA627660546C36B8EBC1A ss = 66C6CC59647EB6139FFCF4FA6C904396FC56B3C6F28AE487 count = 60 seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E pk = DB48E11DCC6B6C48AF7FCC13F8A1E0DA6A2A071B2F2FF042FE2F081F4FD90C9F80B6B69858644A73C9BAAC1127FE4F1836267C94ED10F45D56C2A2B35EB2F00A99E7E5B5CF38130165CF1FD796605F9507E0F7AB13E4DD56EF9C46DBE306CCD423E6A367CAA980DF51CE0F1F0787ADC7F330CC0D3B98FC083F591FC570A9C415CD26C8A7F53ECF1D936EBD54839A948A7CAE2DB9A15C47DD437C33D881CF382EF716B2EC47815D57D22839A51ED8D115AEF267062D4E3F0C9579BC17F5F809DFFBE2198F20FD119AD93E748A3681C4CA76D7FE0C4C7AF5BC6307A8F060B96EB55D18DC3E56D5FADAA879CEF4F44C774B33F3F6110506B58254DC0F419896A8224971B1F6033B57A2FB027C7672C6E3275C9404A9CABA79EC34493023409AC9E055DD7112A182E27FEA26E568A2C64957A917E977680DF6F5E850D2DE8C8CDA77B76777674479A530446BE395D91D72A50246A8E9DE6B02904401B68CBB7DD96FAE8BAACD35D896501D5252FA4A31727E05EAEF6349C9614044C67E2FD810863A89CF31871696E37B80A2082A2DDF23BC0ACA0BC8453BB2FB6970064798FFC3178125EF301D248B1F2EE6CE3DB2C34E21BBCD39091816014DD88C9DEC50AFE22482AC66207AC082E6227B9F775B0AEEBE90E90E1EB53FE223A547065835FFEADD11641F225E5B460816AEA770FFC0098EC93D5D15BEC31567220AA7EE43F20DF1BBFF85AC56E4D64F84B1A092B1247368E1F4BC2E833CE5D2D9381623A5CBA2456A2F474851A982AE37082AD616D9F5D13A80B662 sk = 47CA2B77C5B717F423222C2730CA5CB9C856BC951D01B2B2C80BD76CCB5539B78F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A07870991F8D8905ED1F967B747102EDA9802DB48E11DCC6B6C48AF7FCC13F8A1E0DA6A2A071B2F2FF042FE2F081F4FD90C9F80B6B69858644A73C9BAAC1127FE4F1836267C94ED10F45D56C2A2B35EB2F00A99E7E5B5CF38130165CF1FD796605F9507E0F7AB13E4DD56EF9C46DBE306CCD423E6A367CAA980DF51CE0F1F0787ADC7F330CC0D3B98FC083F591FC570A9C415CD26C8A7F53ECF1D936EBD54839A948A7CAE2DB9A15C47DD437C33D881CF382EF716B2EC47815D57D22839A51ED8D115AEF267062D4E3F0C9579BC17F5F809DFFBE2198F20FD119AD93E748A3681C4CA76D7FE0C4C7AF5BC6307A8F060B96EB55D18DC3E56D5FADAA879CEF4F44C774B33F3F6110506B58254DC0F419896A8224971B1F6033B57A2FB027C7672C6E3275C9404A9CABA79EC34493023409AC9E055DD7112A182E27FEA26E568A2C64957A917E977680DF6F5E850D2DE8C8CDA77B76777674479A530446BE395D91D72A50246A8E9DE6B02904401B68CBB7DD96FAE8BAACD35D896501D5252FA4A31727E05EAEF6349C9614044C67E2FD810863A89CF31871696E37B80A2082A2DDF23BC0ACA0BC8453BB2FB6970064798FFC3178125EF301D248B1F2EE6CE3DB2C34E21BBCD39091816014DD88C9DEC50AFE22482AC66207AC082E6227B9F775B0AEEBE90E90E1EB53FE223A547065835FFEADD11641F225E5B460816AEA770FFC0098EC93D5D15BEC31567220AA7EE43F20DF1BBFF85AC56E4D64F84B1A092B1247368E1F4BC2E833CE5D2D9381623A5CBA2456A2F474851A982AE37082AD616D9F5D13A80B662 ct = F654177012CF438B93CCC0BD485D44B8E500B6A5D3EE214FE81919BFB34A7D1B1940BFF33EDD10E50B860984E3992AB9ACF1A4680B683126ED76EB01D61DAE36CD74228004DA981A11DA233B4C009875CEBFA9C6C0D2EA92047E242591342CAAE9CB17F458CB5EA64AD3BA34FF00895C8FC7FA7F4ADB6D09E38183972BB557190C6FB0A3EDB215C810DCFB2E3AE3162A0963F9D31EA84CC866555D2D36FEFB6DEE152434958A74FCE1B552CF36A1B3ED86BDEDB4B8322ED3585E724F663B7A82799EB5B8D58B0751ACC3DE0F47AE1DB0992D401E05B4772FD6DD558062BCB03A0AF0F1CD008AC95B19AED50D3CA8A6B99CB7C70EC6E5F0C6D9687116876774D1317C89673F9AD3F5953FBF99E68312B9DDA23880019F07D5906C68066E78DE13D7E6F3A585E6FC4E06EA8066EA551C2404EEE8EFD048AC4772EC80D47FF07D2292DF1D2C45279265B07BC9743328C57C7775A2C9AAE3E6C79BBCFA642C974D5CC12692CCF01E32FFE87A804A03CCA84B628E8B1CB9B3984925EDB310CF6EA13DFDEDAF47BFA4510640131CDE926A2BA14FE061602276E105456133B9ECC29EAB66A0FC052909123DF4CC4799D88A7AC79BB754FE06ED36BA3E08A8876961D15CB1A0B02360729CC7C9FBA71A6F77B86BB0A72BD6B94B825ABDE8D62C92D54AD2C70A40BD90295A3A7AF18C987EDC2AD81A6AE551F2C7AEE6523ECC0C9E5A3C92271E2486385991B79A79B062D9494E4BBB565731585876C0AC74B71B14AA2AC7B1845976FEEE78E13B9933BE73FA872AF935655FF1685DE6FE54BF257263E47E87F02F3081BBB903593411B9AB49A57C9D386288 ss = 7019023E74B19711EDCD06D52200227419C8D1A137B4A697 count = 61 seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 pk = A74BFB44F0434F0965A88CA9F3375F57DE619A4768780DDCDF51E29D9BC5C859158D44C44B74FF547C7A2E03C2C26FEC6FE8029B5FAB2F35F955E4D6FFE5BAEAE81CD39EC544769080970DF88000E2FE21B08942A72AD5F31469897FC416CEF6CD341D56A6D879F89D90CC50DE2EB9407ABCD7DC21AD216374E24B038FFE7FF8A2A27CB75627049226F5A77E9A4FEF41931423E2D0F9FB7A13DDB37A5CE07081E0B9172D2E02A8566BAE08E2A92D3703BFEA8C87B44E190B75252E0E909E2FAC082B020E0AA7329E47287B4EC2793C9DA52AAB4824083210BC69DE33C248CD0EA5EB2F8078A21EF9893D7F8DB4BE1CC157415FAA5849C4EB139DFABB49160873DFAA74F2F8161AADDFAFCDD2EBFC2649C7F1F5DC33EA6544311BE139BD31A3CCD0A7814F089C53173BDD9AC1843388C572A0AF4EEDE7AD37AB3262B8C48F0B4D9AF436C818FE2F6A4605AAD4BD3A7CA8549B92B0179715AFE51A76513397E355707EB1A6B9CFC334DA4D4B260461D87DBDA4509888BDD95BEEDD9068D14F2D11D13E5707114CF5EAACD1103D9F4BE72AEFB788B2EB1F5A1EF562AE3BEC3627BCF210829AC23A942FE1C64DCDB2F0E4D29C2C5AF479D3F38642E2AD647799555FE04C59220113FA5E3AE4179708C3C1BEF1D2DBD23A0714348FBDC2E4A9B554257C9A99228175ED2D9C11EA2EFCE541EC0338C98068177DBE52EEB6626FF22E3269A3A009D4CF995B2D25B2FE8D05CF19217FBA09EAF5C4F73637BB39449133180E64A22F93A420E9974534B80BFE02B3DDBDF639 sk = AAF6EB40E596A5E3E8218871E708B089240DCBE7FD3641F0E5E41E071CE49107E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB7885D03687DE2B06E1A480949CC3D98600A74BFB44F0434F0965A88CA9F3375F57DE619A4768780DDCDF51E29D9BC5C859158D44C44B74FF547C7A2E03C2C26FEC6FE8029B5FAB2F35F955E4D6FFE5BAEAE81CD39EC544769080970DF88000E2FE21B08942A72AD5F31469897FC416CEF6CD341D56A6D879F89D90CC50DE2EB9407ABCD7DC21AD216374E24B038FFE7FF8A2A27CB75627049226F5A77E9A4FEF41931423E2D0F9FB7A13DDB37A5CE07081E0B9172D2E02A8566BAE08E2A92D3703BFEA8C87B44E190B75252E0E909E2FAC082B020E0AA7329E47287B4EC2793C9DA52AAB4824083210BC69DE33C248CD0EA5EB2F8078A21EF9893D7F8DB4BE1CC157415FAA5849C4EB139DFABB49160873DFAA74F2F8161AADDFAFCDD2EBFC2649C7F1F5DC33EA6544311BE139BD31A3CCD0A7814F089C53173BDD9AC1843388C572A0AF4EEDE7AD37AB3262B8C48F0B4D9AF436C818FE2F6A4605AAD4BD3A7CA8549B92B0179715AFE51A76513397E355707EB1A6B9CFC334DA4D4B260461D87DBDA4509888BDD95BEEDD9068D14F2D11D13E5707114CF5EAACD1103D9F4BE72AEFB788B2EB1F5A1EF562AE3BEC3627BCF210829AC23A942FE1C64DCDB2F0E4D29C2C5AF479D3F38642E2AD647799555FE04C59220113FA5E3AE4179708C3C1BEF1D2DBD23A0714348FBDC2E4A9B554257C9A99228175ED2D9C11EA2EFCE541EC0338C98068177DBE52EEB6626FF22E3269A3A009D4CF995B2D25B2FE8D05CF19217FBA09EAF5C4F73637BB39449133180E64A22F93A420E9974534B80BFE02B3DDBDF639 ct = 4667C47F5544E2BA203D04342213D140038B63367EB08FD23CC8044EBBFC9072482BE50D07F1423B7FD20F2CDE0050002B7E0D2BCCDE25DCEA4B97094E2F98974350CC30B645A32975E1B3BF2403FFCB11627D7B86904BFD3E14E61F3065901B04752CE420038EE464870BB15820499F4B8C2F8C6E8F68166CB70754DD20DEC9BD6ED612BBA87DB18D4451FB078AD230EF074A64BE64680C29D15EF3B9EE7DBC0D500CD356ABB79B089E6324AD04A4930C9C4705970896C6F9E65C2FAB2F44CF22368F44D096B5418D045AFA08AC1A3C525A328F3354022BDBE9CFBED532C0378C9E40A51FEE8F992EC211CEA1BED8C4EB0DE0A58E56B7D60D02D3D3E6CFE19948892A7870D372725083A874FAA5781EEF643245B694AD3C274B8D7751770886E2F514D17B50F7866CE5F7D7CCFCF45DB448555A58805948BB9D93301B3BAF103EBBFAF2EAF0EAF5BFF16937FF534D59532996944E9E27D01E29A4B22495C5B23803E8544719AAEF545619B6BB5DFA3C55CDC89175636E66BEF772A15D5A8A587C186F664F3BF6CC2BEB78C2B7CD2262BDFAE1026625E5891FB1C0D465800593EE9CA9D6CFA3EA0D5971740D8D4FB90AB297C357D574BFD70C32DF5B9696377251443544A646124E9EE661DB2C58810D0C0CF6367E50CCF7D19D8F9B1061172F9A8582401E97D1B88ABE4EDBD5B9A1C0FF20A7909E7FAC53ACB8951FD985904141456127C6BFE11E5717EC587CF90158DD64B73499C6B961F32127599CC1357D2C486AE73D484A885465638AC2B141BF5C669161EE548F060EFCD273CDEC0675AC192F98C2E4AD061CB5E8F21ACDC6599039ECAE ss = 6B73EBEBEF3DCDE86005FA30124061038FA676EA338667D8 count = 62 seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 pk = 27D3FB38DCCBD9E61A5F5A7D70A54A2524D1A2D78460EC9F56AB75B10D34A7D4C0CFAA384F1D6AF0CF75858E65B209FE81F435D3852EB820AC7F5213D3D024DE3E6273AAB9B06F0F24E37155F45F373D722BCE7912FE9E0DE98994FBBA6AF072E2DE886DC9ACDA864E1429B7316B24795F35761738E472277684FB02A43BC866304D07EE7C9BBA4E2F9860D23C7802B3A3ACB822E2B818AB80BA639C0E98F6DF26F6E48856EE7A49688431D4756B368F463C0710AFE21A17B19284304B7DAB1B5D34586E5798D38E44ED9191AB95A930E14359AA8163ABECB1D84119F654919C0453E9CBFFF26A8732C7199CBBDA1B970DAA0CF600BD7CBA8BC422BE0661F4F281EBE2257BF6A3B4E3DB28BD5C873286BF562C38032B3A27424496E1D7FDBD2C9CF40BCFC383EABD3F7143A0CD0546863CCE86DA37D882A8665BCE7FAE0ABC1FD1C33B3C7C7A3D8D48DEEA79F781EBF17043BBA37979F93F5924BA6CDAAC3665836CCE4E502AC15879B88B10F73527A5BBDB8905438E070746C3290993BEBDBF4594CBFDEB5E6DDFEBD719DF8AAE78E697CDD21360C59A110D9FB95F91A68B94D34E1C9BADB42039AACD845ECCAC2896B2C1F8862F4A3318AE10B3C6497D552A08803057F2299216083DB87D08E8A1A0569E6BD784555E989E40DD31D345A1FE118F6FC24892299778BBD82948AD3A91D52CCBD786DCC695675CBA78687E83EE59280E469CBA0B3AD1A22C0522B50073C8416B2D71F09B2FC449144B71F20174A2924FF2B14A087103046EDB08F3605BB467684B sk = 6500F32C93415CFDBC0BD31D78D5BE95CB9060C8CFA2013955B56F8B6868B322393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F954454E963EB0D01B937D6DB5EFC6661AF40327D3FB38DCCBD9E61A5F5A7D70A54A2524D1A2D78460EC9F56AB75B10D34A7D4C0CFAA384F1D6AF0CF75858E65B209FE81F435D3852EB820AC7F5213D3D024DE3E6273AAB9B06F0F24E37155F45F373D722BCE7912FE9E0DE98994FBBA6AF072E2DE886DC9ACDA864E1429B7316B24795F35761738E472277684FB02A43BC866304D07EE7C9BBA4E2F9860D23C7802B3A3ACB822E2B818AB80BA639C0E98F6DF26F6E48856EE7A49688431D4756B368F463C0710AFE21A17B19284304B7DAB1B5D34586E5798D38E44ED9191AB95A930E14359AA8163ABECB1D84119F654919C0453E9CBFFF26A8732C7199CBBDA1B970DAA0CF600BD7CBA8BC422BE0661F4F281EBE2257BF6A3B4E3DB28BD5C873286BF562C38032B3A27424496E1D7FDBD2C9CF40BCFC383EABD3F7143A0CD0546863CCE86DA37D882A8665BCE7FAE0ABC1FD1C33B3C7C7A3D8D48DEEA79F781EBF17043BBA37979F93F5924BA6CDAAC3665836CCE4E502AC15879B88B10F73527A5BBDB8905438E070746C3290993BEBDBF4594CBFDEB5E6DDFEBD719DF8AAE78E697CDD21360C59A110D9FB95F91A68B94D34E1C9BADB42039AACD845ECCAC2896B2C1F8862F4A3318AE10B3C6497D552A08803057F2299216083DB87D08E8A1A0569E6BD784555E989E40DD31D345A1FE118F6FC24892299778BBD82948AD3A91D52CCBD786DCC695675CBA78687E83EE59280E469CBA0B3AD1A22C0522B50073C8416B2D71F09B2FC449144B71F20174A2924FF2B14A087103046EDB08F3605BB467684B ct = CEAF18E076A4B4B4DAD20727B13122FC6360DBE3D199D828C045759CB9AE00AAF45A0BAEBE9F6EC548E51309C80A664470764738DBFC4518E26C0B25C2F1327E582822EFEC7F18B8FDA19DC104492754B84CC381EFD67E0B651BFB39D156B0305B18670243079CF3635119A3EA9F9791BDCF991A147EF41B5E67536A50194EB5C0F8C10A62B56DD3A1D7909DB17F29D6ECF8CE599CC779B27A5AD8ECA84BA599F03F44E01FC94755FDD6750554F1FFA2FE07ACF4507C067BD6DA6445C9BD0BD5BEB9F9E8E69CA68C722257741DB9A549489A3F1E2467F4FEF863799478104B932EAA3250445C845632C170FC52C59B4C39A00B48A7BFB506540424BF6FA49C1E55896769DF842C8562CBD4BBF2937236C4230F1B166342DEB2282BAF3CE2334CF59C63F6B88B1EB840E85DB9BD0C592A86EFB278977B95A5B4D960207E23A674BF6288BA39F0BDC2F348BF90936D8B858C8B29DC94B1ECC76A154B4EA5F879726CC3A38B1B8ADA8B076B71FC2BA48A8A85DACCC0564E2D36E1B2CFAA019994BDD0E1D5A255B4B14C2EFC49FBC3F8B96FB37C96E385BA9C25E4589095DD04F3821F18E64AB6CC8167D4577531B502C24A280CF7A9B59125ED192F3867DD6660094749C98424EE55E6A7CDE1712F3C833FBE5FA1E0D40A29C10C09FED56EF44F30BBE926A11ADC99331C5CD8885D0BFFDA911584C854B87CF75220B0C2C80F5052D547ED7CC660DBBA99BE2523F776E24BDD87F622604E2DBCCA4837CB36B25FF66D7FF42D4C8503DE4E3C0CCD2793AE18EAECED1CD8360E9CCE19F71A533C8CDD3514C5596D97D89FB4D34A09AA2046B630BD6C0E ss = E8769152ED96B45CE212ADB3B7A1EFBD2F52E9F870C8DB9B count = 63 seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC pk = C61A932548AAD82D2F87E7B4FF54DE3AC7101C10368E9DDF996A1FA5284B66FEE4C39A58818E5EBAC55E04DE890655C74A9ECE24A3A6AA7807138E3988B2E4F008530134C0DC4FFECB4F27B4E50708B1DF390F06223AC4C3288829C40D428E5B943EB0B2C955DEC738939D3C061EEA722089DC39BCEE34033A12F515D392ED23C5F617F5F7B8F8A0BE077A6A4B17AF7FAAD39F553E782D3C2A86EEAD047588ECBFA6163A0156CDB96A1A767E8487279C805C9ECFC7155F7CA1C1B85E313B5992A765E9808B04A82FDCA0EF13C96F1F2878BE183496CA45A4DEF55A73C6EB9AE9EF9EC8479B1F2B369034ED1535527447197F6E1B605793F0D89255C3E48ABD1DC0C859EA5517FCE86D1E7FA3B3DB0D592805750FDA11B4EBE641310B026E945204EA67441C2EC2291B1AB79A4EEAE377C94103D2C853137FC5AED4930C2E7123949B2EF21D8D02E80F611AC9C556BBF882A5458B4D6E4462F8735D8FB4B198A006830F344C2090CBFB178283B69487B528DE2D5C498FD037A6D2C0D84E7B341CCF4AEFDAC4497B3A4904592AE87A42681B26B77A08B8D4800638901DC43E8CA4EED00C648CFD3C835C6A2ADB7029DDB1227E603B4D3777AE7EB7538367D27E687EFFEED0233CAC61D8C431162EF5B3636D7120C0EF61B1FC2D78D8BFA68235692CA3026CABEFB0EF4207F748551F1374DA4327540964E3334D233043E12CE926961F21FDD9B2CB7A5645E358303E167C20687EBCCE5CBAF9C4CEBA4D3C520FE067C695605632B4ECC8C75C3CD71F888C6817E402 sk = 7643CEF2D62CC5AAEECF754653EA62294CD2208E5BF3DDEEA209E3DC45373D49EAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142951EBACBC33859B828F9FA95F5C4C114702C61A932548AAD82D2F87E7B4FF54DE3AC7101C10368E9DDF996A1FA5284B66FEE4C39A58818E5EBAC55E04DE890655C74A9ECE24A3A6AA7807138E3988B2E4F008530134C0DC4FFECB4F27B4E50708B1DF390F06223AC4C3288829C40D428E5B943EB0B2C955DEC738939D3C061EEA722089DC39BCEE34033A12F515D392ED23C5F617F5F7B8F8A0BE077A6A4B17AF7FAAD39F553E782D3C2A86EEAD047588ECBFA6163A0156CDB96A1A767E8487279C805C9ECFC7155F7CA1C1B85E313B5992A765E9808B04A82FDCA0EF13C96F1F2878BE183496CA45A4DEF55A73C6EB9AE9EF9EC8479B1F2B369034ED1535527447197F6E1B605793F0D89255C3E48ABD1DC0C859EA5517FCE86D1E7FA3B3DB0D592805750FDA11B4EBE641310B026E945204EA67441C2EC2291B1AB79A4EEAE377C94103D2C853137FC5AED4930C2E7123949B2EF21D8D02E80F611AC9C556BBF882A5458B4D6E4462F8735D8FB4B198A006830F344C2090CBFB178283B69487B528DE2D5C498FD037A6D2C0D84E7B341CCF4AEFDAC4497B3A4904592AE87A42681B26B77A08B8D4800638901DC43E8CA4EED00C648CFD3C835C6A2ADB7029DDB1227E603B4D3777AE7EB7538367D27E687EFFEED0233CAC61D8C431162EF5B3636D7120C0EF61B1FC2D78D8BFA68235692CA3026CABEFB0EF4207F748551F1374DA4327540964E3334D233043E12CE926961F21FDD9B2CB7A5645E358303E167C20687EBCCE5CBAF9C4CEBA4D3C520FE067C695605632B4ECC8C75C3CD71F888C6817E402 ct = 7E5D9EDB7A6B0CE8105A0196F0F844FBF5BB1BC577A5F1BE27B94600B284CC1796251FAA7A4A8D7F46694C874257E4A528C5EB5DB8A139BB39DA6D89472CA9D857C601FCE739B9EA268118181F0F5EE70930716DD8880652B3A196EEED5E737DEF7B5DB692470365FAEE611193F9228AAA5683B0E90561D36416126BFE4834B7E220D09E9A6F1A2569DD6AACB9BD1CA6182EBEDB5D6ECC4A47D70719AF6DA1670EF1BCF22CC8D245454FC52016D446D8ADFC7950B2C1D712DC04621206C0FDD7D1770F283E40B932140E7E5849BB242C6EDAD3A87D4A8461AE3D13AAB4A1642AC3F6D484EB8017C290B76FE604F52B71CD8D98C4B30622D2BF5E0EE063CC7970C8E6FC6E6FE616A0BE4B15140DF6155BFDB270C445E840BA9A05488C6823ACD0BF416B991CB362DAEEFD8F69322F84FFC7FC23C332A198D106B2A5EB2DEDA56DBB951E6353779F19A7E476D8D6F29C4117FD66B2C59ACB7932C5FAF9BF0DAD9C3AAA37D91C2C01C081E4D5069F11EA33265FDCB7BD549701D5A4A7F7EC70EC8F82869BED88F4DB6B7DFAA012D3197EEFCF7F7B0B5A18B21BB6FDFC90F0FE86C9BEE993F2E519332C3C5D3DBA8A9A38FE2025AEAD8A948AB8E8D5479086262FD5AF9EE47115143D2CC78470AB43CDE5DF62AE2A16840D99C7A2248FBB8EF32BCE01F0A4816405E2C6F4151A059AC0147C035E4892C9CDBDAF96B947216698D1B921FE7A318F43520D1507DAB1114C25CB8832D881A7FBD6DAFC3A9450740DA6DCC7FF0C22EB3FB8FBB75249E0E4C4AC11E0D820023DB0939121C5213082C1505C831FFAD7407FCE1FF7C6D892876CAC5B583D7195 ss = C482DDD09802B47F86E06483C225DEFEE3F619FCB22B22E5 count = 64 seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 pk = 022C6BFEC937A2578FBA580A3C407448D47F4740C3C09ED70B8210D0DC8F93DCB4A0A4F6334FA3578A3833F3005E76077A417EE88ACAA7858241D882B84DEE8A5446BF75E5D03A686EC3D96329713811DC456A359689AE3BB590D03B0046C7A55E42A2F0B46DE811FAB6249F5F4D31AD7F8AE893CAEC6E1E42278873C62E6F1D6F371A58F524B59C8184151F658D305C933ABDA5C9821DCE785487D26AFE66435582504ECB8D4D3B65249C0C2F5213BB8C142268D90FB216FB61C64CE0EB0335217F61AEFAD2776E39B59B6A400B986E37A8CA5CAEF27748729840E3352F5A451E178F55AC19DF83B0A20F00823C59877482342D238E50028942F6AC43BB79891160744F8203EA501CCA678997CA24DC289E195D381F5BCFA125B7E245B5C4E6CFEA0B8DE1A84B3D77F6E52D57031393B477539653967FDE9B237E1B78215E6F0886B3082150B0604E8DB776F4B4D27D1DDFD3602AD36CBD413FCA693472BCBD848FFCD16FCDB54D1A4680AEFA0A3097A84712FF54EF3652EB075A9E091E43D2EADA220B1A4801EA6636AFB8F2F7AD2BA60EFC02C1409AAB177A9A31B206DB28D3B12058FF717D53EDED7B66498B62DDA80731F1DF59759C7BCD0604E6F7A8483B782C18DF165F481D25F98E7CAA7EC385D06C575552FD4D4D731A01DD468AB43814131A5D3A56A89EF2D31554BD69BC3E9DECD9BBA925092412F79C96468BF791C4A04A5721DF6F472A5A20ECA1B666DCD3E54B1D77CCAD122FBEECBE801B5FB63502605379CE3B26A6BEDA64A57989D005073E sk = F8EE95521060C03BB8DACC79F7EB7DB640F545F315613A35D447A09E504CB4E13FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA98D497462F26B431E889F56A33FC9499002022C6BFEC937A2578FBA580A3C407448D47F4740C3C09ED70B8210D0DC8F93DCB4A0A4F6334FA3578A3833F3005E76077A417EE88ACAA7858241D882B84DEE8A5446BF75E5D03A686EC3D96329713811DC456A359689AE3BB590D03B0046C7A55E42A2F0B46DE811FAB6249F5F4D31AD7F8AE893CAEC6E1E42278873C62E6F1D6F371A58F524B59C8184151F658D305C933ABDA5C9821DCE785487D26AFE66435582504ECB8D4D3B65249C0C2F5213BB8C142268D90FB216FB61C64CE0EB0335217F61AEFAD2776E39B59B6A400B986E37A8CA5CAEF27748729840E3352F5A451E178F55AC19DF83B0A20F00823C59877482342D238E50028942F6AC43BB79891160744F8203EA501CCA678997CA24DC289E195D381F5BCFA125B7E245B5C4E6CFEA0B8DE1A84B3D77F6E52D57031393B477539653967FDE9B237E1B78215E6F0886B3082150B0604E8DB776F4B4D27D1DDFD3602AD36CBD413FCA693472BCBD848FFCD16FCDB54D1A4680AEFA0A3097A84712FF54EF3652EB075A9E091E43D2EADA220B1A4801EA6636AFB8F2F7AD2BA60EFC02C1409AAB177A9A31B206DB28D3B12058FF717D53EDED7B66498B62DDA80731F1DF59759C7BCD0604E6F7A8483B782C18DF165F481D25F98E7CAA7EC385D06C575552FD4D4D731A01DD468AB43814131A5D3A56A89EF2D31554BD69BC3E9DECD9BBA925092412F79C96468BF791C4A04A5721DF6F472A5A20ECA1B666DCD3E54B1D77CCAD122FBEECBE801B5FB63502605379CE3B26A6BEDA64A57989D005073E ct = 1A4F59F4FD7A0F164F77D6E5FA6F4D3E251FC40E4E823A21D992F09157606B947BF13B2788ECAEF8EBE32642D75DF58EEF8FF99D21BBA13ADC59D4AA2FD7F28B2CF26A1903D037CC09F0B2A2DDE50CD27C3A9D150BB386FDEF76380E73567A1F0B9F22890213A651413FC15DC953FE648DDB7DE35342D19A0F0A24F1EF42984DC21D920EB659B4AEB3CA8AC39981B253C43294101C0A7DAA7F50F7E69ACDF72156E7FF626C2442FD4C00E52D80F055331273B77DA82B005AD7D9FA1AD92D64D167555E1A3033B580FBAC8B56C21C7653021299F06684870765AAE5442B8CA2BFB817A9DF71BD493C38C40F7B238A65D6C83AC975BC80FA709540179FDC2B1A8D89672F3C1542DFB51F095D88AD60BD5824A20BA484EC0D56923BA30B5D07C5A94DE491632347475366AF747DB8DCC9314E71946463EE162FB257E7DE6CA5D7A3AE0F386BA7F6F64FC6B6A7FEDF8D9047344B24CE0ED505C6B7E781935418C2DFB0497C4AE9E4525B370C753B31D3D17CB025C42B3EF40D102AEA56FBA554BDB72A191C951253606D8BB692DE198852F40AD0376C8A0B1739997E1BE89DC20225223B1A8FF5640F376DA247BA617F859F9B23EF5138122DBB6662660776573EDAEB0E1CD20A8CB1473DE89B2609509869D025F2A5C23D9BDB3425FED017D9A369269AC0FA0B4BD52E1D8CF69C96EE8AAB968272FFC9F8A0DFD89A6C5781CC506B60079249B324D373A7A15D9505274094FC7A209F91C02AF0CBF16238927A39CB85502DCD98B2185D4D7B1906A21D8989D60437438CD088D7AAE1EF09B0F7B3AA43FCA31BA3B6FBF260BA5128D71FE1AD7FAF80F8 ss = D9EE11FC4CBEC6C83EA26F877BF46AD340BB5BF1F59ADA45 count = 65 seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B pk = A7FB6B058EBFA4166D6C7E82D63EB9913EA64545EAC89842A4D462D5A4F7C4A2234B158116DA9D7FD9A6BC7C922E050ACB580A22F5897982993DFEA19351B3BF8ECA5A9CDD0461559B4D8E1F0269F9FB4A298AEF22977FD34CA31B726B418B7A135748CFCA60AF1D06023364CA42205BE1639D62C3280C9404B39477730DCD145FB8662CEFDBB33D13B661098FC5561A81222E1E59D5289C7C5FA07B291CD16DDE9AC7B998888F6923AC76C4C5B76B2F19BDADC6D013689C245DAB06AC8EDFA88D153444BEEC24CF9E6884FC18124E04352BE71F947B7838326B371578B71629B1FBD96E06A1406E71B881582700BB8967E9E1014D678E431E844B5062C9D1E06DEC377DFE86438AA7072359BF7ED993E4FEBCF2E2B2312F91314058A81B2A3BA8E99144C44C13FCF2ADC272B5C0C261246C7A359E340C04F585A79F2394F502B491E08C228DFFF7FE712FAC6C74BC61EA01848B17A286F7DF14800D63C5576C24418C6519557B0F235664F398556D37AD54289797DB9763CBA92A85F072EE1A054127724E89D6AEE4A79854F0A07EE1A0EDFBE432A40DC12D61AF506D14403CD3E6B29219E3E908F0BCD989DC74B2A08656F5FCC72681D3BE501928CC851461642D454CF1F57BBE2DD199FC117E6BBB41022145D45F0D31623B1C40EB04921981194AAFB5A40E6CBB12E2ECABA4A97F812434F3CE94C6C78D43BD654066B7A947304EC920B91B0D3B5440AE84ADF2E0B6038217450596EB4021A32A5C2E1C3CFC6AAEDCA9BE2D15F85EDF1EE3EEFF0B07B16E45 sk = B8BD0493A882E3A49B4E0F6256FB1FEA0912562FD9BA26EC3D6C9CC12C8973ABD7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF76DA93BC0A2D45E032A1546012E75DC8D03A7FB6B058EBFA4166D6C7E82D63EB9913EA64545EAC89842A4D462D5A4F7C4A2234B158116DA9D7FD9A6BC7C922E050ACB580A22F5897982993DFEA19351B3BF8ECA5A9CDD0461559B4D8E1F0269F9FB4A298AEF22977FD34CA31B726B418B7A135748CFCA60AF1D06023364CA42205BE1639D62C3280C9404B39477730DCD145FB8662CEFDBB33D13B661098FC5561A81222E1E59D5289C7C5FA07B291CD16DDE9AC7B998888F6923AC76C4C5B76B2F19BDADC6D013689C245DAB06AC8EDFA88D153444BEEC24CF9E6884FC18124E04352BE71F947B7838326B371578B71629B1FBD96E06A1406E71B881582700BB8967E9E1014D678E431E844B5062C9D1E06DEC377DFE86438AA7072359BF7ED993E4FEBCF2E2B2312F91314058A81B2A3BA8E99144C44C13FCF2ADC272B5C0C261246C7A359E340C04F585A79F2394F502B491E08C228DFFF7FE712FAC6C74BC61EA01848B17A286F7DF14800D63C5576C24418C6519557B0F235664F398556D37AD54289797DB9763CBA92A85F072EE1A054127724E89D6AEE4A79854F0A07EE1A0EDFBE432A40DC12D61AF506D14403CD3E6B29219E3E908F0BCD989DC74B2A08656F5FCC72681D3BE501928CC851461642D454CF1F57BBE2DD199FC117E6BBB41022145D45F0D31623B1C40EB04921981194AAFB5A40E6CBB12E2ECABA4A97F812434F3CE94C6C78D43BD654066B7A947304EC920B91B0D3B5440AE84ADF2E0B6038217450596EB4021A32A5C2E1C3CFC6AAEDCA9BE2D15F85EDF1EE3EEFF0B07B16E45 ct = E89C78D21C1A288CCD4868ADA9525510289888CEEBE2CCCB430F8597D8506802FCABA4A4F1158EF04DA5B17507F5BAF9DA072A1285F00368025F960D7E2A616EA8F420ED23C4B91AADE399A7B548496A5FCC784387A37D62779C03BFFB04A83CDB21A8B23345E9C9EBDD89C23A477FE7908CF6EFA6E57313559B2F0B400119C89255768E58D7F40218DCB938B619421EF5682B73E05F9A7988B5B90A2E2380B16673752D261687FDA8D65F2F6CCF24BFB3AA0381571EDD626EB403377F5EE36FB33C0A23338F281F2FA692BEB2AF22791D34218B0DB62134A1048ED17C1857F512BC122C564DFF31018EBFB23CC78A0504000FCE7CFFC300CB2669AA955B3AD4C9386B19C580D39EA9944FA8DA4B2B2420284388E6AEEBE4D910D00A3DF20264BF7F1080FB51CE4B81A03A39695034430C625062E72962A5D394288F33DAA72072703B81BBA27E75E0602DC1DFD5D5E7E43B248008718BFB1BF81EEE71F8B0AD21933D2AF7CA5CC420BD6F603CDCF02FF35CA49E5AA129506CAD550AC329C33D963D67EDDCB4051E12BD1F702E5416BAC3AC558D481EEA4B5F2119E92474E39D58E7E24598EB3F2936F3660CB40233D3D8C29C4F324662207C3B9456D493D95DC7BB59BE6BE89E260D954A86EB0084C2F5FEDB925051E3C698D35D37463FF1B1C5C990EFD8D1FAD4FA8B167538580E6FA9921FDB094D29F60909C2270E68ABFFB40C2769B3131694CE4CC31283917B2EF3EEAC04193BC4627F93A28CB0B70BE516FA29457B4A1EDE1F6EAC1A87972AC5D781940CD665A7F27C08C55C1CC42226B25DC624DA97B3D160D0C7554B7017C1C422A4BD ss = 95E14F79CB485BA89A125C5C4A957FB059FB83D49399894F count = 66 seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 pk = AE9A29B71848398E983311906BECC2DC2D7BB53BB161DC416CD80B4052D2CA81ECDF4C548CC7603E802FBFD1E6BC6BBBC25CEAF779EF68EE156147D1DF8893FE410E9E87E67C26E7DC85094745B8A7E6E3B40FEAE079B030DB12B6A3932C60683D313203FFBF121108F819B8F6E3C4A8AB09D68496EA07020AB717F01EE3D6EADDC0AAE5C4A36D10DE74477111F316331178F5DBD21DBB80AC73964A686EDD2B61749BCEFD34EA11C8516B56027CA50C874777B0E328524FF4DD0C613522DBBAE4C7FB92BE05A4F17C48A5B7140A0B0B5B8F8F77640796C31ED050D383343A4574452935F82ACB536A6C31DAD3002945E8BCC54B5C8D667B1FC08998FCCAD3D2EDA813A44BE62F44218F930390E0C3913DDB3842C27060F39E240AA1D647632446263E22BB23AFDCE38AEC769C67BACD25BB269DE9BD92746A44F683AD4E83F44DA9CD875ABC72C929AE88477F1417F005FF3A2658DC6209E716ADBAD896E3686053ABA1EFAFDBA7639E68ADBDD5CE7E76AB5C124CF5CC0CC0CAD1912FDA617F49E5702D4E228ABFE606B172EFEB423F0EADBFD126CAF01FF1BC025E2481F9158D19A68E9717C691396789473CE66F7185C591FDACCEEF2C4EA19022CF30EFEBABA4AEC36E1627C8FF3A25118B39165D92AA435805441758E429291F6F6601A6DA3D465D301E2E3389C61B2BBF61ADFAD917690DF999D4C354E9214C5A6C925164CFB3FA3F04EA75D4DD635B7211E9049AD331015B52D144EBAADDB81910EC06857216EAC81519FD11B868175F667A23B1D05E4E sk = C0407E41DDF48D333978B89BCF2DB01E4613425B456249E76A6F25B8A2827BF5B2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F1246436D0AE40E7A499B148DF04878ED898201AE9A29B71848398E983311906BECC2DC2D7BB53BB161DC416CD80B4052D2CA81ECDF4C548CC7603E802FBFD1E6BC6BBBC25CEAF779EF68EE156147D1DF8893FE410E9E87E67C26E7DC85094745B8A7E6E3B40FEAE079B030DB12B6A3932C60683D313203FFBF121108F819B8F6E3C4A8AB09D68496EA07020AB717F01EE3D6EADDC0AAE5C4A36D10DE74477111F316331178F5DBD21DBB80AC73964A686EDD2B61749BCEFD34EA11C8516B56027CA50C874777B0E328524FF4DD0C613522DBBAE4C7FB92BE05A4F17C48A5B7140A0B0B5B8F8F77640796C31ED050D383343A4574452935F82ACB536A6C31DAD3002945E8BCC54B5C8D667B1FC08998FCCAD3D2EDA813A44BE62F44218F930390E0C3913DDB3842C27060F39E240AA1D647632446263E22BB23AFDCE38AEC769C67BACD25BB269DE9BD92746A44F683AD4E83F44DA9CD875ABC72C929AE88477F1417F005FF3A2658DC6209E716ADBAD896E3686053ABA1EFAFDBA7639E68ADBDD5CE7E76AB5C124CF5CC0CC0CAD1912FDA617F49E5702D4E228ABFE606B172EFEB423F0EADBFD126CAF01FF1BC025E2481F9158D19A68E9717C691396789473CE66F7185C591FDACCEEF2C4EA19022CF30EFEBABA4AEC36E1627C8FF3A25118B39165D92AA435805441758E429291F6F6601A6DA3D465D301E2E3389C61B2BBF61ADFAD917690DF999D4C354E9214C5A6C925164CFB3FA3F04EA75D4DD635B7211E9049AD331015B52D144EBAADDB81910EC06857216EAC81519FD11B868175F667A23B1D05E4E ct = 460213A94691E78A02E704E99FB964F551D7A88F5F9A3A44868AFB810AAF0741CB38CCE534C6BCA0C570976F1230D0873B0236D981EAFE1C9F839AB8D8A39A56E3E10B850A555BAC396B8C716994C46840F308B80A13B020D01F0E06500B3C57E66DB6195744C23DE31C59280B39CAD4C585DF14A1B422CFB91864E4EB6A1A599496481CB25B5355BDDF09559399BB77641A93C72CD0D6AF3287F654F3B521368CCDF9A8E7DE88CDB19276D55417FABACAEBB227384E00B54011BD0903A58C7CEFFFA48B8DA91FBB37D8EFCD5D43FE3ACE1E48A26661DB15CC0DA6A5C97FF41B9C29C130AAF0CB9370D829ECA239BD62A7ED432CE223AEC52B5CD9838DC0E56AFD6865B5A54597880D244EBD63CB697D716CC02AABB2592099678A4A3BAE19AD43CFAEEBA78C108FA6A6413A900849ABF54C587148CF9001E9690C2B85D04FF2A371130D301DE28DFEF0A5A57B9FD4D9B63A18270BA6F6F14121EC398ABD4D9E4055EB31BC817CA34DB91732550A8D03EB878FA7D6C2622E9D7C6D5F1C85BCB43E6FD763C7867083DC8979D984FC6E5DE3A631C3A238A297B2C453B71FCA16FAA6443DBD5D6F3864D7CC83C09277AB19563B422250B2A615C7E2034FD643AB9CE38CD8D5F6ADC04A8B2F4C4D91F2C8B6C9A9FE037536578A83BC864697DE1B14A4AF5020878FF42444D7F1F227ACF140308BA58B073DD0090EBCB2717BE03093145ABA0CA37DE8A86DF066EE44943299E74A6FDEED613955382A847BA55C45B7D0D5A1C420B8B4DCDDBA7CC31707703EEF9CD44E87C8618B7EC66C3AD1D1969EEFD1FA23DB388753DEE16A4E7C663B185D5E0067 ss = 42D7749371FAC2D7DC8CA6C903D78C172E7D986DA1B36F24 count = 67 seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 pk = 1BF6BCA84C552B7221E5D49C5CC583B5153ADBD7120CC6325A0EF4E07FAB16BE09661F9DDEF49417B62A855DD5CAAC84C2C8F2178609DFE99B33F9D238B4288F0624EB2429C9BB4A0C42B03D6946F5812A256EA01663F21B6EE62A938B261148C5127A6A360A689A1ECFC631B16E970105E85E302799345CA46C6201560800E73919472F3942D31A575064B20E007609AEFD8264B7BA486AFB293569485DF3CC611BC65677C50BB67850CAC91218D95882B1ACD15D32E76823F4533D1461F022F217F53E6230DF2147E107E0C427315063EAF6399BBCCB5E1E14F33103975250C87FE31AE5A7ECB4FA58DFC3305C66BC07684A304B9F70EBDEF155B99D0916FE83F9574B95F8B6026817F95FE2C0EBE523F4EE5B41784C7E8009C9855BCC22B5C079D862AE950B8C9740085BB95AA2E1105952E22DC7B72970E3A386E26794BB123CB18FE0C28481ADE1D58B62A371E42A599E8B4613E5BE86F016C2F44C275B0598A37938258FAF473372141252E742EB5A5377CCD0B5206783192EF6B2A1EE6D119AF10E4642CF58F7607F948F8BC88CAC95A11398E6B258CE61CD0B3471D898541FE6793D6E62100A4EE5984253CE9A0FABE48330BE7F9041ADB7FA59986D3037265169010239D6179E877BA9FAB239D5EAC9764482A2CB8298FBF2A62AA0BD701F6356A96452A08DCAAB8867FDFB1DDD8CCDDA1ACB92EA48B5F89FEFB5D31512DDB0944F5884A91ADAA17A4EAA11EA6F79D7E36FFC64A3DE0F11C6C5055ADF89A91FAC5A0D69137B3883FD9D41155F924D26 sk = 334382D39164D1989696A2FF77B25A28AF8BEAD9883B5365EB6FCCA7C1781CC9ABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D252397F0169ADCCE240CCE953AC7B438B9011BF6BCA84C552B7221E5D49C5CC583B5153ADBD7120CC6325A0EF4E07FAB16BE09661F9DDEF49417B62A855DD5CAAC84C2C8F2178609DFE99B33F9D238B4288F0624EB2429C9BB4A0C42B03D6946F5812A256EA01663F21B6EE62A938B261148C5127A6A360A689A1ECFC631B16E970105E85E302799345CA46C6201560800E73919472F3942D31A575064B20E007609AEFD8264B7BA486AFB293569485DF3CC611BC65677C50BB67850CAC91218D95882B1ACD15D32E76823F4533D1461F022F217F53E6230DF2147E107E0C427315063EAF6399BBCCB5E1E14F33103975250C87FE31AE5A7ECB4FA58DFC3305C66BC07684A304B9F70EBDEF155B99D0916FE83F9574B95F8B6026817F95FE2C0EBE523F4EE5B41784C7E8009C9855BCC22B5C079D862AE950B8C9740085BB95AA2E1105952E22DC7B72970E3A386E26794BB123CB18FE0C28481ADE1D58B62A371E42A599E8B4613E5BE86F016C2F44C275B0598A37938258FAF473372141252E742EB5A5377CCD0B5206783192EF6B2A1EE6D119AF10E4642CF58F7607F948F8BC88CAC95A11398E6B258CE61CD0B3471D898541FE6793D6E62100A4EE5984253CE9A0FABE48330BE7F9041ADB7FA59986D3037265169010239D6179E877BA9FAB239D5EAC9764482A2CB8298FBF2A62AA0BD701F6356A96452A08DCAAB8867FDFB1DDD8CCDDA1ACB92EA48B5F89FEFB5D31512DDB0944F5884A91ADAA17A4EAA11EA6F79D7E36FFC64A3DE0F11C6C5055ADF89A91FAC5A0D69137B3883FD9D41155F924D26 ct = 9F5485FBCA97BCC83C6FB7DFB90ED4469ACE310F24F294D69C73F621852904865964F401DE456514AD80C753E289A51E859864F9EF9BA38A32C3BA82B711584B4FACDECBB699917DB9688DBEA55B146925923F723C2A5FF73B03B0928314A1E460CAFD8E8A5EE1BEE3180380F9D7DC8EB01AE0CB60DB213704F208194A42976720CAA97EB7D1FF3290180168D55301E63A41A06CD362DDCA0FA819CE462EA12CD570429B1BC453CC9D34E63DFF6266564B31A7BDA2C7C35A8005A829E0BE555916C153DD1D201FB87620F45D885B07821C59419E51D828B370B905572E4D8F99FF66B5461F954ED288725EE3CD2F34767860749644853A171B87C9334CD1D885FB31CABA9D31DC38992F0F0A5835EF35C121711EE5EB19B9CC11849F0A063E261742538B4D4C62BDA53ABEB438753977BA8FD2D7D609DD411887065447AC9C70513306018CAECA4C7FDC7E91859CA604616FA941E9B128A4FEC3D34BD4D7C9EFA1481CB31B812F35A86677DBC1C0C9274B02CE3B2EAFB92CB5B3DD33AA9DC25AFD763E9224598385F8F115C98B999DAA02B34B489C0863B371471E499BD7BB4C499107FAF14A91059B8404BD51C04D6D10A71EEEDE4571867B3114DFDE446B09D018250E6F34FDED61FEAE29A5A891D0977CBADD9164562E242C897608AAAB223D1BC8B34566DB31D94C9C067BB81953A579C827A13829BFEB980E3E7D7F215754F36E3D62C73C648C4868B3661F2E3EB43F5D79DBB5C37AFC0145DF02DF2D9A1C67B7BB4D92FEA2D7B8043ADAF6823BDBD6BE34A184113AC9EC62CD128215A925D58F071A4AB943ABC2ADD53DA9D43B6D42BF19 ss = D514C3A40623FD15BD9B8017ABDF3947B6D2ABE53CD40ED0 count = 68 seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA pk = 51A1E22D7F3AE6935256BE150D72CFF6C4CD149C02F0B5FA7AD71A0EB9FFEBD1879099F76E1394026009BBBAAF98DD592EFBDE5B654CC3E28BDAA5F04E1BE04643F4DD1C101F0C9719B1FEDE627C0E5D55CB8877699952599B21AE0F4B5AD0A2197BECBB10ECA85C8362690C1F519224E1890024528D7DDE9583A0F6D8EDED4D23DC2FCC666413DFE0ED80133B9739AC0C719EB2FA5824174FCE73A2045E7CD675BD1B59D00F252C74FA0D46489AEB28C882BE8582090BA851806300925496FC57E81BB1ED7896F7415FF54AAE5E47FF7E40BE8C903383EF8858B20480BFFFA934AE1EC7526CAC5705BFDA896F72DF1F3A73E98A8F75ED0684C85C60AD90BE99058482265B9F0FAA54FCFED2FC737B0F0EC2C958190C56E9306FCFD0685D45C80C649E4E0D342A834984B2F5345714822BAF311825E878DC1AB614471E3C42AE488A9C0B457A3A6041CDE3498DEDDAD2FD8FC535BCAAFBE7E751A72169D04CF8449FBFF505CC9A9B8DF7A7FD9C90E9BD1FA10D22505DA93E91DA7B4FEDB5CDAFF5B6D0DF2FFE1726E6A82792224B403668F5C1F60B31B33995E97952DCAB0591868AE476AC66501E6FB371E92140BF861AF8BFC0AE1DEB1E5BD21254A1AA4827649B3875BDAA426B15176A168A4B0ED622397740502E351E60CA1E5296294037429E4FA5751A6F189764E44875E5A2395B432619CFC69374FB987FA882A932D385C353A13A06415421C18F652893611F94A67E36504229F480788435B5483B14578E29DC9F8A7A9D3CDC0D7CB30FF94BA818361C sk = 6995143E8EB8A6E93840F76EEC844F67D2B5F75B1839A5040337E61F9806764A0F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E6C6289AD9FBE5D49083E7078F73238A240251A1E22D7F3AE6935256BE150D72CFF6C4CD149C02F0B5FA7AD71A0EB9FFEBD1879099F76E1394026009BBBAAF98DD592EFBDE5B654CC3E28BDAA5F04E1BE04643F4DD1C101F0C9719B1FEDE627C0E5D55CB8877699952599B21AE0F4B5AD0A2197BECBB10ECA85C8362690C1F519224E1890024528D7DDE9583A0F6D8EDED4D23DC2FCC666413DFE0ED80133B9739AC0C719EB2FA5824174FCE73A2045E7CD675BD1B59D00F252C74FA0D46489AEB28C882BE8582090BA851806300925496FC57E81BB1ED7896F7415FF54AAE5E47FF7E40BE8C903383EF8858B20480BFFFA934AE1EC7526CAC5705BFDA896F72DF1F3A73E98A8F75ED0684C85C60AD90BE99058482265B9F0FAA54FCFED2FC737B0F0EC2C958190C56E9306FCFD0685D45C80C649E4E0D342A834984B2F5345714822BAF311825E878DC1AB614471E3C42AE488A9C0B457A3A6041CDE3498DEDDAD2FD8FC535BCAAFBE7E751A72169D04CF8449FBFF505CC9A9B8DF7A7FD9C90E9BD1FA10D22505DA93E91DA7B4FEDB5CDAFF5B6D0DF2FFE1726E6A82792224B403668F5C1F60B31B33995E97952DCAB0591868AE476AC66501E6FB371E92140BF861AF8BFC0AE1DEB1E5BD21254A1AA4827649B3875BDAA426B15176A168A4B0ED622397740502E351E60CA1E5296294037429E4FA5751A6F189764E44875E5A2395B432619CFC69374FB987FA882A932D385C353A13A06415421C18F652893611F94A67E36504229F480788435B5483B14578E29DC9F8A7A9D3CDC0D7CB30FF94BA818361C ct = 4CBFD2149F49CD9814521064539CD0DF762A50BE967B255FB22FBDFFA3293774DE04B2A586F2BFE15FF03DF13C621F8D2239D781137B6EBC5CAAEAA7EB14120AB19419C92B171C5B83A4C4BA51CE8410FEB03C5EEC0E91A111F97854391DB5265099D0072B72C04976EFE2FC2B10E332E98ECC56917B5ED85D6792A7F729C7AEDF0E2A9CB2498BE66355CEAC1A0F4C24C05D32F7ED7153171FE28DA6EEC08A1AD3047EBD71F6F96ADD3D0C01892EBBD9DFC55E9398AD604CCB20E64750F01A89271E80C1BD9E6BC669BC076D0C39E38FC7D85B9548B593F5D610450778453B1837F64BD04A0DC9E7700890D70100539C29FFDDB10B4AB49FB8AF03EFD8C1C6D0BC35FD9F5FA6DD51B5005AA348240F36F28D5E67C49E0483DC65A0286B467CBA28593D7852D29A6B5DC536EB55A2C77FE3D3794E106AF008962618A4981C687D3C0C4EC8C2FFF33665D831B41E2414135BF14A3927AD3B511D05CEAA7020F535E6BFAED7892D4A95E27DB22B5B918FB90D8A47F6B0FAAF25EDA7C228C4F8FA30116533D86158A3F82595F472481F6685535541C2162319CCD3F99B211562BBFF908382BC07B17C7B43F14B10B2CE96E2D0CFE51BD555797FC3CD28B58650908F6B401B436CA80DC13AF5F8C3C42A9D9D51DADFF6F950B896BE3A870C31695EAA41FA6452B6F9A718BDDA03C456BF43D690389678DA610BD3A111ABAE89805316B6B48BAF79C8FC63F97BE3E6B0B6C3237632746025782E86D15827EC39F8BCB785F1BD29578D6CE8C6AD181655263A7F0C66151A61F941E1E2D8445CE54E7D84BF9498EA43FE13F1EB84B62CFFE598160D3DFB4B ss = B86A259CA79B80325DCB16584CF627331F2D35E9CD3D1B5B count = 69 seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA pk = 368CF21C677717560CCC8F67ECA1229229B3D935BF351E842699D8B5CC22CE9B54E6F026B7B9EC41FFE532FA8F3A0F443A87E992642C0D35AB28EA33B70973EC57A1D2F04AB5AD94814DBF30AE8418811D2B07D41E61E79F3A1C70ADD367F24B127DC385D7F9587DF0356D80C6476EDE728513F8990FA8CA83ED73E739E6EB8315EC37C745624E35E95D773D3B50D267359C613662B8720E35247C42578B0DFCF840776D9CF6CF571ECA4DF42A5D65CA7ED1178703FE4AAC2FB3990BB8DB5454DDD245EB8D39FB94F87236EE51E54C59CACF9C261518EF6E4ED4C6CAB78A16E6A9BAE33C71F2B2A824CA9C4D11D6A1F26E1BA1CFF545000E7209A62D80EE0A9423EDFF19A87746A0321C470EF5EB9CF67E33A8FD1595E5F118489A382AFD13CDD2B8AA422E001BFDFDA8B9733AA55DBD85F7BE10326DAAA503C1660FC3995DE89709E90586A3207572CA8FB7DEBA479DFC70F29C4394EE18394A4D17DCAE821601BA1FFB6C7D93364A3CDC98E788D65A127425E3A9D2C6312CC4D9086B94DE4CC3B49C14D31AA7597A55E6B115D0CC178563A30079E9E3BFFF143533576953C77A39D2B9F7C96BED2DD024F1D83BDB7DE79289DB1C4008DDE846AA36ACC6392278E4F3AE79F061857C70716DD152FF665D205904E644FE2E01DB42FEFF776AFF740E1D80EAE4709CF588EB6855AA198439A953E47ADE76D1BBEB38252ACFF9EF4BE0FA930DE459A7A9632A652E804C9A8721ACCBBF2310D17E75B384CE297508C9E9C7AC888F8DC0162F4F2B2D078759E394774F sk = 995EFF7E0D195C6D0533F3DC194D47E60F9AD14696144CDE694D60A95F3E96B4B28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F2DCF1C724CFFE8D40195AEAAE0FBC788403368CF21C677717560CCC8F67ECA1229229B3D935BF351E842699D8B5CC22CE9B54E6F026B7B9EC41FFE532FA8F3A0F443A87E992642C0D35AB28EA33B70973EC57A1D2F04AB5AD94814DBF30AE8418811D2B07D41E61E79F3A1C70ADD367F24B127DC385D7F9587DF0356D80C6476EDE728513F8990FA8CA83ED73E739E6EB8315EC37C745624E35E95D773D3B50D267359C613662B8720E35247C42578B0DFCF840776D9CF6CF571ECA4DF42A5D65CA7ED1178703FE4AAC2FB3990BB8DB5454DDD245EB8D39FB94F87236EE51E54C59CACF9C261518EF6E4ED4C6CAB78A16E6A9BAE33C71F2B2A824CA9C4D11D6A1F26E1BA1CFF545000E7209A62D80EE0A9423EDFF19A87746A0321C470EF5EB9CF67E33A8FD1595E5F118489A382AFD13CDD2B8AA422E001BFDFDA8B9733AA55DBD85F7BE10326DAAA503C1660FC3995DE89709E90586A3207572CA8FB7DEBA479DFC70F29C4394EE18394A4D17DCAE821601BA1FFB6C7D93364A3CDC98E788D65A127425E3A9D2C6312CC4D9086B94DE4CC3B49C14D31AA7597A55E6B115D0CC178563A30079E9E3BFFF143533576953C77A39D2B9F7C96BED2DD024F1D83BDB7DE79289DB1C4008DDE846AA36ACC6392278E4F3AE79F061857C70716DD152FF665D205904E644FE2E01DB42FEFF776AFF740E1D80EAE4709CF588EB6855AA198439A953E47ADE76D1BBEB38252ACFF9EF4BE0FA930DE459A7A9632A652E804C9A8721ACCBBF2310D17E75B384CE297508C9E9C7AC888F8DC0162F4F2B2D078759E394774F ct = 19661E5ADF4C57C8D5DF99801D951B2FDB39B2BCF287838D206B1620DB72E733A9FC92D18D9E5BD1F40A399689F51E2C9392D724837EC477045D21A789AF7A006D26EA1A2E854577DE94FB98BBE0385B4A124042F7DA4372B83A0028E9035703A91B452108F6FA569C88E638C1BF5E3D450CFDCC781A8DAA1F16B0BAA93EC269EB323B2C5AE67A7D8A9F144CB7F01EFA975AFEE0CE5FEF1A04272589D4E982516F5A82D2C2BDC3634892C141A6E9F726B08AB166CF84F4C41BAD562AD452813562ED82164D1795EEC0ACB520256B85E2A77EAB8F63BF5C2AD29F04768A1D7092C078A59ABB5229EF2114927F582CF263EDDDCB38D29E6CE110CBE2C70ABCE7F0E02BE80D4231C00EE9DDFF924C8179AE1B2C763C29CA4C066B5106C33648948FA634935FDAB37DCF2BB6FC1A24CE8DDC04A9FAE39EC28781346E00B610CBFA8A0B9F987257E05392590C62B9C9533C61A9E419218F8C9723F2BA3F43A9DB6EE2D81DC0693FA4BC3E046C9FFA09F095C7F836D6DAF8830B176DF23A9D4E78B8F9D3C2EC76C52D3993276A37D6AD58BFB2067D1F5EFEDD0348D9AA613805F3E1B44091F88B1BDFDDFC0D6DB67D81B4862DE58F98A66990736E88EE92740839411C1C49DA314392F74C15293F1DA163790023F6E4B26125FC4794D1B25241EFF1FC55471E00D103C79BA59BDF4EA9265DE371BC0370C9423BFBA7F56C55D8F3B0026EEAE9CBFAB14151B23ABB6B9A32E513829CC2EEEBDB2E39CA63836E944003076662B93EE46D1254807FE2A035B74D524FCB132454DD6F7DEB27F24D4A0C8F5AD78F5CC92FD664290DE2A45A8021EBC373F451F5 ss = 5E4F7644ABF173038E5C0799C797ED1E401E512FD77C3F6C count = 70 seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F pk = 738ECC3B5375C919826513B2A7A6DD0434F22BDC53D8E44FA1623A0CA00025AE47658B5F6C6EE10F2C10C6025B15F90F60510835EA2B5B8D19DF482E03F54DCB757942438512BF259DEF5598A579F460072A3CFBE6DFF2A950FEE620E643C3BE6BF28035A13DACCB0EF0D7036302EEF35DD17BB45CC1A2020D07E0735297B550F7A7FE80FE9DDD7C5B08C7F78CA363375FB7ED3F59EFA9D77DC17F75BBF5CBF404B8873A072C1BC91E360A774F7C11F4E9AF0B040CF110D1F7C3E41A00ECDB23390232A0B7062E1B3FE8DAEE8C308D13110F580D1203FCC56E86946F516D3A30F561DB431F48E911FACBCDD6025B72AF5A0BC2D0C1EBB66770E2459847087296A215C2BF773E45BB2AE0564944A70D97181EAB5A2EC3C709A369FABA337EA27A3425CCB526A6F66CB1DF01C884ED3FE30608A9D52BECB51B474B033037F4FAAFF2E2EF51D2E7FAC9E41DB216AC84BD30E0D9AE7F9375D345655210738421ACB04F38F1B56BEA2653B5059645F85CCE59A04B5A3977F9DE51508E99DE6200B04307FC1ABC3514D1441F10CBCCF15715CDEB72807C8A0D1CA460260D4954329A299BE4483B9B45D8A4331AAD26EB719A6FA05B6344F356C418D86C011DA07CA694DACE41E1733CCF9CECFD40254A43087ACB357C779734AFB2ED813B3E1B0F950E9FDB8B930120B1C79B3AF336B212AB6328FB94F65450E71B42D3068C5B8583E8A6BA198A4051E60A9B9C1389DA81B942B4C41F18662EA1DB749CB2C06BB98FB43E8BC63FCCAEB70FFC44A8C9CD317F7BAAC1614C sk = 3E809EC8DD0FEC0D911A4E3FAC20F70FBB128C5DE94DC7184CA7310AE9157A98D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C473AD3022B265A1EA4CB233CAB79A52FB02738ECC3B5375C919826513B2A7A6DD0434F22BDC53D8E44FA1623A0CA00025AE47658B5F6C6EE10F2C10C6025B15F90F60510835EA2B5B8D19DF482E03F54DCB757942438512BF259DEF5598A579F460072A3CFBE6DFF2A950FEE620E643C3BE6BF28035A13DACCB0EF0D7036302EEF35DD17BB45CC1A2020D07E0735297B550F7A7FE80FE9DDD7C5B08C7F78CA363375FB7ED3F59EFA9D77DC17F75BBF5CBF404B8873A072C1BC91E360A774F7C11F4E9AF0B040CF110D1F7C3E41A00ECDB23390232A0B7062E1B3FE8DAEE8C308D13110F580D1203FCC56E86946F516D3A30F561DB431F48E911FACBCDD6025B72AF5A0BC2D0C1EBB66770E2459847087296A215C2BF773E45BB2AE0564944A70D97181EAB5A2EC3C709A369FABA337EA27A3425CCB526A6F66CB1DF01C884ED3FE30608A9D52BECB51B474B033037F4FAAFF2E2EF51D2E7FAC9E41DB216AC84BD30E0D9AE7F9375D345655210738421ACB04F38F1B56BEA2653B5059645F85CCE59A04B5A3977F9DE51508E99DE6200B04307FC1ABC3514D1441F10CBCCF15715CDEB72807C8A0D1CA460260D4954329A299BE4483B9B45D8A4331AAD26EB719A6FA05B6344F356C418D86C011DA07CA694DACE41E1733CCF9CECFD40254A43087ACB357C779734AFB2ED813B3E1B0F950E9FDB8B930120B1C79B3AF336B212AB6328FB94F65450E71B42D3068C5B8583E8A6BA198A4051E60A9B9C1389DA81B942B4C41F18662EA1DB749CB2C06BB98FB43E8BC63FCCAEB70FFC44A8C9CD317F7BAAC1614C ct = 8A33EAA0A6295968618845F36BDDD087C777DC0D6C7AD832CAE8B04A5D35344F6615DF4D07323EAD5D0E25472C7FD6DFB3DA6A4306A15A17241C7B2ED6D1D4D18A4687550794EA11C54199FB0F55FBA471696640375B20335DF9FC59DA555C9F448C6EC64B7B81EE5A554885EF82C5AF80D5B244DB5675DE87260EA40C070BD20885B328D4013F78D55C5E07843556E3FB34873B087613F96D2D4C2D50D80A1BF49BBD09D5BD66DFE1A1BFE360C5EA78C75057FE451B64D106EA5235159D2C195D167ECB871BD6BF3089873CF4209A5BE8E284795C1698D8FDED24F437324BF2D19F1F8784D4E37D6CF8830BF9406E817414C60B2239E6B070BB3172BE36BC681E2B6ECB7F34543878A585C55EAAE060B14B9B5882003FF5644EFEE6FE52FAAB240B774E4EF2C10482A5BF0817F4AFEDACD0737E27A265D0BDE6971FF9C765017A30B528F7EF2EAA547A0DFA7DAFE0D4533EDBE47EDF10F550CFAAA23C1A66F16C7FA3DFF9F28210D45EE9000262A284D6A1230E81460E0378306F384BC5C30B01BFA9E9CBBBC12E42E72E89A67FCCB19161664C84E935A5C5EB6A547A5B2FA5EC28B3D535C00DAE6EC72234BDF919269034F169D94095A29C3C7FF0761C12003BB9EEA8E87952482E922F2AE8EC9204E092D6631D5F5A73A2E4FEF5C68D83BABB6B6856B7CF3DB2EDEE1D476241758311C5DC455690ED615C91045BC4F7E44B59FF68F66E3E41798747D8DB7B1EDF8311AE3C8890C87C6ED834816471D4C3707FE4E5E0B52F778300AE41A3B1B6980086E48C0453D31A83A06871D225A4165F7BBBE6CDDC3B048A373E887612B8C0524B51EE51 ss = CC68D5CCB759D4E7655F3C2A5D71FFF67740A4B3CFBF9124 count = 71 seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D pk = A20A895AA0918C363FF02AA418112DCBAA58A2E4451248777916953B4A63E6D829866195CC6FBB0F8951BFB4684D5E102589A48C7216AF7854167CEC559736DE7527788BFF9A5F12178B01CF64CED55B753C1701B7EF6A4352973322731E13C7DF828C9E161196D8FC5D272723ED05BEBDC0EACAC0865711BB4A3F406B1C78395824F79E7FDE7A7D1FEA4CE2E9683356CDD5F3FE1CC430395D1CAE705000F143B5457970758D2E6756A503BD66228A8E209ED2BE5CB5C4818508642095C026873481A86A21D9445D9D89B9561EFA3901A0DD4C74D2D21F64F1C6B5256641AA44B9250A36C638702D8479EB9FAE0D99647071A7B68F8C90F118ED8A86FE7EDE4F15BA00733242A736C5AFBB28F98A74F6080EEAD26499019BAE290A45F53817147A0B4EEE5F41F4C12D1E14903D217D39AE32C108B3DB39F31EBFAB7E1B2886774BB64C5371092EC6D30EAE6F865BB4A6FFCFBD5914944B0BCBCFE0E683EAE8E137DE06DAA86807500BAAFAD9383588DC3A5C995CD4B6902ADEA5C38CE1DFB6B8F8F20398494688C821CE4F68418F7767FCA6414A70837CDB6CF1BC6484652E1C036593D26E20FC4A3C686226B1A6E36A4FFE26B8838930E9CDA2EF4A5B70EF4C74A6FA56E45794FA8311D9BA11390E6DBC4EBE39DA683428D7D75584FE7DDD4FF40A0A780D1DE31645D9BB9751871FE964011AECE8006910741E4EE84120DFEB3163C064DD5A715AB5F7C5D9D922441E99E0487E71833412208455428CD7A02EE11AC4E7C53743768B1D33DDCC4A0BC9B2689250 sk = DBF1C465FFF3D9F783BD9EE61A573715E45691147B8904439B5FFAA64F94FF7BB6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812006F2EA0901B47297BFEDCEEF84A39C62A00A20A895AA0918C363FF02AA418112DCBAA58A2E4451248777916953B4A63E6D829866195CC6FBB0F8951BFB4684D5E102589A48C7216AF7854167CEC559736DE7527788BFF9A5F12178B01CF64CED55B753C1701B7EF6A4352973322731E13C7DF828C9E161196D8FC5D272723ED05BEBDC0EACAC0865711BB4A3F406B1C78395824F79E7FDE7A7D1FEA4CE2E9683356CDD5F3FE1CC430395D1CAE705000F143B5457970758D2E6756A503BD66228A8E209ED2BE5CB5C4818508642095C026873481A86A21D9445D9D89B9561EFA3901A0DD4C74D2D21F64F1C6B5256641AA44B9250A36C638702D8479EB9FAE0D99647071A7B68F8C90F118ED8A86FE7EDE4F15BA00733242A736C5AFBB28F98A74F6080EEAD26499019BAE290A45F53817147A0B4EEE5F41F4C12D1E14903D217D39AE32C108B3DB39F31EBFAB7E1B2886774BB64C5371092EC6D30EAE6F865BB4A6FFCFBD5914944B0BCBCFE0E683EAE8E137DE06DAA86807500BAAFAD9383588DC3A5C995CD4B6902ADEA5C38CE1DFB6B8F8F20398494688C821CE4F68418F7767FCA6414A70837CDB6CF1BC6484652E1C036593D26E20FC4A3C686226B1A6E36A4FFE26B8838930E9CDA2EF4A5B70EF4C74A6FA56E45794FA8311D9BA11390E6DBC4EBE39DA683428D7D75584FE7DDD4FF40A0A780D1DE31645D9BB9751871FE964011AECE8006910741E4EE84120DFEB3163C064DD5A715AB5F7C5D9D922441E99E0487E71833412208455428CD7A02EE11AC4E7C53743768B1D33DDCC4A0BC9B2689250 ct = 656E653AF48636B6A0EE360642941F73437A73EA5B94E01FC9CB9FEB329CC27D95EE55F8A2180FCC2DB9B433492FA944E16ADA04F91F302DEACAA781C5E9718B41B597AAFE0E5B21B7F37097DE3852DAF5D43D8B7AFCEFDD4E15C3C1476798891D3FEE3586A495CE9AFA9ABC8B856F34B2D67037F1903787251F3F4640F0141EB0F708925F0D5B4AD1977E6EBC3C7735CCF0506455AFA650ACDE456CE0DEC86DBBE2E9B352AF2608645F7B2D15141CCE5F012435A6AC67A120C13F138800D5929CD990B025AE0A72758C2C492AC531FEE68A9647C9DF0441C72FF380BDB6502A0B1922D58DB360855A413B56E42E767BF6B6933652EAAA500FC33895FC69F51396928219E00B61C3AF90AD2FE82A0BF36B8DDBA4D1CAA565AF02AA1EA4ADDCD5B48B666D426464258625C8F63F144D0379BAC6ACCBD383F80B1AF72E48303107A8ADCB35E761FFAFB08933DBF4A3A23B972488054785905B19BC5BD67A47323A751DF190B318FB7E9D835E59D9795E4EB894CB47E83A4C18DBA4F82B2254650C13A21EA780557E21998B5A7791453F8311F275A3C05CFE7B5D4C07BB682472A890173C5BCD6BE8F132E43EAD16D0CF06E02B12A5404572AF012915BEA68844CCFB54A52F7A32DE14CEDABBF55C6BD740C13CEF249E13EFDEAADD45649D46CA325C424439790036548843A3BE8AF8560E77AA6D069EB5E089D1D9F40EA69A6F1F3F08C87CC3F412DFA02B234E9150E76AF9A7CAB62EE845A7297CE6EC89804767A1205E23FD9233D936EBFDC545957D8A854F8124A126A15B81FD63163C229CAF2D875FABC279902B8B093734FA0BA278C1FF042C ss = 630EC3944E3EE27C152AD42A344F92103736B2A9CC27A982 count = 72 seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A pk = 81273BF013A0C95CF5C015381939B5FA5951CDE7D4A7B72B037F016EE649FDB2A2902B24554D1239BD150AFB31721001DD67D4947AF9FCBED87486634F687C132FE3F2493519E6CDFBE4E24E19119E1C03AF9ED8644D0F3FD550D97E246FBEA47F76E64C0C960467D30130ACBDBF1F5DCA34E18BB4E4AA84C6F0AC8789FCBBD101E5357BB45469CED50B2AFA26A4E56FD33CD58E77C59DD3C83AD1DB335CD666BCCFBA2522E9D0EA5F6B749CED62F1619F390CCC49D1406C2F7E2467A270FB19455DC3E634E0B780E72393D681F2490DED1DF664F234AFDB8282A14028DCBECFA98957EA3AA0A7702D04D25C3C7A4AAFF108132731CA73B5B656FCA0D24F9068211972633469D9EFEA35159492D3FEE0FD49312DE08C4B035500B7E8B4430ADC19C64CA1ACDAC6AFF42B8FAFD057044466EBA37E75DBDE5C45E4B21D8D3CBC223305E7C64576863D53E9EBA9C4086912A22A0EBAEF75AE120427F3908F5DAECBCEEAE26DDD34282AD6587D884577DB140D344809B9B0A219D545C1EAEC4B4F4926ACAF7E39211F73950828310EAF9457C821993163156748470C6B6B48F278D924145046097DC194EBBC4C7619D7CDC072ADDA8A91D7C6E8B774A3509FA05BD31BE12B8DC48D433D4E00C43280CD20BE0C6DC0440C5778B606D067F6E9C7805D885CF0FFAD14FDE133F8A2261E94E09C7D0D757CB001592D4BA51B1ABB59F47FB7698FC6EAC356486455775E49D08D23DA14DC0D386E468DF0AF69A5BBA66C1C97CED20E4F74E03C7AFE95971F55AC54CCE15949 sk = 1F7CFD2B70863154E8A69D1758532E86C20CFC763D67C758BD10A13B24E759B5273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E76008604C611BEBAEAE425BF69BB34B06612A0350281273BF013A0C95CF5C015381939B5FA5951CDE7D4A7B72B037F016EE649FDB2A2902B24554D1239BD150AFB31721001DD67D4947AF9FCBED87486634F687C132FE3F2493519E6CDFBE4E24E19119E1C03AF9ED8644D0F3FD550D97E246FBEA47F76E64C0C960467D30130ACBDBF1F5DCA34E18BB4E4AA84C6F0AC8789FCBBD101E5357BB45469CED50B2AFA26A4E56FD33CD58E77C59DD3C83AD1DB335CD666BCCFBA2522E9D0EA5F6B749CED62F1619F390CCC49D1406C2F7E2467A270FB19455DC3E634E0B780E72393D681F2490DED1DF664F234AFDB8282A14028DCBECFA98957EA3AA0A7702D04D25C3C7A4AAFF108132731CA73B5B656FCA0D24F9068211972633469D9EFEA35159492D3FEE0FD49312DE08C4B035500B7E8B4430ADC19C64CA1ACDAC6AFF42B8FAFD057044466EBA37E75DBDE5C45E4B21D8D3CBC223305E7C64576863D53E9EBA9C4086912A22A0EBAEF75AE120427F3908F5DAECBCEEAE26DDD34282AD6587D884577DB140D344809B9B0A219D545C1EAEC4B4F4926ACAF7E39211F73950828310EAF9457C821993163156748470C6B6B48F278D924145046097DC194EBBC4C7619D7CDC072ADDA8A91D7C6E8B774A3509FA05BD31BE12B8DC48D433D4E00C43280CD20BE0C6DC0440C5778B606D067F6E9C7805D885CF0FFAD14FDE133F8A2261E94E09C7D0D757CB001592D4BA51B1ABB59F47FB7698FC6EAC356486455775E49D08D23DA14DC0D386E468DF0AF69A5BBA66C1C97CED20E4F74E03C7AFE95971F55AC54CCE15949 ct = 6964EB93C1EEB3CCD4CE5A8B8A0339DAF5BD6773D99A383AB5F7E94D1EDB2CF243AD98279327EEB6295F8F687AB67BF4FC1FD09A9B786DAA92BAA6677DC880767B385FB55AEFEDF10B15F77F552B2AA34FD68CAFE67DE86D51B79C86CE1E2EBA9B919634F7C6E962295883097F7C82D67A0B27C353A06FC1BCA971CF69E5FEC56E2C30B6EF1D01370E3CA9ED4AAD340E4F141549446D7016420F3D570E98DF0F641CB7D81741D94861CE23CD1B87863468C90F5D57ED63AEBC81AA2E47190C7B576CFFEB7D69369F4E656850AF5C5EF56E342F50CB0D1413EF555823EF9652E64BEB13AD14848E2DC62505740111B278A66267CE41145CE6B0CCD39D1851A22D472A23A8AB9D5308CB95DD1552AD44D487AC80C965A165AB7448C2450D86ED3ECADF19DB04BAA21858846AB7373FAD5575D8B6550BB623409BEB8F9776D9E5A09EF9CF68439BA7265471B50E52EE4D50BD1DE8CB2BC53D795DDC577FBCE6E8A768640797DF10B6F3A19554862CCE46634A8945440D9A3C57C1C8DE3AE0F7DF0D2D9673FF676B9EB9831E44347971F221506A0618619138FA85DFD215F916016794EE2B7B0487E467A45970FBAD0A0C41FE97011E8F36E0783D3654F671DAB333971D934CEADB04820AF7EF7E95125367840997C7151DA375E821E6B06D98996842476643467E1DF72F55B34E05266CB00B28B51E2230C76EC9DC2157F1A464404AAB860BFDE890CB4B5A393D9EFFD673CB1BD6A994E75339459BC2AF5770E68FF4B4E9D96AF75AC8D4B60DE51128BD09FDBFB4232AE83F47D1776153A440DF4BF9473E8006E246AD88FBFEAB763F4584DE50B78E ss = 236D8D09E037BEEDC065B488392B9789C2411BE535A723C2 count = 73 seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 pk = 26F3FDAF8054901C547FB65D1F1EB78D13A72194A8078C3C1C187CDADCC59E9F0167BDFEDA4A9F8E37B035A2E004739FDC51C19DAD0412D140298742A0FE5E6E06125CF7D1BBDA3D4E13F05ED7B1BEFDC5930026ED046AF78D5523D7BC3C66E2A999704E1CC57ADB2449736ACF6E40D411272E90E7ACF4737EF80DCA2BC675455FC0F6FBF5E69EA80EFDDDC47039419B41236D9F4DE92879C626325EAA014790E08CFB4C4B9A3EE0BA038215C71145ED5EBF7B4656188C0272466F6CC668E7E3F8261BE3D40536C12780D0F61B525E8CB2605EBF8D693AE502E791F5FD18E200EC2089C101C2CB7078B0DB3117FC505FB9828FBBA2941A3F29AE6B491079D4D6214CD3B709A4EC84D2E1945133F67B9DDF71B170106546076433A9CDFFB88D03071EE908F17DF0788C941FECBA2DFC0076A9CE845246771E2CEB240F6D40D77BE612A410D49908E996F724D26DC86667BF255A811CB5707B2F51212551F8B8D8A945967CFB351B5AAAE548E97C702F0B09D0A44CBDFD6D4E08073C908432B2CD6818EA3B007E1211D1BF01C766DE1CF857CFF9FE36E54342F11439CCAFFB75EF369FFFF31FE5808282081CC39A0E502C7D2CB19C23181D256715B88D65727825394DF47D29956F9CEE90425AAAC128E5EA9D48E7351C3E1BA2F3D8014D2E8A93A105A445986A9FCF306BEDE4A2BD08157A8B5107E502EF49190456B8284F7C90D3D56AC12B85BD3F62B36480811B81BD52C478260D8B4C1FF92DE9DA8605DBADDD57E774498C973A4AFAC2CB5132899D5C996A66 sk = 3A19577908EFD37697B8EDC7FDAF47D1BD3AD01A1B77FAF794BEE5B9C3192A6FA3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B9970C30607EDC2CA4DB2912A5DBB81690026F3FDAF8054901C547FB65D1F1EB78D13A72194A8078C3C1C187CDADCC59E9F0167BDFEDA4A9F8E37B035A2E004739FDC51C19DAD0412D140298742A0FE5E6E06125CF7D1BBDA3D4E13F05ED7B1BEFDC5930026ED046AF78D5523D7BC3C66E2A999704E1CC57ADB2449736ACF6E40D411272E90E7ACF4737EF80DCA2BC675455FC0F6FBF5E69EA80EFDDDC47039419B41236D9F4DE92879C626325EAA014790E08CFB4C4B9A3EE0BA038215C71145ED5EBF7B4656188C0272466F6CC668E7E3F8261BE3D40536C12780D0F61B525E8CB2605EBF8D693AE502E791F5FD18E200EC2089C101C2CB7078B0DB3117FC505FB9828FBBA2941A3F29AE6B491079D4D6214CD3B709A4EC84D2E1945133F67B9DDF71B170106546076433A9CDFFB88D03071EE908F17DF0788C941FECBA2DFC0076A9CE845246771E2CEB240F6D40D77BE612A410D49908E996F724D26DC86667BF255A811CB5707B2F51212551F8B8D8A945967CFB351B5AAAE548E97C702F0B09D0A44CBDFD6D4E08073C908432B2CD6818EA3B007E1211D1BF01C766DE1CF857CFF9FE36E54342F11439CCAFFB75EF369FFFF31FE5808282081CC39A0E502C7D2CB19C23181D256715B88D65727825394DF47D29956F9CEE90425AAAC128E5EA9D48E7351C3E1BA2F3D8014D2E8A93A105A445986A9FCF306BEDE4A2BD08157A8B5107E502EF49190456B8284F7C90D3D56AC12B85BD3F62B36480811B81BD52C478260D8B4C1FF92DE9DA8605DBADDD57E774498C973A4AFAC2CB5132899D5C996A66 ct = 22D56922D3F8D5F6A22F1C28E9A67F4E446452DA231E2014BFAE4B4753779663EE823C5FB260322E0EB5B3E3549120CE252FCC3EBD06A82589A37D9A493E9CCFE186AD2A616FAFC98C48F4CFC5D9EBC4D85BE7BD25B957C50B5E2ADE274B2E5333F2FFDE4C731A1554DE944EC0C61DAD4E97DAA4D204C80F4209DB09DC138F20E78F5F5A1064CC6B9833325F424AEAB2D18CB3528D358327D65C44AC74009A79AAA8056952BC552D4F341A6CFBD5E74CEE8C915CFFDA4FA143C95C3F4341BA5F9E5096F0BEE8A89DF8F0A5353CE53499170C91F092EC1CF64BCE2DE58EC33D5A90360AB76D22BA88A4B21486ED47E463BEC5E017AC99D03092072FACDF25F1D0F3161BE1B78A75E7072A92702F9934F46B85BF179DB67A21512C1C8532ABF963256FC62F3A5819A96CFD6BFCED534F0B8D6872B7BBE6997687BAA6289A355FCACE07A726BC9426D597F7157E1FF3A4EB005E94741B4F7A1A4CB2213744746897C663B5AE1B64E8899127F8887EDA4D13144929C1B229600CE26E3E0269F074916DB5FE3644278EA39D5D158A93F04C57E2BDFB582CA0A916E5846343EE40F61DCF9CCA6943EF18B0D3419F9EA3B70242A4939F44353C9C929B61297B0FA0BFA027150FD2607DF08E98B833664C1892AC706FE50D770FBD82EA1F43FDF661484B1E7599AFF4D4E8C95671760068299D72CF090B5107B27F2C5C2422CF4474D056BC39992EABD53E434D0C0AD1A3E4100482765556903E2518B5F1A6F23393897DF3BFA25FF369D6269F7237351BED8D0F9A660264BE33FC063E585C324C7DE52603C66C5AEE5789CA7FDE5AFE1C12B8750C46A543 ss = 3951D17BF55C2B846F056F4788A68C4F2119AD1222ADBFEC count = 74 seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E pk = BEF42A6EF62DBFFDA2C4827DB57C8AB6C5058FBAFFBE139AD52838433B28D8CCC09733DF15D79DBE4078EE51F6C58100D5D3CFB9026E0DDBC900BDA86FEB0D875E2B6CFE1CC1D25B96C331DC04E68CCD3A88FB7AD3662BD7160F92E90042D691423E9BCC86E92E9588690F27F11FA366944666A8FDDFB9BF6374C8570C241F020C902B8989E3489C0E5A6C5DE79E0657D3378F4D8585049ABEFC1A08282BA416FE9CE77AAE96F6CAC91F41D2D62F910EB2E069A9A2A92DACD01C9C2BADCC6C5AABA809F5B433A28C689E14F5463CD736A21E73ADFA19872155F67C3F310653DE165BA5E6B0B803FC6A41F5F02FD928CBA355D546ACB870027F4117E09D31161A3A1BD8CF61EE98D348D98FB381466421D8F958F50C5C1135231F8919266DBB6D200CF8C47DEEC65FC88ECAFD5C527940FC1F67BD341592B13DBAB1E3F355F616DA594CD0315E247F609BA5E6A96F86582672BE0559EA90139921AC11686DFB2219DFF1AD27E86DB224A3D29DDF81CA746170A0562826865EA195E89EDDF94452E821835E49E5BA9A7F4927F3361EB0291A0F5E023842E6FB04A6DF273C3C1D692DBEE21D389143E2DCACFCB6D424A1CA308A7EAB3B910D698D16F84400DE2C5415079786A728060C51C96890D24B12D12BE016F9A13CAF9FD8A6F482019F397E75FE8DF520A0621CD52FC239D82D1DCD88C44FD16DE713D87F4500A0FF7F6E41A9C1BFE6B2657696CA73846FE5AADBC7DA3BC2CB6CFF6AB24BEC98A375BC6BF52D2FE61279FD33C5F979C370D7FD14967838E44E sk = AE0F65E29F38804A6759F70F4D01E2AAFF7FE1C91EBC4F892DD0DE3AB2E68EA5E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C95E08D6CD768BFBCFEE1CB565A2CE803BEF42A6EF62DBFFDA2C4827DB57C8AB6C5058FBAFFBE139AD52838433B28D8CCC09733DF15D79DBE4078EE51F6C58100D5D3CFB9026E0DDBC900BDA86FEB0D875E2B6CFE1CC1D25B96C331DC04E68CCD3A88FB7AD3662BD7160F92E90042D691423E9BCC86E92E9588690F27F11FA366944666A8FDDFB9BF6374C8570C241F020C902B8989E3489C0E5A6C5DE79E0657D3378F4D8585049ABEFC1A08282BA416FE9CE77AAE96F6CAC91F41D2D62F910EB2E069A9A2A92DACD01C9C2BADCC6C5AABA809F5B433A28C689E14F5463CD736A21E73ADFA19872155F67C3F310653DE165BA5E6B0B803FC6A41F5F02FD928CBA355D546ACB870027F4117E09D31161A3A1BD8CF61EE98D348D98FB381466421D8F958F50C5C1135231F8919266DBB6D200CF8C47DEEC65FC88ECAFD5C527940FC1F67BD341592B13DBAB1E3F355F616DA594CD0315E247F609BA5E6A96F86582672BE0559EA90139921AC11686DFB2219DFF1AD27E86DB224A3D29DDF81CA746170A0562826865EA195E89EDDF94452E821835E49E5BA9A7F4927F3361EB0291A0F5E023842E6FB04A6DF273C3C1D692DBEE21D389143E2DCACFCB6D424A1CA308A7EAB3B910D698D16F84400DE2C5415079786A728060C51C96890D24B12D12BE016F9A13CAF9FD8A6F482019F397E75FE8DF520A0621CD52FC239D82D1DCD88C44FD16DE713D87F4500A0FF7F6E41A9C1BFE6B2657696CA73846FE5AADBC7DA3BC2CB6CFF6AB24BEC98A375BC6BF52D2FE61279FD33C5F979C370D7FD14967838E44E ct = C561FC551B49B035A0D71ADFDA9845133C839286FCE594E984A9D1B76180E71E760D72DA085DCD04C3141B2B45AA01081427FDDB991C8315C365CFAC3856A31563A69499ED2CBF725AC1B8C39FC48E0F5A81FB1EF6CFD1D9F1625CBC2F6D221E605160EC97C47A4F6DB62D1E931C574D5DA744420599A915835EA779F0059911B030DB89BDD24222F7D3BCC4CEF90641DE735BEA2D2BC59586E1B639BF5EE8A8DDF8105896E01CAC429D8B7C3BC8BE673421FA5D255951FE28A17111BB01CC1C73F931486C7E3B69709D4D84FD1E129DC036348112A45F2C5275DBB7996B50E1003F04FDDE89DE04A3C8C067CA516E2ECABA2AACD6837BECDB9619D7136AB67FE8B0C88F6FAEF2E4D125E127D9377BF4118D7227AEE807E247367579B20476668A76450FB3F6CCF1AF244E7FCFAA553A733C05F414C2234E22DA1663D425276754AB31FD55AA3ABA35F50DA8EEBA2AF4DC61F64B9799B13295967D9A043D38E9012CF1AA887B5050D389E60E7503CC2C6409D8B36F7A456D1E743B477A8E0786163EA29D5D981A5C89DEDE0BB2067699154289903BC73966CD5227047BFC50026A7D7A16C6A26DF8CA290983216B1785BE74058C50F388BAC47980F8FCCFFBC7E85D7A72D8B57D337B2AF187B91292A9CC716AA3A42178F7099EF113826929EB50ACB6EBCEF0A9B437E206211D914A4E97B4875B6FC75E69426ABE2BD6EC172EAB44A7F5F89FEB9E4F0B3C2DD101C5A253EA5C92AB981FB733C081C5E8BB1F97FB14B5B429A7A9B5F3DB8A3AFF05C11E6EFDC042678D7D950FDEEA8036BBE3FC18B3C17DFD1DA83328EBC586400FEB84FE50ACDC ss = 6E7B0E63342C5EA3E2C9B96A083E27B1541432F9722A1675 count = 75 seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 pk = 1B01B91B647F1342DB6997E67E008FFB00698FC71BA14A1AD9EBC864E73A8E5DDC63D4FC72A76CC298952EFB1E90D20EF1D31AFE0D530DF88EEC58AA7CC7EBF8EE518ED0C8ECF79E5B3FC9D297B4116A43F35EE157FA51D19DE221F2223D1E57F9AAD1D138B0F017F982BB98091DF656976C36A168800660AD4B2129A0F9FDCE73B389F0CD6D9B3AB5633A437222B817190E620D3AAE9CC8F2F33A4082B07326670F17F528E415721FD69B682E8B947BFA56A121AF03B1AF4EDC7A6304C48A91F283978AAD70107023D8708F64FCCFB580140B8EEF48D32F9D05A3D7274C3F3AED04A242C24F8B307B456D7B0784293093D8188035FDEF10A62B66456124093B51E3E281A37A609F28649EB85597D9C16A862A9D25FBA72189488AE2B227DE8EBAA669245572D6567901D3693372C48B22E763AF62495D8629153145157C3C9B32F2AC6F3A77F1A6CF2348606B9DB83C549EC8A36F40484A5D2F4926BDB7126F8DB9683DB055C359DD067413FC14E339BD816231388DB22978A8F14E6B06743035AF7B0B6CC11A5CDEC3AD901E6EFA259DF55F2EE899B290B5618DD1F37FD88DF7342EDEFDEF545D00545F61F7CF0A35F8158B627173897B779448F8C960BF90757DED596489C1E7CB08D182038D6BD4C4AE0FD32E554593BF35F2827C272F1A78869A1C6C8484424FA58AEFB9C7D7CE43A8CE3BA01FEE30CDBE7C6829EB0A15D8260A0666D65CF18B5125B190C9D09FBB51284C81F6F5F7AD5D6D1461BC1DDF5CA96BA298EA2EF29006A89DC946C906534AA33E sk = 6084A235F79DD093EF6D185B54E69DF33DACEE73A9BF2F379004421A10E3A79D9F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C9851104A2A81136C9568A90022AD41A59170001B01B91B647F1342DB6997E67E008FFB00698FC71BA14A1AD9EBC864E73A8E5DDC63D4FC72A76CC298952EFB1E90D20EF1D31AFE0D530DF88EEC58AA7CC7EBF8EE518ED0C8ECF79E5B3FC9D297B4116A43F35EE157FA51D19DE221F2223D1E57F9AAD1D138B0F017F982BB98091DF656976C36A168800660AD4B2129A0F9FDCE73B389F0CD6D9B3AB5633A437222B817190E620D3AAE9CC8F2F33A4082B07326670F17F528E415721FD69B682E8B947BFA56A121AF03B1AF4EDC7A6304C48A91F283978AAD70107023D8708F64FCCFB580140B8EEF48D32F9D05A3D7274C3F3AED04A242C24F8B307B456D7B0784293093D8188035FDEF10A62B66456124093B51E3E281A37A609F28649EB85597D9C16A862A9D25FBA72189488AE2B227DE8EBAA669245572D6567901D3693372C48B22E763AF62495D8629153145157C3C9B32F2AC6F3A77F1A6CF2348606B9DB83C549EC8A36F40484A5D2F4926BDB7126F8DB9683DB055C359DD067413FC14E339BD816231388DB22978A8F14E6B06743035AF7B0B6CC11A5CDEC3AD901E6EFA259DF55F2EE899B290B5618DD1F37FD88DF7342EDEFDEF545D00545F61F7CF0A35F8158B627173897B779448F8C960BF90757DED596489C1E7CB08D182038D6BD4C4AE0FD32E554593BF35F2827C272F1A78869A1C6C8484424FA58AEFB9C7D7CE43A8CE3BA01FEE30CDBE7C6829EB0A15D8260A0666D65CF18B5125B190C9D09FBB51284C81F6F5F7AD5D6D1461BC1DDF5CA96BA298EA2EF29006A89DC946C906534AA33E ct = 77F1421002FB5F7E55237071EF47B7C9C6B73D31EC84F70B764BD86927CFD2FF71CD1708BFFCBBD4C0566737EDD732E3568045F3D803969E6E7CDA16071938BD0AB6AF4FF47F85AAA09A8E14DD85903EAC37D4DCD0501A4F87CE113E0C6B1DFA317B8E3C2835FCB14A33857745FBEFC6F424FB8F56A421C6FE5630F4BB04E4BA9E191F85D639723A56F8DE33B86F6A54A7FBBDEEC32C2E4C887FF67771B7D56654FF1356AF75A79A440A2D83F547E12C21C30E3A783542A522FAC13452EE9E56DA15B4D12AF37FA3D8E4E8571CD66DB26906A5FDFADA7F8732E184BC2B162FF84A4354FBB8E630BDE184E5F3A3B0157E25AC48A41E9141BB98101A03614743445C62879D9A018BC67ED906EE9A15D4775A48F1CD8476AF1B4A217C62B22CA7EF56DB2EC362C33B0CE823B441F9F264028A6F20156D633E95FC03334140DD049491A4B79BE7624B9A7064E4B708F740D83C3D1BE8A65DFC3BE0A5998566A4DB7DD66507C5FBF88C354CB4641D1236C58F5BD5DAEE6FCACA1446F5A6815C7199F16F21AD65FDC601FE8CC872B5AC99C852D62386EA710BC76D9B38AA98EBD8D925993A1DD2C430D6CC2EFF1644DB3A2B679043AA8CD6D1E288B67135BF7ABF6328E0448568E88907ABEF8035799AE1FA402F9ECBB6FE6656E297BC1AB29BAF0AD392B112CC8E0EA98B2D7603A236C52A30FB06D0DCCF5B0C5CAA05F8E36CA0CCB2DA5D9B1205B781C8EDB1A389318306FB7F65F84EBDC491ED985859D5ABD1209065106AA939C25871405AC09BFE58F697200E5E206B4F40416EFB04F1EB843D1190DD19C73510D0B2C4B73CC7F56A6B78EAF98FB2 ss = D7959F1F8758ACA3BBFBA18E933895470C165E604769F7D8 count = 76 seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C pk = F433DF0B41D4F4E9578E012AD60D417CC0DC067DAB40F7AD8BDF592082862549DC4F85A093082C129FE8F3A83A58B3B3916464536BA1E01AA60840B7B38DD7C0296E0C6F7AC310C43D49DC9AEAB6E26D49FF3306C348805B610E840F2A1745A43D87517A22FC52F06798567E927C0FE7C780499746D76E41F145C1AC6DBD38E62D318E8491F85263DBE21890CD1A37BFB8A4E89DADB84E0735FE6983AD7DA293E3B7AF3072FCCC261B5FC55BD827FAB83D1248767689FEA6D6343801F9CB23F0051543E48AE650D44DD3524EA20FFB718CD86B53B21ED179D4EA761A9888C0430D078980EA50295CAFC476557F50F0239FCBC8D13D311FDF94E1DDB01AAC6D3799409E034C44D1012DA641BBBEB84DBFA0C9489D1EF67A82A168DBE3D27D45C7D005B3CB83BD8AB8DEA6008289FE40FE2E8F83DA3424868DF710B1245F0D0394F4ECCBC8DC5E7927BE833D72C899FA1E5A7B233A50B9D88520D74120FAC43C949582BA67957A5140D55A055780EDAD2C27DF55FB84FBDC22056E966A64575CDC54AB3E1009C3B95E18E3340BEB971A9AC5B7840C7E0B680BBEF6E83C7DCC01FE101DB875B7EDAA5685700B5FFDD7BAF63BE474B40EB4C141AABE40F60F0C883B45E247F2C8AF15D8D98B59B17BBB51FA6B06D391F02DD324E3A20EEA78A5FD394EF6F933B678BA11AF591C49E766F53C3CAFDFEC9B42BA4C49492B88F72B7BC0DA28DDE5740F7EA78497D727EA1590A36CF5451D599F269FE46F586151CEAD602F0A357AE4BF5AFCB53C5D768663D4B3C0CAA143 sk = ACD1C0217FAD5CAA4235544DD9DE153AB1880CCF4C76F16F236FAE4E4BFDA04CF03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587AA73EFECFB5A325BE44FE5C5D3C4062BC03F433DF0B41D4F4E9578E012AD60D417CC0DC067DAB40F7AD8BDF592082862549DC4F85A093082C129FE8F3A83A58B3B3916464536BA1E01AA60840B7B38DD7C0296E0C6F7AC310C43D49DC9AEAB6E26D49FF3306C348805B610E840F2A1745A43D87517A22FC52F06798567E927C0FE7C780499746D76E41F145C1AC6DBD38E62D318E8491F85263DBE21890CD1A37BFB8A4E89DADB84E0735FE6983AD7DA293E3B7AF3072FCCC261B5FC55BD827FAB83D1248767689FEA6D6343801F9CB23F0051543E48AE650D44DD3524EA20FFB718CD86B53B21ED179D4EA761A9888C0430D078980EA50295CAFC476557F50F0239FCBC8D13D311FDF94E1DDB01AAC6D3799409E034C44D1012DA641BBBEB84DBFA0C9489D1EF67A82A168DBE3D27D45C7D005B3CB83BD8AB8DEA6008289FE40FE2E8F83DA3424868DF710B1245F0D0394F4ECCBC8DC5E7927BE833D72C899FA1E5A7B233A50B9D88520D74120FAC43C949582BA67957A5140D55A055780EDAD2C27DF55FB84FBDC22056E966A64575CDC54AB3E1009C3B95E18E3340BEB971A9AC5B7840C7E0B680BBEF6E83C7DCC01FE101DB875B7EDAA5685700B5FFDD7BAF63BE474B40EB4C141AABE40F60F0C883B45E247F2C8AF15D8D98B59B17BBB51FA6B06D391F02DD324E3A20EEA78A5FD394EF6F933B678BA11AF591C49E766F53C3CAFDFEC9B42BA4C49492B88F72B7BC0DA28DDE5740F7EA78497D727EA1590A36CF5451D599F269FE46F586151CEAD602F0A357AE4BF5AFCB53C5D768663D4B3C0CAA143 ct = 5808752F48C187A8C86C9FF5F2AA34712C205CEB96B26B86B59FD1A679123D50647EC04986D79A05D39B4B60C418904171049D3246ACCD30E0114B1A76EA2AA3C5C272D6E66CE53E507355CBE59D82708366DF409DE3E38A923E6774E40B811476DE4AEA8C00EC3FE9754406E9E3BE80C4BB2D60889AD1F92F8317B0B034FAEBC39C3C2A1C2065042EFA940932E3C70A893E673A0B17BEF8DF8FF4C3BD5FFB83BBBB69C1DF891EB021A6D1560F7F742A40D87489F285F052AED2343C33AE940CBB2305C05EBE8087093E7E62D400772DDE1AE220FC7908C94E670EF31E302743A48D40B19E914F4373A7EFEFE5EE7730B9394124A3B2BEFBC2A4721C62677454DB6FCF176CBA73D8255704471DA7A0F8EDF506C5463C77EBCD5B042BCCF1FC5AD6DB983B3E523870A0F93FA65B56746082867EDFCBEDEEFCB3014F34D19814D72D1C8A26B4FEEAEAB984296588EAFD496541B9FE47D3E4FEA5A87105438B2B7FA64E20D56127CB69F3435AC19AD91355F68663D29D152B22F1E6B2118DE832E9CDA7A3E60D8F335ED5B319219EA520173C4F5BAE45BF066C7FE09F263ED4DC6E5193B44ACE38B160D4649F6DF64030B440DF0D19D017ABB4AD0A3E8DDAB9309DDC22915771D5E05988D3133899C1180A628BD5ABAC59354DE460576559AB2AE0B0CD185F40779D7A2D7F8A500E9CF75FCF85E00E9E827C844FEE18CACA9C19971BF4CA056BF0DFE01823FB6B25022CCCADF09E80F017968A34A17DA217A3C7B48A123D88776F205B4FCB7A65875DD37037C86D6FEC74ACF5F747B02DD1714B828BF5F7B7D73B170E7B90FFB20DC4ABB03CB99AB1 ss = 953AF773291A7DC43F827BFF3A4B0FE97204EA323E669BE5 count = 77 seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A pk = 09DC4F77D6AADC81DD76BD97805AC1F21958A88C405C776A7393B70BC4DCB212B6B9074B2679154E259D539B4A1D06DCB5205B98986CEDB30A92C72D5F8F8380919F522D2458958EB8274E450013F146C350B3CBAC6AC6849EB7AE876E5EAF6AD0D671C81F77228F76A0C5AE1B750B900754ADF9A51282CB366DDB1683F7238C50BFF34808E23DCEA866FC4EAA940BCDEEEC65096BF7BBEA1FA61DBE782600AE8DFD2D5E218ACB63A7363F83C216738AC84AA7D07EA8CA1F10A6955A2553610A52536CB021B58D876BF86831ECCC9A00E45B2F143FEC7459F4C3C1B65F9E5BBC16176860039C1A4C1528EA11EABFAC3375DAAEF79A776F2DB394D93779F1301A81FA0CD1FEEF282603C5C4AEE2619EBBEAD7B919805DF8452B25BDE2A23EDD72D0C7BE91103FD4F47BACF7EDCB979D6DC244DB061E1BD1918AA7BC57E74D4C6E31371AC78D81C382D37DF8EE4A7C8B346654D08D1595814F6E8F52059B859CCAFB0016ADF83B4CD1723776855B5723FCB2B06D43DB4F8747D46572314F71FA24B901065F7697E506A1794DC6F33C5D2D3A8B0FC8C5A60E12B24CFC0871D7CC942E9DA944976A48567541326561BEE0D6D82834A3ED44EF2DEB67FA7EA759FBD084901920AEF3C8044829AFDF738768ACDAEC50B97E54D4B0326EFF15A3C831D38A687EC7454293255209090FF969C482AE77B12C0C3330CB59A4EF455839A0FC8072FF6DF4A899F361D07E65E024DC2B7A66CC5800240140FA5500D7DFA516BC551EE23B63EF7168E3936A6047A1242D18002816 sk = 241191401A63AFA750F05662E354DDDBC683C776CE3222BEB83E3CF913D7ED7CA59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E15D85112C0C2683DE1DFA7719ED7F49880209DC4F77D6AADC81DD76BD97805AC1F21958A88C405C776A7393B70BC4DCB212B6B9074B2679154E259D539B4A1D06DCB5205B98986CEDB30A92C72D5F8F8380919F522D2458958EB8274E450013F146C350B3CBAC6AC6849EB7AE876E5EAF6AD0D671C81F77228F76A0C5AE1B750B900754ADF9A51282CB366DDB1683F7238C50BFF34808E23DCEA866FC4EAA940BCDEEEC65096BF7BBEA1FA61DBE782600AE8DFD2D5E218ACB63A7363F83C216738AC84AA7D07EA8CA1F10A6955A2553610A52536CB021B58D876BF86831ECCC9A00E45B2F143FEC7459F4C3C1B65F9E5BBC16176860039C1A4C1528EA11EABFAC3375DAAEF79A776F2DB394D93779F1301A81FA0CD1FEEF282603C5C4AEE2619EBBEAD7B919805DF8452B25BDE2A23EDD72D0C7BE91103FD4F47BACF7EDCB979D6DC244DB061E1BD1918AA7BC57E74D4C6E31371AC78D81C382D37DF8EE4A7C8B346654D08D1595814F6E8F52059B859CCAFB0016ADF83B4CD1723776855B5723FCB2B06D43DB4F8747D46572314F71FA24B901065F7697E506A1794DC6F33C5D2D3A8B0FC8C5A60E12B24CFC0871D7CC942E9DA944976A48567541326561BEE0D6D82834A3ED44EF2DEB67FA7EA759FBD084901920AEF3C8044829AFDF738768ACDAEC50B97E54D4B0326EFF15A3C831D38A687EC7454293255209090FF969C482AE77B12C0C3330CB59A4EF455839A0FC8072FF6DF4A899F361D07E65E024DC2B7A66CC5800240140FA5500D7DFA516BC551EE23B63EF7168E3936A6047A1242D18002816 ct = 4631BE48B574078486287D9FFD4A544C15EE195B5252F36E991B9A591BAECE800DFC6D2D5BBD53CBA2080C451C7B223AB87FB822DBB319C6E0CD9E77A69362AA9155AF153E0D9BA211D4F9598667CC1CAF29C1C4A239732B62F072892A5072B76CC4F3E4100ECE3ED4BB45ECB40C0990F29BDA3017AF87515D1279693E7DEA2CB1FBBE752D2877E00D62FABB2B6B81792D23FF141E64BD7D6414A4629484C88CA17668337A7F56FB17D577BA1D4F0D992FA11905F10BD01D92C3DC261A99AF443C305B991966FA5266F8CA60AA8A2160D7DC10D984F12003405E7CFE4EDE4A54AD20BE8DD3D530D15DBDEE547CD30EE6C91B2AD7EAC95C7AA567FBC4CED8FC0279C4C70EFF66FCDCC15F9A5742DC9718AE6F2AE61BC808EE991D9B202D8C0928D348E952C6F86455AA0655454C5DF992031F14C866B4669C6B93F00E8E87C1AEF764BB240E4604F8B697761D74261B6DA2A95032FA5AD3E3A9451EB4C575703F3303E828EF2F92EE85A1E0B87D1A0245944252FF12BD805C61E837CD610A5271C61ED0C7D701E2835B1B9FCCDF8745E2B5F2603E9B26A3835A80583D36993E97E19499F6723F089D56B5CB3D3611CA0C43087318439B108FB83E41BABB9DC89D556A5B8C7B27E491BAB41B0292BA7E794BE3F8F62C19A6CF9FD721BF42B3B3830342F1D34C16D5D8382B1C6E7252701E84D09A7EAE663919589B48F968FA49391AD0D4ADB149188A7F998AAF34C6DDB428389BCF81741BCE625BAAEA27AF96F6107A36A370FF36F33FFC9F51B1BA0A0B23ABF340ED26A303F4453C3CCDCD06BCF69649681608E5A5A332CA303ACD613C0F8E5843 ss = 952598320654D07CB5A636DED3EF33BBD8FB29D9B198CDC3 count = 78 seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 pk = DCCDEF8BB0433150CB54D7965861044E22B4F1CE3AA72AE1BB33170A286774B4D93EAE234B6C94C79DEEDC0DD2986982B34A78C28A9CFC5B51E115D156A26779E1CD65CA3214D135AFEAEDA3BE9FD94DE8CE3C16034E1CB940B5C795A1574407195D6E54A9727EA252E4B7F5698AFA1298FD735D4CD80496F8EA278230E6E56D8ADEEFF889CF395178BA7CB3DEB9C4186E965AEDC68B822BDDD8EFD135EA46A65237585AC188589C45FC9AC0CB541E4879F14A06C5B1E58C112684045276C38A5CC119071762F4217BD6AC83A0ACFDF0EF3FFE809EB30BEFD44F036EA821133C8103387316C2FFFF04AA4980A7186D3C10E269670629222611B2655B14AE75B11825A9A08CD08DA89151DF9479E503F5E606A0D00629CF51A156C6ACE51ED1C27E2612755C47A9C393869DBD4B7C3C49A33567254DC6C8D01C050CF2E525B828EA991586570AD07752E71F87ED4881472CBD9AC9A32266A787EF615885795450EE67CDF42BCEFFEFCF34CA801A05A3876B134F676F2C716B0173279EB503089ADA76828328F9068F67618A0B5BA2CAB6196CDDD3D63763713B1AD80621C43043F08E4A5329B2C4C91D392AC11D97DA8EFC79A01170FBF2846D73107B924D78C056DD0389273D397C11D926ADAA40036EA459300A9D12E8251480F1253219A93E0FC12634A3548B48C8297E3A92384D67746C8B679446D3ECCE6B9749CBEE1188ED12A51C56AA68B0D25FDBA0B4DA9C1D4DA9F2FED79A7A5DEABA74BB5ADCF07C687730597C628C18A489A708F9C3AFE7AACBE46B sk = B9A6B0C05677E957D41A34BA03BD06F2A9092E31F63389397D7E70FDE6409D18E99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8969B6E72DE77006189ADF35F4EBE05AB703DCCDEF8BB0433150CB54D7965861044E22B4F1CE3AA72AE1BB33170A286774B4D93EAE234B6C94C79DEEDC0DD2986982B34A78C28A9CFC5B51E115D156A26779E1CD65CA3214D135AFEAEDA3BE9FD94DE8CE3C16034E1CB940B5C795A1574407195D6E54A9727EA252E4B7F5698AFA1298FD735D4CD80496F8EA278230E6E56D8ADEEFF889CF395178BA7CB3DEB9C4186E965AEDC68B822BDDD8EFD135EA46A65237585AC188589C45FC9AC0CB541E4879F14A06C5B1E58C112684045276C38A5CC119071762F4217BD6AC83A0ACFDF0EF3FFE809EB30BEFD44F036EA821133C8103387316C2FFFF04AA4980A7186D3C10E269670629222611B2655B14AE75B11825A9A08CD08DA89151DF9479E503F5E606A0D00629CF51A156C6ACE51ED1C27E2612755C47A9C393869DBD4B7C3C49A33567254DC6C8D01C050CF2E525B828EA991586570AD07752E71F87ED4881472CBD9AC9A32266A787EF615885795450EE67CDF42BCEFFEFCF34CA801A05A3876B134F676F2C716B0173279EB503089ADA76828328F9068F67618A0B5BA2CAB6196CDDD3D63763713B1AD80621C43043F08E4A5329B2C4C91D392AC11D97DA8EFC79A01170FBF2846D73107B924D78C056DD0389273D397C11D926ADAA40036EA459300A9D12E8251480F1253219A93E0FC12634A3548B48C8297E3A92384D67746C8B679446D3ECCE6B9749CBEE1188ED12A51C56AA68B0D25FDBA0B4DA9C1D4DA9F2FED79A7A5DEABA74BB5ADCF07C687730597C628C18A489A708F9C3AFE7AACBE46B ct = DF648211D2E9C4A41D9FE2C6ECAC41BF0D08516B86FD0D09F113B6007D2436BDA47BA871942BDCB95463CB17C6AC211E273911BD39E54AE2DCD22D08F300D6FAA0940EF416103E6FE2029D685C1FB7D0EB9AE837BC840F8FDE21177FCF3DAC80513B543F93EC971614EB5F32F0875237F6EB72589479239C644D2CFD2AE8B825F8E4BA86FD208107B8A8C3502559D752AE6695277C664356C057E7CABC2C854171420B59D709DFBC257D1CE6E5C87DD3F4B587F7E77B9E13E5B0CE1210B44A610A1A268A0C42B4B026CEE77BCFB1AF4D19A2B8736A50B30104C0A57E013AEE6F7ECFA8416EDE3BD18A13EE54CC25606E5B555E7631AE747E87331FBFBCF07302D5B8F6D4260C4FE5973791DA3C519AFDAC6F1256CBF95D47850059AAE05D1E6C6A1199B930CBB94BB6884818418143CED039A8F323D2B9F87876962E419623FD04091E4B4B72D7FACB842FF696D12588F851C52832A5813AAC2B32AE63735D0E8DD88F12858FEE0DADAE8EC6AF8EC7FDE0634D47AA67266176B2BF66587F0CAA24BA5A1D8B2520CE4CC9B056AD1884F3F71739A7FE20791C9FC4868CD1D20B031B35BE81A4DDD03385F24E1E00ADA52ED969CC236FEC4036C4E224B39D9DEC3A7D34BD9097B2BF9E8FE667E1F9A662E6AE5ED50969034068A3FB3D966B3F563B90E50D307DC867ECFA18F93E408EDBA774C69C5C478CEF9A007720D333443AF124D392BF80FB8C5015B3C98756E4994CF7FFD77C6C4F18043DD260406339EDF4F1273007DCEFE7D2905BDD599579B3D0BB3F0312D4A796626BFEBF8F0F7574476A54BD0BB93C3FAE4CD884417BE6AE70CA06E6CD ss = E482A8A18D776FD3A6F2122BDB741512F2FDC5193514B6B2 count = 79 seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 pk = 7074456915418B1165D320CEA4801E0F4DA3F7D547473442045676C9EDD2A7AD1AA6FF029A957C93CCF49858B5ABEEA911557213F05C7C7D253C005E9657CF7C41CD6070E68F39FAABCB99077425AC750DACB1FC301EB91858055F04442E8A1C0FAD1A157ECA7D29F68C23720600433752EEECB33527BFFDE2203ADF196171CB4E9BB68DF91C4D7C87740A031FBE84B0C3C2F0B5CBB5ACFC4D9104DF1B58274A48D341B1495EF4CF54CC5B89F1AEC65DFBFD30B2E6B87DC9F1118562C63C76251C488305970308C814D8DFD3C4AEEAA3A84968DC66F32DF3ED54291E3C6BB0BAA199EC170DC6FE3B66AD6A81AB73D49A056DE3044F24B0081BC187571A7E031C41BD34B3940B920B06222368C79624C24F031F75E04607CB64022FBBF82112ADBFA7D91356F5DE0A37BCDB069F78197CF9BCEDB5C47A8B9851A90FDEF436E7FE6F7F7EF71FA693A24FF6EB84BCF3983D3AACDDD9ED8EB8621384C9D0CB4AF58F56A231CA1B70968958CCA9691AB8FB7944FD7BFF77888D632E7BDFD7177535F9B5CBCD02C95E858D0C6359A2F851125869152DE38B081E02025F74B581B8281436D1D98DC08DF4CF7C8AACD18B4076AAE576216CD47443B812B1013B8581E254CD892B6ECBF3CA14FF992BD8453B31847351E266890539C309CB95859F4C8A434375C8B10B721D6038D525B08AEF592426EBED410BB9F2FBE5D6E22F0687B2CC93C9423FDBAAA019B5437ABDAD2335BC34FCD769C79C479813A6023B2DF5891FDDAF720B684C0D3D97ED65D224A15C83D8E32841 sk = 28A96C71577BA00C94F99FE965BC595A26DB2B3CA6AB5CF8E443CDD8462B17929C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F4A503F3E68011F266F54BBD60DB0F99BD027074456915418B1165D320CEA4801E0F4DA3F7D547473442045676C9EDD2A7AD1AA6FF029A957C93CCF49858B5ABEEA911557213F05C7C7D253C005E9657CF7C41CD6070E68F39FAABCB99077425AC750DACB1FC301EB91858055F04442E8A1C0FAD1A157ECA7D29F68C23720600433752EEECB33527BFFDE2203ADF196171CB4E9BB68DF91C4D7C87740A031FBE84B0C3C2F0B5CBB5ACFC4D9104DF1B58274A48D341B1495EF4CF54CC5B89F1AEC65DFBFD30B2E6B87DC9F1118562C63C76251C488305970308C814D8DFD3C4AEEAA3A84968DC66F32DF3ED54291E3C6BB0BAA199EC170DC6FE3B66AD6A81AB73D49A056DE3044F24B0081BC187571A7E031C41BD34B3940B920B06222368C79624C24F031F75E04607CB64022FBBF82112ADBFA7D91356F5DE0A37BCDB069F78197CF9BCEDB5C47A8B9851A90FDEF436E7FE6F7F7EF71FA693A24FF6EB84BCF3983D3AACDDD9ED8EB8621384C9D0CB4AF58F56A231CA1B70968958CCA9691AB8FB7944FD7BFF77888D632E7BDFD7177535F9B5CBCD02C95E858D0C6359A2F851125869152DE38B081E02025F74B581B8281436D1D98DC08DF4CF7C8AACD18B4076AAE576216CD47443B812B1013B8581E254CD892B6ECBF3CA14FF992BD8453B31847351E266890539C309CB95859F4C8A434375C8B10B721D6038D525B08AEF592426EBED410BB9F2FBE5D6E22F0687B2CC93C9423FDBAAA019B5437ABDAD2335BC34FCD769C79C479813A6023B2DF5891FDDAF720B684C0D3D97ED65D224A15C83D8E32841 ct = B7146227D186AC3FD4300BEE059E659A205829DDF79558D6BBA2E95F2E354CF19CEDE8D22DD2ABA2F7D5FD0BC6793FD7584CC875C625591589C6482EB4BC87675BEE9EBE074ADB6777D765DEBE2C2D7417204EDFED8E93A0933687A0C91F186D8A85F58113A0887F104838EB763EC9F27E6401118485D2A6D31AF31B68A77A6D61DEA5B6EE88A384E757BC1D7E4EF9A2442975554203BC2FE25A4B319741244BBB494EEEA4E34D57776C11A44957BA6F850C9913B22C0686704A073CC6ED2F6FC0C0CD5B5BD8628A8AEB2C931EC700513A767FC6712096F9112FE7D1B36B2EFC9C5EBDAC4EDFA94DF4BBE03BF59B8DE19EC5BC3D643A7D1092E57F2A03AA4792A16A6C90355BD1139A4C87F760E1604CD347BE894C088D182B42F1A4BDF85DEF3123314146A7C3936C0CDF3889A25621ED5E68BFC286B7AC1CE1070871A272092D500FD9C5B25140D73F08FDC06BEBB2F979C016D63F14E3CB7836923BB3E5B36F71E286D5EEFF138ECFCD1214471772E0A0975F26FDC00605404466D4A153E66D974293E1BB14BCBCE7670F1989C7777E6D8E78397F9943538754B9C9188C747A57E18ACBDD9439E1DC6569E11FBC42E6F1FA0992F783D0075F712BC831BE117B71F1D6D6C3B60FD9337552A5FC818DCE1F6D921E6DEECEE23C05F49A62FAE69C3E7CC91039F8D6D3800D7291725197DD7E389E765B6E439A0CC6D0EDA611F15A093986EF7169530EC67D97C93920C006534014281A8801006FA08DCACF927AC3C512D0B1206B8925BB0020C4E3E4CAE43A696A52C0D0327E2846FA1778587551E58CA1E9DC65B3579DCB43B5C2AF0B3957FD2E ss = 0487EEB2E7C2D8D596BC0727EE2F7DA6C8974017353C72B6 count = 80 seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E pk = 0CE72692B54C6081CBDC85E06F12FCD5B36F43E014F50D1C4408C68534DD6232705AADC7DCD75569593F2E3AF01EF99A3530F6445BBF4DCB4353A29B2C43476F26B6921529C4D3459742DF66F91F44676B1DBD9DF9E544101C05B073DD37351D81B46B02CBD0F0D38422C484A67AAEAF93C9995089FFE2D4F2BE5CCB26F8A1EBF09ED13647B8F6F9E58F5D82055CA4A05BBA5443981E2E47ADA70D35891DC1DB56416C8C989C59645E58952B04938843368DF94E413B171A9B15136E51B6A83E81362634309485264A7C726AF5DAD0BDF98627D1FDDF842E6230623ABF066527A7C44435B117E18CD628DC82709135B5380456FCC2D0A7D0DDB1C93A524A39425668B04E754E8E6CE3DDEE6772ADB78FDB496F2D7AEAF4CC7F6636FCA138A495E60AC375DCE5BAF6F38969118DCF300FD6D497B32A652DC0B8EA24AB3F29D892AADF488A4F47FABCDA67712049AA84BF03F67E89A70A46C8685E82F6F934CE4C3B9BE83B586F2A27E1756116E7B74FF8941F47C7CDC5196F6892D899CF5672AA2B7E720F1974048DE09850CAC540302C04DA9F4B9C6E24036C0FCCC03B1C876406C349B9EA949D151B3E4F61A2709B0D6360CFA11D5F82B6E7F8028DAA40A8D63013E0356CF77CEB7A54AFFAB8DD0B359281A6C71450647298D9AFCAF1F23D2BFE34217CA23C1DAFABE2FAB99B18D7C5CF9B84C8F36E97468CE5510B93F759F6878EF9D5CBA25D4A7970079ADBBE95EFA4629663398A1D4A18B21CB8B64FE11CDBB0B59A255865336C45463BA3B3A6840484D913 sk = C08BA2EF8C3A0A043AFAD931652D7A19E6E8CB670F840DE5F1FA03309B2CA9EC5FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D71DF174E708D6185784938F57441688A68010CE72692B54C6081CBDC85E06F12FCD5B36F43E014F50D1C4408C68534DD6232705AADC7DCD75569593F2E3AF01EF99A3530F6445BBF4DCB4353A29B2C43476F26B6921529C4D3459742DF66F91F44676B1DBD9DF9E544101C05B073DD37351D81B46B02CBD0F0D38422C484A67AAEAF93C9995089FFE2D4F2BE5CCB26F8A1EBF09ED13647B8F6F9E58F5D82055CA4A05BBA5443981E2E47ADA70D35891DC1DB56416C8C989C59645E58952B04938843368DF94E413B171A9B15136E51B6A83E81362634309485264A7C726AF5DAD0BDF98627D1FDDF842E6230623ABF066527A7C44435B117E18CD628DC82709135B5380456FCC2D0A7D0DDB1C93A524A39425668B04E754E8E6CE3DDEE6772ADB78FDB496F2D7AEAF4CC7F6636FCA138A495E60AC375DCE5BAF6F38969118DCF300FD6D497B32A652DC0B8EA24AB3F29D892AADF488A4F47FABCDA67712049AA84BF03F67E89A70A46C8685E82F6F934CE4C3B9BE83B586F2A27E1756116E7B74FF8941F47C7CDC5196F6892D899CF5672AA2B7E720F1974048DE09850CAC540302C04DA9F4B9C6E24036C0FCCC03B1C876406C349B9EA949D151B3E4F61A2709B0D6360CFA11D5F82B6E7F8028DAA40A8D63013E0356CF77CEB7A54AFFAB8DD0B359281A6C71450647298D9AFCAF1F23D2BFE34217CA23C1DAFABE2FAB99B18D7C5CF9B84C8F36E97468CE5510B93F759F6878EF9D5CBA25D4A7970079ADBBE95EFA4629663398A1D4A18B21CB8B64FE11CDBB0B59A255865336C45463BA3B3A6840484D913 ct = B5CD7AC8195C05FA25E1C81350C8F80F17910E08E9080C16044692F21EF9757EA0C807982224E473D4C625511D7BBCBB5024A5B0B8477E4C62740F2B6F55FCEC513493BD310D8ECEB20EE92EEDB05C088F695F03DF50B8FA4898117F6D0EBCEC7F4A7941449782E84FF16AD4829B82DBDCE43E2F8E70499DE72456796DD99FE8480C8273A4849BA4E50C263B98C4E40B0A16C8748F1C9511157B993014C69790E5B49AC1BDD71BEDE2BF61AB031374B4AA9C560E4891C351ADDC914C98FF48FB06FDF1DAD91C99A0DDE83BE0245699DE2A7358F8D2FBB6EA99C2809889048F601BE1742A3C203A2AC237012DA54199DA0F9D5D58B2C7AB18C86F19611DEFBE6FAF8509D2E5114C1C286BB67A3BC07507CF73295A2CFAA25C4E184C7516345205D19A01EDA2044C56813431E0E7B285DEDDF3E8F80E370759E887AF63F2F59349D86CCDD4B3B756C533BBD08859E2F463E3B53B7B937E227F0E182B48445F3EA3B9E221595753E0A29912018F670483DE6788D11BAD41B353F665ECAA108AEE7D483057A175F76AA39FA4AE46F6312A1E6911A2C759B07E1C152FBDA90BE682FE78C67F45F476B7A1E078E2BD855E4425296E0C5D9DD83A42E98B1CC106D400488E62B9269210167702E657BA238006F06B305C9B6B1A7BE5E4C8750568B62E6D22836DC605D8D3E7923DE840EF1CC6EF0C43249282E92F0EC72126EA693DAEDABBFCEA25E02C4331B269D3B939EC18679B98BD1C0652997FF9A2E8E571CFC953771362AB125AE7636AD740307A20AF0103AB1C5AE9FF73E63584603E0272BA3DD47D2ACF3F484CD3F5ED81DFED5B50BB086004F5 ss = 7CFC30F488B1685A412EA126605E6B575E6F2916B63E08BA count = 81 seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D pk = B66014B654480E7A04977E243244C9F50A75F4DAB121FA4C4F58076CBB87EA65AAB5E9061C07660E09E186338330F700E9C7245862AD0FDD31238B1758B1641CE0ABD7BA99C9B6E43F7C0E361DD28147361AD9855424DE015909AF708406FBD9C8BCFEE44F1CB79E77D4AFCF4236B4A1AC93D157D5D3BD5DF0B7D625C2672C2C48D585E50E1BCDF741050EC6E3133C6D1F2B6C3B8B5CA74F6F78BC1AD091909D60232B3ECE1729020299EF31BE9363F61FFE8E3AB9467D4C31C44D5C8C43A033C49FE2B337C93E54D8A0C5FE7F97EAA8D92F69C4DA6811AA600A27823ADD67193D19E11322A60E090505AC13841FCAF9412240CF3CDB795D27690AA2A07E95071E69DF3EE33BA8320E6171309D3596E2814A9E280181D513B907D98D7CFE52E704069621B0D0A47A7D5BAB1DB21470729EF3F73C57D83EBC3305652672F3A0FBE41252D4E88BED4890696CB5314D2BB6CB725723D20DE2012FDD7C22F9DF5C9A714B13EBD6DC295B39301BB8639B5EC79765C9A7E389A423F6E4F9CFF558A170FECE4117300301ABA2A9336C0AFE823D1AA9C785CE1CCFC27CD9DA00B3D4151FAD8D7A4326FDF3F0E138760819681B4E1E13F89C857D389233FD84CF5BDFE43F2F167FE011C86A52F926EFC3D80AD6E75B312FF58B33B869162899A5E8DD8A8427C7E27BF41754E619347B07C2FB5512A8A7A60D0082CD66CA1A9414B93CAEA192B9672F18B44527597841B3654E6C4EF1289F9338BBDFF5EB63CF9FFE4349C610A4A676FFAFE4E5450492EE9C31802C0D6E0B09 sk = 0E3B30E102D707538C2671060F603BB0B8A014103F132D63B09ECE07E4A4C75B11EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E4CE709B0A4180D920F87F7286402996002B66014B654480E7A04977E243244C9F50A75F4DAB121FA4C4F58076CBB87EA65AAB5E9061C07660E09E186338330F700E9C7245862AD0FDD31238B1758B1641CE0ABD7BA99C9B6E43F7C0E361DD28147361AD9855424DE015909AF708406FBD9C8BCFEE44F1CB79E77D4AFCF4236B4A1AC93D157D5D3BD5DF0B7D625C2672C2C48D585E50E1BCDF741050EC6E3133C6D1F2B6C3B8B5CA74F6F78BC1AD091909D60232B3ECE1729020299EF31BE9363F61FFE8E3AB9467D4C31C44D5C8C43A033C49FE2B337C93E54D8A0C5FE7F97EAA8D92F69C4DA6811AA600A27823ADD67193D19E11322A60E090505AC13841FCAF9412240CF3CDB795D27690AA2A07E95071E69DF3EE33BA8320E6171309D3596E2814A9E280181D513B907D98D7CFE52E704069621B0D0A47A7D5BAB1DB21470729EF3F73C57D83EBC3305652672F3A0FBE41252D4E88BED4890696CB5314D2BB6CB725723D20DE2012FDD7C22F9DF5C9A714B13EBD6DC295B39301BB8639B5EC79765C9A7E389A423F6E4F9CFF558A170FECE4117300301ABA2A9336C0AFE823D1AA9C785CE1CCFC27CD9DA00B3D4151FAD8D7A4326FDF3F0E138760819681B4E1E13F89C857D389233FD84CF5BDFE43F2F167FE011C86A52F926EFC3D80AD6E75B312FF58B33B869162899A5E8DD8A8427C7E27BF41754E619347B07C2FB5512A8A7A60D0082CD66CA1A9414B93CAEA192B9672F18B44527597841B3654E6C4EF1289F9338BBDFF5EB63CF9FFE4349C610A4A676FFAFE4E5450492EE9C31802C0D6E0B09 ct = E3B283B96BA70DFEC577032B7BDB964ACE5E98BCF43EA378837B0156F0A1E725161A427CD3B7B0B4370B556E48491F91E0E03E5C59128B10B009874633D4DCA8A4E0C817790434F21ECF97FCB3A04BF5D8FDD8D2EED17DBBF0A69EAB912782731D63EB3C6AAC9B06CE0015856C5995CD66899DA3CD18F7C2FFC04AACE0C1A34B33A91D6FCE94153074D65F49822B7147A67BBEA0167AF6A5889183E0EB7B0DE09338CE0C16620995EB9DFE86C435AA3B5A5C788C29A31944206EAA3A14254723FC79F6080D010084A6F19DB50C78391DD9A6280E38242B3280D8B1C7309A8DD8F10E203A7AD008D50824A8D2C20D66AC12587C135D5DBE4FE1A1A0ABF28755FF64EE996D6AEF66BF6D7EF5FC00FA79AF8D0AA59EA24AEC4BE33553F9BA9E976D2A72B90622C2AA2A4567B6F3D9F2ED707E7A914D1442195030828EBAAC647476919D8BA5BE060CEC0B575ED2A03CD07A3784D15318016D9EDB3B07346710B7100B8BE155DA9B7E6A3659021B4844029536952E6B9E7F4418E0D03920DCEBA35838CA5DBC29E8CF09C1B8AE8C11E46DED66A4E816C94C6462FF2929FC83B35F79257C02566008CE806786B636D6FF64156F949D454FFE41BC00D58E9433F2EE32B19A4569A8F9538FECCDB9DD51A9B28306EC22EB63421B3DA471ED8B626F7EE780E188BCF6E3097F51D08711DC9885F3B9E68AD4FF3330D04E7A297A4BA707D1BBBEFC9E76E868FA1324C1B3BA2496429EBDD01BFFEA48314C168F42909F7B2350D652D5E386864F6377483A472F97A4D613F26917C9AE80282A8F2BADC2E5C9408446D94BABA9E036E3D71BDEAE06C0D44E275A ss = B562AAC505E9695F0F7C1425256839CF515E5264CF68310C count = 82 seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE pk = D1057E40C63278B6C18CC6C959BCEB738A0D0BD4FD4327E70D911C8E41A6066D7B8EC0BCBFF8C01584A53D2878B74FB73179BD7283451066EB26BF67E8F24F3C010385B15551ADD727E66E8ED9D6900C6007BEA40EE77107E8D761286B21699C233F644A15439DD97ECBFD293FA0BE9C601F6D235CB9F6E6DC56CA86D9FBD037FAC0218694494189B63C7047190EC656E2275159AFC969D1BA478BBE77DFF449BE8BA80B2B49722A00BE3CBB22ECE7D00313A46393575CFFD21B6D6CE535635E18DA4D1604E7AD3296F5B1873FEB20A9C8A12BABBA7CF88F76E90AB3C08931DD2FCA3B013CE634B96D203D710AD877640F33FE699164AE7CF1957D648DD19931E50993C22202AF13CB33C4CF1B792C8E70E53A661457680D6C3CFCD11416BFF656E793513F864984376B20C0633D057C7D556C735D7152F26EAB3810F8880F808D3AE701E688B3B8EB065DA733433EF5855ED05ACE03B67E9C82B4DECC3DB05F561CE6713604B696CBD5D84F2999891BF3EFD185D515964F6DA5748952EABCF15ED408703308FC25A8854A801B161C383FDA2C841E4CBE9241A9A4DDD9465275F07A71B983BA7350450CB8139A9517A04EA0C49BE99939E00308DC36A05698E19F3B066F99EB790AAE5BA7ABC395576AF2DE1F937D56F2B5FBB331293EFE684EDFC3D0B11C3EC688E4DEF096ACC1BFA3BD576FE20CC6D2C30205734D2AB53C314B2BBED63A3EFC1D043016F4A82F6E23AA44A05BD399A29981DC3CEFA68C4B105A4C07C3A85D4E4AEB1BB2891F13298336C97E42 sk = 2478F7D3DE6041E7E5CD11C5E2EF483D1AA6218EB126444091535F6AE532FA7311136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E28952F0AEFE4CEA4E32A3BC47C86D24C01D1057E40C63278B6C18CC6C959BCEB738A0D0BD4FD4327E70D911C8E41A6066D7B8EC0BCBFF8C01584A53D2878B74FB73179BD7283451066EB26BF67E8F24F3C010385B15551ADD727E66E8ED9D6900C6007BEA40EE77107E8D761286B21699C233F644A15439DD97ECBFD293FA0BE9C601F6D235CB9F6E6DC56CA86D9FBD037FAC0218694494189B63C7047190EC656E2275159AFC969D1BA478BBE77DFF449BE8BA80B2B49722A00BE3CBB22ECE7D00313A46393575CFFD21B6D6CE535635E18DA4D1604E7AD3296F5B1873FEB20A9C8A12BABBA7CF88F76E90AB3C08931DD2FCA3B013CE634B96D203D710AD877640F33FE699164AE7CF1957D648DD19931E50993C22202AF13CB33C4CF1B792C8E70E53A661457680D6C3CFCD11416BFF656E793513F864984376B20C0633D057C7D556C735D7152F26EAB3810F8880F808D3AE701E688B3B8EB065DA733433EF5855ED05ACE03B67E9C82B4DECC3DB05F561CE6713604B696CBD5D84F2999891BF3EFD185D515964F6DA5748952EABCF15ED408703308FC25A8854A801B161C383FDA2C841E4CBE9241A9A4DDD9465275F07A71B983BA7350450CB8139A9517A04EA0C49BE99939E00308DC36A05698E19F3B066F99EB790AAE5BA7ABC395576AF2DE1F937D56F2B5FBB331293EFE684EDFC3D0B11C3EC688E4DEF096ACC1BFA3BD576FE20CC6D2C30205734D2AB53C314B2BBED63A3EFC1D043016F4A82F6E23AA44A05BD399A29981DC3CEFA68C4B105A4C07C3A85D4E4AEB1BB2891F13298336C97E42 ct = 9B6761E60085053646A3621966892FF8899381CF3C04C5ACA778F9495B1B47E668D38B631D2B0ACBB772C391CC62788CF1323C4F4A1914579D6F2CD0ED4B446A92E20A4F0AFCF59F48ECB0FBDD92B200098786B7B56FABE98EF5D746E12BEEAC662823C92A10ED9FFB44A8780AEA48F5B7416E48514628D4DB9783ABEC4F5AC830AA99E838089CE3135EF73C034599042CD60075E4A2D8B77C574FB4AD0488E0C3980F08C6D5F567D3D75875C7E2374BC10E826C92EFF5259134F367947184B95EBB617B56CC1D212E08EC66A3875C1477D647DD4FD91733673DEAAD791F0272C06B4E5B4D423E5C7EC644D24ABFB2C41F3B05E40C005549556B6DBA573EE153AE2DB2A47FE10EE978349C7D266B738E311CB05DEF015D928126AA61F0FD1BEA08D1D4DFC15DF426C977642E59552CEE3DEC6B3638A857545958151FD0BD1E657455BD5102429EB48E67D9585069A5C9BCA2E39D2124958144B57AE931F0A510AA6D42DE71C2D899110E454F2189A3071B5AF4D2E67A77261D9217641687BCCB4FD7A119E393DFE403E87583BD882C302BE1255F551B3EAFDDFDC301AD053A970CE517031C126351E76D422F221D0C8CA42AABCE5070346F118CB4C938765EA69B10738273236C6782F1899904138D1F73935EE22F162F71D723C0214CFFCF9935FB8B69DBC11B88AC9C4D36A389187C25212B9A3429EF81876CA9B1D7C6D89D66195E6E8F076DA8E244B1BC4CA49A21DA921F5734EDD048D534481C10539A87FD1C2087A400BB7CED7D283605EF8E682B0B7253A5349D72E8D46F11DD76240123634EE172590E3802B9346B2D01947D315C3C12 ss = E8BC2C4C65380F8A98C8534B7F1FC84B9F82EAD41A3DF1C9 count = 83 seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F pk = D0C2061595C4702C21B5B4E7C51F1AC6E562FD8C504CFB4E49D6D4FAE76B7004C889E96D6805E5882FF5013F258F374102BC1ED32CA1E0EF4891BBF11A26320E65544AB63CC41A26B44B9332C36312684FE6E05E0ACDA587F085ED63DE40C4EE45EC878878A86877FB37BF97B78337BD8A6FA20AAA500F4B60D554805F8EF1FEFA5E5FEE67BE33306B724A774EBB2537292EE11B490DAD3765C5A63FC4159F97947FC1A9099CF4A21271572A48732078239AB8D5F9F5CA70BD802D3CE3B8224D88C58B788AF19BF80EEE0A2F7DD9414E33C4C720BD29C7A873A6C6194EA365925EA2566C7F273A32C4535FDEE08EEFE35E301F38AD16AE48AFB204B381080EA37D7C9B0667ACDB9B8DB8DB9AC437C08E56D1E66579DF273C2511FBDC329B366AEC80A00C09D71D3FB8F42F32467F6F9E6D6539D4CEC4AA0113FD3CA08901837AF0F93B6354B891EE259C79B082BB5EDE3988CA87F388155C92A0720AB56A5CE69D2150BA163FD0707E3988970B019DC5484C914FC65E525C3280CDE4CF25F8C48EB6354715FBEBEC7292AEF9108D628E5E0D51E6ED411FD4671CE2E2B5D4F46C5D79D264DBC37DD168B91A26212817945632BC469088AF3BA351B21D9044580C70E3E354055128667090E022D3898EEDF17573308C57BEF80B615050B93AC4C0CF5942F4761BA9C362322E4CE9D21EFAFD52B2416F6E16C66FE2CDE7CC4932929F9A261967038E9A7303633EF926ABC3C51835E56E9B9EBC4D666187FA927A34F04D18F0F0740444B3CB2E71F36F3D857600F81E sk = 9D405D3EBDAF35FA8722DE431B669722ACAAEA2FD10B814310B17F78B66147D16CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE32F1EEF33ECE28D20086A1FD00DD3EB903D0C2061595C4702C21B5B4E7C51F1AC6E562FD8C504CFB4E49D6D4FAE76B7004C889E96D6805E5882FF5013F258F374102BC1ED32CA1E0EF4891BBF11A26320E65544AB63CC41A26B44B9332C36312684FE6E05E0ACDA587F085ED63DE40C4EE45EC878878A86877FB37BF97B78337BD8A6FA20AAA500F4B60D554805F8EF1FEFA5E5FEE67BE33306B724A774EBB2537292EE11B490DAD3765C5A63FC4159F97947FC1A9099CF4A21271572A48732078239AB8D5F9F5CA70BD802D3CE3B8224D88C58B788AF19BF80EEE0A2F7DD9414E33C4C720BD29C7A873A6C6194EA365925EA2566C7F273A32C4535FDEE08EEFE35E301F38AD16AE48AFB204B381080EA37D7C9B0667ACDB9B8DB8DB9AC437C08E56D1E66579DF273C2511FBDC329B366AEC80A00C09D71D3FB8F42F32467F6F9E6D6539D4CEC4AA0113FD3CA08901837AF0F93B6354B891EE259C79B082BB5EDE3988CA87F388155C92A0720AB56A5CE69D2150BA163FD0707E3988970B019DC5484C914FC65E525C3280CDE4CF25F8C48EB6354715FBEBEC7292AEF9108D628E5E0D51E6ED411FD4671CE2E2B5D4F46C5D79D264DBC37DD168B91A26212817945632BC469088AF3BA351B21D9044580C70E3E354055128667090E022D3898EEDF17573308C57BEF80B615050B93AC4C0CF5942F4761BA9C362322E4CE9D21EFAFD52B2416F6E16C66FE2CDE7CC4932929F9A261967038E9A7303633EF926ABC3C51835E56E9B9EBC4D666187FA927A34F04D18F0F0740444B3CB2E71F36F3D857600F81E ct = 2BD495AD8E524B67F79735E546FF599D9EE9873CFA45D6022F32F626C8948A9489541FC690E27F13214D7BC85C985169EF7946FCD96582F4B5B7D15958448A23520F4A3C8397F6291D5E2C4BABD306D1FCF7A183BA5277EE4B5ACD174E1E73CA97E149BA3CD8B6726495A7BA4529F61D221D730ABDEE22B6639ECE473D4DAA0ACCFEE1E55CEE80AC453C6A4A27B9D8C7A58C1E02A8A3CE7ABD1D01EAF359012BBAA6C2F137A416BD2D9E36031AF68151F13F3D26D876FA7F88B3AD39B184C9C7D5479D78A5568C8AFB322A8EF68B0BD98F337706546967CB83E08785CAA88AC285267C54D63B4BA32CCE21C939B535F6D87ADA3C0529C11CDA7CADA7004168F82B5202EDB457C82A4B254A68723B69289CF14D183A3AFE7B9E01A382270CD6EACF129982022AC02A7847CC420EE0C8A8C89886C3BAB516D04C355E76791AA9C1E03E719931F73D40CFCDBD46AAED0BECF28A61BBB27431E031E40E2CC6131ECA2573C850F3C3A9ACC90361A530F2949121842A34267151300C54639D59B394A528189B8EA8D84024AD73B39643B5AEED24C456A7AB802F7EEA3B9493343E3E773AE532C52A91128CD537CCB2425619857FA2AD95485F079B8AE6A7A0C7312B727AD31CD03A627F996294AC1DB2AE7CE1DBBC681D7326C3FC77E0222931AB24AFA8721D5373A38D8D845A08B763B4FC2DB63510D58E5EC5D80B1D76A461395731888F61FBD91E1B83C1640AF97B8D4FE815871C30542F617951ACA0D85759EA3F00095F08422497D5A58AA1A22CD20A8DD14D7C01A7AA3AA64C66FD77252E808D2C9E0701BD61862143B5CC524AB1A32B5CA6AFD5 ss = DE342D6B8DC3354B83B0E64D5FC0990E4F50CB34B4E6507A count = 84 seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 pk = D4D369C42FF45DBBCAADAF666EE31F6D074DFCF7C313FA54EACAF6951AD7985AF71A06650FF3A1AF99EDA097AB9DB299CB9C332B9FC799FE7321E5E260310F43BF2093060BFB7FD7EB8CEE26E84AAABE29E31DBA26FD135B560A576B976B9DA82C873B92DAF79C46208BAA8AAA1409F508B6A05255E1B19506254AAC85120629B7DB32ADA9D182269348E5102F3A6A45AAB94449EDBA11E60B1E848036F4DFBD38869D86AFC9CC66208D356F38A7EDB095B7F5FFDD2BEAA82EBBE04582FD60D298C766F5698ACA98443C27E37018211A9B3A71A356421C98475B8965D94DB04C8B7A56048FE03414FCC05D5FDA9601358294878C2D5FA728307BA8AE9668B356A6F3603CF4C23C8993911F156A8123B31D24F5E4FCEE5DF92D42EFED654130DA5907B223F2501830447A814FC347601381EE2B6D3781DE9AA8222237EFEC00E188869FE9E10A8C1E00CBD454115ACEFEF3BFA46147B36FCE6B0F135279E58B2266E027C452FE3A2E16098445E590AE22FDEB769773F7CF5C9B33DCDAC0F905C41880A83451ACDBED5F3A05A3A8FF125DD9BD84A8B1A630743D8B85BD0D04259ACF9D152067DAB8520627BDD5D926D85B0DFAE760F86C509DF5C17453A0AE9A76B003CBAAEB71F2AB385EAC23C0C3CF61EEE4EA4B2E0654B1B2C4D4E47CDC38844100A5EA28063605FC1312911895A5DD581B4566AE7F921F79B33723E9039CA6605F3D422706046B7A7FB957DAC52FE11A3223A1423F81383EEE92641B9D998293D11D32F657F65F838675CB71A7D882EF81F168 sk = 9A86490F0615F3EDF789CB0654066E9EE339CC59F968281F3B89213F83C692EDFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF361117140D780101E59B3D63CCCCA74C0793CB03D4D369C42FF45DBBCAADAF666EE31F6D074DFCF7C313FA54EACAF6951AD7985AF71A06650FF3A1AF99EDA097AB9DB299CB9C332B9FC799FE7321E5E260310F43BF2093060BFB7FD7EB8CEE26E84AAABE29E31DBA26FD135B560A576B976B9DA82C873B92DAF79C46208BAA8AAA1409F508B6A05255E1B19506254AAC85120629B7DB32ADA9D182269348E5102F3A6A45AAB94449EDBA11E60B1E848036F4DFBD38869D86AFC9CC66208D356F38A7EDB095B7F5FFDD2BEAA82EBBE04582FD60D298C766F5698ACA98443C27E37018211A9B3A71A356421C98475B8965D94DB04C8B7A56048FE03414FCC05D5FDA9601358294878C2D5FA728307BA8AE9668B356A6F3603CF4C23C8993911F156A8123B31D24F5E4FCEE5DF92D42EFED654130DA5907B223F2501830447A814FC347601381EE2B6D3781DE9AA8222237EFEC00E188869FE9E10A8C1E00CBD454115ACEFEF3BFA46147B36FCE6B0F135279E58B2266E027C452FE3A2E16098445E590AE22FDEB769773F7CF5C9B33DCDAC0F905C41880A83451ACDBED5F3A05A3A8FF125DD9BD84A8B1A630743D8B85BD0D04259ACF9D152067DAB8520627BDD5D926D85B0DFAE760F86C509DF5C17453A0AE9A76B003CBAAEB71F2AB385EAC23C0C3CF61EEE4EA4B2E0654B1B2C4D4E47CDC38844100A5EA28063605FC1312911895A5DD581B4566AE7F921F79B33723E9039CA6605F3D422706046B7A7FB957DAC52FE11A3223A1423F81383EEE92641B9D998293D11D32F657F65F838675CB71A7D882EF81F168 ct = B1C3243A6C12E5AAEFEEC4AD2E9BFABB476FA5D3DDBD297AD5F17F9D5CC3F6DA7F43726FDBB9A6BEC260038BAE5F0BAB89D34E8E40BB061A1B521D24A6E94AE6BF5FDFB19781B6080F9B5D9BFFACF215D7598E8FB9B9C61BAD43DCF69A397938956487F7AA0A4958AFDC64B378F1C1EAA80D34CFE3B7D2AB84618EDDE05E814AB27BD26A0865C739D772DA67AD47A424C69F16321327B99EF1FF254953EB84CFD81A02C889040C258E6CAA2FCD3EA8B22BB52DDEC97F83BBC5B6244D5469DF902E7E9B17510E9CF1BA78BB37F003CA8C894D2C22EC970EBF07AF7A87DBA4EA218BC1263DB256AC0E30C7CFC7B4E0F533206FCDC87AAC69CC6FE5D85064B21F2887AB778EAD49362B1C0AFA34286D6959CFAD036C2F6D3278655FA6A738C8C1E448B239C203ACE800F20088D7166FA355D8EF2E1BAC3677676ED85956ED33222305EC8E8E01BFC179AD95D212FFE6F0BC45CADE3E8747DC5A85EE834F984386B9CA5225F2A4D61B3FA7F9EEE63283FF5A1A71A888B4044050A4FDF760AAE4EEF42D4DE846348D7E692D04747578B40CF4F0A40414C919E802DE62E8CC5DC15B9744F91C2C5440336AE73296038304B40793617B4A6795BAA2466419D796EC7A312F1A5175450A3334F07EBCACC381AFB32E837EB2101871256EECB9513ADEC14180997856BF16A3004788DFB4911D97C256B5973B0D0D4EAB6662F3329B44CFE2D15F2AF1A3855038CFE995B28957ACC2F27433578D9766A676E4BD3D004313074B1F8228EFF4E87DF95522B28D90F3B54DAB7A2D4F5807F615EC4FC0833B1C9A79B3539616DEF99ECAAAB0E73E9F071D248ABF4A ss = 35AE89D157BD8CF5E1F8B18DAE5E7955B84D6AC23A816973 count = 85 seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 pk = 6F9C41FCB3A0E1AEBA96EE2811A88BF1804D3354E2FABB1D94174C888D6AD7E26803C9B0F94FA0EF48EAC529FA7E9159EDC74DCFB82DE896BF08A41153D1CFF064FB73168D8A59042FA4559C78B5770784C88E5EA18265F43BF8939BB450FCCB98849CE6314FF88723D7EB6C8EE26EC829FA236E4CFFFB9ADD671647C8F431FCF4B39C49E4D6CF86B238F53BAC1039A86537DE5ADCFF22D59B54DEC77898B19DAE21DA7B154DFE75D1FF789F550066036498992E9F07D8FA59FE093E50696CA2BA3E8C97B19ED82283868646A83E8DC81DA9B6F2EED9D794C58805D1BA2302DA8FAF69459FD325AAD6861C3C76D975936459C3E963B2FE4D644B5B7A492ADE60AE2D57E9FADB4E5CEF3BE801D1419BB6FD5158C36F39D78AFB2E6EDCCC410B37A3EB5D691DB732484965F59BAF48B94001E61B9FFFFB80DA804C2DF3CEFA9D78EFD26E5CF177CCDF45407FE17F850879F89377C125990B58736F4601E0E8E7617C3A38853BF1F7945D6E641A44B5364F1B57D46C4E9BAA496E3C03012013674B7A123F94EEC7C136375DE614EA98F1B4F43541E95BAFA9A34C5FB6808A4857605EE1FBB452FBF065BD882BE64EEF6F206F61D8214C7B9718EB92456EF3FE2645E815DB91E71C22D975440CE0A0BC402AC30E487B2243044734A9635D4BE0CF689CC817BAC3C62BE50E86FA20E9434700571888A2CD10B6D010BE4567736D02523D9BD8BFC5F1220F22E68301D95AACCF3D92C1158760993224ACE54604DCF0B799282BE4D8F5F3556610D1ADABBA90AE6C7B8261 sk = 6DFD9B575872560C7BDC2732C4A28DAC4DB04E535EB8E402C3DFFD145C09CE47A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E5BEE66291AE5E226AE015D9579E3DFC8006F9C41FCB3A0E1AEBA96EE2811A88BF1804D3354E2FABB1D94174C888D6AD7E26803C9B0F94FA0EF48EAC529FA7E9159EDC74DCFB82DE896BF08A41153D1CFF064FB73168D8A59042FA4559C78B5770784C88E5EA18265F43BF8939BB450FCCB98849CE6314FF88723D7EB6C8EE26EC829FA236E4CFFFB9ADD671647C8F431FCF4B39C49E4D6CF86B238F53BAC1039A86537DE5ADCFF22D59B54DEC77898B19DAE21DA7B154DFE75D1FF789F550066036498992E9F07D8FA59FE093E50696CA2BA3E8C97B19ED82283868646A83E8DC81DA9B6F2EED9D794C58805D1BA2302DA8FAF69459FD325AAD6861C3C76D975936459C3E963B2FE4D644B5B7A492ADE60AE2D57E9FADB4E5CEF3BE801D1419BB6FD5158C36F39D78AFB2E6EDCCC410B37A3EB5D691DB732484965F59BAF48B94001E61B9FFFFB80DA804C2DF3CEFA9D78EFD26E5CF177CCDF45407FE17F850879F89377C125990B58736F4601E0E8E7617C3A38853BF1F7945D6E641A44B5364F1B57D46C4E9BAA496E3C03012013674B7A123F94EEC7C136375DE614EA98F1B4F43541E95BAFA9A34C5FB6808A4857605EE1FBB452FBF065BD882BE64EEF6F206F61D8214C7B9718EB92456EF3FE2645E815DB91E71C22D975440CE0A0BC402AC30E487B2243044734A9635D4BE0CF689CC817BAC3C62BE50E86FA20E9434700571888A2CD10B6D010BE4567736D02523D9BD8BFC5F1220F22E68301D95AACCF3D92C1158760993224ACE54604DCF0B799282BE4D8F5F3556610D1ADABBA90AE6C7B8261 ct = CC87A1063E781199C02F0F5066E28C99CD5E97303BE6A06123241EC68F75B32FA75545528AB6141AB0C3FF78E354C31F3B9B603BC877B929CAE50A54993AB9DCE5D3E1BF164C899F1D9AE57287113C5D68A8904B1D08A457A3A323BAC4495AFDE5EE0B5C1F6FE75CA8DC5A75A7200CE088186D4588D4BEF23DD74F3C375A54AD8B9CF8198A645196DD747BB3EDE4C99A880D6D23619927F15D1EF9485AC5FE03B6838C80F3C2BB09E4DA6274B411CA16961AB3984521581D22130019FD39A403F3C3F63F53D316409F57372A1BE4B935F44AA0E11235AF46FF9CB9E62144360988D4D2245A34E3B77F112A377A56D3D73E93AC5CFC5E3F35E3B3ADAD002C5A564DA9F7C0EF9EF831F61F5389DE3E3D0BE18853C67696F94EBD6DCA547FA9EB37AFA847BDC172010EF589EFEF2EC24E9C5AB9DDFFFDD5C85A75105FC3C50E07DC8199471FC87EE2EF29C2DF85516641976C5050FC665DEA13980B7961661243DBD3B400890372AD120528EE65024A6D78592CF5513E223B6CC635632B3DAE66AEF6DCD6F9496B08B85318AF6E3B8D228DC3CA5AEC7F91106FB60F61D75FBA5BEC0A0B9433091E62481C676F6CB743CDFB1532AB8AC34D4B4579A360A685A21E32598F51EE4556870A8D1DD3D6C067C497B48EB2982D16D377F08A1C46E51F836C4087A65655CCF6ED4109D0AD8E602784813CFFC5E1239102B26E277CFCC554104D5FBF7C57A610FF56C5BA28CA106962BF2B735DA1812C96DE6F6D7F15F79AAC137A28408139FAB1A2B2E1E0EE45F662F61D405AFCB71F61F06906334F24E5B1266FA708AFA0926A31B7970D98716CDE9B20269B ss = B1B8B7E39D35E84CFF6E4FB36FFB3BB2C1DAECE957A2F318 count = 86 seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 pk = 0781CE3142048FC65FB3CF9A0225D26BA57DA3F6D2E55BA36A8B65D81C9AFA2E00EA3AB0D002164DE8DA7AF786F60BA8D761C62D3DF4BA54E7F50D16974D35C5C3F1B22D45449D64A2CA9CB9FC075B8DA2C22880DCBFCF3AEF6091274E626DDE3A4A559A695B0BFA541D2BF9823523FA27582AED3CC6E7E4C5361F14AAF33E35E8E9C85938D198615560D740C975D3A950565116FB502327EF09C769ABCCCBD70CED804791D9E62F4FA6EE1B4A6E5D432BAD93496BB0E6227101516DDB317343116E374EA766DF124B2EF5CCE6A8321A14B932E6DA33C22FC7BFB8B38F5619ED7A54D014B29F6C743CBABE2C715FCB642F71B0D6532EF10CE36CB43D43156625169073C78247739D4154B366E142565610998B7EE0CAEADB9F28249C7B279A569D845316EF91AA794A47931308DC876EA10B5F29CE6ACEA8ED637A4463602C48D13D40B5D8FED501C2BF338CCD4C13AC750993C5D15D408CA9FC0E63AFF4633401EC7BB9C8DE46F10754F142E9AB8B38D1FE588A1F9B315C7149459402E9E10BAD5A1B379195FECF32CF72EAAA5DB93AA81ABDD896355B221622761A027881599F7A67A48CA26C1597691877732C0A281B58DE124E0C52006DDFDE3A090BC3686156521B408DDD7EA7E5352F47A91956537FE1642D0F61B3CCE58538F8AE2C6774F92BC99BE87715B5FEA09FD450F381868E48B4D880F83C1FCE999DC5772692484E26EC0D03545661242599C4F535811D0EDDB6D318F50CAA1FEA925CAC35B8DBAA7B57824EC9A6AF71BA9860D08736B9565D3C sk = 6FCA9F4E384D8418075CC064C70730801BDB8249899D456A77130D5BEEB3662CCE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A01022AD673C62EDD8B7D17F5459C9D1DBD010781CE3142048FC65FB3CF9A0225D26BA57DA3F6D2E55BA36A8B65D81C9AFA2E00EA3AB0D002164DE8DA7AF786F60BA8D761C62D3DF4BA54E7F50D16974D35C5C3F1B22D45449D64A2CA9CB9FC075B8DA2C22880DCBFCF3AEF6091274E626DDE3A4A559A695B0BFA541D2BF9823523FA27582AED3CC6E7E4C5361F14AAF33E35E8E9C85938D198615560D740C975D3A950565116FB502327EF09C769ABCCCBD70CED804791D9E62F4FA6EE1B4A6E5D432BAD93496BB0E6227101516DDB317343116E374EA766DF124B2EF5CCE6A8321A14B932E6DA33C22FC7BFB8B38F5619ED7A54D014B29F6C743CBABE2C715FCB642F71B0D6532EF10CE36CB43D43156625169073C78247739D4154B366E142565610998B7EE0CAEADB9F28249C7B279A569D845316EF91AA794A47931308DC876EA10B5F29CE6ACEA8ED637A4463602C48D13D40B5D8FED501C2BF338CCD4C13AC750993C5D15D408CA9FC0E63AFF4633401EC7BB9C8DE46F10754F142E9AB8B38D1FE588A1F9B315C7149459402E9E10BAD5A1B379195FECF32CF72EAAA5DB93AA81ABDD896355B221622761A027881599F7A67A48CA26C1597691877732C0A281B58DE124E0C52006DDFDE3A090BC3686156521B408DDD7EA7E5352F47A91956537FE1642D0F61B3CCE58538F8AE2C6774F92BC99BE87715B5FEA09FD450F381868E48B4D880F83C1FCE999DC5772692484E26EC0D03545661242599C4F535811D0EDDB6D318F50CAA1FEA925CAC35B8DBAA7B57824EC9A6AF71BA9860D08736B9565D3C ct = B1FC2FA4BF12E86594E4933073994B503BF47E8B5E60D103344EFDDD6F8BF3F8E5870A594AE05ADABF7BE979A0983D0EA38F28524372D29DFC6B63B91DAC9BDAF095742F9CF19E6DBC1F502310A5C8F8E588AABC6F16AA020C35D63F096ADE93D9D73AA43A1058BAD65CF271DCB61AC922163EEC02AB4BADC8807744C7EE8E3F9B0F536F2746EE4CB425C58E9DA33B5E991A7108351B15D0B5B6942B0D316075D6DCFAA9DDB2D47E4F7B1AF74D69B3DFB1F069E653651C7847DA545BCB2AC1BC8337F2033031707E65492D4EE80CC481EA3F071272DDAFD48A8A7357F1D3EB1C00D49E46311F5DA74D645086CC52D4B5CC3042C85457CD3769D9348C84442A73C85CF00A86863361C07F430F4ED322F0FAE1EE7BE8A6F900D225C8B93FE4A90FCEFCEBC214B1D3F79FCA233E26C1C1372A5E0476A51CA4461870899F5F12554D5BB2FF8334F6E19017EF8605C06C0E99C07482D4C9ADC5BF4F6A2049291A59163A47D0E515F68C17DB9E7129EC57B0F32E626C3E7851A3658A55EB1C1F00968B2E5AAB879C142404B652EB5527073A502ADFF9EB0CF5C9EE750F01A27E57949E06241D5499556BFD6BDC7BC255466890FD525BCE3401144394197037392BD40071F40B1E45384C7C6E4DF9877130E5AB061C43FA985D5191E5212993337A06643B9B3FF7672DF4C918D9AC0FFE85DC6DFD2D339FB21BA3ACA3098F48723205589C82FF9BA2C0F22DB1C2EE12E0E400AC6678434D5F30737E78A677C27B9C1CF2E115FE337435FFC9A003216FB9F8E24FB87D830F4309BEB167DCF4C1F7CF29EF4F29C4E6449BF2333FF0CBF0489001382C79B3C0 ss = 1333FD5A66921A197A9E3DE273120E79FEE156EE54E6C7F8 count = 87 seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C pk = 22A2F0DA9357F94373397F34E0FC45A5FEF2D2BFE8943DDD0ADE68773BDBF36A6FF29004802AD6C2C4DFBB9FC62B1FBA69565BA8864A2169CB14635E86AEC5DD3165C54CFC3480FEC30D19D5C893F1EB3BA5D6B8D3481DF17E6CA8EF1B136627E467B6B7B27CBE40C5DB13B8A9225BEC96A55D30E1A63FAC454D1282E4FBF8BCD40F8D8E535C5D0B0D266010DC2F6E8AB897C628BBCE1264CE2364CB563EBFB88696F9DC1F8A7030EA1E4E86A1DF4BE1566AAC4CAF5F714CD47C35583F27CBF12614D9B31DA40DA9B59237F4E26359246CEAADAA5C620A8BA29B52B6BF97B71393949510C701E773CB982F14B59D0039B9C5C013E5EBD01D4D262A0D6B92B994F7D6B048900A2E710338820F2B2FBE0FD6D8A4BE3F73C0731D11FD97A3CED7EA71D3B20384CEE06A648A876470EFDD8F6AAEFCA6AA2135104AA9484FD78A0037D9AB53BFAF34C62F1CD4ACD223474104DC6AB2FB310143CB56166E56AB328F9E87E796701048B58C828B878C53C16622D5D395FC3B1DA33C7FBDE40FD2105234FF9225ABC8BFED2F6F99A9BECE83690A886FAA0B4270AD4C29C0E39A889A60CD57D0A85573AEF0E09F84F093F512B7A19AF938D99F0D5C4A79DFB57D770CB186B2BD3382C2F649D25AB14B6AE83D589708FACF66B8454C8525C4BB4CA29FE4483EA92B68B974A354572CA71A203853B98DEF1C5287EDB8CE9B4796B59C2A68AD61E76236E41128DC874D0E54B0A6DEAC1B99813E618ED7C43618831D19316256589C58875C1F4E601A24B476565524080BE22F0C sk = E58F71BF175C0550A67E00E0F7B3B7FC36BC2707BF0C93044A492626DE36301A7F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D9722814394AA8D7C351EC828975853DB530022A2F0DA9357F94373397F34E0FC45A5FEF2D2BFE8943DDD0ADE68773BDBF36A6FF29004802AD6C2C4DFBB9FC62B1FBA69565BA8864A2169CB14635E86AEC5DD3165C54CFC3480FEC30D19D5C893F1EB3BA5D6B8D3481DF17E6CA8EF1B136627E467B6B7B27CBE40C5DB13B8A9225BEC96A55D30E1A63FAC454D1282E4FBF8BCD40F8D8E535C5D0B0D266010DC2F6E8AB897C628BBCE1264CE2364CB563EBFB88696F9DC1F8A7030EA1E4E86A1DF4BE1566AAC4CAF5F714CD47C35583F27CBF12614D9B31DA40DA9B59237F4E26359246CEAADAA5C620A8BA29B52B6BF97B71393949510C701E773CB982F14B59D0039B9C5C013E5EBD01D4D262A0D6B92B994F7D6B048900A2E710338820F2B2FBE0FD6D8A4BE3F73C0731D11FD97A3CED7EA71D3B20384CEE06A648A876470EFDD8F6AAEFCA6AA2135104AA9484FD78A0037D9AB53BFAF34C62F1CD4ACD223474104DC6AB2FB310143CB56166E56AB328F9E87E796701048B58C828B878C53C16622D5D395FC3B1DA33C7FBDE40FD2105234FF9225ABC8BFED2F6F99A9BECE83690A886FAA0B4270AD4C29C0E39A889A60CD57D0A85573AEF0E09F84F093F512B7A19AF938D99F0D5C4A79DFB57D770CB186B2BD3382C2F649D25AB14B6AE83D589708FACF66B8454C8525C4BB4CA29FE4483EA92B68B974A354572CA71A203853B98DEF1C5287EDB8CE9B4796B59C2A68AD61E76236E41128DC874D0E54B0A6DEAC1B99813E618ED7C43618831D19316256589C58875C1F4E601A24B476565524080BE22F0C ct = 5ED812655258BADDC6A015D9D197D82AC5CB751AA95395A0F10B706F47A2E10E6A60DDE1797510199D327BFAC349219580149670EA078D03E7627FD762123DFA82AB70A043737B4906075925121EB61F97ED19025BA2E3E6BA9AA2A8AF09B32E884476FD1BCB47580A5334AF27DCB8558B11F8AE632033D173BC50CAF32ACF869133B93094E9103722ED043B0C6262FED1D5D30D9A9D5084293E0605E2D4252569530FAD2EF297F21A04FB530C41A0DA340BC8219B2FA545D48701121F0D06CB6B8448C55AB641C7FA6CFFE10635AFE6DAB818F31D6AEB67C5E4400D6F8C8552426DE4F626976CD4D727C4F4345C797DFD1D329BB51B0EC5BA4B0CCA2A364EB10885B7734FD197F07B23C95E3841BEE14FB9AB658EFACC88D521004C5522EEBBB0151EF3A00D05561A9FCF880F81D37A2FEBD5E045499D4496D18B2F86703188E584505F1DF2026D2CAA34F8F759EFF1ABD4D27E2075DFEC9DC3FC3F9A3E7EDC9151200DD381EDCE8044ABAA04870A46CC231F6A32D48E5A8C4D355AB3DC1D1897A97584356A60BC9418C549B0D0FB82244A5AE4A1CE7405E7626DCF03684895F0A8D5D4FD0D0A2343DFBAA21606CDEEEA1B11EA1BBC4C82098EFCDF1824095708A96BF65A49D18D9DB22FCA0B6F56BDEBF3101D9634EE5AED5B1CD134CA6CA0EE743A314B45A22FA183363F07E29FF51832B48ADD6A45985D5041EC5F4BEBD1A4BF23ECAC27BE1A9BD724F722185C2B40A3ADE250B78EFF76677F5AF00FD2D1F3A30C64CB49EAC4CE56862716C174B39AAEAD515457CF8C8A377C8F9E1608E21F5EB3DECDA8D767727BA2DC1BBEAD16403135A7 ss = 75931798926D93A6078121455176C548342F0FDA9BB20063 count = 88 seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 pk = 849E7803495C220128C742E284AD8FE7350B2F44D563D87017ECB43C0D568ADEB0BE5A09F6A84A194AF50F17EF0BC9084357A7A215E601AFB10E148900020D26E66BB35C201A042C2143449047D88489BF4B65F1370BFE5860446F93B364B89CFB13BECCE912813A1F81677B09AA6E4A4152F2639CD9F0D242D29D0F1B0E9CF9E12F869AFBD3C63FB15A778C8E845045A148A8D3DCC26FA07C15CCBCB1A71530DDB7EF11F7CE64B12C3CE570B0A2A906F6310AEA05C3CC602354611E9697046895B961877F20D3D208E2C1ABC272C255D158988DC3B1FEF6E6176CE685E2175A160CB1285E97A6C28FFF0874B47D62A35FC5C0851A1C2E3159AA06D2F4A8B9504D2CA86056A63B3659D383FEE9CAF46D12E769500913A2CA01480D64C3FBA3BF5F428E0FE38CA8E6876683D40748794BAD018FB5831E3212FE597D5115A649E7D75051AAB6AE5782D8EBCFA73CE9EB5BD68AD1647E5500C150D4D4FDAFFAE069010C16ED9C571F583F1E85ADEE0966EF24323A8E7708DD153AEF2D739AB69F8AE58177CBD5E5258E909B612A6B90B81C6C21257B49358348400A19AC027F7B0A0582665A16AA3251A663562EAE25EC950A8E330D5982509EFCCD2BE63C6227B10468980FEE0D0F5E770CB57E797C88FE619D96B0BE3C55064965A47479FD7BF795A30079AAD24650361B4FF58E2B86985A4BFB647CDD7578E32558AC9C2B0D87063169E1C92115E33BEEB31691EC07FD15AA629CBD3FB378141BA2A53030F27A5C518B25D9057FB5CFB02B06978A6A6B891C241D sk = E3FC575ED51513E62ABA655D24CD9C8F1C6C848AAFFA946C49A53AC3EA59E474D82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEAD06ABF589AA1E7C22EB20E04C5ADC4D603849E7803495C220128C742E284AD8FE7350B2F44D563D87017ECB43C0D568ADEB0BE5A09F6A84A194AF50F17EF0BC9084357A7A215E601AFB10E148900020D26E66BB35C201A042C2143449047D88489BF4B65F1370BFE5860446F93B364B89CFB13BECCE912813A1F81677B09AA6E4A4152F2639CD9F0D242D29D0F1B0E9CF9E12F869AFBD3C63FB15A778C8E845045A148A8D3DCC26FA07C15CCBCB1A71530DDB7EF11F7CE64B12C3CE570B0A2A906F6310AEA05C3CC602354611E9697046895B961877F20D3D208E2C1ABC272C255D158988DC3B1FEF6E6176CE685E2175A160CB1285E97A6C28FFF0874B47D62A35FC5C0851A1C2E3159AA06D2F4A8B9504D2CA86056A63B3659D383FEE9CAF46D12E769500913A2CA01480D64C3FBA3BF5F428E0FE38CA8E6876683D40748794BAD018FB5831E3212FE597D5115A649E7D75051AAB6AE5782D8EBCFA73CE9EB5BD68AD1647E5500C150D4D4FDAFFAE069010C16ED9C571F583F1E85ADEE0966EF24323A8E7708DD153AEF2D739AB69F8AE58177CBD5E5258E909B612A6B90B81C6C21257B49358348400A19AC027F7B0A0582665A16AA3251A663562EAE25EC950A8E330D5982509EFCCD2BE63C6227B10468980FEE0D0F5E770CB57E797C88FE619D96B0BE3C55064965A47479FD7BF795A30079AAD24650361B4FF58E2B86985A4BFB647CDD7578E32558AC9C2B0D87063169E1C92115E33BEEB31691EC07FD15AA629CBD3FB378141BA2A53030F27A5C518B25D9057FB5CFB02B06978A6A6B891C241D ct = FDB20E1A9AEC58E4EAE26692092112CF9CDEF24B434B3E64208C2603F9ACFB935060C7E2EDBD806E9182001B7DDC9E252342471F2050B6120A07A77F98762A1FDEDE6F91DA02262E020CDBC62EDDAEDBA15CA426AAAC90FD08350EE88B1033C3C36516516E5D636BD9481D7356AFAD1D82AE9594AEA65EB37853416812DC294F461DCC25235A1407F0E1728955EBCEC2B4D07BE5AE9554FB76EBBEB4403E5A8CB2031F0B21DF2566E55539017955D3B640F6A86EFC0518AC7A72DF41A2DD573DEE5AFDAA102F00E6174712565B80A79222D5AFBCC16FFCBD943735BBFBF5BC1E74EA93B02433BEC1F710E639E89C6A3B0502ACA305ECD57A4F04E960F40724174D7270EF09D15B822A8807A6324484F2283EF8EE61BAB2F4AD0593C35E14D0A99B11D47D16DD5E4772B97204EF2204ECF570F3750B3985CE04D9B5C0958D8A53AFBE85100223756BF89CEFF9F7F9974AF6BCF07E9F5070830F9941C71F68A2579BAE6B486627119F41B82BD91E7F44AC4E274277ECDE4C06E08B4B928C6863A981456921CD2607BCADC36CC788F2DCA3E158B772818306C3BD7D076C092984834C72C12CFA840ECBD072B25C642ADE11FB5FCE8B15F8E9B85D4EECC8B0C4F47D259E3CCD298AF68A8BDB11E8116CC29ECA16D05E0B54D0B4338D4B2F060B1AF2DF21A2C0307748D9AFBF054B560110B4BB664D984224E9EA2E55FC8D7DB77FC748F998E9FF217751FDF8FF0FA7E2BF9D9E56A5141B844FD10ADA0A6CD16ACD279E702F572D79426790F163D0B706C9A53C3437286F05ECB050D652FB56034AE22786E8E8838636623E67AE41DB89369BFF6EDF5A ss = 2BAF6500D216CCEADBC28842E94D2E8F1B057DAF6F452FD1 count = 89 seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 pk = A4021A0B5D93862278437D912EAE64C7C293CDEC20474F8ED8A2E89DC2122D0CB8BC6FD8F6FFFF77184EA343C283B9746A1C57333DB2AF7F148C45210A1DCE3ED982395CA4BF0957478C238A75FB8651933C1A0238C0B2AD6BD9B38FBB4EA9DCA993A6DB89682251CA99956898DBF2F8FC4B2EDFB896D15B134AE5C89A93C4FB5353348B3A4BAB04939C93FAEFC568BB868C810C79CD4E0312F793C43E336087B5A6FA97A90E23AC759DE28C5BA40BD753A37377DAC4D95835F7FC066352983A2661F7976F99AE9D148E5CC50130FC834AE7989ED9098C61EE67096F6A5E6A8F7663223A9C0950E4552A71B7D18A3ACDF7B34009F3DA5382D20A4B0B768D61CC37E55DC1401E1DF5CA502E3307C0A3F7F24E95270280283F0B1F5760942D135F1CDD1F08C25E43A2159F9BD7D0B46718F1FB9DB258E82BA4416247BF60BEF0522F5F43B1A811AE60C96F716EE9C2E3855698EA400433889BB3B94656C08E0B0F20F6403F8D5014D2CC2FF0E75E5F6CD8AE1567CCD3510A208570781F00280EB10BFCC57CDB5531B0F17FE67CB3B0A315C0B0C44EAC59F7326A3DFD351AF5DADD76625E8BF36C5633EC792572021E7AADDA8FDFD9398ACC6EF1EFEE2FC149A4D43969D7DE655C681D1C8301338F53A7F3EE78A051EF487788DB49710B5EEDFBCC2D05E31334EB144A36A2CF434B39E02516516A02BE09610F37BEF8A2668A2F2D9AD3F5572B35464AF201829B02BB42211EB5D469AFCC4EFF6A8D27DAA44FF1906777B4A1FAE1483722793AE12249833DF69B0A44 sk = 470B4943F0FE7FD0D8EC5185ABA0D1DB09D112934E4FB4787E2BBC6B88466E7B8B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A5A4C4CF8794833434B07153F4FCE619D01A4021A0B5D93862278437D912EAE64C7C293CDEC20474F8ED8A2E89DC2122D0CB8BC6FD8F6FFFF77184EA343C283B9746A1C57333DB2AF7F148C45210A1DCE3ED982395CA4BF0957478C238A75FB8651933C1A0238C0B2AD6BD9B38FBB4EA9DCA993A6DB89682251CA99956898DBF2F8FC4B2EDFB896D15B134AE5C89A93C4FB5353348B3A4BAB04939C93FAEFC568BB868C810C79CD4E0312F793C43E336087B5A6FA97A90E23AC759DE28C5BA40BD753A37377DAC4D95835F7FC066352983A2661F7976F99AE9D148E5CC50130FC834AE7989ED9098C61EE67096F6A5E6A8F7663223A9C0950E4552A71B7D18A3ACDF7B34009F3DA5382D20A4B0B768D61CC37E55DC1401E1DF5CA502E3307C0A3F7F24E95270280283F0B1F5760942D135F1CDD1F08C25E43A2159F9BD7D0B46718F1FB9DB258E82BA4416247BF60BEF0522F5F43B1A811AE60C96F716EE9C2E3855698EA400433889BB3B94656C08E0B0F20F6403F8D5014D2CC2FF0E75E5F6CD8AE1567CCD3510A208570781F00280EB10BFCC57CDB5531B0F17FE67CB3B0A315C0B0C44EAC59F7326A3DFD351AF5DADD76625E8BF36C5633EC792572021E7AADDA8FDFD9398ACC6EF1EFEE2FC149A4D43969D7DE655C681D1C8301338F53A7F3EE78A051EF487788DB49710B5EEDFBCC2D05E31334EB144A36A2CF434B39E02516516A02BE09610F37BEF8A2668A2F2D9AD3F5572B35464AF201829B02BB42211EB5D469AFCC4EFF6A8D27DAA44FF1906777B4A1FAE1483722793AE12249833DF69B0A44 ct = 6CE396F4233CD5B3176D8890A8EC911DB48E12A75451816010F85BD40E96906190124A4ADB1031DA9CE72F932227838A569DB992920B0E346D8C92AC493443E425670F9A0064007C192B31824A12B03B321D3C44ABCBD329A5AE1FFD8B4AC38AF62AC269CEBE10DDE56B28C4DD027634EE39DB4F82D89E699BFCB8672AF7F738208689431C3E22AA5449EC3CEE38D49BD4D809DE910D0972FAE135A0BC1E3D5B70B95824981B098E275FD1E9EEB8C60C4D2563673E9BFB257624B50EE54C054905AFA6614BF3A5C92C625F8308349B336CF352923AD1E6378881CF4CB2B67CC7E6D0CC73E281F3C0F6D04E4681BF9647455F0FE0CEDEE427F0CB873DE908EE0D95A6970256744384D4DCF2F9A76A8B563FE47FB5EDACCA24255380920B01C114C3F051C4FC0B16EEAC99EE72B5C60426093C4AAD54B0C049A3C77AED5B38C2B17F4A268A847B574255C5B5D229D87B9924FA2BCE0D851FC5C238D890FF3C05A0246EE748777A4C5FB49DE4BB1E5583824E3D18FA87BFA210DC28C0F8033A6711B5900F175CFF7F9A8B5EFD43B430670E749FAF0C3C0172274309686ECBF3CC70E748AA8E97B38B6FC6401A0A77007B731CEB43BF80D0BCA0EFB450D7BF41E4CDFAA40B8058AD8ECEF983B786DB39260C4931E9927B5534DFF970C3517EBFD7B2F383D70832EBED1E519B5B572E8D069D6080185D69A7768E9C577819E1CE4F46A1F9515A5AE102CDB97618F5497CF047DA5CA915B409BC63A4D24EBC92BCDF7C4B24D449237A025B8EA1E3EFEB144A38FBA64D45E71F8E5087C9BC920DDCBD77E47D9262B89B6740A7E463C16BA436D32B8B0A52 ss = B209893563C3F7461EA1D541367EB5592C42A6372846C50D count = 90 seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A pk = 9F16EE51D2A511AAB706C75BDFFF378AFBC17AF2E8D00E91A062B53F4FBF64CAF1E5C44224DCA7C57CC5D34E87BB3834767EF39F33D548D8D309A11560D67F2F0A9D0F476B070B7519C838B4D87B285180DA85548F14759CDDACE28330586504E12E919BEBB2B0DA3CFFE9666FCC3562163C0A78722C5501BC2EE693C1E649DB0293A55780AA8055B9CA3EC000612294A907A0C2C1A7C3FABF8BF0295ED8F67F0AC920E55E1B93B4CE4183C5A5D1E163A18F3CF86E65875DC1B9A425A58DDF235189C7A4164E699D3EC5313403CDDDC91A34E20321F46B8DFBD7004CFA5E1EBC703E2721E4ED170B6BE7C1BD152A2F9FD90827AB4E025A0692C8D5A17DD9C270974008FC919E42BCCE65331F39D8DC9CC62501F8CDC064B45C52EB88AC6A950610D885AED5D287732FB402502183BF349568486CBE41431E7E9E760B1AF18EC44459617B5CBB5E590C9B4F156CF019DB538A919CCA6FC24B2B380BCABA616F333FA548A42C7EE2202C452023FCB88054B4757A80FA69E80BBF925A02E40F8F508CE4A70F0C794516BE1B7DA9C20E72282D46947E6D7A35300B6EE7746E0C7D54822DBA3BE2153192EF8352172A1C5EA0EFFD48E5A4DD2D715167EAE71D53A00C4F46CA7527C7C92BFCEB281F0DC93EFD31CF49E28F27F95DC720E3192F2DFBFF37C068DA57F2B30C9D067C7486595E9CC93DBFD8794CA7B3DAC8A931AC047B817619EEB010C2F2F35EF05AB69500E8D64B3D79ACAE3FA5E03045E52BF41CAF6041C46FFBDD859DDF806A50EA430797BF8D4B4F4D sk = 6DF4385DB978D27B27D2AA5E452E4152B36F097503D9581AC3390105C5727E7DC95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45EDC5EBE6C48C21012C2B18C5AA931733DB019F16EE51D2A511AAB706C75BDFFF378AFBC17AF2E8D00E91A062B53F4FBF64CAF1E5C44224DCA7C57CC5D34E87BB3834767EF39F33D548D8D309A11560D67F2F0A9D0F476B070B7519C838B4D87B285180DA85548F14759CDDACE28330586504E12E919BEBB2B0DA3CFFE9666FCC3562163C0A78722C5501BC2EE693C1E649DB0293A55780AA8055B9CA3EC000612294A907A0C2C1A7C3FABF8BF0295ED8F67F0AC920E55E1B93B4CE4183C5A5D1E163A18F3CF86E65875DC1B9A425A58DDF235189C7A4164E699D3EC5313403CDDDC91A34E20321F46B8DFBD7004CFA5E1EBC703E2721E4ED170B6BE7C1BD152A2F9FD90827AB4E025A0692C8D5A17DD9C270974008FC919E42BCCE65331F39D8DC9CC62501F8CDC064B45C52EB88AC6A950610D885AED5D287732FB402502183BF349568486CBE41431E7E9E760B1AF18EC44459617B5CBB5E590C9B4F156CF019DB538A919CCA6FC24B2B380BCABA616F333FA548A42C7EE2202C452023FCB88054B4757A80FA69E80BBF925A02E40F8F508CE4A70F0C794516BE1B7DA9C20E72282D46947E6D7A35300B6EE7746E0C7D54822DBA3BE2153192EF8352172A1C5EA0EFFD48E5A4DD2D715167EAE71D53A00C4F46CA7527C7C92BFCEB281F0DC93EFD31CF49E28F27F95DC720E3192F2DFBFF37C068DA57F2B30C9D067C7486595E9CC93DBFD8794CA7B3DAC8A931AC047B817619EEB010C2F2F35EF05AB69500E8D64B3D79ACAE3FA5E03045E52BF41CAF6041C46FFBDD859DDF806A50EA430797BF8D4B4F4D ct = 6992291A260A92D80E600E17739F6E67DAF2EC59F958A9B5BA3C042805031464E496D8559E159F5502905A0156C259A9DCE65879C79B9267CF30DB44A693CEE9671C7E09A62494854909EFEDE4AAFCC40B2DB18248DEC8A49A2A198D5830C031656A74ED985C46AE459FDA7230FEB28B13FE8BBD53876A68FD4BB48B7AB5C920568EFF899FD968FC989EB5232173F1B6B56DAD00FD02194C2185421BAD4D37D6938C3CCF8ABA83AD2515181509FB2FD41B81291194AF6B8B51A3B015EC8797D3BFD7617DBB67FE828B8189EB1272678A9F037320657B297DE1FEBDAA2B74D637E4ECAE1ABBA41335CF06AA14DE8F37255DFBC10C0F544AB58A809BC9A03117E6BC2DBF3803F611AAD48513B7E4C7A1C65C606D19D9610AECE90CE18CD1463B0F5C4054C34CA0445AC07DCCC9A8E80BE39F9E942A20F315C10AC83618DA291FD9326A36E3B81878B6DD0E70593185896CF503FB9FA0C34913A5D5AF93718048270C94BBF20F1A4FB442B3914BCFB92968D1964C31C1FE3F5D1A4761E9D2C6A272D0C0626E6F4371511E187D103B0B55B2090F7354DE0AFE77F620FB48AE8F9590088FFF84A8D82AD5AEBEB80E1F118A3ADC910D255E593A80B2DEDEF650D3FA0F7E5E7C2F158B5433A5EA0D8762025F3DB475492C4E507BEFA4411DD660994B7858E13AAF1EFBBA127CE82058A861A6B9B2FFFB30BFF94290162F6ED40B07A93CAB08BAD48B00D7A3CCCE84B4D92940AE795A94A37FCFE8038960A1B399F3B23AF4424F20506112F1DB50EE3A961214F4BF521C0DFFB00ECB198EA5A11567EED4FA12015C0D458D23F370D1B734401588219566DB ss = 91E42475D6EDE424783731EB18394490ED90EF39C8BCC8BC count = 91 seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 pk = B245794E693AF68E8DFAFEC79D8B00950ABA42C3B6289B78AB37CEE0B5682BFBB438D969D4A01821102B9A9854593E984D15D76E5DDA0D406AE7D4767A7FAE4E3394348EC0B7F24DF740A8FF64EE67089F46DF96AAA3326D24D220634D61D984A5D732C976C8AC723D3D011B1B877910BC68CACA316F3C56A32F2276AE935C0E87671E9C53851C9C067A2D44585D384E073C4C407943439E758866FE35710F36530434E661645434241F786AF84B32AA098241CEB0A39DFF0CB247484F181159B8A967FCFD209E2BAB2E1D37ACA6F44F2A76512E715A5B5A6073F2AA8A453A74AE494C7301532A2AD863B896B3D8755366F9763884F02E19CFBB242E2383B3CC4A810E7B7C8BB33C3819FFFF072D5D5A265C91177BA0B85F950631A5DB0B263AB7179FD8D30F8364FEC1068B3EE26C89AB1FAFC06A1313E58EC623B388A1DD8A2D4B1511F338AE2312480E9032C44DA5F81CEAE016A76A2C93B3DA7C9214C670A0C1A0940723CA2C9E0C7BD6B53E1856126E5C5187DF7C103D3DE52135751AD42AF5DD0C93BF7FCCEA53C74394284D1E00384683DF201A69805E71BFA3572F526FA801CE92506E3179C1DF18126AF235CC31636DD7936806F69F5F5B5BE31DBB6BED11BB30A1C32652936A0E6A9382F34B3ED3747A0738358E98AF3ADA131A2D9267700F4F5436A782B12A1954F1D8A03B603D86C1D2C7F2146691C9AD218A70185A5B9189FF754E25369A2BADC43EA3B06970259D43A84F377323EF2D63E7EC910951D8BAAFFDD5511A7BE3BABD6A300492F867 sk = DBACBA825728444921B227CDBA54446B3F6881B47BE9CD02832F78B023B1BEE0E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8DDED341361D7317C5D77217C8122A4AB402B245794E693AF68E8DFAFEC79D8B00950ABA42C3B6289B78AB37CEE0B5682BFBB438D969D4A01821102B9A9854593E984D15D76E5DDA0D406AE7D4767A7FAE4E3394348EC0B7F24DF740A8FF64EE67089F46DF96AAA3326D24D220634D61D984A5D732C976C8AC723D3D011B1B877910BC68CACA316F3C56A32F2276AE935C0E87671E9C53851C9C067A2D44585D384E073C4C407943439E758866FE35710F36530434E661645434241F786AF84B32AA098241CEB0A39DFF0CB247484F181159B8A967FCFD209E2BAB2E1D37ACA6F44F2A76512E715A5B5A6073F2AA8A453A74AE494C7301532A2AD863B896B3D8755366F9763884F02E19CFBB242E2383B3CC4A810E7B7C8BB33C3819FFFF072D5D5A265C91177BA0B85F950631A5DB0B263AB7179FD8D30F8364FEC1068B3EE26C89AB1FAFC06A1313E58EC623B388A1DD8A2D4B1511F338AE2312480E9032C44DA5F81CEAE016A76A2C93B3DA7C9214C670A0C1A0940723CA2C9E0C7BD6B53E1856126E5C5187DF7C103D3DE52135751AD42AF5DD0C93BF7FCCEA53C74394284D1E00384683DF201A69805E71BFA3572F526FA801CE92506E3179C1DF18126AF235CC31636DD7936806F69F5F5B5BE31DBB6BED11BB30A1C32652936A0E6A9382F34B3ED3747A0738358E98AF3ADA131A2D9267700F4F5436A782B12A1954F1D8A03B603D86C1D2C7F2146691C9AD218A70185A5B9189FF754E25369A2BADC43EA3B06970259D43A84F377323EF2D63E7EC910951D8BAAFFDD5511A7BE3BABD6A300492F867 ct = F2E3F4FBC8D3091CE5B47665C9A58AA76C09C28C48A6C18F5722ED031606E6A10E8DBE5AF9581A4311B6A7ED04EA69A5165C7F1F6F841A5A5B351BD0E4D6AB1B1E7979CB60A35A059632ECD1B4F97061E7DD5CFB39E71FBED9C4DE14300292405BD1FB13D69E58C15FCCDA2A3C65B33F725BE08C021DD2857D3CCA0DE7042936D59BAE235D40A884AC74015C80CB072F03A0C9BE60333C6948490D08174F52FE6D955814FC82FDFF185A8E98BAF6C6F3F7FFC51713D823FF7F0DBF129207351C6DAFD007BD41E7327BFE3E8986644B90D6F6FE1471073C00E75D7165EBF0E7977EAC819BA0A0CAC161CEAD1FF9F265043203CF21EC52FBD16C2DA57F0D5DC59407672C6594AC2FF0417A6456D28520C4D8EB23BB33AC7FF4093EC4B4488ACBBEFA455C79C5C28BA7010F9054A5B54D57B8E5075471A8553620F6AC7A9A994D8881DD3FD04190E8B8DDD9E86F2F79D3CD0AB63BA05F365F4B83CB9A0B01B357C410BB8F61662C9910C815E0A1EC5037E8C18C530E582BA45FF1475B893E59EA45D85DBADAD7A068B4DA55626ADE9EC823FE101CCAF34474460DC48BD57F3848CB13DF108290452CB85B817320CDCBECAC14C0A9BE3AEDD5D633C0EFA5948FA6409EAE1B82136B659B494425A670543B0AF0697725652DFDE37DD7D6BA57CA9AC11066EB217E124D1F781D709F5B93D0384AD22F651696EF083A0CE18391AC00395416366AB8C8C86F4AA6428189775413364CED6CA056B9D42662D3829611E2523B6E5B9D5045AFB028E6F6EC97DD194CD6231F577211687B9EDF9CEE5C410247474C89DD2023993B55C1E202D5C261001519AE1E ss = 362BEE387B12AF4771EB7CB33A47325725FF1AAB2FDDB44A count = 92 seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 pk = DD23CB40EF5261C76DBC99383DE08E586F6E27FBA48CDBEB492FB4C917BFDC3CCA91184CCBBDCE967BB886AD2D5FF420EF3BFB9ED1191D0B882646B8A18BFB0BBDF1420B8884BE70B1BCA7EB9868ECF6470763CD52DBA024DE2D287C534AD8C5636E3B867CACFFA792EEBB740E0E9051030B2B140F8D8FAD7A0704485982AC84EB5F53EB78E038FB3C15093F58A1905BA83AD2264BBFEBF6107CA410BFE995334A23C95EC170F6EA7500C8548717497E8A6778936CC09401460028619FB07A05C40E2682B4C776AA9D0ED6C965A55CE166F12A7939FBED46B36C674EF95E896056DFE271F624B3D6AEB6D2A7057764F12449AF33F79E25463A9D9878DA1A8C376B47330172BF0865EDA745392B21628254E7A5507114257B196145699256C63EC6F71E4D40B822E1691C508F6ADD49986A0874C24C4B2A231145067CDDDBDF03D335DF39893EEEA8B918A100C6EB096DCCC1F5D21CAED986DF6C6086036D0D922A2DCF7969472666550FC6C40AEFF5A2F873C113A2FD620977C2D01E083D9260D193AD4EF3600D3DA2BFFCA6F4897DB64BD55BEBD2E76F348AAD6852BE3A79B55E4FC39DAFF2757DE0CB45C1FBA05C2DF40A269412C232DED51798B9E3E63D775188B9E7614D23A85100093DB0558A473C7BD14E6F00F093BFCDF3CFB8FD5A456B981E7876CE35FE644826C1F71D6B9FE0E702210A98DCD39ABA0A178BBCB73D2BB94B55529235DAA10498795C30111774FDA6D158DB6EDC2C597DC4BC6EB500052F42B2ED19CEFDC048039A1472733EAFF16E60 sk = 690EB71FD7052B906EAEC09937A8ED374E0B02AFA27C2F14399932BE5839FAD281C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423288F6A9E55D6AA936CAA943911DE027B9803DD23CB40EF5261C76DBC99383DE08E586F6E27FBA48CDBEB492FB4C917BFDC3CCA91184CCBBDCE967BB886AD2D5FF420EF3BFB9ED1191D0B882646B8A18BFB0BBDF1420B8884BE70B1BCA7EB9868ECF6470763CD52DBA024DE2D287C534AD8C5636E3B867CACFFA792EEBB740E0E9051030B2B140F8D8FAD7A0704485982AC84EB5F53EB78E038FB3C15093F58A1905BA83AD2264BBFEBF6107CA410BFE995334A23C95EC170F6EA7500C8548717497E8A6778936CC09401460028619FB07A05C40E2682B4C776AA9D0ED6C965A55CE166F12A7939FBED46B36C674EF95E896056DFE271F624B3D6AEB6D2A7057764F12449AF33F79E25463A9D9878DA1A8C376B47330172BF0865EDA745392B21628254E7A5507114257B196145699256C63EC6F71E4D40B822E1691C508F6ADD49986A0874C24C4B2A231145067CDDDBDF03D335DF39893EEEA8B918A100C6EB096DCCC1F5D21CAED986DF6C6086036D0D922A2DCF7969472666550FC6C40AEFF5A2F873C113A2FD620977C2D01E083D9260D193AD4EF3600D3DA2BFFCA6F4897DB64BD55BEBD2E76F348AAD6852BE3A79B55E4FC39DAFF2757DE0CB45C1FBA05C2DF40A269412C232DED51798B9E3E63D775188B9E7614D23A85100093DB0558A473C7BD14E6F00F093BFCDF3CFB8FD5A456B981E7876CE35FE644826C1F71D6B9FE0E702210A98DCD39ABA0A178BBCB73D2BB94B55529235DAA10498795C30111774FDA6D158DB6EDC2C597DC4BC6EB500052F42B2ED19CEFDC048039A1472733EAFF16E60 ct = B330F9D0796EB926F542746247108D60D8D12F4A1657F1CB1485F2CD8922492027C108218A73792ADB61CB17E249853C2613D2621A23F27683CB5B3B00D0E3DF66CE0647BE693FDF367D25C8835BC0FBF20D79E997178958B26119A98832A0CA071516DE275C5FFF4080A5A8772CFD35FFA0D07311A50AA4E5B7972051DFE31F4AAAF2E7A8B9008E64C94F56EF5B3963B09DD2414C3122AE257405F9E5608C5645AF3A700613A667F3F158E891D3F47578487FD7CAB1659AB4EB5514F673D8039750F26457190ADB1845D39EC383C4F5A5C2127E87A51BA8FC9D3F2BBA2A991318A6DE0B6D36A909ACC388553DC02CF28B69DECDF105E3A4447234916CB7896120282D405E445095632F9C4F1D348B3C28527C5E0D9F3532D825F14B217A41E9A1C32E53D52EF17CA6338E59CD120516764444297D11157DAD4BC1E77A01B49ED670D6B1F630E57138F824683E800FC5440AF0DB033E69D57FFB7F4B82615CEA413A1382DC533BE4AEF80D97EF8C5A8ED2EB0213613C8456BEF9B016831B2A99AB4EDB9AFC75BB132E2A5F80AD17697422E921EF8EE77BED364AC6761B7019EE0B69BF47921AE35A6FDE72A9969968BFBB1AF2D793EE6383633EEC3E081F8499F4093013ACDFB9F072C3E6261DF79E512F3A57F5846B61E75B2145D977DAD185061A59EF04E87D744997D19AABDCC829BD4EA6641FA43FFDF0286BF3182D981E2B5F9AB1EEA8A8E647670B4F9F15BD1F0A6ED3C9EA06E76A7E01B69F06018C03EA9D623A0F7360577812FF40F577EDF14DA0CC20B2F14598080C133C0FAE4BD70841C4554FA972CD9EDE0361A6F4C6595FDF3221 ss = E0C5C11D8203F126E3203F002623C2E4F97F13CB08DD148C count = 93 seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 pk = F37F29C528BCAA1565E817E17A42AC91608B57AB2A706E141D9B57F2D4235D3A118EEF6D843AE97467650D2386C7B1FE5A4C5B10802EDFD27DF25B57E525D54EACCD06C1BC98839AE671CF76379E939CC1299BA062DB15344432147D0E10AE4EBB71F469B4A744E2D133CF5E86F7FA90636E708EBEB0E1454C6B83509ED789AEA68ADBB49036779299D27D508559854A77647994C3AAD5D875A05BC8E7C06B2225AC2EC3536E340666B898076328E0B70022FB8E089B396A4A89733D59347535E6B229952F8C9EF78EBAFA352FDBB61DB3FEF26842470E4B1AE789350E2B5C319AD0E1A51BA28353563E212FE4CB0156BD6B1B7EF4233832D48FFBCFD23C8BC99BD4F26C91C4DF4B2615C9481AF003F367DBC18865B296237F64B0ADD716EA0F5A99DC3F009111993ED9CA1F3DBB7FFA79E9560F0FC7AA64DC5C8167871A954440561916772EC848B74DB4200CFB6C122C72BE5B3C41E72C474B63570604530BEA05FF602710596E7D47F1D86DBE637D774B5A65351A062707918E6662CB5DC6031853F292D6D096CE798EC777841FAC651C15BA72153C9DA1F3D0A05DF2CC0973B3730E68488098CB98FF9497E95F02FDE288B36CE4515E467965D7AEC787C5775EABBCC8246811FC24F6E7F14604F514917C6B2E68771638956C2AE8A0B707B9FFFB28B8F6E56376BCAC0AD4F51E4459BA01136E463CCA2F694907A1397F4D3E39356E6EB17CA0216022B0A0FA6E99F7354909A0D1A8CC6DA5945B6FD3D488596691D768B4A4F552BE4B2B5256AC6516DC9246 sk = 32E0EA9089FA928482C0770DA545AF1BB871A03CE38604138B0D08EA2A10CA2BC06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D8844F53696845942EAA424C6F6CCC89B701F37F29C528BCAA1565E817E17A42AC91608B57AB2A706E141D9B57F2D4235D3A118EEF6D843AE97467650D2386C7B1FE5A4C5B10802EDFD27DF25B57E525D54EACCD06C1BC98839AE671CF76379E939CC1299BA062DB15344432147D0E10AE4EBB71F469B4A744E2D133CF5E86F7FA90636E708EBEB0E1454C6B83509ED789AEA68ADBB49036779299D27D508559854A77647994C3AAD5D875A05BC8E7C06B2225AC2EC3536E340666B898076328E0B70022FB8E089B396A4A89733D59347535E6B229952F8C9EF78EBAFA352FDBB61DB3FEF26842470E4B1AE789350E2B5C319AD0E1A51BA28353563E212FE4CB0156BD6B1B7EF4233832D48FFBCFD23C8BC99BD4F26C91C4DF4B2615C9481AF003F367DBC18865B296237F64B0ADD716EA0F5A99DC3F009111993ED9CA1F3DBB7FFA79E9560F0FC7AA64DC5C8167871A954440561916772EC848B74DB4200CFB6C122C72BE5B3C41E72C474B63570604530BEA05FF602710596E7D47F1D86DBE637D774B5A65351A062707918E6662CB5DC6031853F292D6D096CE798EC777841FAC651C15BA72153C9DA1F3D0A05DF2CC0973B3730E68488098CB98FF9497E95F02FDE288B36CE4515E467965D7AEC787C5775EABBCC8246811FC24F6E7F14604F514917C6B2E68771638956C2AE8A0B707B9FFFB28B8F6E56376BCAC0AD4F51E4459BA01136E463CCA2F694907A1397F4D3E39356E6EB17CA0216022B0A0FA6E99F7354909A0D1A8CC6DA5945B6FD3D488596691D768B4A4F552BE4B2B5256AC6516DC9246 ct = 1C4A9395CE1EF6AC71188CBCD0C9980060671FE8D28B9952EC76930FD1CA746F718E80D18160F6BAAC299E9C28712C1856684B7D6518872B2111F8A10500F35728BB72416B9481F0662341C2D79573C84C1C2001AB1D25EC227545A29E585D4A923CD614C4A9DF68DE600B609E4506C5B86D94B1F0AA95373C02C4AF420752AF08532423A517C73435DC4167D20A846C3CAEF0295298986CC0DBBAC4B31306B37FD6851073F1B7AB6273B1066183EC9B06BF272D8AAE505C2E64B0616E4C12AA22CD337667F66964BBFB0079F4937032FA8BCBB81E1C6516A29EB3CEAB0AABB8794B914126C804667DE91A225944329DEA854CCD0440371FF289C309D81B8C127E6D656C00AEAF5ADE38A47B8921B3320BCBD22E238E7FFE3D147B99912B5E365957B9AB92376A3EAE5089D677A665A92A07621D8F48855A9A464E1C1A181C15CC4162F12B17F0A5E4F7050D1B135C8A41FDD5C7A0A5DF6B3B31113F86D7E484E31185ECC5D921408D17EED06B9B890FC5E61F997531B847BB2ACEFA450643B7ECC418CC93640C71FAE5AB8BA8A48870073488EA9695D7EFEFC6DAB4B613A28A4B4BB16B0E4B34DFF260C6CE58943C253A7A379CA7B75C4F03FD51AF79E520C8842D20C4A75EDB27616E501633B4E6DA6065EDFE6D2AB3B16E608066BD33EA68D9C9C302B2E4E8E9B20F4B9F900CE441C628A082D306C54C550DDB64E1FC5232901D7BB09EACBC341440143BF1A00A819BBE092E5768048A8158DC9BA0E1DD7580EEB0FB66B1EFFAE47A68366CFC42052CE3A4481CDC14BEAD854E792173CC64FD800A22560F48EA5474A7E42D83CD405B803784 ss = A0CA19773619BC27A6DE75342C280852D1DAC149066A0BFE count = 94 seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 pk = B1B4EC2A554B9B14B94B2F5F5E7339397EB67764FD8B9E474697848EEF40740D0D5E23548D83E604933761215C7D8976446AEE104F488716AF959607738A2C77E3C83A7BBCAE054AC904569EBE6787BE159633214CD0526E82CA488B2D05F3E8EF2ED53B93888134C36D909BB53C931CE0DF9672D7EDF8CE80C7235471EEC9A9BF4BFEB59FD66D1BC9CA16FED7136975A9ECEE78D23237F60679437C70FF58142BAD1E07EB218524CABBF299D63F00C01CEA080E5EB455FBC1E0195230DB38D8767CFD1EB5BDA725741D868262AC3B9F207EA6EA5DECBF238E8C95FC4415EFC6B577816BE1DD825A914F93B2F660C7305D484E8248E2EC965AA43D2CF1D8457736EB1C14C00E028E35EF9C03977FF06CEAD4249D7F6A32FB3E06C1D2B076896CEA37584C9FE910ACEC0026E95713875F567A92DB2FDD4AEBEAB6C8B15F92434889CCBA47170F8BF45CB4CD266797EF51ABF49834304A0A4A284BF56BAB67AB7815F710CD3F80368DF868674C0EDE22B4F06EE76A83F2612AC723DC351ACDD3AEB1476A20969F6BF5F09B5EA2809903787513823B88295AE62DEA119FF98323BD5C87710DE8800EC018D45037508186A3E4F3CD3047DEBB69A4B5FE8FF7EA15B33BBF4F8DBB70E655019C97F74CA0CDBCCA403D9BDE61DD565178E4B285C67BDD3D887774759953299C4F87F255C7DCC4AC1C9046AEAC4033D8F3294064CC054A106DEF5E055B633CF9AAFD5F874E864B9ADDF3CCDDFF89FA57AEA28BC53797020CFCCCF8B4A105F90435522F5DCF2D9C19762C2F sk = 6FB2EC719F2A0DEA152BF3F64B9D148F8AB8BA88F64E61F5DB53E12D59F525574F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C349C03C3C45314774D82F5211B45FC6100B1B4EC2A554B9B14B94B2F5F5E7339397EB67764FD8B9E474697848EEF40740D0D5E23548D83E604933761215C7D8976446AEE104F488716AF959607738A2C77E3C83A7BBCAE054AC904569EBE6787BE159633214CD0526E82CA488B2D05F3E8EF2ED53B93888134C36D909BB53C931CE0DF9672D7EDF8CE80C7235471EEC9A9BF4BFEB59FD66D1BC9CA16FED7136975A9ECEE78D23237F60679437C70FF58142BAD1E07EB218524CABBF299D63F00C01CEA080E5EB455FBC1E0195230DB38D8767CFD1EB5BDA725741D868262AC3B9F207EA6EA5DECBF238E8C95FC4415EFC6B577816BE1DD825A914F93B2F660C7305D484E8248E2EC965AA43D2CF1D8457736EB1C14C00E028E35EF9C03977FF06CEAD4249D7F6A32FB3E06C1D2B076896CEA37584C9FE910ACEC0026E95713875F567A92DB2FDD4AEBEAB6C8B15F92434889CCBA47170F8BF45CB4CD266797EF51ABF49834304A0A4A284BF56BAB67AB7815F710CD3F80368DF868674C0EDE22B4F06EE76A83F2612AC723DC351ACDD3AEB1476A20969F6BF5F09B5EA2809903787513823B88295AE62DEA119FF98323BD5C87710DE8800EC018D45037508186A3E4F3CD3047DEBB69A4B5FE8FF7EA15B33BBF4F8DBB70E655019C97F74CA0CDBCCA403D9BDE61DD565178E4B285C67BDD3D887774759953299C4F87F255C7DCC4AC1C9046AEAC4033D8F3294064CC054A106DEF5E055B633CF9AAFD5F874E864B9ADDF3CCDDFF89FA57AEA28BC53797020CFCCCF8B4A105F90435522F5DCF2D9C19762C2F ct = E6E3F7211D025D49217153F297E872D60AEAA1953858EDC5E1796A1BEA62C67A40D867C974BE3A03136B96740160961C2E9214BC1BA0CE48AEDEAA157DF0243BD9D34AC04E39E90D676146C30BE68E7AC17F802A4815E6BF8D7F6B50605F4F51020144A41ED9FB213B76D4562040A2C57CABDFE85DD1C3B8304EF2421ADF16CEB89D64DEFA45DE7F997E29348B6253DCAEE919DE386D6FE312C6F52A088B2B25638C83C0DCEC06BBC3C1137681907F01FCB413AF46BC171B6B10890C4DF662F2DA0D70783B62ABDEA079CFD0684AE41EA15A72907F75036A88BBCCDD7DD947F1BD698D202CF37FF5F4B7635EF452B64E838061AB49DED9B92A9F722A5AF0381587871AEFAA382B3DA0A75B4A7D2707820CEED5CD282037FD122ED0B5BC755982BC6D7D342683791D81647E40061C5CD52BDFA05DE4A6B9045901BACE0C2E01C027BFFAF1F888059902A14FC2448BCCC580AE6440548FF3BC4D7FE3514454C41739EC147F43C3B2D11692F0A736DBBCD44BD3609473A17916746EEB5BDDD7BA9845C07175623FBF951B320E19A314CC24D5AFCC9ED786115D1810097C64ACE2DB18B8BB66B203997E8C924285F3B205543177A4D06D61D034B7F50D3A53A0D7B295E3B9C337E945EFB253E6508BAE7C49128066F80B6A887E6D072E73EBAC8F2563965C9D6B1B4C4F839BE57244E4FBBA516B37666E7F0EAAF8931F1A3A6361C1EBE6C1672505F5F97E02E851A3423E1FD2695B5CE2A00986596183CED634449D9055F0ED0BA2C2955261A1BF0F7991ACA0927028FE3DD5E7B3A2E19A866E395E2B11665C2AC4DE041F9B091C841217256FDBC9D4 ss = 8527540121A28DFF2BC543F0E1E46F7FE4EE08105ABD5FF4 count = 95 seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F pk = 6E3E67EEA52D71C8A14D67F59F58FD710F72B3EDC4CD178E41262FD8BDC467460EE85927C6A6753137EF2DE12D5EC4A13CA807B7B0D2005993154D50072100772A372795F0026560D1A59D3377B1F9BD66066E99789C863385B085CBC13F923EBD83E2CD2752B63BC0D66B99CF64F976724B61E270A1E980B18F53862752F5D82C79E1E12DB32A21F91C1E03682131DCC914EFE4F3D99E2D09C69A6101024D152E9B0A5982EA78146C15EBC549486EAD3490860196651704C770125B4CFF2A7E8942023D3596F65B4DF5B95F3477C7AC19E47B9DD0A2E27413B755770CA3759B31C45CA498B2F9F613C6FA6A991E1DF791C107004B77A0D01BE03782FB07E9FFCB8F3C58B96CFA092225A37AAC62B8A606399059A7102125BC0371EEF8A40D8BEC2F5412167F15DBA6E1DACA333734C3AC956407EAB87044CF866FA915FA91094F3F387408BDF5BC84F5B43D3816DA797EB6B753F2A2FCAF7CA84BC0855EF20A3DD84B6A7325CB42474ADBEEFB6E39B75B9848702E69AD5C54F241B2B90E16B1B56BE18A8E7F83B191C03B87F3BE8A9BF81C1C6942CEF633C577F98FDAB9AABD4B75204EABDD2BA3D04493D67432C5A7634744268EED2F9FC9C8B6BA225558D807B655C3E9EF526110F083F54076692AB9FAE5860D2938F9B1C0261CB0EC0373C3546EF545C31B72AE819C234D04F1CD5EAE458A1DBCB996F9040AFEC4BA9B686E301EEBDA201BDF5089D9741351715CAED17EEBBBAAEA5D30CD8C6FE60ECD3339A6B420CD8B6F9E72F3987C7E00BA8270747B28 sk = 527FB88C8BD9A4D6031DAD15E63878ABD2B559E7E08D61F69E8E78FCA964EE6AE32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C89C239FAA654A488E65167123A0737F08006E3E67EEA52D71C8A14D67F59F58FD710F72B3EDC4CD178E41262FD8BDC467460EE85927C6A6753137EF2DE12D5EC4A13CA807B7B0D2005993154D50072100772A372795F0026560D1A59D3377B1F9BD66066E99789C863385B085CBC13F923EBD83E2CD2752B63BC0D66B99CF64F976724B61E270A1E980B18F53862752F5D82C79E1E12DB32A21F91C1E03682131DCC914EFE4F3D99E2D09C69A6101024D152E9B0A5982EA78146C15EBC549486EAD3490860196651704C770125B4CFF2A7E8942023D3596F65B4DF5B95F3477C7AC19E47B9DD0A2E27413B755770CA3759B31C45CA498B2F9F613C6FA6A991E1DF791C107004B77A0D01BE03782FB07E9FFCB8F3C58B96CFA092225A37AAC62B8A606399059A7102125BC0371EEF8A40D8BEC2F5412167F15DBA6E1DACA333734C3AC956407EAB87044CF866FA915FA91094F3F387408BDF5BC84F5B43D3816DA797EB6B753F2A2FCAF7CA84BC0855EF20A3DD84B6A7325CB42474ADBEEFB6E39B75B9848702E69AD5C54F241B2B90E16B1B56BE18A8E7F83B191C03B87F3BE8A9BF81C1C6942CEF633C577F98FDAB9AABD4B75204EABDD2BA3D04493D67432C5A7634744268EED2F9FC9C8B6BA225558D807B655C3E9EF526110F083F54076692AB9FAE5860D2938F9B1C0261CB0EC0373C3546EF545C31B72AE819C234D04F1CD5EAE458A1DBCB996F9040AFEC4BA9B686E301EEBDA201BDF5089D9741351715CAED17EEBBBAAEA5D30CD8C6FE60ECD3339A6B420CD8B6F9E72F3987C7E00BA8270747B28 ct = B3BE2626AC5C6F17EA0D18BA7791FA1FD8A84EF0ACC64B7A272078DFBA5CE0D20A698E652B7D09FE5967C13414C4F9BE4ECCD578EF72D938C619669C89DCAF18647A08FF54C3052FD9EC8F4C787446295601363778F5A7FBEFAFBFB10367F3007FE3750DE71114818AB8C1554E320BD7B94B5FD038DF1CB17BCA99C56E9FBE4CA94523019F0F0538CABC4E32966B40A975D2C0F25FCF04BE04AD932F24ED54D0972B8CDCDAE4F3EC235B1C8768E475F091B0F2F2EE89FAF6C877506B457DAFFA080A9ED8D12E94C33E9BEB45771E6C8FA9A63BDCC595D3F0417A9995B0DD8CDED2A33BA7D9F307F609FA4E1F4E2AEBD4949BBB065010779F13F28DD5316999E12BA400A4F11704AA11A58FC0ED16A1F85410ACDB2350E4E18A5719433C8D21728A783A39911B4F668EA8D22586D34AA1DE71A5360253161BBF0839332EAA1F6C4970DED2EB41CCD0877A99FF7E78FFB55D876647334347EC37130729E068D0ABC9740EB0A998F1C2E5C1BF93C687F826E7F9926BFE0D485956E047B0ACCBF6902F4D3D1FF1FC7B80483FCB4C4D410C07DB105769141950F0AD40D5E0CE300994DA38078B0642D028741478D1BC508A858B7567AED898D052D5A3D8512CFE501A01A85A7FF9CF5BC065E8D2C31ECECAE0088CB0BEFE0E75D751CF86F696C83ECCED24A0C1336B8E29E2775D65418488A77F3B1386C9A85CF369596925E80E7C18247074F8DF5CAEDF1BBD331EEC4E253BF33F95214445B65E322CBF90B6681AEA873B278B1594A6CE08A1269312F189D6941DAC33FA76E6CE7FF4812A189337E36ECFB9C6C6A23482FEE3EC0CE7D252E3D164F973 ss = 69D2682DCDA60B7343293151F9596B023D2976AE65B83045 count = 96 seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 pk = 9FA20A26B5B1DD1DA3AA3463E444DD598C866E0333D98C5D1A7E7EC890BDC4F2B23FC120340547A66152CA0BBEE55546B4820ACB865AFEB52395AB3AFDC33E8E53930CBE7B54BC200FBEBB2F8DEB9C2AA8A5DE71E22278983BF781C7755E232860B0EA388FEBF0556A0205A635721E0E0A6F71C870F9C10BA6DA852062E75F363E0B823A75C5D2CFF26C90623646AAF792EDE9B4D9C9ABDA06190CE486AD467838185619611C63D99D0A7FEBC518E604A012A9D295BC698A386DF240F3A68DDBE7B2A4672988C0285F9D7660C2F06577A12563F24174649403533657016CB8E8F2BF3F2F3C83E4EFD3DD22F3DC0C9DD954A7351C377D74B60B96CC876020A62DFC1BE9FDD89CD26EE765C4F551F8E713EEE7CC4C2A815F3686514398230F714DD57C837E4C1E3A7916A7C95BBEE251C1446542DD2A793F4CDB05642316CF244D52472E50DA716A63907E7849507C81FFE75F0B3315195DB4EDE0BFAA2006A8DBE346913AE1A1E89273AFA67419F053993DFF9792CF76E2599CF8FBF6072B22A367CC8E83F8B18DE6DEE3EC9DB2B690D2D3A37E2C13B58AA3FF473ABF34B576D9956C8FA56C28347D313D22ECD0ADBF897C39473562CB43291C917DDC045D9EA8BF228FA22097A6827262739DC3EBEF681418B02884678557DFB886F5CBE401C04100FABC35E6CA4C442901DD6AE15D23F7C1B21B19494A3880D0BDACA4C1F96BA6B941A36E6FA09C5AEC008377D0E45DA2D367A820803E3D00AE49800633A6EBA343B7CD8CA1F6DB6ADE07FD6389306971FED22D sk = AC6FCFAEEEF795B6EF9E062F02BF42975FA01E7D91BA832F74E05269A72684D05AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA11EC67FDC3F209B930E1FEF9E3B9A07788029FA20A26B5B1DD1DA3AA3463E444DD598C866E0333D98C5D1A7E7EC890BDC4F2B23FC120340547A66152CA0BBEE55546B4820ACB865AFEB52395AB3AFDC33E8E53930CBE7B54BC200FBEBB2F8DEB9C2AA8A5DE71E22278983BF781C7755E232860B0EA388FEBF0556A0205A635721E0E0A6F71C870F9C10BA6DA852062E75F363E0B823A75C5D2CFF26C90623646AAF792EDE9B4D9C9ABDA06190CE486AD467838185619611C63D99D0A7FEBC518E604A012A9D295BC698A386DF240F3A68DDBE7B2A4672988C0285F9D7660C2F06577A12563F24174649403533657016CB8E8F2BF3F2F3C83E4EFD3DD22F3DC0C9DD954A7351C377D74B60B96CC876020A62DFC1BE9FDD89CD26EE765C4F551F8E713EEE7CC4C2A815F3686514398230F714DD57C837E4C1E3A7916A7C95BBEE251C1446542DD2A793F4CDB05642316CF244D52472E50DA716A63907E7849507C81FFE75F0B3315195DB4EDE0BFAA2006A8DBE346913AE1A1E89273AFA67419F053993DFF9792CF76E2599CF8FBF6072B22A367CC8E83F8B18DE6DEE3EC9DB2B690D2D3A37E2C13B58AA3FF473ABF34B576D9956C8FA56C28347D313D22ECD0ADBF897C39473562CB43291C917DDC045D9EA8BF228FA22097A6827262739DC3EBEF681418B02884678557DFB886F5CBE401C04100FABC35E6CA4C442901DD6AE15D23F7C1B21B19494A3880D0BDACA4C1F96BA6B941A36E6FA09C5AEC008377D0E45DA2D367A820803E3D00AE49800633A6EBA343B7CD8CA1F6DB6ADE07FD6389306971FED22D ct = 8B6417C9B51A1DD853EBDC78DE1F120B11904F8713B4F8C6C3E7985DFC67842457A47D2B0DD275D0ACD309BC8CD2DF62E437B4D1DA5A628EEFE241A96AED76E9D6517AEBFDD70F9E12924D835AB6315F20B9B5996302DF8A46193B70F0659735B7B835D52FEAD9F0A9F97DF969D0DA586DBB6ACB9EECDA30ACC3C7A3F4DE0C12364F77A366E9F88652EBC326B6A10BACA96BBA4E39C97FEB9D612389B401E35DD7F33188829DBFF9C2BE92FC2D68892214794DF16D94847EC75B710AA415F1168185020C33082BE40F6B17564AE1DF8B6DF5A81FFE9806C614F79AFA3ABCC69EC251A07E1E45584E25AE6C381EC5C0A036910C1162C076CE50571E07E61BE40FFEA3BB6AA4F841EF07F63F41A32225F74376DC636FBCCF43CD65E620CA8EEF8EFB5B337D5F791520C7F4E2C85FF0E775892EF2C179F6FCE1D54A9A69B15F3193D2FD9A5AEBFF9E256C6BAB2D6B251AAC808CD119B28EEF513A95C6933F355247D4BA8915E90C2C823619178DCB5B3CABA0CCD7A0906DB31C6837B6174D7737A1805DFCF5BF9BE2B560FC50DDD730C60B082150588FD3762E83F8D7E51B0224DB2CEC98E1D8120ABC47B0175971A98C28188E5D4B308C1B9C8FD0E96D16498323B319A101C57F426E59D9FA18C823E5B16F2C1978CC33090D96429065B466A983AD096491DD3B3533ED37DCF66374CA3ABA8A526DE1D9C167EED0DB79B3E3AB279141BD2C4C1A698197452D51B2530800E5A0D215C49468463A737B0E0325A89F51EE594334A0880AB2F05AADD2219853C785923CCF3E3903F281761EC62B00F083204DE501205B6D8BEADB82B0E19DE56B255082 ss = 1C22BDE5EA95F4955D68095B855323C5AADA19F6B876D0A2 count = 97 seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 pk = AACA3495AD3B8408718C964BFB7B7421B4E734954F54EBA3D4405E41073B6DF5743A6742373693AC2A06D11BCFCC9E3D54DB29EE0CA6FBB414CEBC437E186221A788C881ED372E6915FD951CCB464F63FDD338A256BAECD7B89921305842ABEAA844D596C27AD2FD3F75F3D83EC7AA30CBFF5DE203D4C54012865D1F740DDEA9D7888BC339CFD9513BB4F3C7AEA45DB2015A92C1026CFE1B94308FA30DB3CD55467457C82D49847F6E9C3081047B9879A7CF101553595FE72B0F4F6CD89D66E4CBF23B0ABE01798A6BE692F30D6914384623D394D908D08A9A484AC2CF2ADFE6753B3F47F69E83B8AD0771D02407EF72366C2863404ADA316F18FB2BFA1BBC960BA62079BAB02C9F3F21CCFDB92EEFE497A31DC4216D599DFA3B6EA673D32C291DCC5094EA18276F6218D6ABC24D4D31640E0BBA61DD3247EE14E5DFB1ADDB6CDF3ED2043235EF227D271EA1DDA03198B0C14BD2E25C7A80CC403A8ACC58C81E3BCC2948D241797CC332295950E10C8631477C0568B8D15BAE37A21D15A69F8757360456DE489A54B0154188F770944B374048FDDDBDC590EEA481BBE141E722E2F9350B48FD2BBEEB1EF72C0671720D9E1690D7C5261FF3F6FBC6D5B4F472CD6E254948D0ED8CCA96819F64DC884668506A00E30F09D2932BABAF989C2A9BC9563EC444C6862BE2B6E7C92CF6ED308499A1C23520AED32E7165E44C98561886D1FF7535A5C1E41295C24231EE6B85685E3B1A5BA661B9D29522557C1909BF4EFA48E88222684908D948D5F57DEC4D16DBCEBB55 sk = BA2FB9318D4DBE7488057C33E95E6F054583A2800C41BB83083C330A914A12CFE63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83BABDA6C8966F6CDEA65916F5EB3C99F9E00AACA3495AD3B8408718C964BFB7B7421B4E734954F54EBA3D4405E41073B6DF5743A6742373693AC2A06D11BCFCC9E3D54DB29EE0CA6FBB414CEBC437E186221A788C881ED372E6915FD951CCB464F63FDD338A256BAECD7B89921305842ABEAA844D596C27AD2FD3F75F3D83EC7AA30CBFF5DE203D4C54012865D1F740DDEA9D7888BC339CFD9513BB4F3C7AEA45DB2015A92C1026CFE1B94308FA30DB3CD55467457C82D49847F6E9C3081047B9879A7CF101553595FE72B0F4F6CD89D66E4CBF23B0ABE01798A6BE692F30D6914384623D394D908D08A9A484AC2CF2ADFE6753B3F47F69E83B8AD0771D02407EF72366C2863404ADA316F18FB2BFA1BBC960BA62079BAB02C9F3F21CCFDB92EEFE497A31DC4216D599DFA3B6EA673D32C291DCC5094EA18276F6218D6ABC24D4D31640E0BBA61DD3247EE14E5DFB1ADDB6CDF3ED2043235EF227D271EA1DDA03198B0C14BD2E25C7A80CC403A8ACC58C81E3BCC2948D241797CC332295950E10C8631477C0568B8D15BAE37A21D15A69F8757360456DE489A54B0154188F770944B374048FDDDBDC590EEA481BBE141E722E2F9350B48FD2BBEEB1EF72C0671720D9E1690D7C5261FF3F6FBC6D5B4F472CD6E254948D0ED8CCA96819F64DC884668506A00E30F09D2932BABAF989C2A9BC9563EC444C6862BE2B6E7C92CF6ED308499A1C23520AED32E7165E44C98561886D1FF7535A5C1E41295C24231EE6B85685E3B1A5BA661B9D29522557C1909BF4EFA48E88222684908D948D5F57DEC4D16DBCEBB55 ct = DDE378E99BE5715D3010C67A418DDFC432042599DF3A16DB0318186D23DAB6F50E9F0132755DC0C19376DD87108DD005DC5A919C3D49E115FA8B7B6163C455CE963C0B5FE385ABE45256057E72F5591080B078013AAC4B79EBABE76FFF076C01032AA015D08ADC4AE6D4DA38FD54BCF1F5A03AD5C0894A7333BC450F2A8D55C579999D0EE5AA7F7C48AE0F0AF4C3A937F4992D40C13D2607338789930CEECA6A528359B4ACEC2527C0F605022397933FAE32AB0DBD16AAF79A250E6CB6B37961F52C1A6B8986C04EC17FD998A41A6EF09D99CE27D48D63555B4447B46F4226CBC3121DCD348616D482ED276E94A97C314AE108CD89CAD1AD5706D2EFD5B7522860B3AF66EC464AEF4D515A1F0952A17A35030FBA34191C87D82CEB431C6C4D69610F89C27E9AD8A46850F101AA2973D53C2EA3A98EFB5397BE24E3F2D56D5D6B64C6755DCAAD697E4E5440CAEE161157BF430C001620CD28A89BC3C95B062164828DD8F56AEEEC70460EF739C6DC702C9F57134BE1739E6A7E648A998B56552ECD279456A16431B70E3E87CB36D1C5A013FE61D4D1B566E50CAC01B9ACCC7128CDC598432D7800AD8788853F6B0C296F8C73BE0AFE5C2D2E93384BDBF44BD55D1E189A10998A927C26F649CB8A32B7C8792739F76F39748607A2A01C536790217D12682831C8A84CFE7459FF4D38DF95858DB67A5FDBAFD899918B58FEC65375EC8F80D3E4C3943737305E4CD7533A68DF7C3F5CF1C507F8DBD7EBBD8F21154434B9D54DB45D4C4183A156E5F6D0A2F964570F30DFF5E6CDD64F2FA9508784F554B608C4165060505F9744205E8B3B38ACDBC177 ss = E22E660E9975B7696CFA260D9814A232EC7F2ED14CAB5384 count = 98 seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 pk = 600769FDFA19FC0663CF404F7A1B4B03A3FA08D6D8EEF4507EE7C41F2FF0A1E4A8C7FB5ACB39F55850AE99032AB9EDADAAEF4885CB7962CB680B22A8C65CFFE2086217E55AC49050C3A7B55E644A673D72BBC00388230DDF8B495C347153EBB0D0151DE7B6E9FB45BCC472E3CEB9184D817DC3AD3BAB85F8B84F845E3505B5C7BA37CD676B06D5B118FF172CD0462DB57C29F70E498EC1C40DC8803632F4A394A1CFC220B5F17E239552B487899835828F9A8CE855CBC42BE9723A503ECCD7D8418ED9E3AEBB3DD3798C5F5D43FCEE9374E4C3BA4520F8FDDBD7B4C640925A2BA0A53281A520F0081118366D1A1723F651E750A66E665D52BA252CFC13A46864900C7E4329AFE0491FF43AE1501C8241688A5CA3A75368B95C0FCFCD6E8893FCCEB93A9A1D45D0AA93A6B3EFA01B9FD06E1D3D9D32CF4D856B36ABBABD4AF45F15A9D55513D5FBC0EB9143393CFB9D8D2D68F9A88224243422EA99373374F822389C20FBD72C5FFB1A07227DE42837514ED0760EE9CCC1657CFF7E1D4AB368739A1BC44E823E63544D69D14C55A22DE10A81AA2C8000CA410F7FF62EAEFC8A6386DD53E4EA0B626F28999286CA5E131D2EA0A32730F70132CBE130507B73477BF316F2AE6332CA0A4EA85753EDC77D24B78552B1846514D9DE13B34EFE7F34CBE8A7117D2757B7C076798D73EC641027CB676573396442B4F7CBD1674C465C4EEBF61EC38231A6800C2AFB023BF64F0287FC613BA860EB72DFD0CB07C7976083C430A3AA61CF496C15F371E7DF8F1A870034482E sk = AA6DD1E5799CDF7AF9C4FC632B3EB9D51D66E85C8E0A21EC98664FC51AB63C7DFDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD356D9B7FD18E7550346EDFB273F1506762A03600769FDFA19FC0663CF404F7A1B4B03A3FA08D6D8EEF4507EE7C41F2FF0A1E4A8C7FB5ACB39F55850AE99032AB9EDADAAEF4885CB7962CB680B22A8C65CFFE2086217E55AC49050C3A7B55E644A673D72BBC00388230DDF8B495C347153EBB0D0151DE7B6E9FB45BCC472E3CEB9184D817DC3AD3BAB85F8B84F845E3505B5C7BA37CD676B06D5B118FF172CD0462DB57C29F70E498EC1C40DC8803632F4A394A1CFC220B5F17E239552B487899835828F9A8CE855CBC42BE9723A503ECCD7D8418ED9E3AEBB3DD3798C5F5D43FCEE9374E4C3BA4520F8FDDBD7B4C640925A2BA0A53281A520F0081118366D1A1723F651E750A66E665D52BA252CFC13A46864900C7E4329AFE0491FF43AE1501C8241688A5CA3A75368B95C0FCFCD6E8893FCCEB93A9A1D45D0AA93A6B3EFA01B9FD06E1D3D9D32CF4D856B36ABBABD4AF45F15A9D55513D5FBC0EB9143393CFB9D8D2D68F9A88224243422EA99373374F822389C20FBD72C5FFB1A07227DE42837514ED0760EE9CCC1657CFF7E1D4AB368739A1BC44E823E63544D69D14C55A22DE10A81AA2C8000CA410F7FF62EAEFC8A6386DD53E4EA0B626F28999286CA5E131D2EA0A32730F70132CBE130507B73477BF316F2AE6332CA0A4EA85753EDC77D24B78552B1846514D9DE13B34EFE7F34CBE8A7117D2757B7C076798D73EC641027CB676573396442B4F7CBD1674C465C4EEBF61EC38231A6800C2AFB023BF64F0287FC613BA860EB72DFD0CB07C7976083C430A3AA61CF496C15F371E7DF8F1A870034482E ct = 153F18EFC64FAA6F612AF2251A3E4111E79E226CE92853A3152EABEBE7734F4D5C0C9EC757D136E796A889FB9D2FFDF8EB5947FAC1BECC4AA6ACC01A34C76BC1DB78B7C56EBCA13C2B3EB6978D6814804C38239B0CE29EFD64438AB7FC62FCDBF1A3172809A02C93149C3204AAA2866B4732424E68522B1E83588F1177838414FD71F053327BA3715A3B4B607A6D9A22C27452CA1FAA7735D2DF46ACFA9BDA91661B3D9A7B485A0EC40B659CE037F7A0AA9E685434D9D81FA736D918A00EBDE8F307DC6E0584C54E2C5263A7048C481A81A65E36B0C24516C81E016D2921A58936F44032B8E8DD8346152E997B0223640F080A525222E1DC9AE3B77187346408E1FB328333CE1E087009CDB585B2B2E549CE89A3A3E2C161FA4AE3AFB4888AC4463A8AD2603A30C929D9AEE39C73F1C0E273E9C8DEB4BA73ADE92007B93C3BEDBE204C5ACF8155566427E0A1AA81404B1601B0C436F00960A932DEC738772C23F727BAA2B503F3F4A38ED1E059E395FF9ED4FD8D6BE301180BC9ECEEA831820719EFAC2FF30A27904EC7DA7BF799D1E6366FE6B66969789B64197A14FF58D794DD3258A5B00076560B19EF1F5D6F1C073A9F18BFEC2F506063F03022238525D9FBFB20491A0904E260AEDBBDE21096CDE091D2625A66A0F6DDB7E2F66EA29A8114494C148EF6D04FEC0A97FC9E48373E99F306A3B4C09DAED23C8F2838146B0B7C530D3976014DC13FA73E83FF66FB328004013DBCF8423D14D61C041F1B2A29BA37E05F6425372398605B3EC433A943415E613A3F68CCFBBE7845E968B6F60EC7365C2BE3B081E8B942CF30FEC9B4D79080C40A ss = 62F446D9C938ABACC201AACF02A6718B9F43922516F2AF5B count = 99 seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B pk = 28AD56DBFA51A96E17D19EA46FF26AA9C94989ECF0D4E364AFA163BE4BC2DF96D4EF0C4ED44BA0AB1F899D2EFDC606535C343D6B9ECBBC8064A2A6CCFC71F37632BA5645BD6A5F3462454A104E18F6095ECCF7F76FB18FF8C0AC96A1A1235CBAFDB617519EEE54E9316EBB071E19428876FE69A0D84414080BDE38A88E4AB61AAADC344DD9859F90EF65F10B10EA1E206664D031031993D2885C86C381E7F219501F08353919D97970254F8E3FCCA41D223A2C53CA34587E844DB73850F3693E69D8780BE4F58A6CF79B70C640484238DF2A0BF9B2198721EB9AFE7789851E6660896E568C06446D2C717304441AB77CD166437D64BAF6C86B3F76DAE4C61B732872E196C4155871BBD1A4CD4B980729C8067211007A501F194A71B086FD72FE3D7535BA299D3246ADBC9DC75B53DD496ED831B7840ED551183FF48A05A7B91C2A6656497954BC4D41C5A56A641F6AA2A92E7AE65FCB38A2AB717B0091E3B76A529E08CA36BAD09543963180CDEF8879BF6DDACAFD617B507EE6C9617D7E9406D85D51137602D83DF65D42284E394C1AE2D57B10969138193D94BD2CDB92762EE4AC4D7B1A5BC3538801B3438D68782C487403650059C968D66A0BBA2EBA85202BC0C729AF04AB0D6368FE1F47D7D70DC57077160D1A9871EE77D1B1A431D0E3875231B9BABED9FB5F7D7B4819FD991535D9512D6B512A0B3044AA42F040FAACED9A583ABE5DFF73DF0BFE46E906FE5598EFFF7E7D1BDACAA54099CD8A98F7D588B91E9A77CC6DEB7C76E998719C1FDD84BC511E sk = 195D6C86A3DF4C21E3007D7F2768B43C74CB3060E0ECA77F0A5D3271542B9A84AE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC21CB84E70A7F05DEE947808468042CE10228AD56DBFA51A96E17D19EA46FF26AA9C94989ECF0D4E364AFA163BE4BC2DF96D4EF0C4ED44BA0AB1F899D2EFDC606535C343D6B9ECBBC8064A2A6CCFC71F37632BA5645BD6A5F3462454A104E18F6095ECCF7F76FB18FF8C0AC96A1A1235CBAFDB617519EEE54E9316EBB071E19428876FE69A0D84414080BDE38A88E4AB61AAADC344DD9859F90EF65F10B10EA1E206664D031031993D2885C86C381E7F219501F08353919D97970254F8E3FCCA41D223A2C53CA34587E844DB73850F3693E69D8780BE4F58A6CF79B70C640484238DF2A0BF9B2198721EB9AFE7789851E6660896E568C06446D2C717304441AB77CD166437D64BAF6C86B3F76DAE4C61B732872E196C4155871BBD1A4CD4B980729C8067211007A501F194A71B086FD72FE3D7535BA299D3246ADBC9DC75B53DD496ED831B7840ED551183FF48A05A7B91C2A6656497954BC4D41C5A56A641F6AA2A92E7AE65FCB38A2AB717B0091E3B76A529E08CA36BAD09543963180CDEF8879BF6DDACAFD617B507EE6C9617D7E9406D85D51137602D83DF65D42284E394C1AE2D57B10969138193D94BD2CDB92762EE4AC4D7B1A5BC3538801B3438D68782C487403650059C968D66A0BBA2EBA85202BC0C729AF04AB0D6368FE1F47D7D70DC57077160D1A9871EE77D1B1A431D0E3875231B9BABED9FB5F7D7B4819FD991535D9512D6B512A0B3044AA42F040FAACED9A583ABE5DFF73DF0BFE46E906FE5598EFFF7E7D1BDACAA54099CD8A98F7D588B91E9A77CC6DEB7C76E998719C1FDD84BC511E ct = 28C315E99B6BBD17A7B046C104F4A71F6E3AA8E846CB882F4B3693CDB4C1AD816E25C835BA2EDF616A8DF79FF92DF1848A801C2E6D7E89C5FECCF139C83BC80EFF190A880F33160867DFAA3139E46832217009F2BAC4C77578829A39B4275B0A58015588A0B060B38497E27355A6BDF6C8947CD870F0CB4400308113D53B68A925E30EE35D02435C86122F619DDDFA09521A062B3F814DA9057DB9BF19813949503AC7903BAA309D3746693BD05A8EF7044749D773197ECDFC913D1695D28DB87A8B84B816E4DDA864A4D8313089C3964FE02E403CB7AD77BED351CABDADF49289F943647A83ECAAEA36731827429072E44ACF681797B70B0AF34E3EE524915BC569C2961A705EEE389A1A56B4A9C591473E3BABCB3F04368A1B45EEFC12CF62176298DFFF909A64F84B83E072B7FC196C3A3EA389DF223C42334B0B6CE1A9F77629274BC7A34CDD7ADF2E1065C50C087E82B6F12D325F8D1C15017051EA4DD7142C9AC86F2533BB1C60A04CA1FC49AC955205C15690BD049D86BF14FBE1CFF69CC05E45CFDD191160930BA67E33312517603CFFC93B7C801014162F8C3734DBACBB7DEF7E973090DA7E44EBF97D4D44C053E4D0F751934F68748D06C794BC85968A2F1597FD706DA0BF50668E80AAFEB554A0A2083825F7767ADBFE0C0FB33E059B3474E78660BC6FB5B183140EE2CBC6AE574141D9A688C312A8481D7E9261DA933BE5CBBEA0723D3AF18744E3707A950E6EFF0F4DF45AFB5C8ADB34A51F449382FD1C5FD3C9756FD3BC3B9B217903A340E26D9772E02B6EA0DEBB1426C191D70095CAF0B032BC69B217661975F83A3C4C0648 ss = 55A74BFC29EB82D301F428A0B1AF156BFC730F15CE4CA371 golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/csidh_testvectors.dat000066400000000000000000002466331365325520100266070ustar00rootroot00000000000000{ "Vectors": [ { "Id": 0, "Pk1": "2d2245ddc2585067a780ae9675e24bb747277a2d2b6ee8847b9c760e0e14cfb04daf3149df3b28d131187517700a7dc67e77722413c81315f262a3a32a9d032e", "Pr1": "f40b1d2c5c4f10beefeb1e2fe055cd2b25e4113b3f33bcc2fecd15ecd40ef3df02113ffcf0", "Pk2": "64d6b6ff48913d4c2194444bfb5b8ec76ba6834b5667230147ef64913b42341de07afe9ef8cef26b7c7db63d0b4154f0dd48fb0f37d5138d02c7d3a6e3116033", "Ss": "8effa0f3fa1347875a762d8ff41954af383ed303e444a29f7c9954c81c83f7284cfa01287519f9ced0486a0a1d68b48381f8ee99ff0ac6865616e05dc2a5bf43", "status": "valid" }, { "Id": 1, "Pk1": "bb0fa654ac7f60fbcd3784096eff76061ab74c2752c31bb9e2c54d3375883ab95d3e6495596eb66ac2cff6f9b31da162f7be52f16225a67f723a615612bddc17", "Pr1": "4b5c01e2220c331d31fe110c3ef4e4e1c3e334e5cdece2f5cfe241044103bc0f4d10ec144b", "Pk2": "0e6c453a94a5742acd5d576105821b2cec115c195c9a563f57780a6c354e96e94a48cd0245b5e678b14363c99540edb1f757d2f88c980008f794733e65bd6a0e", "Ss": "369012cef69aac843566c7a1044280cd37264c9b324588bf241b9bc5beae14cab8c410d5fce510f50baaa5adc331621b309a7c1e962334bc9327fe182e475716", "status": "valid" }, { "Id": 2, "Pk1": "11f05bea34f7a3083527391890e468e9f257ae7a2f6704e87243abd7f9c68bad04ebc57021c883b43cf5f2e8951d223a7b79773bb6af67850aba932472115351", "Pr1": "11f31e44b2f110d4cbc52cd5dbcde4110dceb4fde04f455f4e30eb3bdb3b03b1e4002fcbd2", "Pk2": "a4be903c7e71ab7bd3d7c5bb2e18db7d8a22a731e9c12d24e8347d48442189ce911e5a0c4d27a25fa71ad0fac5520cbca606a3a05fe23c4e5aa18c0505faec37", "Ss": "ce9fd933685d0fc7570e566f0217737938f20cf76e668dbf7b8aa3424d8d6a50133555af3154cd72147d2cae098abe3347f1676f1c19deba1d8b697892a9d910", "status": "valid" }, { "Id": 3, "Pk1": "1417531fa4272312f02e3646b54bb746bd37868bccee0409c1b466ee4acb334fd05e3dc272aff97f61749d4ba077f7ef05de33c820703cd2e3f004a7199d7a17", "Pr1": "35f4254d2eefe02132d0beb04440e2b104e325412005b4c405df1c11132fbd1053fe53d001", "Pk2": "2c1f804270ad7aa39a6d3ca157f1359e5c0ebc5e4afeeef7c677ae9e3a9a50b4bee3d617f56570f2b2bcd0cc3bd7096b0c14989750b727ad88796f6cbd4a673c", "Ss": "ef3c0191f2e1959586a62923c55f89c533dd5c4b351dfe1d9ed478a658f527cf7411d9505886c60cadc3b7ba848744c7d1535c6549052b74eedb73db380e4331", "status": "valid" }, { "Id": 4, "Pk1": "4ddd84d919cf01c9fee63dfa544aae3e540d8b1e4ea6339d191e76cd945fb8a038666a186bfdb20e9656184acbce9eda89c3b46cda2364131d74b596310f063c", "Pr1": "555412c11b430bfbbcd5be543cbe4d50bec5cdbbd543b22eec0ed44ed2d02c3b1bb0cd405f", "Pk2": "71274a500e6aaf08840a82eea69c8fa36fa8c77ce4d6d0e33d757f9b00982dc5451b999fd7ee18384ef5ca5f0dd8d75700d9bd8e35fbb3f9b904ffe581d4df37", "Ss": "ec41c88530df5157b990a0432efece612bd1924feedab1fd72a8a777ce6f27e73da3bf1e1fe7797c026e835328a37f1324122d13d8d12baf900ffa91b1402602", "status": "valid" }, { "Id": 5, "Pk1": "3c577e6bedff898168bab8c8a3c4abadd69ac530e2a5a09b93e6f74e37f790c85cfaca5b92f3c8f8b878f0fa5c163fbe4f554ec4216d1aa30f017980c3d08c5b", "Pr1": "ccb2fc5e333ed41bd3d04b244c13c20deeb10c25c0222ee303420cb1440251d03bbe1eb12b", "Pk2": "f1b7424499ddece4452e0ac0674171aafb8b2428e56944b75adea8b978277572e4b0394318fe4bec182754fc238a754b0ad6134ad829fc4e4900e7b0607fe707", "Ss": "99ebe34dbc81504f7f6a4c75bdff2dcf973b5477660bc7fef9b6f769e25ca9bcc531ca1f488fbb748bba8bc9a85e465d08f482895a92d7ee36d34dae244c3819", "status": "valid" }, { "Id": 6, "Pk1": "b6c7764765e4b5153e06580aa89253b2d4cfd33caabacae42b28da8c4f6193dc36a7778c1e650413f35ba5c3024926eb7bd965a05621522846c08d8c76bbb85c", "Pr1": "cd3d14b4b5423f1b352f332544fc15fd31bc33b22fce21410ec55315cdecc5cc2f3db0d553", "Pk2": "a65f4c2c43a6c63ffe5f02d65f87c4e3624f3153075af84eb437fabfc179473ff17daedc7b45c5a460c694efc74dc5e5121f1e02d137c23535b449cc5eb64325", "Ss": "65ba807c5ece4d1c5b82a41951e7498ab07139c3a789cf58c51f3bd38e92afff4577f83c8d71104ddb418806c4dac8ce647100acc115b7d32ca86913e422b71e", "status": "valid" }, { "Id": 7, "Pk1": "cb1db0662008532165ea6d8f8ee12768f79c29f77932a890aa09876903d243ad35c8f9faede37d0309701559c2ea0b6ab7c5f1576d411aa9f8a6a3eea5e9e75b", "Pr1": "ee5e2332dd000eb2eff3f2113b1f5fdbddbb3bd5503bfc1d210f4c0042c10f3415d1bd5cdf", "Pk2": "eaf47d81d503a1bfe59c1b8e19d502bb79d5c19245260699f54887f86ba954fa92baf3abc6521989f0dfc214a0431508c2a17ae24fd3acee3c00dd3cf5a3514f", "Ss": "968512e1af1dbd4076d895e787c388d76bb82836d28a047fd32dd26ca46ae9e2fd27b08728766d4edcba34d8490862d4e2c3f063b59ca73d697cab5c2498150a", "status": "valid" }, { "Id": 8, "Pk1": "55bce8ce22bf9da49e60c5bfd78f55738b83abbf3e72150902bb9d2456c8fb6ecdc5dbd12092ab63500dede29a9bf09b1112d854bff6c3cd9feb4f4ed7b49a51", "Pr1": "e4c252cd50cdbececd50d2f0ff4ec30e323bdb5e3cbccdb30e1223d03442bef335fc3314dd", "Pk2": "82423cbdfa56117abb57dcc7bf63b136ecbe533699b9053d7ce88deeb184450ccfff2e1ea2c1a36a4e3c13bbd88b3df347912df5a538e391cbd7900346031b5a", "Ss": "560dcd7faefd72cd9776b754a95869ae3210361a4d330deb5ba661059436ea73250cb97ee931c39e8879003a3b27ec54386b464a11a2628e244ae36d800fd244", "status": "valid" }, { "Id": 9, "Pk1": "03cf16eabe80605bac77a036310dd08c4d9dc58f6db4e7ee8cd54fb22e972aeab7cbd1362a8b437c4618735fcc03bc77032214a73d83c4653d0faed351094914", "Pr1": "bb15fbcd2bbfce5bbfcce3f42415e0f0052cc22c4eb04c5344b13055c5125ed2e2b1fe3b12", "Pk2": "7335bf5c0744f91ed821970623dbd4cad7557619b9f655989e2e397cd77ead25010524b3fca838552640105564d9a9efdb20930e0102f7fdf8aa661db21b3f56", "Ss": "f937451ce62a42f1bae4fe948b23cde9631862a184aee7608d7fea048d12e08fbe502ef0073c56d4e86a41810a448e96c269e6decdf4665c60d4d38de164411d", "status": "valid" }, { "Id": 10, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "937477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 11, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e70377839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 12, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e774f4839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 13, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e774771e9dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 14, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477834ed3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 15, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839d72a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 16, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3be1f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 17, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a1130c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 18, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f6c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 19, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0cbdddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 20, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c6013ce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 21, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60dd915f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 22, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddceda85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 23, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f3fba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 24, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85d36918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 25, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba7118c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 26, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba69dcc4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 27, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba691815d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 28, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c48f5eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 29, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d1ecb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 30, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15e318385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 31, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb20685ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 32, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb2836eebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 33, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb2838520cb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 34, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebd01bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 35, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcbe3f835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 36, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bcd35a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 37, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf894a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 38, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835e041be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 39, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a1ffbe694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 40, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141d7694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 41, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be224b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 42, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be690b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 43, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b6b2be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 44, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b40cfe48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 45, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402b698d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 46, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "valid" }, { "Id": 47, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d51519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 48, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00cf9ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 49, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d005123bda729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 50, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519e1aa729d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 51, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebd8e29d2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 52, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda7fbd2a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 53, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda72975a7011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 54, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a6011eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 55, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a71f1eb8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 56, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a701a6b8a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 57, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011e11a977ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 58, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8de77ed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 59, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a99aed2cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 60, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977c12cbb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 61, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed97bb3eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 62, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2c853eb4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 63, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb8ab4b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 64, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3e04b08950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 65, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4398950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 66, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b0d950e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 67, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b089b0e05cc759042b", "status": "invalid_shared_secret" }, { "Id": 68, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950bc5cc759042b", "status": "invalid_shared_secret" }, { "Id": 69, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e09bc759042b", "status": "invalid_shared_secret" }, { "Id": 70, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05c9e59042b", "status": "invalid_shared_secret" }, { "Id": 71, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc75d042b", "status": "invalid_shared_secret" }, { "Id": 72, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc7592f2b", "status": "invalid_shared_secret" }, { "Id": 73, "Pk1": "84a26238e6afc1f4ddeacf5f4371409ff432e10db0bd884f28550c904f657e99aa7a7ade9c0babb5f6e66c19646401b63abb1b20b152706e97efdf4b8093e112", "Pr1": "b4c531b310d0e22fc501fbef10ecdebc025fb1e2ee3bdce1bed550be2bd14d522cb0c1d221", "Pk2": "6582e839a1fab510c1faf683520505ee77eeac32f990e2e0f8f27f89d58e1eed5381240695d4a5e0bbe5919d549281d6f17b47540f2263106749770170e22941", "Ss": "e77477839dd3a11f0c60ddce5f85ba6918c4d15eb28385ebcb1bf835a141be694b402be48d00519ebda729d2a7011eb8a977ed2cbb3eb4b08950e05cc75904cc", "status": "invalid_shared_secret" }, { "Id": 74, "Pk1": "49db63e984ef1a720243a0a9a0b0953896c5b8a1e29ed28b215fbe9116bb13afdefcf67e0b4467af3f317661d166ef6625a0016e1fd3044e83ec6d0350938020", "Pr1": "541dd1112c0ed1452ff31f54035d0df5c503ecefcc032e04cdcbb4e2edb5e0b1eb1cbcfe31", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 75, "Pk1": "ed565e507422f79f3154a72d39e41e2a28768542f30d61a1a192579ba671fd606a9445ace08d261c10cd16c5e0b853ee6d39bdbf99c1bfb5dde1864c8d3bc246", "Pr1": "2fe4d5ecbd251eedc2ffc13f3e102fc3feeb1402e15ddd400d42c1115c23545e5e3c15210b", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 76, "Pk1": "cc1a498ec0799fdfaec1911472bc94f7effe4cee8a9755b2b8ec1495aa5f741803f6e55696df39d2c5c3db8c4f89d9650e23a58a915833b3700218fbbb959425", "Pr1": "544c4bf4c3fe0c03be4f0514301f14c0fcc01dbde1cebd3d42dbcb5b1b5e3f05bc0c2ecc30", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 77, "Pk1": "c2fe147e550d3dc165bdd5f762312af69b9285e332fbeefae8eac9c58852d35fbdeb1f837e601126e6cc8a4c45e5234e6a3cc73a02f4c7642d6d03723a125b30", "Pr1": "dbf1c5de5ed000e1bc55ef234012e0045f1eb0cde1bc41e0114541eb445112c4c151b34f21", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 78, "Pk1": "faad0182dbdef6a40540f4e27850952da3f30c2b4fe0415291f6844b390493b5f15692c9e6690a33bc0d9ac52559be2c1c833b3a483cb216f1828692f4bcd74d", "Pr1": "2f1c10110bb40f3bbe2314300fff145015d3fdecc5fb0d4c250b34fcf0fb2e31dff4252d32", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 79, "Pk1": "95760b580a8f523a11f13dce5cef1046c9710b87b37d94e7aa63cb9db5e4883265ccb02d85da9ca5e5c437b91583e8df475b4654d9cc8e7eb5b1e0ebd6783a62", "Pr1": "cfeef3e2b30dcef3e5d4fe1c3dcbb130cf5e4ecf0d33df00e5c4e20f44e02dbcf3c02fe10b", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 80, "Pk1": "8638cefeaf3338f0bf47219b35cef56ea48dbd615329964659c63603ee8a2cdb67380675a442e860daa937f4bd0714ac0c8876faf2216845b6bf1ccac2b76934", "Pr1": "445eccbddfd42131120cf223cc1141cc0bec11d2bf41e53ffbf1fef1c34e0fe2b2cb355b1e", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 81, "Pk1": "f2da5707f9e7be8ba782fb6ca295e63b427827b5a42aeb4e52f3d32a2ff67380d5cb0830f9663d9ead77798bdd289fd71f5ce7c42083c297dde40ade725b9624", "Pr1": "c2e51d0e1ef1eb5de3ee33be4bf0dc152244d1ceee010bc0ceb31fc3253f4f24b53f331c21", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 82, "Pk1": "d0e907fc7733bd8ceb81334052969ae054a1aa38d73de8a46c08f823d0558e50d3b70f2b7086f3e78db0e34d511f7962bb8e91984a62d2d0a5adb6dca490a03e", "Pr1": "51fb1ed50fdec331141d2350fd4344053ffdde1140bdbeef1d302b30fd1c2efd1511bed2dc", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 83, "Pk1": "f3757ff3aa3214f19785f8fef2702122886031f39f30bcc917f5a4d96bbf265af2a2c8368a76cafe84c841adb268631ad8e96ce0c5c4e0dfd03571164f33f253", "Pr1": "c45fccebfedfced1b0f25eef0b2eb02fc4e2dee3eb24fef24c154fc0f05032bbecb3023bbf", "Pk2": "", "Ss": "", "status": "invalid_public_key1" }, { "Id": 84, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "c913eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 85, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "daf8eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 86, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da139e75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 87, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13ebe7929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 88, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75089ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 89, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb759222b87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 90, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ac37b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 91, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab8601bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 92, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87beff40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 93, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bfa0e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 94, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf47e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 95, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40ec6b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 96, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e701dab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 97, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6f75c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 98, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab4519d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 99, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5cced7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 100, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c1901d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 101, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d77badb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 102, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d61ab756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 103, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6ade156b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 104, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb7e1b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 105, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb7563d8a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 106, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78c064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 107, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a4d4b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 108, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a06206bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 109, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b96fd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 110, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6b6b96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 111, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd2cba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 112, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96843ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 113, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96baffc1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 114, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3e1fdeaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 115, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec170aedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 116, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1de73dd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 117, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaee13ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 118, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaeddd4e8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 119, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3c4fa76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 120, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8c06757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 121, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a73057c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 122, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76791c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 123, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a767579452ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 124, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c6bfed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 125, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652dd30da9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 126, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652edeada9876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 127, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30429876bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 128, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30daee76bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 129, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da98c9bf3886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 130, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876873886e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 131, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bfbe86e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 132, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3862e4ab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 133, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf38864fab2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 134, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e48e2532257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 135, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab1732257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 136, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2517257b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 137, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab25325e7b3bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 138, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab253225403bfafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 139, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257bc1fafe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 140, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3b04fe8f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 141, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfa718f81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 142, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe0e81ea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 143, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f6bea9efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 144, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81749efe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 145, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea60fe53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 146, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9ead53", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 147, "Pk1": "94767acd6089d743c3ff77995593b2b07a1872770248ded9677a5877ec817934998efcd79843a68256081bc3da8b26ef6a28721770256b89613e8cfbb9b20d0c", "Pr1": "d21ed31e4fbb0dd13cd1220151bd04514f0c024c30c334c0e4de151fec43d1d22c23db5eb1", "Pk2": "da13eb75929ab87b1bf40e70b6ab5c19d7d6adb756b78a064b6bfd96ba3ec1deaedd3ce8a76757c652ed30da9876bf3886e4ab2532257b3bfafe8f81ea9efe89", "Ss": "30acee6d14d95e4c016a2e8f1488a0c98bd2fe469bb32568f7bb6677e8d7483cd4b32d255f5236e09b554c801c2971561252b247c60c13d3660e4c7350e3554e", "status": "invalid_public_key2" }, { "Id": 148, "Pk1": "", "Pr1": "", "Pk2": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "Ss": "", "status": "valid_public_key2", "comment": "Zero key should validate correctly" } ] }golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/dockers/000077500000000000000000000000001365325520100237725ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/dockers/debian-buster-aarch64/000077500000000000000000000000001365325520100277445ustar00rootroot00000000000000Dockerfile_1_13000066400000000000000000000005651365325520100324100ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/dockers/debian-buster-aarch64FROM multiarch/debian-debootstrap:arm64-buster RUN apt-get upgrade -y RUN apt-get update -qq USER root RUN apt-get install -y make wget ca-certificates RUN wget https://dl.google.com/go/go1.13.linux-arm64.tar.gz RUN tar -xzf go1.13.linux-arm64.tar.gz RUN mv go /usr/local/ RUN ln -s /usr/local/go/bin/go /usr/bin/ RUN rm -rf /var/lib/apt/lists/* go1.13.linux-arm64.tar.gz Dockerfile_1_14000066400000000000000000000005651365325520100324110ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/dockers/debian-buster-aarch64FROM multiarch/debian-debootstrap:arm64-buster RUN apt-get upgrade -y RUN apt-get update -qq USER root RUN apt-get install -y make wget ca-certificates RUN wget https://dl.google.com/go/go1.14.linux-arm64.tar.gz RUN tar -xzf go1.14.linux-arm64.tar.gz RUN mv go /usr/local/ RUN ln -s /usr/local/go/bin/go /usr/bin/ RUN rm -rf /var/lib/apt/lists/* go1.14.linux-arm64.tar.gz golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/etc/sliding_window_strat_calc.py000077500000000000000000000153431365325520100301420ustar00rootroot00000000000000#!/usr/bin/env python2 # Calculates (P-3)/4: Least significant bit is first # Configuration # kWindowSize and kP34 must be specified # # P434 #kP34 = [1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] # P503 #kP34 = [1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] # P751 kP34 = [1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] kWindowSize = 5 table_pow = [] table_mul = [] i=0 while i=len(kP34): break # Calculate length of a {1,0}, so that it starts & ends # with 1 and len() <= kWindowSize if kP34[i] == 1: # max string len is either 5 or len(kP34) if i+kWindowSize>=len(kP34): string_max_len = len(kP34)-i else: string_max_len = kWindowSize # look backward for first occurence of 1 tmp = i + string_max_len - 1 while tmp>=i: if kP34[tmp] == 1: break tmp = tmp - 1 e_string_len = tmp - i + 1 # calculate number from bit-string of size e_string_len tmp = 0 num = 0 for x in kP34[i:i+e_string_len]: num = num | (x << e_string_len - tmp - 1) tmp = tmp + 1 table_mul.append(num/2) # set new number of pow2k operations count_pow2k = count_pow2k + e_string_len # advance i i = i + e_string_len else: raise "Wrong number in kP34 at possition " % i table_pow.append(count_pow2k) print("POW: "); print(table_pow) print("MUL: "); print(table_mul) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/go.mod000066400000000000000000000001501365325520100226670ustar00rootroot00000000000000module github.com/henrydcase/nobs go 1.12 require golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/go.sum000066400000000000000000000003171365325520100227210ustar00rootroot00000000000000golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/000077500000000000000000000000001365325520100225105ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/000077500000000000000000000000001365325520100233465ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/doc.go000066400000000000000000000062021365325520100244420ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package sha3 implements the SHA-3 fixed-output-length hash functions and // the SHAKE variable-output-length hash functions defined by FIPS-202. // // Both types of hash function use the "sponge" construction and the Keccak // permutation. For a detailed specification see http://keccak.noekeon.org/ // // // Guidance // // If you aren't sure what function you need, use SHAKE256 with at least 64 // bytes of output. The SHAKE instances are faster than the SHA3 instances; // the latter have to allocate memory to conform to the hash.Hash interface. // // If you need a secret-key MAC (message authentication code), prepend the // secret key to the input, hash with SHAKE256 and read at least 32 bytes of // output. // // // Security strengths // // The SHA3-x (x equals 224, 256, 384, or 512) functions have a security // strength against preimage attacks of x bits. Since they only produce "x" // bits of output, their collision-resistance is only "x/2" bits. // // The SHAKE-256 and -128 functions have a generic security strength of 256 and // 128 bits against all attacks, provided that at least 2x bits of their output // is used. Requesting more than 64 or 32 bytes of output, respectively, does // not increase the collision-resistance of the SHAKE functions. // // // The sponge construction // // A sponge builds a pseudo-random function from a public pseudo-random // permutation, by applying the permutation to a state of "rate + capacity" // bytes, but hiding "capacity" of the bytes. // // A sponge starts out with a zero state. To hash an input using a sponge, up // to "rate" bytes of the input are XORed into the sponge's state. The sponge // is then "full" and the permutation is applied to "empty" it. This process is // repeated until all the input has been "absorbed". The input is then padded. // The digest is "squeezed" from the sponge in the same way, except that output // output is copied out instead of input being XORed in. // // A sponge is parameterized by its generic security strength, which is equal // to half its capacity; capacity + rate is equal to the permutation's width. // Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means // that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. // // // Recommendations // // The SHAKE functions are recommended for most new uses. They can produce // output of arbitrary length. SHAKE256, with an output length of at least // 64 bytes, provides 256-bit security against all attacks. The Keccak team // recommends it for most applications upgrading from SHA2-512. (NIST chose a // much stronger, but much slower, sponge instance for SHA3-512.) // // The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. // They produce output of the same length, with the same security strengths // against all attacks. This means, in particular, that SHA3-256 only has // 128-bit collision resistance, because its output length is 32 bytes. package sha3 // import "github.com/henrydcase/nobs/hash/sha3" golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/hashes.go000066400000000000000000000045571365325520100251630ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // This file provides functions for creating instances of the SHA-3 // and SHAKE hash functions, as well as utility functions for hashing // bytes. import ( "hash" ) // New224 creates a new SHA3-224 hash. // Its generic security strength is 224 bits against preimage attacks, // and 112 bits against collision attacks. func New224() hash.Hash { if h := new224Asm(); h != nil { return h } return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } // New256 creates a new SHA3-256 hash. // Its generic security strength is 256 bits against preimage attacks, // and 128 bits against collision attacks. func New256() hash.Hash { if h := new256Asm(); h != nil { return h } return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } // New384 creates a new SHA3-384 hash. // Its generic security strength is 384 bits against preimage attacks, // and 192 bits against collision attacks. func New384() hash.Hash { if h := new384Asm(); h != nil { return h } return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } // New512 creates a new SHA3-512 hash. // Its generic security strength is 512 bits against preimage attacks, // and 256 bits against collision attacks. func New512() hash.Hash { if h := new512Asm(); h != nil { return h } return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } // NewLegacyKeccak256 creates a new Keccak-256 hash. // // Only use this function if you require compatibility with an existing cryptosystem // that uses non-standard padding. All other users should use New256 instead. func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } // Sum224 returns the SHA3-224 digest of the data. func Sum224(data []byte) (digest [28]byte) { h := New224() h.Write(data) h.Sum(digest[:0]) return } // Sum256 returns the SHA3-256 digest of the data. func Sum256(data []byte) (digest [32]byte) { h := New256() h.Write(data) h.Sum(digest[:0]) return } // Sum384 returns the SHA3-384 digest of the data. func Sum384(data []byte) (digest [48]byte) { h := New384() h.Write(data) h.Sum(digest[:0]) return } // Sum512 returns the SHA3-512 digest of the data. func Sum512(data []byte) (digest [64]byte) { h := New512() h.Write(data) h.Sum(digest[:0]) return } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/hashes_generic.go000066400000000000000000000014521365325520100266460ustar00rootroot00000000000000// Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //+build gccgo appengine !s390x package sha3 import ( "hash" ) // new224Asm returns an assembly implementation of SHA3-224 if available, // otherwise it returns nil. func new224Asm() hash.Hash { return nil } // new256Asm returns an assembly implementation of SHA3-256 if available, // otherwise it returns nil. func new256Asm() hash.Hash { return nil } // new384Asm returns an assembly implementation of SHA3-384 if available, // otherwise it returns nil. func new384Asm() hash.Hash { return nil } // new512Asm returns an assembly implementation of SHA3-512 if available, // otherwise it returns nil. func new512Asm() hash.Hash { return nil } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/keccakf.go000066400000000000000000000233431365325520100252710ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64 appengine gccgo package sha3 // rc stores the round constants for use in the ι step. var rc = [24]uint64{ 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008, } // keccakF1600 applies the Keccak permutation to a 1600b-wide // state represented as a slice of 25 uint64s. func keccakF1600(a *[25]uint64) { // Implementation translated from Keccak-inplace.c // in the keccak reference code. var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 for i := 0; i < 24; i += 4 { // Combines the 5 steps in each round into 2 steps. // Unrolls 4 rounds per loop and spreads some steps across rounds. // Round 1 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[6] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[12] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[18] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[24] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] a[6] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[16] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[22] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[3] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[10] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[1] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[7] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[19] ^ d4 bc3 = t<<8 | t>>(64-8) a[20] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[11] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[23] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[4] ^ d4 bc0 = t<<27 | t>>(64-27) a[5] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[2] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[8] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[14] ^ d4 bc2 = t<<39 | t>>(64-39) a[15] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) // Round 2 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[16] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[7] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[23] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[14] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] a[16] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[11] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[2] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[18] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[20] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[6] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[22] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[4] ^ d4 bc3 = t<<8 | t>>(64-8) a[15] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[1] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[8] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[24] ^ d4 bc0 = t<<27 | t>>(64-27) a[10] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[12] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[3] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[19] ^ d4 bc2 = t<<39 | t>>(64-39) a[5] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) // Round 3 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[11] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[22] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[8] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[19] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] a[11] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[1] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[12] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[23] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[15] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[16] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[2] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[24] ^ d4 bc3 = t<<8 | t>>(64-8) a[5] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[6] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[3] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[14] ^ d4 bc0 = t<<27 | t>>(64-27) a[20] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[7] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[18] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[4] ^ d4 bc2 = t<<39 | t>>(64-39) a[10] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) // Round 4 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[1] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[2] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[3] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[4] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] a[1] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[6] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[7] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[8] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[5] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[11] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[12] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[14] ^ d4 bc3 = t<<8 | t>>(64-8) a[10] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[16] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[18] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[19] ^ d4 bc0 = t<<27 | t>>(64-27) a[15] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[22] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[23] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[24] ^ d4 bc2 = t<<39 | t>>(64-39) a[20] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/keccakf_amd64.go000066400000000000000000000004651365325520100262640ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo package sha3 // This function is implemented in keccakf_amd64.s. //go:noescape func keccakF1600(a *[25]uint64) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/keccakf_amd64.s000066400000000000000000000342561365325520100261260ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo // This code was translated into a form compatible with 6a from the public // domain sources at https://github.com/gvanas/KeccakCodePackage // Offsets in state #define _ba (0*8) #define _be (1*8) #define _bi (2*8) #define _bo (3*8) #define _bu (4*8) #define _ga (5*8) #define _ge (6*8) #define _gi (7*8) #define _go (8*8) #define _gu (9*8) #define _ka (10*8) #define _ke (11*8) #define _ki (12*8) #define _ko (13*8) #define _ku (14*8) #define _ma (15*8) #define _me (16*8) #define _mi (17*8) #define _mo (18*8) #define _mu (19*8) #define _sa (20*8) #define _se (21*8) #define _si (22*8) #define _so (23*8) #define _su (24*8) // Temporary registers #define rT1 AX // Round vars #define rpState DI #define rpStack SP #define rDa BX #define rDe CX #define rDi DX #define rDo R8 #define rDu R9 #define rBa R10 #define rBe R11 #define rBi R12 #define rBo R13 #define rBu R14 #define rCa SI #define rCe BP #define rCi rBi #define rCo rBo #define rCu R15 #define MOVQ_RBI_RCE MOVQ rBi, rCe #define XORQ_RT1_RCA XORQ rT1, rCa #define XORQ_RT1_RCE XORQ rT1, rCe #define XORQ_RBA_RCU XORQ rBa, rCu #define XORQ_RBE_RCU XORQ rBe, rCu #define XORQ_RDU_RCU XORQ rDu, rCu #define XORQ_RDA_RCA XORQ rDa, rCa #define XORQ_RDE_RCE XORQ rDe, rCe #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ /* Prepare round */ \ MOVQ rCe, rDa; \ ROLQ $1, rDa; \ \ MOVQ _bi(iState), rCi; \ XORQ _gi(iState), rDi; \ XORQ rCu, rDa; \ XORQ _ki(iState), rCi; \ XORQ _mi(iState), rDi; \ XORQ rDi, rCi; \ \ MOVQ rCi, rDe; \ ROLQ $1, rDe; \ \ MOVQ _bo(iState), rCo; \ XORQ _go(iState), rDo; \ XORQ rCa, rDe; \ XORQ _ko(iState), rCo; \ XORQ _mo(iState), rDo; \ XORQ rDo, rCo; \ \ MOVQ rCo, rDi; \ ROLQ $1, rDi; \ \ MOVQ rCu, rDo; \ XORQ rCe, rDi; \ ROLQ $1, rDo; \ \ MOVQ rCa, rDu; \ XORQ rCi, rDo; \ ROLQ $1, rDu; \ \ /* Result b */ \ MOVQ _ba(iState), rBa; \ MOVQ _ge(iState), rBe; \ XORQ rCo, rDu; \ MOVQ _ki(iState), rBi; \ MOVQ _mo(iState), rBo; \ MOVQ _su(iState), rBu; \ XORQ rDe, rBe; \ ROLQ $44, rBe; \ XORQ rDi, rBi; \ XORQ rDa, rBa; \ ROLQ $43, rBi; \ \ MOVQ rBe, rCa; \ MOVQ rc, rT1; \ ORQ rBi, rCa; \ XORQ rBa, rT1; \ XORQ rT1, rCa; \ MOVQ rCa, _ba(oState); \ \ XORQ rDu, rBu; \ ROLQ $14, rBu; \ MOVQ rBa, rCu; \ ANDQ rBe, rCu; \ XORQ rBu, rCu; \ MOVQ rCu, _bu(oState); \ \ XORQ rDo, rBo; \ ROLQ $21, rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _bi(oState); \ \ NOTQ rBi; \ ORQ rBa, rBu; \ ORQ rBo, rBi; \ XORQ rBo, rBu; \ XORQ rBe, rBi; \ MOVQ rBu, _bo(oState); \ MOVQ rBi, _be(oState); \ B_RBI_RCE; \ \ /* Result g */ \ MOVQ _gu(iState), rBe; \ XORQ rDu, rBe; \ MOVQ _ka(iState), rBi; \ ROLQ $20, rBe; \ XORQ rDa, rBi; \ ROLQ $3, rBi; \ MOVQ _bo(iState), rBa; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDo, rBa; \ MOVQ _me(iState), rBo; \ MOVQ _si(iState), rBu; \ ROLQ $28, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ga(oState); \ G_RT1_RCA; \ \ XORQ rDe, rBo; \ ROLQ $45, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ge(oState); \ G_RT1_RCE; \ \ XORQ rDi, rBu; \ ROLQ $61, rBu; \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _go(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _gu(oState); \ NOTQ rBu; \ G_RBA_RCU; \ \ ORQ rBu, rBo; \ XORQ rBi, rBo; \ MOVQ rBo, _gi(oState); \ \ /* Result k */ \ MOVQ _be(iState), rBa; \ MOVQ _gi(iState), rBe; \ MOVQ _ko(iState), rBi; \ MOVQ _mu(iState), rBo; \ MOVQ _sa(iState), rBu; \ XORQ rDi, rBe; \ ROLQ $6, rBe; \ XORQ rDo, rBi; \ ROLQ $25, rBi; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDe, rBa; \ ROLQ $1, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ka(oState); \ K_RT1_RCA; \ \ XORQ rDu, rBo; \ ROLQ $8, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ke(oState); \ K_RT1_RCE; \ \ XORQ rDa, rBu; \ ROLQ $18, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _ki(oState); \ \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _ko(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _ku(oState); \ K_RBA_RCU; \ \ /* Result m */ \ MOVQ _ga(iState), rBe; \ XORQ rDa, rBe; \ MOVQ _ke(iState), rBi; \ ROLQ $36, rBe; \ XORQ rDe, rBi; \ MOVQ _bu(iState), rBa; \ ROLQ $10, rBi; \ MOVQ rBe, rT1; \ MOVQ _mi(iState), rBo; \ ANDQ rBi, rT1; \ XORQ rDu, rBa; \ MOVQ _so(iState), rBu; \ ROLQ $27, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ma(oState); \ M_RT1_RCA; \ \ XORQ rDi, rBo; \ ROLQ $15, rBo; \ MOVQ rBi, rT1; \ ORQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _me(oState); \ M_RT1_RCE; \ \ XORQ rDo, rBu; \ ROLQ $56, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ORQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _mi(oState); \ \ ORQ rBa, rBe; \ XORQ rBu, rBe; \ MOVQ rBe, _mu(oState); \ \ ANDQ rBa, rBu; \ XORQ rBo, rBu; \ MOVQ rBu, _mo(oState); \ M_RBE_RCU; \ \ /* Result s */ \ MOVQ _bi(iState), rBa; \ MOVQ _go(iState), rBe; \ MOVQ _ku(iState), rBi; \ XORQ rDi, rBa; \ MOVQ _ma(iState), rBo; \ ROLQ $62, rBa; \ XORQ rDo, rBe; \ MOVQ _se(iState), rBu; \ ROLQ $55, rBe; \ \ XORQ rDu, rBi; \ MOVQ rBa, rDu; \ XORQ rDe, rBu; \ ROLQ $2, rBu; \ ANDQ rBe, rDu; \ XORQ rBu, rDu; \ MOVQ rDu, _su(oState); \ \ ROLQ $39, rBi; \ S_RDU_RCU; \ NOTQ rBe; \ XORQ rDa, rBo; \ MOVQ rBe, rDa; \ ANDQ rBi, rDa; \ XORQ rBa, rDa; \ MOVQ rDa, _sa(oState); \ S_RDA_RCA; \ \ ROLQ $41, rBo; \ MOVQ rBi, rDe; \ ORQ rBo, rDe; \ XORQ rBe, rDe; \ MOVQ rDe, _se(oState); \ S_RDE_RCE; \ \ MOVQ rBo, rDi; \ MOVQ rBu, rDo; \ ANDQ rBu, rDi; \ ORQ rBa, rDo; \ XORQ rBi, rDi; \ XORQ rBo, rDo; \ MOVQ rDi, _si(oState); \ MOVQ rDo, _so(oState) \ // func keccakF1600(state *[25]uint64) TEXT ·keccakF1600(SB), 0, $200-8 MOVQ state+0(FP), rpState // Convert the user state into an internal state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) // Execute the KeccakF permutation MOVQ _ba(rpState), rCa MOVQ _be(rpState), rCe MOVQ _bu(rpState), rCu XORQ _ga(rpState), rCa XORQ _ge(rpState), rCe XORQ _gu(rpState), rCu XORQ _ka(rpState), rCa XORQ _ke(rpState), rCe XORQ _ku(rpState), rCu XORQ _ma(rpState), rCa XORQ _me(rpState), rCe XORQ _mu(rpState), rCu XORQ _sa(rpState), rCa XORQ _se(rpState), rCe MOVQ _si(rpState), rDi MOVQ _so(rpState), rDo XORQ _su(rpState), rCu mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) // Revert the internal state to the user state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/register.go000066400000000000000000000006351365325520100255250ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build go1.4 package sha3 import ( "crypto" ) func init() { crypto.RegisterHash(crypto.SHA3_224, New224) crypto.RegisterHash(crypto.SHA3_256, New256) crypto.RegisterHash(crypto.SHA3_384, New384) crypto.RegisterHash(crypto.SHA3_512, New512) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/sha3.go000066400000000000000000000131531365325520100245360ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // spongeDirection indicates the direction bytes are flowing through the sponge. type spongeDirection int const ( // spongeAbsorbing indicates that the sponge is absorbing input. spongeAbsorbing spongeDirection = iota // spongeSqueezing indicates that the sponge is being squeezed. spongeSqueezing ) const ( // maxRate is the maximum size of the internal buffer. SHAKE-256 // currently needs the largest buffer. maxRate = 168 ) type state struct { // Generic sponge components. a [25]uint64 // main state of the hash buf []byte // points into storage rate int // the number of bytes of state to use // dsbyte contains the "domain separation" bits and the first bit of // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the // SHA-3 and SHAKE functions by appending bitstrings to the message. // Using a little-endian bit-ordering convention, these are "01" for SHA-3 // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the // padding rule from section 5.1 is applied to pad the message to a multiple // of the rate, which involves adding a "1" bit, zero or more "0" bits, and // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, // giving 00000110b (0x06) and 00011111b (0x1f). // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and // Extendable-Output Functions (May 2014)" dsbyte byte storage [maxRate]byte // Specific to SHA-3 and SHAKE. outputLen int // the default output size in bytes state spongeDirection // whether the sponge is absorbing or squeezing } // BlockSize returns the rate of sponge underlying this hash function. func (d *state) BlockSize() int { return d.rate } // Size returns the output size of the hash function in bytes. func (d *state) Size() int { return d.outputLen } // Reset clears the internal state by zeroing the sponge state and // the byte buffer, and setting Sponge.state to absorbing. func (d *state) Reset() { // Zero the permutation's state. for i := range d.a { d.a[i] = 0 } d.state = spongeAbsorbing d.buf = d.storage[:0] } func (d *state) clone() *state { ret := *d if ret.state == spongeAbsorbing { ret.buf = ret.storage[:len(ret.buf)] } else { ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate] } return &ret } // permute applies the KeccakF-1600 permutation. It handles // any input-output buffering. func (d *state) permute() { switch d.state { case spongeAbsorbing: // If we're absorbing, we need to xor the input into the state // before applying the permutation. xorIn(d, d.buf) d.buf = d.storage[:0] keccakF1600(&d.a) case spongeSqueezing: // If we're squeezing, we need to apply the permutatin before // copying more output. keccakF1600(&d.a) d.buf = d.storage[:d.rate] copyOut(d, d.buf) } } // pads appends the domain separation bits in dsbyte, applies // the multi-bitrate 10..1 padding rule, and permutes the state. func (d *state) padAndPermute(dsbyte byte) { if d.buf == nil { d.buf = d.storage[:0] } // Pad with this instance's domain-separator bits. We know that there's // at least one byte of space in d.buf because, if it were full, // permute would have been called to empty it. dsbyte also contains the // first one bit for the padding. See the comment in the state struct. d.buf = append(d.buf, dsbyte) zerosStart := len(d.buf) d.buf = d.storage[:d.rate] for i := zerosStart; i < d.rate; i++ { d.buf[i] = 0 } // This adds the final one bit for the padding. Because of the way that // bits are numbered from the LSB upwards, the final bit is the MSB of // the last byte. d.buf[d.rate-1] ^= 0x80 // Apply the permutation d.permute() d.state = spongeSqueezing d.buf = d.storage[:d.rate] copyOut(d, d.buf) } // Write absorbs more data into the hash's state. It produces an error // if more data is written to the ShakeHash after writing func (d *state) Write(p []byte) (written int, err error) { if d.state != spongeAbsorbing { panic("sha3: write to sponge after read") } if d.buf == nil { d.buf = d.storage[:0] } written = len(p) for len(p) > 0 { if len(d.buf) == 0 && len(p) >= d.rate { // The fast path; absorb a full "rate" bytes of input and apply the permutation. xorIn(d, p[:d.rate]) p = p[d.rate:] keccakF1600(&d.a) } else { // The slow path; buffer the input until we can fill the sponge, and then xor it in. todo := d.rate - len(d.buf) if todo > len(p) { todo = len(p) } d.buf = append(d.buf, p[:todo]...) p = p[todo:] // If the sponge is full, apply the permutation. if len(d.buf) == d.rate { d.permute() } } } return } // Read squeezes an arbitrary number of bytes from the sponge. func (d *state) Read(out []byte) (n int, err error) { // If we're still absorbing, pad and apply the permutation. if d.state == spongeAbsorbing { d.padAndPermute(d.dsbyte) } n = len(out) // Now, do the squeezing. for len(out) > 0 { n := copy(out, d.buf) d.buf = d.buf[n:] out = out[n:] // Apply the permutation if we've squeezed the sponge dry. if len(d.buf) == 0 { d.permute() } } return } // Sum applies padding to the hash state and then squeezes out the desired // number of output bytes. func (d *state) Sum(in []byte) []byte { // Make a copy of the original hash so that caller can keep writing // and summing. dup := d.clone() hash := make([]byte, dup.outputLen) dup.Read(hash) return append(in, hash...) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/sha3_s390x.go000066400000000000000000000157361365325520100255150ustar00rootroot00000000000000// Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //+build !gccgo,!appengine package sha3 // This file contains code for using the 'compute intermediate // message digest' (KIMD) and 'compute last message digest' (KLMD) // instructions to compute SHA-3 and SHAKE hashes on IBM Z. import ( "hash" ) // codes represent 7-bit KIMD/KLMD function codes as defined in // the Principles of Operation. type code uint64 const ( // function codes for KIMD/KLMD sha3_224 code = 32 sha3_256 = 33 sha3_384 = 34 sha3_512 = 35 shake_128 = 36 shake_256 = 37 nopad = 0x100 ) // hasMSA6 reports whether the machine supports the SHA-3 and SHAKE function // codes, as defined in message-security-assist extension 6. func hasMSA6() bool // hasAsm caches the result of hasMSA6 (which might be expensive to call). var hasAsm = hasMSA6() // kimd is a wrapper for the 'compute intermediate message digest' instruction. // src must be a multiple of the rate for the given function code. //go:noescape func kimd(function code, chain *[200]byte, src []byte) // klmd is a wrapper for the 'compute last message digest' instruction. // src padding is handled by the instruction. //go:noescape func klmd(function code, chain *[200]byte, dst, src []byte) type asmState struct { a [200]byte // 1600 bit state buf []byte // care must be taken to ensure cap(buf) is a multiple of rate rate int // equivalent to block size storage [3072]byte // underlying storage for buf outputLen int // output length if fixed, 0 if not function code // KIMD/KLMD function code state spongeDirection // whether the sponge is absorbing or squeezing } func newAsmState(function code) *asmState { var s asmState s.function = function switch function { case sha3_224: s.rate = 144 s.outputLen = 28 case sha3_256: s.rate = 136 s.outputLen = 32 case sha3_384: s.rate = 104 s.outputLen = 48 case sha3_512: s.rate = 72 s.outputLen = 64 case shake_128: s.rate = 168 case shake_256: s.rate = 136 default: panic("sha3: unrecognized function code") } // limit s.buf size to a multiple of s.rate s.resetBuf() return &s } func (s *asmState) clone() *asmState { c := *s c.buf = c.storage[:len(s.buf):cap(s.buf)] return &c } // copyIntoBuf copies b into buf. It will panic if there is not enough space to // store all of b. func (s *asmState) copyIntoBuf(b []byte) { bufLen := len(s.buf) s.buf = s.buf[:len(s.buf)+len(b)] copy(s.buf[bufLen:], b) } // resetBuf points buf at storage, sets the length to 0 and sets cap to be a // multiple of the rate. func (s *asmState) resetBuf() { max := (cap(s.storage) / s.rate) * s.rate s.buf = s.storage[:0:max] } // Write (via the embedded io.Writer interface) adds more data to the running hash. // It never returns an error. func (s *asmState) Write(b []byte) (int, error) { if s.state != spongeAbsorbing { panic("sha3: write to sponge after read") } length := len(b) for len(b) > 0 { if len(s.buf) == 0 && len(b) >= cap(s.buf) { // Hash the data directly and push any remaining bytes // into the buffer. remainder := len(s.buf) % s.rate kimd(s.function, &s.a, b[:len(b)-remainder]) if remainder != 0 { s.copyIntoBuf(b[len(b)-remainder:]) } return length, nil } if len(s.buf) == cap(s.buf) { // flush the buffer kimd(s.function, &s.a, s.buf) s.buf = s.buf[:0] } // copy as much as we can into the buffer n := len(b) if len(b) > cap(s.buf)-len(s.buf) { n = cap(s.buf) - len(s.buf) } s.copyIntoBuf(b[:n]) b = b[n:] } return length, nil } // Read squeezes an arbitrary number of bytes from the sponge. func (s *asmState) Read(out []byte) (n int, err error) { n = len(out) // need to pad if we were absorbing if s.state == spongeAbsorbing { s.state = spongeSqueezing // write hash directly into out if possible if len(out)%s.rate == 0 { klmd(s.function, &s.a, out, s.buf) // len(out) may be 0 s.buf = s.buf[:0] return } // write hash into buffer max := cap(s.buf) if max > len(out) { max = (len(out)/s.rate)*s.rate + s.rate } klmd(s.function, &s.a, s.buf[:max], s.buf) s.buf = s.buf[:max] } for len(out) > 0 { // flush the buffer if len(s.buf) != 0 { c := copy(out, s.buf) out = out[c:] s.buf = s.buf[c:] continue } // write hash directly into out if possible if len(out)%s.rate == 0 { klmd(s.function|nopad, &s.a, out, nil) return } // write hash into buffer s.resetBuf() if cap(s.buf) > len(out) { s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] } klmd(s.function|nopad, &s.a, s.buf, nil) } return } // Sum appends the current hash to b and returns the resulting slice. // It does not change the underlying hash state. func (s *asmState) Sum(b []byte) []byte { if s.outputLen == 0 { panic("sha3: cannot call Sum on SHAKE functions") } // Copy the state to preserve the original. a := s.a // Hash the buffer. Note that we don't clear it because we // aren't updating the state. klmd(s.function, &a, nil, s.buf) return append(b, a[:s.outputLen]...) } // Reset resets the Hash to its initial state. func (s *asmState) Reset() { for i := range s.a { s.a[i] = 0 } s.resetBuf() s.state = spongeAbsorbing } // Size returns the number of bytes Sum will return. func (s *asmState) Size() int { return s.outputLen } // BlockSize returns the hash's underlying block size. // The Write method must be able to accept any amount // of data, but it may operate more efficiently if all writes // are a multiple of the block size. func (s *asmState) BlockSize() int { return s.rate } // Clone returns a copy of the ShakeHash in its current state. func (s *asmState) Clone() ShakeHash { return s.clone() } // new224Asm returns an assembly implementation of SHA3-224 if available, // otherwise it returns nil. func new224Asm() hash.Hash { if hasAsm { return newAsmState(sha3_224) } return nil } // new256Asm returns an assembly implementation of SHA3-256 if available, // otherwise it returns nil. func new256Asm() hash.Hash { if hasAsm { return newAsmState(sha3_256) } return nil } // new384Asm returns an assembly implementation of SHA3-384 if available, // otherwise it returns nil. func new384Asm() hash.Hash { if hasAsm { return newAsmState(sha3_384) } return nil } // new512Asm returns an assembly implementation of SHA3-512 if available, // otherwise it returns nil. func new512Asm() hash.Hash { if hasAsm { return newAsmState(sha3_512) } return nil } // newShake128Asm returns an assembly implementation of SHAKE-128 if available, // otherwise it returns nil. func newShake128Asm() ShakeHash { if hasAsm { return newAsmState(shake_128) } return nil } // newShake256Asm returns an assembly implementation of SHAKE-256 if available, // otherwise it returns nil. func newShake256Asm() ShakeHash { if hasAsm { return newAsmState(shake_256) } return nil } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/sha3_s390x.s000066400000000000000000000024351365325520100253420ustar00rootroot00000000000000// Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //+build !gccgo,!appengine #include "textflag.h" TEXT ·hasMSA6(SB), NOSPLIT, $16-1 MOVD $0, R0 // KIMD-Query function code MOVD $tmp-16(SP), R1 // parameter block XC $16, (R1), (R1) // clear the parameter block WORD $0xB93E0002 // KIMD --, -- WORD $0x91FC1004 // TM 4(R1), 0xFC (test bits [32-37]) BVS yes no: MOVB $0, ret+0(FP) RET yes: MOVB $1, ret+0(FP) RET // func kimd(function code, params *[200]byte, src []byte) TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 MOVD function+0(FP), R0 MOVD params+8(FP), R1 LMG src+16(FP), R2, R3 // R2=base, R3=len continue: WORD $0xB93E0002 // KIMD --, R2 BVS continue // continue if interrupted MOVD $0, R0 // reset R0 for pre-go1.8 compilers RET // func klmd(function code, params *[200]byte, dst, src []byte) TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 // TODO: SHAKE support MOVD function+0(FP), R0 MOVD params+8(FP), R1 LMG dst+16(FP), R2, R3 // R2=base, R3=len LMG src+40(FP), R4, R5 // R4=base, R5=len continue: WORD $0xB93F0024 // KLMD R2, R4 BVS continue // continue if interrupted MOVD $0, R0 // reset R0 for pre-go1.8 compilers RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/sha3_test.go000066400000000000000000000324621365325520100256010ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // Tests include all the ShortMsgKATs provided by the Keccak team at // https://github.com/gvanas/KeccakCodePackage // // They only include the zero-bit case of the bitwise testvectors // published by NIST in the draft of FIPS-202. import ( "bytes" "compress/flate" "encoding/hex" "encoding/json" "fmt" "hash" "os" "strings" "testing" ) const ( testString = "brekeccakkeccak koax koax" katFilename = "testdata/keccakKats.json.deflate" ) // testDigests contains functions returning hash.Hash instances // with output-length equal to the KAT length for SHA-3, Keccak // and SHAKE instances. var testDigests = map[string]func() hash.Hash{ "SHA3-224": New224, "SHA3-256": New256, "SHA3-384": New384, "SHA3-512": New512, "Keccak-256": NewLegacyKeccak256, } // testShakes contains functions that return sha3.ShakeHash instances for // with output-length equal to the KAT length. var testShakes = map[string]struct { constructor func(N []byte, S []byte) ShakeHash defAlgoName string defCustomStr string }{ // NewCShake without customization produces same result as SHAKE "SHAKE128": {NewCShake128, "", ""}, "SHAKE256": {NewCShake256, "", ""}, "cSHAKE128": {NewCShake128, "CSHAKE128", "CustomStrign"}, "cSHAKE256": {NewCShake256, "CSHAKE256", "CustomStrign"}, } // decodeHex converts a hex-encoded string into a raw byte string. func decodeHex(s string) []byte { b, err := hex.DecodeString(s) if err != nil { panic(err) } return b } // structs used to marshal JSON test-cases. type KeccakKats struct { Kats map[string][]struct { Digest string `json:"digest"` Length int64 `json:"length"` Message string `json:"message"` // Defined only for cSHAKE N string `json:"N"` S string `json:"S"` } } func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) { xorInOrig, copyOutOrig := xorIn, copyOut xorIn, copyOut = xorInGeneric, copyOutGeneric testf("generic") if xorImplementationUnaligned != "generic" { xorIn, copyOut = xorInUnaligned, copyOutUnaligned testf("unaligned") } xorIn, copyOut = xorInOrig, copyOutOrig } // TestKeccakKats tests the SHA-3 and Shake implementations against all the // ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage // (The testvectors are stored in keccakKats.json.deflate due to their length.) func TestKeccakKats(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { // Read the KATs. deflated, err := os.Open(katFilename) if err != nil { t.Errorf("error opening %s: %s", katFilename, err) } file := flate.NewReader(deflated) dec := json.NewDecoder(file) var katSet KeccakKats err = dec.Decode(&katSet) if err != nil { t.Errorf("error decoding KATs: %s", err) } for algo, function := range testDigests { d := function() for _, kat := range katSet.Kats[algo] { d.Reset() in, err := hex.DecodeString(kat.Message) if err != nil { t.Errorf("error decoding KAT: %s", err) } d.Write(in[:kat.Length/8]) got := strings.ToUpper(hex.EncodeToString(d.Sum(nil))) if got != kat.Digest { t.Errorf("function=%s, implementation=%s, length=%d\nmessage:\n %s\ngot:\n %s\nwanted:\n %s", algo, impl, kat.Length, kat.Message, got, kat.Digest) t.Logf("wanted %+v", kat) t.FailNow() } continue } } for algo, v := range testShakes { for _, kat := range katSet.Kats[algo] { N, err := hex.DecodeString(kat.N) if err != nil { t.Errorf("error decoding KAT: %s", err) } S, err := hex.DecodeString(kat.S) if err != nil { t.Errorf("error decoding KAT: %s", err) } d := v.constructor(N, S) in, err := hex.DecodeString(kat.Message) if err != nil { t.Errorf("error decoding KAT: %s", err) } d.Write(in[:kat.Length/8]) out := make([]byte, len(kat.Digest)/2) d.Read(out) got := strings.ToUpper(hex.EncodeToString(out)) if got != kat.Digest { t.Errorf("function=%s, implementation=%s, length=%d N:%s\n S:%s\nmessage:\n %s \ngot:\n %s\nwanted:\n %s", algo, impl, kat.Length, kat.N, kat.S, kat.Message, got, kat.Digest) t.Logf("wanted %+v", kat) t.FailNow() } continue } } }) } // TestKeccak does a basic test of the non-standardized Keccak hash functions. func TestKeccak(t *testing.T) { tests := []struct { fn func() hash.Hash data []byte want string }{ { NewLegacyKeccak256, []byte("abc"), "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", }, } for _, u := range tests { h := u.fn() h.Write(u.data) got := h.Sum(nil) want := decodeHex(u.want) if !bytes.Equal(got, want) { t.Errorf("unexpected hash for size %d: got '%x' want '%s'", h.Size()*8, got, u.want) } } } // TestUnalignedWrite tests that writing data in an arbitrary pattern with // small input buffers. func TestUnalignedWrite(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { buf := sequentialBytes(0x10000) for alg, df := range testDigests { d := df() d.Reset() d.Write(buf) want := d.Sum(nil) d.Reset() for i := 0; i < len(buf); { // Cycle through offsets which make a 137 byte sequence. // Because 137 is prime this sequence should exercise all corner cases. offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} for _, j := range offsets { if v := len(buf) - i; v < j { j = v } d.Write(buf[i : i+j]) i += j } } got := d.Sum(nil) if !bytes.Equal(got, want) { t.Errorf("Unaligned writes, implementation=%s, alg=%s\ngot %q, want %q", impl, alg, got, want) } } // Same for SHAKE for alg, df := range testShakes { want := make([]byte, 16) got := make([]byte, 16) d := df.constructor([]byte(df.defAlgoName), []byte(df.defCustomStr)) d.Reset() d.Write(buf) d.Read(want) d.Reset() for i := 0; i < len(buf); { // Cycle through offsets which make a 137 byte sequence. // Because 137 is prime this sequence should exercise all corner cases. offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} for _, j := range offsets { if v := len(buf) - i; v < j { j = v } d.Write(buf[i : i+j]) i += j } } d.Read(got) if !bytes.Equal(got, want) { t.Errorf("Unaligned writes, implementation=%s, alg=%s\ngot %q, want %q", impl, alg, got, want) } } }) } // TestAppend checks that appending works when reallocation is necessary. func TestAppend(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { d := New224() for capacity := 2; capacity <= 66; capacity += 64 { // The first time around the loop, Sum will have to reallocate. // The second time, it will not. buf := make([]byte, 2, capacity) d.Reset() d.Write([]byte{0xcc}) buf = d.Sum(buf) expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("got %s, want %s", got, expected) } } }) } // TestAppendNoRealloc tests that appending works when no reallocation is necessary. func TestAppendNoRealloc(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { buf := make([]byte, 1, 200) d := New224() d.Write([]byte{0xcc}) buf = d.Sum(buf) expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("%s: got %s, want %s", impl, got, expected) } }) } // TestSqueezing checks that squeezing the full output a single time produces // the same output as repeatedly squeezing the instance. func TestSqueezing(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { for algo, v := range testShakes { d0 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) d0.Write([]byte(testString)) ref := make([]byte, 32) d0.Read(ref) d1 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) d1.Write([]byte(testString)) var multiple []byte for range ref { one := make([]byte, 1) d1.Read(one) multiple = append(multiple, one...) } if !bytes.Equal(ref, multiple) { t.Errorf("%s (%s): squeezing %d bytes one at a time failed", algo, impl, len(ref)) } } }) } // sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing. func sequentialBytes(size int) []byte { result := make([]byte, size) for i := range result { result[i] = byte(i) } return result } func TestReset(t *testing.T) { out1 := make([]byte, 32) out2 := make([]byte, 32) for _, v := range testShakes { // Calculate hash for the first time c := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) c.Write(sequentialBytes(0x100)) c.Read(out1) // Calculate hash again c.Reset() c.Write(sequentialBytes(0x100)) c.Read(out2) if !bytes.Equal(out1, out2) { t.Error("\nExpected:\n", out1, "\ngot:\n", out2) } } } func TestClone(t *testing.T) { out1 := make([]byte, 16) out2 := make([]byte, 16) in := sequentialBytes(0x100) for _, v := range testShakes { h1 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) h1.Write([]byte{0x01}) h2 := h1.Clone() h1.Write(in) h1.Read(out1) h2.Write(in) h2.Read(out2) if !bytes.Equal(out1, out2) { t.Error("\nExpected:\n", hex.EncodeToString(out1), "\ngot:\n", hex.EncodeToString(out2)) } } } // BenchmarkPermutationFunction measures the speed of the permutation function // with no input data. func BenchmarkPermutationFunction(b *testing.B) { b.SetBytes(int64(200)) var lanes [25]uint64 for i := 0; i < b.N; i++ { keccakF1600(&lanes) } } // benchmarkHash tests the speed to hash num buffers of buflen each. func benchmarkHash(b *testing.B, h hash.Hash, size, num int) { b.StopTimer() h.Reset() data := sequentialBytes(size) b.SetBytes(int64(size * num)) b.StartTimer() var state []byte for i := 0; i < b.N; i++ { for j := 0; j < num; j++ { h.Write(data) } state = h.Sum(state[:0]) } b.StopTimer() h.Reset() } // benchmarkShake is specialized to the Shake instances, which don't // require a copy on reading output. func benchmarkShake(b *testing.B, h ShakeHash, size, num int) { b.StopTimer() h.Reset() data := sequentialBytes(size) d := make([]byte, 32) b.SetBytes(int64(size * num)) b.StartTimer() for i := 0; i < b.N; i++ { h.Reset() for j := 0; j < num; j++ { h.Write(data) } h.Read(d) } } func BenchmarkSha3_512_MTU(b *testing.B) { benchmarkHash(b, New512(), 1350, 1) } func BenchmarkSha3_384_MTU(b *testing.B) { benchmarkHash(b, New384(), 1350, 1) } func BenchmarkSha3_256_MTU(b *testing.B) { benchmarkHash(b, New256(), 1350, 1) } func BenchmarkSha3_224_MTU(b *testing.B) { benchmarkHash(b, New224(), 1350, 1) } func BenchmarkShake128_MTU(b *testing.B) { benchmarkShake(b, NewShake128(), 1350, 1) } func BenchmarkShake256_MTU(b *testing.B) { benchmarkShake(b, NewShake256(), 1350, 1) } func BenchmarkShake256_16x(b *testing.B) { benchmarkShake(b, NewShake256(), 16, 1024) } func BenchmarkShake256_1MiB(b *testing.B) { benchmarkShake(b, NewShake256(), 1024, 1024) } func BenchmarkSha3_512_1MiB(b *testing.B) { benchmarkHash(b, New512(), 1024, 1024) } func Example_sum() { buf := []byte("some data to hash") // A hash needs to be 64 bytes long to have 256-bit collision resistance. h := make([]byte, 64) // Compute a 64-byte hash of buf and put it in h. ShakeSum256(h, buf) fmt.Printf("%x\n", h) // Output: 0f65fe41fc353e52c55667bb9e2b27bfcc8476f2c413e9437d272ee3194a4e3146d05ec04a25d16b8f577c19b82d16b1424c3e022e783d2b4da98de3658d363d } func Example_mac() { k := []byte("this is a secret key; you should generate a strong random key that's at least 32 bytes long") buf := []byte("and this is some data to authenticate") // A MAC with 32 bytes of output has 256-bit security strength -- if you use at least a 32-byte-long key. h := make([]byte, 32) d := NewShake256() // Write the key into the hash. d.Write(k) // Now write the data. d.Write(buf) // Read 32 bytes of output from the hash into h. d.Read(h) fmt.Printf("%x\n", h) // Output: 78de2974bd2711d5549ffd32b753ef0f5fa80a0db2556db60f0987eb8a9218ff } func ExampleCShake256() { out := make([]byte, 32) msg := []byte("The quick brown fox jumps over the lazy dog") // Example 1: Simple cshake c1 := NewCShake256([]byte("NAME"), []byte("Partition1")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 2: Different customization string produces different digest c1 = NewCShake256([]byte("NAME"), []byte("Partition2")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 3: Different output length produces different digest out = make([]byte, 64) c1 = NewCShake256([]byte("NAME"), []byte("Partition1")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 4: Next read produces different result c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Output: //a90a4c6ca9af2156eba43dc8398279e6b60dcd56fb21837afe6c308fd4ceb05b //a8db03e71f3e4da5c4eee9d28333cdd355f51cef3c567e59be5beb4ecdbb28f0 //a90a4c6ca9af2156eba43dc8398279e6b60dcd56fb21837afe6c308fd4ceb05b9dd98c6ee866ca7dc5a39d53e960f400bcd5a19c8a2d6ec6459f63696543a0d8 //85e73a72228d08b46515553ca3a29d47df3047e5d84b12d6c2c63e579f4fd1105716b7838e92e981863907f434bfd4443c9e56ea09da998d2f9b47db71988109 } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/shake.go000066400000000000000000000124541365325520100247760ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 // This file defines the ShakeHash interface, and provides // functions for creating SHAKE and cSHAKE instances, as well as utility // functions for hashing bytes to arbitrary-length output. // // // SHAKE implementation is based on FIPS PUB 202 [1] // cSHAKE implementations is based on NIST SP 800-185 [2] // // [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf // [2] https://doi.org/10.6028/NIST.SP.800-185 import ( "encoding/binary" "io" ) // ShakeHash defines the interface to hash functions that // support arbitrary-length output. type ShakeHash interface { // Write absorbs more data into the hash's state. It panics if input is // written to it after output has been read from it. io.Writer // Read reads more output from the hash; reading affects the hash's // state. (ShakeHash.Read is thus very different from Hash.Sum) // It never returns an error. io.Reader // Clone returns a copy of the ShakeHash in its current state. Clone() ShakeHash // Reset resets the ShakeHash to its initial state. Reset() } // cSHAKE specific context type cshakeState struct { state // SHA-3 state context and Read/Write operations // initBlock is the cSHAKE specific initialization set of bytes. It is initialized // by newCShake function and stores concatenation of N followed by S, encoded // by the method specified in 3.3 of [1]. // It is stored here in order for Reset() to be able to put context into // initial state. initBlock []byte } // Consts for configuring initial SHA-3 state const ( dsbyteShake = 0x1f dsbyteCShake = 0x04 rate128 = 168 rate256 = 136 ) func bytepad(input []byte, w int) []byte { // leftEncode always returns max 9 bytes buf := make([]byte, 0, 9+len(input)+w) buf = append(buf, leftEncode(uint64(w))...) buf = append(buf, input...) padlen := w - (len(buf) % w) return append(buf, make([]byte, padlen)...) } func leftEncode(value uint64) []byte { var b [9]byte binary.BigEndian.PutUint64(b[1:], value) // Trim all but last leading zero bytes i := byte(1) for i < 8 && b[i] == 0 { i++ } // Prepend number of encoded bytes b[i-1] = 9 - i return b[i-1:] } func newCShake(N, S []byte, rate int, dsbyte byte) ShakeHash { c := cshakeState{state: state{rate: rate, dsbyte: dsbyte}} // leftEncode returns max 9 bytes c.initBlock = make([]byte, 0, 9*2+len(N)+len(S)) c.initBlock = append(c.initBlock, leftEncode(uint64(len(N)*8))...) c.initBlock = append(c.initBlock, N...) c.initBlock = append(c.initBlock, leftEncode(uint64(len(S)*8))...) c.initBlock = append(c.initBlock, S...) c.Write(bytepad(c.initBlock, c.rate)) return &c } // Reset resets the hash to initial state. func (c *cshakeState) Reset() { c.state.Reset() c.Write(bytepad(c.initBlock, c.rate)) } // Clone returns copy of a cSHAKE context within its current state. func (c *cshakeState) Clone() ShakeHash { b := make([]byte, len(c.initBlock)) copy(b, c.initBlock) return &cshakeState{state: *c.clone(), initBlock: b} } // Clone returns copy of SHAKE context within its current state. func (c *state) Clone() ShakeHash { return c.clone() } // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. // Its generic security strength is 128 bits against all attacks if at // least 32 bytes of its output are used. func NewShake128() ShakeHash { if h := newShake128Asm(); h != nil { return h } return &state{rate: rate128, dsbyte: dsbyteShake} } // NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. // Its generic security strength is 256 bits against all attacks if // at least 64 bytes of its output are used. func NewShake256() ShakeHash { if h := newShake256Asm(); h != nil { return h } return &state{rate: rate256, dsbyte: dsbyteShake} } // NewCShake128 creates a new instance of cSHAKE128 variable-output-length ShakeHash, // a customizable variant of SHAKE128. // N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is // desired. S is a customization byte string used for domain separation - two cSHAKE // computations on same input with different S yield unrelated outputs. // When N and S are both empty, this is equivalent to NewShake128. func NewCShake128(N, S []byte) ShakeHash { if len(N) == 0 && len(S) == 0 { return NewShake128() } return newCShake(N, S, rate128, dsbyteCShake) } // NewCShake256 creates a new instance of cSHAKE256 variable-output-length ShakeHash, // a customizable variant of SHAKE256. // N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is // desired. S is a customization byte string used for domain separation - two cSHAKE // computations on same input with different S yield unrelated outputs. // When N and S are both empty, this is equivalent to NewShake256. func NewCShake256(N, S []byte) ShakeHash { if len(N) == 0 && len(S) == 0 { return NewShake256() } return newCShake(N, S, rate256, dsbyteCShake) } // ShakeSum128 writes an arbitrary-length digest of data into hash. func ShakeSum128(hash, data []byte) { h := NewShake128() h.Write(data) h.Read(hash) } // ShakeSum256 writes an arbitrary-length digest of data into hash. func ShakeSum256(hash, data []byte) { h := NewShake256() h.Write(data) h.Read(hash) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/shake_generic.go000066400000000000000000000010121365325520100264560ustar00rootroot00000000000000// Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //+build gccgo appengine !s390x package sha3 // newShake128Asm returns an assembly implementation of SHAKE-128 if available, // otherwise it returns nil. func newShake128Asm() ShakeHash { return nil } // newShake256Asm returns an assembly implementation of SHAKE-256 if available, // otherwise it returns nil. func newShake256Asm() ShakeHash { return nil } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/testdata/000077500000000000000000000000001365325520100251575ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/testdata/keccakKats.json.deflate000066400000000000000000017721761365325520100315460ustar00rootroot00000000000000;o-:l2= Љ^XxYUOH˿5o?h~Ī6Uƥla< H,0_>)I_.?oo_0g/tw95+?lΣbJg___ B\qr@0 5m2BcFԯOxx#܋ӌ`o+Ʉ̘<'!S~}ʭP3tH ؆ ,~Nঙ(_-Q=*{Kc e̴%xVFQkpGcSaλ{>]{@<_<[rÍxA>pw GCxF;p:%*ݘ&rZ}#լ.;Q&>iE)% 瀒iN=Qy0>ag_)ݱGDd\zSG8l͔T%3AJ9/Ǘ_>at.U?x:]׊pZ gzO(4vzҍQ֕d7a%HWaWL]E4[/}BN&K+}}g}{XV2[C [#X yƼؤYha63H18<To}MAnڳs=z`΋w㐚<xH.f>O^Mo{=\.ymAZ-a,!O$OT2 ӯobrcPh =ui~ƆJtZPW{za6I1ϕ-~woNJLÖb=EaI/Bw&Z> d} V`Z$^"KKy_U@&qG 4(8ߥrUb?&*[ !BpfT/f./Λz<\ .^b#c)|=Q{478c9_Ĩ]u_!A>W?iSs12^8@%\Qz<_^GCy=Nj{>R@t]6;8k<3,*mFY}a~}:?p{!t9?0tvB \#BS]*bLXy-/Vn&jgZ{W%hsڒ%DG> Q4ங~o-yN?ƒ8W@7C]u,[mzv"5ƅLi6n4D bcx!x*$ =Q$x_|o%f2_}dO3wsd/wxb0O2zuFuTE5D0ΏЁö1_մl$1#ٷ3 X"@"D-CV-geEv)3x#Q5Q Sg0|Ug8Hp4 ;|Q=go]Kc>UԅdD, n )"-Wh.i/+C˺; z{Jl=}" ^~LoP7x *=!=$D g\saj UjCW`~NqX:fda28+̽)hGc)ąvJtZ-7L*ZMvu>;,PŦNSmb /+J]G1lk} fA焇/~o{`dнبOVӇ` :2['S:Zrݣ8{$N(+Lg4R]6ҳ5t42yU`zoYuDQxS+>UtYr|^b {.f)䭆O;*ŞӺ#%J]X=>7 Z .Lyss6CU]˻~znu u_41!ȼjlʇ=k)KKy7 w[6SfvMVϊaIj̖lޙʼnd O=˧K=Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJK݁ZSȲ8 G1Nwq̧ӯTii}_LI[+ LkN6} ^S>:tW!&a 7QU]\J %0T40fX[g\j TiczNv 4z:QTi a "t9rNc- E0mmUv2>Qf,&q [B.WB|P=ݬt;FdóχgϹW~6 BCInC뷤-n'-|R2KQv>GtsTB |6cs8#X,lq<=UtZtZFh`ڻKț4In*MBV3qƯ;}X1Go=8ZD<ܧ)Röݩ=qrYDwuÍɚELO`-O%l<{aPܗnOLɭ>~K4:a3*ykdj*mō#~GXWAcoء+&!yYI[hkZ}Q3xKYu ۷>iU_8OOd8H>QlUMC O*}6U%cADyy}\^h?{f,=0bGnϊPUL*b/+$R`Hg~!!v3o)JyznoV=;dN) _iNxM{eoTY0oq@,/,dM[3\0T}Yէ8е~dN_Lyįu_@{;l [pn-> Ɖ7gkUxB_h\rA&_h M) n7ϴ ,ް'\CxC=${w|zl!VcsP rl*/LpĘaP`tZcwҞx9{#u,"ԓvx%.Qi[0cw+"bExAY'hjk瀽$^K+ݦ5?fb@+(HJxC5ץEJ=lRk2B?]RJdr1fMLzHIGD@CA%Z䪓FSm+GUl}xJZ+y> >ֹ'H@O=k؅ k0O?$5F,WE:p*OeEu)ʻ7`$D\3R8ZJ v1 :"ÉRuC9W((|:kM0X˶{,d66>Ro'tf=BMz57f&)Hi``0ٰN@ nB.eTq=~brI`<"nYv2I#eŻ(=G+l2?RG7q$d+{ m<=V%ڊ,.y*qB?Vl+ JU&$;Ũ !շmKHѤL_XVx?Qi(z%C]']}٥g'Ry*+P<[CBP;c6,#Ivw}o|6S:DBq/cԎfIxNIq{ }4YK[ ŋxĚHų M^ß4ܝACW ):6H Pxc砺Iׯ;D<ս='xH&GD{~:#"Zu[R%8hV!y^ c)4&.*,"8ch>a"Nd0, X9>X01[#F%B7L/L٧r2 Ic+:x"'JjxI)ɌG0ND^Tw$?'JOV~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟm MUOw4w:Pno nVf9Q,l=M8unLԡGCT D2hIGJK$Mcu kYjς5CnbNA][%"dŠ[;Hs1V7S<׭LCV.<&E{xojIeΆܴ0˦x2y{/BuCp`W+q^Gw) x?qsQH)'t=/CC,y@ť6HmN5p܌%IᘂL+ã7e$OWrPP x =KO< . \k?sS|:z>W:]Y*lNܩki7 -3? ٘5-AxGWevɎOl JO7^CZ@~Yd`˳ >F<[U.U]|=ADs`;xB~bꥑo* *Ƥ6!\ΰ!kEwXxOW"\U۾/}!BL,q%tSـ#QypSM9ڎg+ q7 oDB,y56m"]іr7Aё;voJ9t臢:z'bR>.TWI|5KIgp@tΑ[]v KSOm>ZQI*i6x{2 30KpET q0e |Sl50'Q=G{\N fu e8izV^Ϝwpٜ4jNA)":Q꫾Z[W棷|Ւ})n`b5 RrRzfz 1ѽ~vX۫Y ͘7I-'ʑZh4ƺY* 8Wh*+aYLRGq+}1P/:dAѝLȅQZоtxpqUy'u-?on8h@`1{u^łKrA_~_F!YSrFsL,kTUա'4"j9:0b)ehJ,(-1*JȜJ: 5^o.&l«G^W1&JR߷ToY؋փŒCcӹh7!6. BB3 Z UF# d(@)`e*m!K"NHvݡve) 9Sjpu>gO: 6RL-@EAލyV#9Ufr]R _1%4 9 .{?| Nؖ`?C7J D%`܆D <({ܙDԴLZI/o+h$Dі^[^'<"t{W8+lv?y<*c7wD "^iaS"z+O^ͯ=vH^~Y4,/VzVX'%x:HK2 ب^׉WaP,65>%n~\lޖ;s@62Mi4bQЅ<{svz*瞨N^utU&- 0=MNJe KN@]Lиq;7T_t8w 4qիtWt7HgU2Ahi<AV`QzYV9oZ!8Kj{V&Ioj .!dԫD|F-/y!G9SuwezM9к2C#.$F78Gh/Qt(=em7HpV-Xur)>2Y93oԔJWV_4CGWʆ_x~ߝ"r^ ˼R>=V3&{R|'g9ȋ w锂)򶍰3+dzkj^;T 1/_ UspK$ylPA!׳e&(w(LTt?y ZĨZ6vޭcZe=;/5/jl'|ryu.Ѭ0ʝay@,Ouv_ fXH 1č*Ur,JmK%eDW+XjlO`f2["#SƟƇ Bχi%}coeŨ3W':dqEIdmOs4~{0ޠ^A ?[;MGy5n1ofa\K}AN*̟d>lq~3E $t &%pSH}2Easa[5 ?壠:vZGm8D1ЍZ7Mg<'Б~.Ɓͳ".̻D.M4\]qqI>{޸ Yxe4H?sg\=)<d#(8<{;zz*URxC=y4A4H&*{ 68H鉽'?%^,M Oٓ|΁fss7YPl Aˉ FQrG"N5aʢ+WFPԵJ-=}o38Q,zJƅ}7 (NXE=6s.lQQu?8#1ofo352샏6"r";c\#a41l91z쐘N^"|޺Đy^E~sO|m{8PbzʰZu >e'>GfX^/mi;<W\sI)223%hBKcfQXg̯ECUd moNV#]x/ -'P JXkjdփpA^2# ͕G#A)( O_kb?}ԣ#㤯`= Fs+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕ3{* M ;:}3ד&!v@:i{AaMAs0YΩV{03QgAr(i ۞zMdD>\{4`D&Rf,hf@G#tESf-X7 >}o0:UM>$=TkyϦgwf hJI j u?1\a^=Ny>oA"s(9 {$GBxNΩ=s,X=T 7u -< H $$$'Pհ@n2fk8VadJh jw ylO"S{;V-w4޳'>ɃNiߥR\SdU]Aɗ!gT\ȯ+3d(ᖄlU-Yt;j-[5frɡ”3oҴM+kg>aߟA,,69iϞ-fN3Cq ;o?;+,g<(tA\WdE` +4J4 Σ 9ݑXشDzu/0ҷ O:IߛFyk=jxܖ0-#R*?]'ƻO՟vܪ~8h$kLe~oӵԃUf]n4Ɏ1Tdb&wzS uȔ1P)IZªbr=m-HnXlHm5Yj62}/9e?C .J#- ]MǑ)f@D;xni@fr=ja7n:q}@Jw\U6f (iMNFS]ebC18+|A..>T8(2f!:%t. Wnz GSX`×Ij0'Qyp0YTpETw=x-s,[;M2+cq9IW1 :bV;H6ǥ)-txV=۶ZM;'q9{D#4l#Wz$a%iJE6!+n!zfnҡԍ+` 7 xݳ58SXz`eͰ1 x1\p;BW? }chdu1@P_kO@&? a̡tG(#>[9_=AOZ{&%\VzQ'\<wE8 ·%B\-MX`^:ɣ -J-[>TSqЙ{n#lvaAMZkKOQ*BKltŊhҍ[5a~25x9Y/̋0V=w9nT, i3ױSCxqPQ_U¸C| z.tgEE. z:R"ܬ2i߾%"IэxKXDyLZƉ:Mi'šDbrY|,'_giZF_; I ~KzID0R2A]#7G}ݔ1AϏCIĺ`P` 9.&$K6vGM\RnkHS3 # 6WOD&8Uoz]EU{ #/6}1"3le4i< ؁Z`'ⴣڞL@a9+'p)/:<&~fE"4u5%jV(yXWS@ 0<>%fƍhY'5!g$Ht_#=5TAdI{54||BBn%x:vB1Fߺj;xR;+XZYs_Ðֶ \dmf>s &/._q=t^Ex|a^άH>ʐNyWOUG@{>8fg#' a2nAdO}N2,/Pltd?xQ8hX:Z/=7Emc>7g0l YKXa(,"%/r='QzNa4mCeE/R43\8y^vͨ˞pz9ՐRU~Ï~7 .boi26"5Z'=3l>X.Gۭe.cEu=1N: 4b=-}wؑՈwZK, YlR=zX3c^h@U,Rj)WC8pk:):G4U&R[չ G:CŒJ$r%] ]%Ұ~zj^U&#zozAɻ9yuȖ3* uv*3au񹆓{ 9w]00#t[(uq,9]BU|ةF5[3yGk勠|{ ~O!jݿ" /HOv!Z,qx8Gj8ںvH*{1-3Ggߋ|24juGAb3%Y]O1S/ԴA]盇4<gܹ8WlͤH9D]HkD`OYk!8 E:.1)EVكa*!.ȭpyt}ƊU K U:{ }L9{2anb 3] &^{;V5-ЁzegG,Cpm]9ܥE*^S Z´H'E4ԛV}X+f)"Uڜ࢝e.R< C#k|h|]gsv{-xgb@g0)K4Pj1].a&0m"~QMI`Uq$ZIl2گ 0x*nm-Eb#+0s#nNN&4:ݯ.z P m͆ Vu2zϏbe[.2β$)wMõ8 @@́Vc-7!t302"R%<瞦 )ql?YOҡ4>3՘69ҽ$?C`TY/m= BypPLt^?QPiA}7q {7QQ]IqruZ$2\OQl|gj2Cs:2 V~g=ڊģT^~ߘYI=-O5`=Z'0_DE'14@01'NXψ]ռQq(dTlpәR7"8 #ӼmO8bPǼϣP^nMOPdFxB58 3i2 O't+ǹQD|OÅHRm1ZqY8ᛸ#Hm iH )WX DiCqɧ4l=Ti׏U1kGu6:պs,N|. !0KҲ\p̴Lo)%R݂tb@ky؂ztP]\Lly.K{D׃R&u+f=8.N>#Ip"IH::)s5g'Dyڰ+P)XX7XY%hPnxb-4[|:[µQ{홛lWi#m$}\ckg GQR&_ .bV^B,+4ⓜԚb:}gDPoDfxTx}J;Og89rV{@26Bǐ*ϮPhPݩa9Ŵi| !DX=됀<.RkF"vd'/ak{/]!IgގxRԜrA12[+|:@ADwOBa.Ƽ6{]-%f^MchXaT73"oXɋ>O۔Mck7|~hR:sأ)dqM5@l=cǰzAQ'n#6>R8_ӡtT3s3͚c=t#r~Ս$-oelQ}T Pq) @3k$ x1tXAC 16&~I MSZw1cݱ󜸌6&4P^ V"}/ykN >% ќ&S9+S\|]&S!휃x&,>l\CtX])9ZZ wa;|r۵%ۧM(EzF0+(Ҩ<,BEcxYa7Mz4_+ {Mgty*!t;?."2.mIJ FQ^{w\j{i\뤕2 fFnpHwU9 >wT{0Xw;4d(Tu1۾#l՚{ObمC8wNfjg^Hz-QP> 0t1qq(d3+ z5|=RC?`ME%gER`p\-Rˎ墷aTpٰ:y*ևX.[Ђ]g 9LO{Aӧ_\k+>ބx:?!ܳg[^`#^ /:,W-쪡XGW{@X m:;TyªE道Irǰ"1,@d;|B{tƣl)p$d L}F }.58Zir؜tj X[=ׇ\^SXd\lQxZ%&YIKsSk#@*bjޕt}tC޵)P댴"Cモ})*tezy^6A}t4zc@'wY:]VMNrLڰJ`1.i[93Xk;`Q͕ 0aU:ȋ| B)vRv p4Q dW0!.\˅AuFyiEmLEv<"\I ]NE/0,7^*>TEDX55dڙB;(D^+;MzG# G]e P\DUsFA }Y֗WzAԘ;˛&5\w`waϞA2(ƒ&{Ze[k'| Dhw Bإkq ˇ72jA:g VEf X0<54Rx@t{j&?cx5 ވW>Ξsݏq-)'{`| rCWֶ9 "״M[IU VG*"ݦE_ya֩<;&ם$(g?|BJ(:C˞GjGo)k+7Մykz ~FMLoZ-Mj =ZFڒ}}ijiͲOG^"GaȀfLc@2'B[iLe<[Ju|P0Q s͉/OLq9pmMq@\GNPۉ.(GApufJ-Yl+#|(Qm% 4><9TvQ/J)AƆWxr:k0<*mvT9T>Pqܖ:+9囇UP=jDȟ񂤿i)}3= ++!g5U7.|% @Z8U]K|1RBw6_,#z:SMx-BiVS G 5v*XlТ\?y~s5^/R# g:Ȓ<ФJqⴠXh,$U?CQ;vSN>`gVP&Ҏ-#u##?+l K,Gpm,%f{j&Nӵqf?IxG5NB(%kM{e XDFʹ4o=/Ob;z„pR fUfٱn"ȑOxtN+Sn `[mBaί\\Av^(3ś0B#:,# }$xkD Q5 /} vWsȲPJ5)Ep=}ȹ-:  gX?IzVǥ=MgJاO]:鲊bx3z]#4B'r $XJ@b_uJ,YؕX0Auf,iA 1a[1| n|(z9R<zVcxhI7DžQElI:t͚G!*%`(LAgffE 1;VO ~P+hp AI1~VmehXbJA3WkO2lщ\S?aSs vKHC2?{Y,bްupLLbc(ݥf($@vP=2$lfhwꓶć KVTQWc X%*5!n][T@(<ЮYX1!Լ`F=HM|=93c_zc!W$g:l!3p{6o2IךPN_%s]ؓ+W6 tI^hF1r8/lX,TVӱ&|Iq$_:xLX B1-wgcsOYiCVB]zw^Zzt]:H1iaC:ɧ14X%){OTǼKj`h[: yDV2T5sD($"c{X^"gQW9Dt1HMRmB0 e} tųro`-&T9ӨSaPPXK!PؠUXdh*iy"֮ͳ;'.B*:>IGnF Y AO&9{y]EI3iGDjyN1;/X %a9'`U["K}r1sCFiox)# O; ]{,nbl9HtC*/QR3 J=sb+ kp~\BEY/ɖ6)CA{Tj 8;/.Ed=TbKJ04]ɲ1?u=pGrMhlTaЭL(~rHlNW&a28& Mb_t?yFg.sh P_IPp'tg,Eaq*iωGҷhmUuF{C 5΁H\ -؋vˇE^p =Wn0n{== D ΎxW7Lc'Wmg)F !t8P΂qb7\a]A!wxnY¡JȹòfOKf)A`dѰro r{ŃA_xw{LK(χDOOJZ'Fa-(`{ $ aP9W6ٮguc eI\|4a BwU i.h'#Wb)[T0Tk;yWe+P U4 U(Y4 P)LMoZ$; \gw!K]<| :Y^b?&3W59dΥQq璸`:zƞKiG9W%n6X`@ ts*,Vˮ:ik9٥/KfWu.$2PkOJyǗsCDT3AНzi3e18vK@D z[l+1|=.rE;̠P(o{a,ğg|Q41[2rTOhdTH&0*d5Li-Xvw^xvEUU3a\Z-&}B́*r5)|ŭA=1)K"G5=)Zf=x0lS싼S% ޹õZUE{i3?z&Z09B3ul^CU3D}!Vh-+|>{zDij:uu: ~ y&=Pitv0瀎o\ 4r+(VjT0i{t-nM}#A5}A^^Lox]){S! >k$# .2},"/Y;kLF&f i?߫G7BH&ߤ{0o6XO|Rߑ._3|5ݓ'v:kP^3XLd { gۙqj2H,Qi.1Ԧ83 a6ksAg wnn>Ĩ%=h/Ⱥg(K➼iPU22pr-U&^\ tKx U͆ݎ9`nI@8P#w&47]$=*~BH? EWI>};m7 +W˺'vNGT(/(1 ߤ&+²{H9A6$3$U3e>s^P#4vCPΛs/'Zp]uʣA\SMl= !O 3cq8c {*<3J3Jͻu<ҫV=Spg=Đ-+cgJB;(rl`]z=}Gƺ+b{j[)^:|.^ S߈-8%vdyKMʡ+ =&Vt=_ә2UJy)iD.U݊,#J;sFma@U=(zPuP/]/4q9rFaE5=mmpW* 1:!!E{ Dڵ]#nv{!Pfx"Lr;rD^`xfу 2އt π`hWfHA%'W -nmBWa:q|?E< y -tdBhQHԲ4F+"Lj2xڏT#j1ÒQM|(TlG^F-8y*wVW8VӋ(]ٱ)ֹ㫣 8׵P6E)S2YV % 5Z 7Թ܇̞Q:tDt8+)Z9|}s6%W/$C_?SD[ץ/@=^{}Fěǜ\//k,9el+K(e,2V$g~8kp,}$VK_p&*K#D_ESHzBͣJm$ N*#TIs2e,J+(S^')bx ո y!qK=xVLAE\e5kD؜"Lg>b#dV#CV.O t{/sb8_ϧ3,䃺 "1:-4ð~[Tod "KAdPȘU2^ELL!M%OE:z=ܙ}{^w՞L{s΢uUhrw$VZ쀻|ߒuC= *v3^r㺌%;ڬ szu,\GTu=TVT=O2wv1()6c=MKq],"rkxaEO2T#G3=Q]ucdIgEJ:WOiqTSgh#=]~0]+mB 9hZvT8iiؐBv~˓) ygČG, }=}T#oķG.h08ΜHޛ Ȥ_3{ƌF֒ͅ/cCO7g+OK)J`ibœ!$x;LO 7 գfħI,P,8 `$19i-5J25H8acxª3=(ysTkv<}.tG)zl϶AZRy?^[Þ&ς*!PLmN["ubKkvdy.nھuA쇪%8GF.~4 l N{4-E4G`oR*LJ{B%8x,KBYN?:E 42 /8KlB$x STfj&aDqM$J9?e|MDPVSG93־jOLs}t&g8pZ S03hw7#(}nⵁw+QPl2ue,K 6m[L|,MZ`x_Nh&:FS^חzL̓zsb;T2cfwW5iuXI::='o&TF}xyXYw%:[ ,&nxҍHp#z.`5{6nt`6gIc.ڎ/jA 7,zlm]7oR n@4lNq9 wG<{.ב!B{iޤn&eF/ nT?+y>I+Et dxE"ʐ+E_$_Օ)opYүa,zI:S@GZ^yac?zjo8%% _& Pf:#ը&D TճzUP--x(g [)}W6UP2~ƺ\0g^kIyBNy̰Bl=K/哌Q_G-Tj:wTe\M:ZCvqO 2[8tx l-5*JmLjb s mԽGO.g5lI* gtl ZB-\}zzZ^9g4huϏaSuϵQu}u{\:Ec|H3۶ -->>a B&f)ay8]Ў<{Dps1 jD=>?*=z2ݱs.ۛ-;fDSΚm9J:掳sYU֚*ZՊ o2)`MB^{#C6G}U-hk ڃCK t77^A?:w-Wi~*߹C?Q"<|݈8' !UPl)n0_6 a{"^ ޟy[+ B.UGwܥ;ɚz S\pa\_lWA@>y4&(WBGt2_ ʁǼ[(O^#^ w68Ur嫁1]C<)1vD֒ a ^>(MSu6Wz[d͗ۮ.[bFԙ<0Yya+zo}GS%(dJ7ٝSY :j~o8Pv*ZG{n> jjo-HOa+ޮ1>s'=1vrty2 A,tŹMWoude>swt[ݯ8++E9/HD=ڒc豜F)Sbxqou,33"^̜0sUpOc %|Z-fӍE[N@wK8jb6WI Am 7d_$-@c9k%ZigE*)\:G%xHd2K5;lG벊`= -|.I x G]~0q-` 2b!~}e5܉*@87z^7]Y;ǔ3цQ&p ;/bYdN}&;Ԛ}5xRy 1oaFkYeL'm 婎>JpDJebntXDC\tG.57D͢uZJ^RDzť%jU?B;h>N*,цc\w^?xAkd! ɾEƈ/%ުݛ'o(S^"`%yCH3"$Ik`*|aDP[݆]E<q !6<=B#0 !&b~[c v:{1OtVᙔ?0{I%\n3YB2IHh) 2Veɼ;:2!$d%!@s]##@k^{m>:d|nչق^2zu-=c,6dMF5*˒4?vÑz)eY =[|%/;ȟB[Ho#_r9.!BK ,p|N<:=<S.rIw%1W^+#Xжk5a{7Av{V=xJ=;7,4« JмID  `Kɦ":ӂRX".9Y06 U.Qe]ҵ"ORUt//ƭ>E!jG8gxE<aIP $R)ԄG5 ӛRs7)n|pWB5L,E+ ْ2jb:7zm%DgL|Q6+ 9E KRq@jcsgp/`A IRApVwEypc^rNav!s)0[82NH=BcLDv*i}-I6 7 RHA5I@fr? )Q7voAkJTNGK/n6 DU?@*zբSK_o -&$6-kڠ`Qmu{ b2r! d3#{x4}ЇL*ͥ<:qZI9B g e avB1Y`X Hy8rKG:c;9rVS7s^<~ \Yܐ6.;y78eQ&oq(GMǖdk>C,Ƅuf-Q9pK!F,=-%%J6!\DؼMoo(+^S`.#tOg﫶X^TQk__wo8#rɁ-4T{BQx_fɍaWۑ|9}1EE m8xE?EWi4~t+MW)R)M֐t58tєSE7v_QV4\ q"F|N6g ݹ͐BiG$[#g%YOz| B31h. ~+pzl1yk\'uE&G^tE[o٩#"eH2w9-1ahvC*|t:sŘm2O90^soEuVCԍyqB7Oyb-,%=4`S'Y@kAȧ3YTZ'qIw WMP{Nyb8>Ged B㔃AByPDbp;KW(-E`u ,:q86J7y\{4n,=~/wNYb25FxL3)[l~)VEfɔLzU68<yan*$ :Iwܧz{<%lzGT.M>K^y^Ɯ4l CѮbhq6b.GuVÆRꘝU O۰ӳk"x5EP(KP&FO\Nw E{k$枉aM .[Gjp'uGǷ%Z {h Y+ [ Qc:wv&Z`VPe=+Ŋ]aӖ-UXu< ,6܎+܁ˡqkPY+JjrvzlEt K>%z2O#w1F-XR HO߹T(s0ÍPrc^;>q+;a0Rz֚sKPc3z]node=pkh("}]d:jW7 5JF-T֩,FlCyy֘Y=w-"^bp7F@zNeN>M(sZ=xl!hsƧpg1wS@ٖ\@p$Z:y RW6O.պҊLmi/Q-4xm%."`]J=g pe9>_=D7{^6H̀LQ=I7^ͮXneUA ngtSn dewGGJUjǽz7o8Lz.TFW[؋@Ec4f|VPԽ/ߑ<4z5*1O-&#D)W@EyeԜj_CԺ_y|sNSP%-S‘1vƖ =ra4w3;4| Uڂewʰ7\ fwѸ!Ȟ#xY˩dSDiH|#;NOiƱ@~3DoaEEpyxWɼ),y.oM8+5c:B ˖ vb!cdB!ʒuqER(3"·7./}GljXʓzD=a1sE I.R2j\Ye/V:_uwR(DeYMx5xgx3 xsIvFe! T0C}$d}[D= ^Fa]ki Cl;Y8 qP}U &cyN׎-I`SFk췑Z43k5٬@=83цfi8$ְILGwLhpȢ6 TrU\=%wy8/{⽤ >|4-^dTTΜLd"]^*8Y*ԣuY<iKңD^:*ŭvG.ME `Lӝ|Y9æѣy6W{R~O@%/3%{_N \5z# րFsDNUY|BW˷ =^Ck%~=\+AXӅLaC.8%6tApR政|ɍbӁ^U8_RA$mH O6pG!B$-2 YQ1WUz !ս/_,ȍ(m.Z^휬ID`|_xByD]mkI(c^+*Ui$GGh?Q9T^Flv z %*.4 _R3B4&O LP頼 v6 $F4`JӎzUpiKX?\q7/*}xY2Ksg=DS-x1EUM۱7D}#SݍY>nKXo yqWP|+ت>zl1FC`Aޝdy5Esc:.9Z⤵((ȾzUNmZ /1E٩`ydG, Hr6i7Y7UhJWmii삆 V/Dgd0Z8S ^|o(Eo%ͮ=F̰\P|bK3ϛO^K48gcQ1smE8z`|jZZ1_tبq{37 3y>v[Q#.sgXixshIDk-Ybt=m#l׮vb{ki=Y-V%w8N|u 3mo9}n0{,Ӵ{(wZK&xF0\z=ATum/Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }ĥ'P|4j7\(z惧Qkx>G}l'qA_8kF ⎘ !2X;y;dGav9o#njE4EX%Is =*awnK=G*duۈG"*yo6yĊ"dP̢h1E΋[>Kz+4j:RtW[r;BH(;~`T%GYNݷj)[x+O+rdjQ=s6>}8K\#Dp^D+* pH=v+}]FƕY@WcKRKm)x.SIX*uQ祼Ȉccٕ\jᰚe9~jXƙhbRzptX.sX$4KP6ѬTF$q,7S| ' .feY68GJTAU`?KЊ^zmh4$xXu1j[|Vnf >|Fao *'d#4^js@TY=r-L{="z'Ҩ" n`O.?LTux8yʋSx[ܞ;^ɛ\,p~1XZT"TlDzژ${'ME S48,K|PVqpWJJlb%9O⠣ e<;s))}QBɼxCiާX?}Lշ'bP!:gGac=áLd333I6lᛁLKY<Tweh1T:4Tꐒj2*^Ձ*7J `B p̸^fw i*MnkRjw5>/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%?e@F4Xq-pg)fAy>e>[H,~ᯑ9Ve9υ %m^puV!thQ1"ؚr#r`A#PNyCc,h `uT= .=R8ZnF|/vAN"s@| ۞6SJ 懍/>)rJR S3V|wB;[a}VwdOLY}!B" A#:I-ZnNY,'{'c}z fUl4^>zN5ymA ѹ5ZAd/]RT`!>BMh 2ƁTϘGYbUw8w<-2DIkԱx!Y: HhZo '9WNO#" ‡2X/[lk ̨7G.CG!j}5i0V웍VȹvB(N؟s=Т=hNe*l>ųzҡZ&xVB(n`firkcU{P/=}DW8hgboR"ѥDx `4lB{-v2Fabߝz sSP/!@zx_n53nA(s[}|ϭٙRQՊEdѦC3mP[rb+~4'[9^2>L2w|4:LA.s1d%ʃ[=et\EgKWF(y#=^,,)ʦy"ss@r0W/zin&X,TԜqs&*oc'.u}Ux1֖x,2uFi#UDI`7iZއ (Ȇ:y!2ݦh6_ H(bԐVݤ3\L@F$f@a_T }dV䢳jepWFV<1w#q&Wփm̵lC:XxPAkG^ZIl!խq^J M%kg'Nlm U}J.Sr yIlH x Fzyuh | 3 u%9OmG󕗲yP҈Вm*h#PGH䅎'zS(FAy`te f6Ӎk3C4 DJwsx=RᲗꮮyn"]@sL6q;;ٳ|kq}ps Dwm5U, J)֌MA3|.|_8rA,|#s# kx,Z ]׼M45OC%4ՌYNѪGO "R)d 1.tTkxyq G&)Sa=+zae/UpKO-$&SS2IqB:Kn*dg" $*8Ny3[+&Biq2h~IRceQW 'qp}ǣYHկ8-Gm,s289{Ynd-;eo"Vg!q[Mdk$ %{0"oƈ8wclgV{S^VcTo,,Ci)b/Px.9Ϛ1d|/Z3VwF{";qdi2RO1}7\T6x͙WatA` F/ f U| ý!*J S{c*"0v߀V ˊN$;@gZ4a\VBɲ8fި,F0K"h{_$ ^ȓzaR@^{C32|*|̓ef[F>NZ)3hx &ڥ9aM\v[}/Waqu(' ;T^.j_ql&}qk pjwۅ9fpr:F?ߛwu r@y{)>Ƶ%R-b~j&î%/8Z^Er;&&@1碟AǦXYMwkHIEf)XUF޳gX&T13U K d#n =Mh|rLCDN; z-Wи$h$R7˦ZTӉfbtRmق -;X 1 4jˠ?8o_H(ZpT&(*8ܽiT&f.=l5/LS߉᳠}`X=|[37OlZ\I<_ꮒ/ [\USj9ߝq~~HM;0H/H-Z4\)K_~}R.tE4IB!*>u^F[zU璋t{lMHg ϲxWIuOë '5brOyK-k}#oERg9(1\}5w p׽i2IpWY0 83c,2~wY]vM~,?a \4"l~{.*^_q#z"_N)ݱGDd\zSg*0=3a}Τ 5 ׆߃0~=6q'rwL29bKZ`oe$٥w{K@jwо[ߡ'm@+cf͒Gڬ9||{PdLHt\Oѹeٶ\N >?ŵnWpXElH {5RlㅩCxN۲q!RUxc)d|}%}K"Wݠ{q`D?o^mk],zd"R+-0)jH*ww&)<{=YsBmw49/ X^ E'i})Š}xiBclw~} ʭgD$/!J]`hÆiSLyD*݀"L fȧ=FS>wBX쏧ZB|}g}{XV2[C [Y\ŕyBGV&Q]agקKw"PQU5 j&gQmP ӜeVfJşl|ojzcוYrcEr-%XWY%R)(j@O*y:@?ݭ \nlj3ZA\3t XO_C1G@=g|nU$Ux {~ ӰFlbQEKpq""O<%A<15};OKj 2;󻷫L1^h(=Pq.)K=jLeąQٰe$V9! B[}QBEt0_^k+D3ҧ|ڢ\~v2F"k5zCز/VnC<[=AyBF/?+W!wPq|H&B fDfF+&<x^O%k=>| ;s<ٹ; pȦ6˗pO5<Gٖ46A2 i LJmN[d'! 5vM 6غ(Tz(cxX!o^u[Bh؆7nj!_l\ʔfF#%na{8fj$XTwq- +N>+Uve/'+$o`dHB-=.D ]H`M Vߑ(h+ۤ@19XZ2J9@ jZ;kp4-`{֐bI~( ;b&髚Nma,qMR>^ٶVDJO5IweŷRW9 BpT%X]|EJmvcaTىe{3>Ww2~,J𰕹URLYvϩܟBVArBWY%׺ RN;N*ȃyZVϚHV뎸y#Vxq)/vϸQVPj*|%\O?>7}PnT1^H[TSHHL1lc)}!IDYLR=iLs[ԬSo]QWU [=|罈P0\Uiz@!,!S|#r^W%׽6P; _uѧGXV&63=| W*1:㣛$OpT|)l#7 KJ-`ސ2™ŝt:genAy(+ȹbg9CʈS#.ST_A Yܩ'Iη=oAX^X )%WmvjɈ..L[d_vB v~9MUuSh0UF驶Ҵ^H3 {hwx& lKi<=~{Tcۃ*Ks4ʃ$e|C5Y [ d<JrKVbHf 4oFOAB_{۫)']y{u ޶So55V KhtՓ÷+]HIX9d(h"Ƨ>UNBqnn1BJNBiEW6d_Rmhvћh(/5S&HA8"n_wݱ@ 581WyHCo\탓M&ʟZ!ε5qQHՎWͬ*i =2~@z/JL𭋿y)Wc o`,߹m#45VB*RdI_o#IC㗕xMɡeݝ=%K>J?\7v(Fozm=G>]j.5)rϙW=x*3[;v_kS%X"@>ٽ6*ݬ ,JlV@[!o[8r6{Zp\Zt\nS}[ O]/"v;Th='uGJҕtV8e{t?ٶ%p˴Go_Ciq]K"槑Ϻ?=lA/ ӘYtd^5F6Cݵå%<h愻- ) ;ȇϦTg{$) - ;,$Ñe>a":߶XO˧=Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJKq :%p_y)O&q [B.WB|P=ݬt;FdóχgϹW~T訃wBl[QD0u7iꗀVL=o^}"dK,zD٩͙S . ڌu܎`ܳWѥVhMz"k%ы?1P !_Z9zI䨖`zόbu[4| k,9x/)DSkp$x9SSL0 a"$?878&(i=xg|f谌swYuB WB̀'UYG"OBxzq*G/|ѽI٪[T^=m(w$JƂ^:~) X{`;YμW B$lL z6''ߜA{VYwNif Ij~ĔTPňb6sx|fA9ˏ >QtVr*=xw!ٻcd -%h5WcS1xaE/# gO@L܆џyx@lhZA+F `"dl*X/\L?qٝJHئmp3ag։h#ZrZ9`/ItĤ< as#hgfik O9*2=gKb,h~fQP=qH tJ)mN˥Ƙq4M3i `#'] jNSOKVųe)9j}̋,&xNDZ;>_i (.=l!&>}4[զ\!vT^e<yԥ&sؒ+*ߔՒ^qHpk] *%WXq;^(t`:+uȶT޸n8w fAr/rz(|:pM0X˶{,d66>Ro'tf=BMz57f&)Hi``0ٰN@ n:5|0nY^ޜNa67)_Ӌ<"nYv2I#eŻ(=G+l2?RG7q$d+21C<[Fgt,mc_c;J=/ӕ!v4Z_eBBCSwlo4F<31.P5ZTRlxSZ}{޶䋻)M ʄQEE4=<:ʬ30| Iw#E@})v Hz±RjG _Ε#ʕ)xz##ܲɽ(%f<qg/B|eri䏢1o#3`@ Q]\>P(O|ViL\TY>rEqx|zE-`Yr|d`cFjVK6*opN_(OdP['>Wt6E~& xOx5XE:Ɠvkf iY!OGW~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟ%TC)ꀨutM쯼-|du,Ood7+ƜMJٞ|X&:7I\E&#o!s\p"J 4# CJc:,g!7Of1B1R2 Ҽ#7:ЂcN63W˃?о{ʄ:m%2A:coh^[p=.?Wf9K]l(M l O* l>R/_V!kW=PUWá}b`u#4R\5O)*{"_2X~K'm:=^m}j>K&1oAW5GoH %O/;E`7o򣘭gnH*]{Yݨ}.PO/gJޒ_=>E^ė}F<[U.U]|=ADs`;xB~bꥑoKFG&r$povmsKn?D&.5L|҂$:8fqx$/9]\:~м+Ku%f6O 27ʦSi4v7Bq_%+ m޺$$t&:v87]d1c$|<ĖiaA)S mMbay{S (֯=E K6kӖ2׭>},]s &VvA.b̖ފ >[0C udy/i+}}/n5`+CߺUDzY7t C+JJ2Ѩs{;3 ?O3{R9FԀ+$⴯tîv`fE*,L A5)hRf?_}-Od]UQo8W1&]ζ /rv\r\mTcVн @"B2j)/̈́2ыXBg8 887@a;H}@Aw3@.Fj)b{WshK-em:jpx/wƗy! Eh_?f^T9C'9 MG^J8>sl}\U\zZ\nY JRQMܓQ!X (|-R{l䐀(cB`{7&kF!sCy*" LN@}}] '^/ ,>=F|洽QVKeulH1 ։jh-U_ղߺ2Up_Hq@IPX3P}5?XHĠֻ983#cNB8ڝo>q:"REv Me5< V }I<(nQ/E ?(09?jZˀ6ڗn9N*Ēws.xRrmĦywj>Dw7 K8˵?^DHܹh}6ќ&Sj.d%rU{0uu fG/̭uJZƟ2 J@{ˠ|(/ 2'ཅBMsMGǯ3hLDƴh?.R!37aoY؋փŒCcӹh7!6. BB3 Z UF# d(@)`e*m!K"NH Du/ד *y0F$pB<86>Sw'{])^ gJ7^hNRuLezB6uUX2>Kzǧ i4|g m6>=:,;dSut!ޜ龀ʹ'꿧$QT`#-k)mWhVz,0i4J[{*SqCuLs+HWJǑzLpH;pV ߋZx-!s9_SAdyG~e创F:J.]Y36Gd; ojy{6}} ?oÎ{ֺ2=b|h]\`XEaT׈#(tb2DXN$䂿P,:9,B=z) j». xnbHuގݩ~}?_s ym&,fJXPK蚞y#/2XߥS 6*ά魗ySA,hǼ|.0OTaϹM;/)#ܒ.>HB \! õ]X/c7ܘYFXę3zk%w}@!. x:U^[F9*O={,AX)Ơ8=>i̠b]*sH*`ɤ뫞$wx˼psQ[wqAo0I-с~k> 2gl \yd2o^Q.ԛOl?>&ՒPtrLDd7D=|I0ˋ*I]a4LzcU7`*FJz+Oxkmh-'zX=kyO^;̭(#f@T= ywn ЕTԢb)F/!Ώb;LǬw@kza`]^޼k¤0uOdİ+ D!X7a=|kcuph螮οYZ"^$ƆtIqy^6l :S❟߽qł0QCLdpp^1l`pPX ɉ@|] +glCF~cx{%j^Uȵ4䢉hLˢ;\'p>"Iw}|SP^k+U{O0xtuz C6:CM)L)!(L*q"YA ruD0 jH[ݕe~2!2:1g\)57H=z72Pcqw^=u:VO{օϟJ;8abq6܃uC?g4_(I~]zXs|<ь'D <0ye㥒ljRikudwGn mI)d(#Q-|MI1aZmdre+m$mf5ISA[c3QV&jnP2m1 ٓH|v{:v^j K#%^NPEo^U]|+Ya;X: Ͱc;U*MYM=! K48W*`ٞ(#dDFr'+%{j}; ߅m_;+H«@ķm@5~A_q|2b+Qh{N 2X$'O?^oP-&ܣXT7GИ7~P0 qN %[X hf`R@P6П8p!i5[ă^t Vr;;=\}MlF\V:O((.eDN<|3v;)tc< GSk t<&q{}, .1K(* WW\m\RE`qǞ7.n)CbgV94G4^Y" R )^ejj xF2`+"7sW}=֏b_mYt$.|)ecٰz Lw xݚhKR'ܡ4O@|XKw7@2QQ$ơGJO<'TåfY+$MCWe"!T|!Ο]r<G&BEj”#AEg=w;(Wk[ {{ H߶g% ҃UM9AQġBG`wVn{]/0F$C Y$=~g 8t4 lf8F-g8&YiK"[1V1dΛ%zgHQp(PVvWv5Dp]<$B&yׇ6s38AcT?KqYx+!koH3qOgz:חc{juX^\ytsB&E,FΔ / >қZjWFa91f  aT2mW§઼2B6 7+ïI;GNc0 dBHqՀ G,#BzlkTGĪ{nx#-GD Pt#1no]k mnWg^<|m_Ќ(cHkgiv!MEYn詑*(OkGBEÏ&g͢Gp"چҸK[ޑ)&y8h{s{i=Hh8фJPZS#$wW )y6`ph< OAYdg_%Cn4T ەLqq$@}6 _/M?L~ꭀ&oK4Am>3'ŋ#[xʜ5x)iOukm4gxAv҉1"1igv%iս,,nxM$cRz# ޮ\ 77# i] d*NZz*17 }찞y`t4 FWi5N _l"4l9rNǽ"ޛG> D~OWPkR%#YڀEۦ{&0 2cA0:8C.¿\ sh4<4 73jYKriᴴk/o Fl:pv'a6zDPSqԝ'{ L,2-o잳0ORq{d!s9͂CpYRQLS@I"*IB|U /|uBgv(gw:#bOB@?>(OŒXxϞD$nk[[;=jpK pU;OUu'_%7;Sq!̐[Utd6Sn94zb%"SwfϼI68}vExdA# >Qtmr蛄 Y 8 4j:蕼.YXG Md0>98~!#vM(qG(vCdw%6#^) 6 -`A,i&u9QE|%LdK+dTŐ <^b·"J`KG4~zʬ+|=>؍&c81&CN`^oj2J=8{2NY︪lm8P?ҚLk!pƇ=cpW\\|pPdMCztJ\2!~AX/K^(aD+pyS˸4b̌=Џ5 өʝ\XTP#6s 8"w@Uف[&hLF%GŶoGNly^ @nO]i>Galg myEu`\vP25/׹#c⓾0P\LE@ 1Jr$Q5I-^R÷VG| 1f!Na#rl3`}iR)3Н9gg|bLM+<{*ݹjtfM>ٮë8,b% /Ģa rPqW\L.xenMÖ%R0- y녡SJA"s (,%%xwl< vhT"Ww<l4kbB3!Eޭ? cwJ:HgFYk9HdݨYdd;|gd3=̇<(x  }M#3:NjƯ\!L:8sU(YXn*HN*V%iDoCEQF=&PkC*z+4BL H v>1 x1\p;BWC2,ނire}-`yfL'1LRP9: Rn$*$96Þ ><"7VDȉ!<T >nL g,`3YFz(&rWxmeǥ*^dQcY@3 lsgJme=e|&rxj7)QZ/ώ:*)5Pݬ+1hp>DF/rlm-R5IofogUjJJ'άsa jPײ'\k_zRZf-V|Dn  U1y /ea E'+e"8Ģy{^3 oB0 u,^l\1TW=m0({nh 3s?]AY u &g4x^T07k̀exڷo)@Rt#ށVѼh-0.qE~ZIqhl|܆|շ#{**~ʋϯYkQ&Ha<{]M>Jbk`y=T,P0,BI)q&a^klu,'>dfCbA)L!o>!z<ހgS;!Bx o]<ŒDs)Ҍ,-aHpk[P.6rZ9uIJ{¯H k:Oi|vU>0PGSgVNaeRP画hc=exKt3D?ZPwke -N1s~.@q]:Yo3$+j6^)03Nw3EQ[n}9k>hCf /`-KHɋ{IvT޽|X)r[PYgq g>F9 N]3*'(El^`Nl56wxƳ  [ZEVК]CI ֹ 8Qvk@ ,jkfOȮ3ͽd{t%oφuzvdq5b793KC#[BOy$Lk;׵FPE!F˷Իjpƕ*ZNtJ; yVu.3*ܮ\xsM435?n[I?'Q})'`:LתL}>t)y5Kb1E%~8>9ZupV0~sx0B&|D!G;wcs-gT (:UfF/s 'iSs``GBO\ۉPjYtszSjxoi@˭A+gϏ}2#!6e8T?I# /HOv!Z,qx8Gj8ںvH*{1-3Ggߋ|24juGAb3%Y]O1S/ԴA]盇4<gܹ8WlͤH9D]HkD`OYk!8 i9*qaw>8McN/!V?W+/-T4&X1etO^@Ī膹 p+4>t7 {AXeԴ+j;oB:YG׉vRJTh7O^ tr(GEnWX41;%5|wgG,Cpm]9ܥE*^S Z´H'E4ԛV}X+f)"Uڜ࢝e.R< C#k|h|]gsv{-xgb@g0)K4Pj1].a&0m"~Q~(6$0ޣ(&R~ϲu>H  CW2^$v: c.y=W8ll~ KcꢗPZlxPlU'w;H.^vR,,kHœr4\^#oN@ }h5r-" JK8##"U³~i0X2dwHCj KLUQ=I˳O3M#[! eKD&zǰw3hEQ_ieٕ'W>N"|6,&3lO;S!kYM}j أxN=LpT u$bv[Ó^>ŴPTzL2ٟeԷm>M >u|FZMwoˆ̵7@'K燦=d`[`9@6Аn{‰ =^~edr+mz"3%/㐬eQI˕ixR< ]92%" 3O%~g-*hFS{ 0հq/rU X}}|:!I= uh; m|y8.a * q*#wHt~=YYZwΛE!ϒɵ׃b]Ztt ְm=TZ[U(sM#R[A+|M!:eov% U7&F AOv#\ʥdI|FNDt4uR4j"φO.aWS@['n7o0ս bJL`<_Z:iltX5؅k'f6D#372 9Fڞ+HLA\Ĭ*$-4 ۵YD W@`=3i'95Ťu/FLYz^ȟe^, B1bδ\! 1ʳ+4"ThjwjFCN1-l=?=`9g+j:$`=ڣQ3wxg@FKsHh#ԡ9=Bx++5g\P̾ `Y#s'%i3qό}ˆUOf='FMS@O">ľiJ.;f,ڽ;}|ʋ]J\o>z)Uw~ǰD!d*'ve϶\ԄyJW=<#dsԄŇ qښr.+%u"GRKN5lOnx޳~ ^H(fWEh"c /+_Tνk4qWlΙ7 d7|d{XfԻʸ%=*)Ey]q1/r rV;,/؛l ~ "<"U(< QtRx 2#(bАPlUk>yd9R yUdX"\GA_0 kiTz(mUU.; ?^.& }_/ZO2C?dME%gER`p\-Rˎ墷aTpٰ:y*ևX.[Ђ]g 9LO{Aӧ_\k+>ބx:?|JG,bhTq1̑nk,m/:I,W-쪡XGW{@X m:;TyªE道Irǰ"g>. <='*]x)} d-)l4c橰kBKz3V6'Ca)ףu3&١;d/[Vg 潯Ihvk mOHB਀Pi xY'NGJ;8]+5@HA*24>((ؗj1PHWHx{e@GGGH<֟nށ{{O8ygx3(e$g4~ d þ‘E3F @\9 [(0(b'%op gK/JZnJ`>$9au`obݦi~hSRB}.JA6y2J6v뺺89݄Ob4a&2-S:>LCbJE={"Q{S&ԣkR=-A(q(ùėm&㸜^6צӸX A#'OI y_e𣍠`]8u 3{K>y(6ĒFppEd*W} QwЇ5B/^Ry]f\#Sqܖ:+9囇UP=jDȟ!i)}3= ++!g5U7.|% @Z8U]K|1RBw6_,#z:SMx-BiVS G 5v*XlТ\?y~s5^^>t5ÜmX{}jb9eywr.͛yA˓NAn%om0#ܪT1H(xYv,12r3Fu3ZѭQ] Cwoo>@/{e|zGe!oU{E=":j;}0c> xӄ5s%7^Z=ezr'`TsBfzq͚)hC8K +7@#9 rE:76xtϟK4F8Եm:vP+OwQ˹ {Qg?In|uu-;nހJ?gb_&ӜZˆsFdm Q3+dDךx!C4Fwg"&ªc@z&jmĮT4c[I+N9N&ܚ >F(#u @'6g[Q9^-x  NmBE/_d+Tc[ӇgJoi\kޛWb`#>)h5x QYi/H g+'Xμ 7=qh7WcH(X ;P>6[};}%Ŭ.Z̈́#~Wl WpKpayg>1c?}7:JӨ׀-dHcCw0eyvp;Z_ iٝS[ ~Q~C1wv5oEċx^]h9ҘR֔՞-Q1*.DPFHT2sqצz{<oj@ 9谬_$mU.+D@wz37صk_a!bC)!8oԤ~gyHәfih3[k9E<\-i2K_gе0a8]VZ,9{ ^ϵcS;yo2CN5DK AN 4"1 KF7Ҍ%#\UP5:&l:1 PoCE/GAtj`LR"7* #0RXY(DŽ{y )(zNUe`s!Tϫrwn<+}J,'ҮZaN b)ϼ^=ɰ nG'bdbrMqL--]"a{!gK^Wy=0ML3atuh@TʐAC}OV.,qsZQF]=\r6\Zbm|$JVv|rtoQy L CfCxbŴP:x<{BLKJQ~Uّ<\U.j$>a y3y9RgmPb>GEӞR;)SgW+|촣+W<6hQ0&k-=EІd/)͓%0[7P~ꠐޘ,P\% HH,0dVeu͕T9?niwڬr(.ؑp/Y$'xܞ#%jZ/j҄Y^{fZ'L+ c9@`3]#8?cYLm`=<pe2\zW/abeZ H@cþ9 H5 smnr/*dX?|N9ܺXSli m#<ٞu{BB L/!$l>GGq_c3Kz'O,kwRTAa/Nݍc\p^ٰY*c MHt&37w)A:/bt+[r{p0p瞲2;; (^uxN++]%T$tbbZ/uO1bh:KS:hʩ"!yuѶׅu dܩ.k2PBIDbis)OjsM3e-% @{ݰ )OMX,G7,Kǵ"xV ń*gwPtX\;{cZAxe,²3Tnf2mI=Ep 9hZɷ /u0S'UN[eO1!DGSzg`l'.OmoįG.Ǽ:*b挅 Of#yA( k#IF:bKe0)4hKAyp)iRO)0 2,r$e%.r,t q=K& D`3Tηj2Mep dDyR,eKJ=B`m'-@7X}VCD?>u61z]뜋uwLz0fY.\Ӂ`߸2h6V/Pۭըl{a6yZbH>zFhj`r7R曻 nGgC8}nLIFf'@\d$9 Y=D^v טډM~3E9: _,.Wy-r3Mm3&ai#6zpCXAOK^XBЃ{|/ɛ&UQ.#gA>+}т\eB RlH1x{O ֝,V 5 qwl_HxEKңb9:`,!qFב$0ITOS(\-래nw9Q 8, !;,RHdhTE>Ϥ́{BV-K"_h C6>=5Rzכ>q.hp9 P5$\SdZ  >=^*yoe7շww^RM9f&ߌYi 9 $(nT3h iX`nwr$]ƫyYM1Q^ɏY+^gZtyɠuzkA|枓'aidd(flBoTS {k/pY͚zk6D{Psz$&E|BʜOt"P[ꋴꝮ֣# n 4m8ĀATʌMTB5'^FqHYoMg.@T}-T޸m:T"'i鲼[~Dھ\-5[XSH֪O@ Z\qSz\v $D\}^/MR=ѱF˒+ (pCP6pӇƴ1_6"^y[jV/ oD};j2޼9;L=R ĈQxD{+iq,ԤW@K}AwrZ-.Kkb0HE&'\tEP|ft5^-!r)TF/EW@ M/dNQ|cQxM+m[#իxNvHBH,-цvC׈|^#@r:ކH0F#!ރ~`‡!3`$kh0!b$Rgtɕ5Q-ML8E;QUf"ڷ SWha#BG1ZaZV\~]Us(ŸmCe+8*z5Rm-ɛU±^Ga},`^ώO_=Oy-؄-Ҷp̏Lzʷ/unpN/Qк]u>g ֡#۠`]YQ]dO' X.}Y?%qЯsNy)w \%v 0PfaI~%o2sr'u,[G&Zp"±Dh[-}z,}9hO! QJ;7f**÷/Ӄ@8pP%]/ρ_L޳Go*(D[֋ٮoȌ~?CA> 2KӲ@3 5IA"TJEY-ZYc704 3IT R+dCs)gRK̽r؅_\-to"=eUX;aScmz{$XTUʭ`9 W{|\*FX1Wygykh>?g gͪ33_T+W# e^U}>eXtߋ{uY7j]Z',#lETZU\:sH7D:5$PQaD=XX'[|`ݗ`jdkgIdNCkrc// fӹ_ KPG"9-myMPs.a Ԯ&J[49fT5(p~Fɱe+ Y/~ -u=`550_2%֓Ʋ3{K AWZ91pVLݺ1EpdDTCI3z=G|l&JcE𞤈?W5=&,ɛ\ӎ!M%OE:z=ܙ}{^w՞L{sO1 /ֽ;nchy#Jt[/RsG#"A1n c[nRUc\dVraxNe눊Nʲ\0݊Yf.%f̵ӖiI:˱EdASyc#HI wbVhGa5kn̘,,7Y P)4c̀ufѢy;mVh#շӡs<޷QOpռ܋@q|) ygČG, }=}T#oķG.h08ΜHޛ Ȥ_3{ƌF֒ͅ/cCO7g+OK)J`ibœ!$x;LO 7 գfħI,P,8 `$19i-5J25H8acxª3=(yϳ>0;b\I jer? \#y}|SYxҾ^%JA iKN<^x|mŽ,MgWmq ~O0OҟJeH=x"X) EeM!{7xxm{ E8[>-:.n]}-5Cu[ӯ5K!X/׶Z (,S:8Eޜf؎4UdnZ,VNN /› Q/^0VV]ItV z;B1:t#17 c ƞy[/X<_)YoA{5CY;mhWytM* 9)3G.ݙ1ݝv:2Bh_yp9͛pr­pwăԍt>/' bұN;b HX;wdkr#%" 2kQ580򖪑)&D6[$QQ[>I87[FnE|%$Lz3\h >&0WDry#:Ǘjyٝ^۵'lFmgʻݎ,F#E#ʤ0y)C]4 !:޺m?K 93+>/lbߚ玳G 1FTca۪'fD^׽!?SW@&>\LKwV5@¸bЁ|D7hMkQ rU5eveyPySb;%e}Př봃m7Ț/]]~I%=W@1nW vVPsgw5 [2J{sݩ=pՠ˸ȮI(.lSjeud꡾WX\;LrmO}Ђ4 V#9w#k.G'"9BWt^G6[?mv⬬,)h#qLhKbru LYǹJ#Zmp̈x1siV=:)gN8*~dK!zcbswΉS,fs6-\F&>- ~ue!sMjYp+ @`Mb !/!(vT=*na$u7$197$ `vHgVM"z`H[J6љ4,qɂQ:w|,bv֐yʗz&ҥf{!-}Qϐ7n) Q;b 9c."䙧 Ko J9&8ޔIq;.Ǿڦab(_!NȖ_Jl9bN$v<3;fE49㈁4+Ψ*_ j x[z+kvdΝC**w!+S`pd,zƎVU%3`s[l@n8k "@;~&SzQo.ה4:X_Hs+9y0m@뉪?~TBEyDep߬AZLHlZ4X9C͓ݐT 1lJ0{BV:>ßchţ [>`"@Vi.JJMfF8Y-3 dH^?ĵpd*3 FlP@rByŭ`kCD쨬vWzAʼnO\O+2>h ~:)rpl|\ֽbS0[:ԉ7 Ω@ʸ`x↴q?}mO3 c*sv9X&[LݟyXc:ݖ%OC|BpZFj%eBX`U"l&lx ɷ7/w)0'MƳUx @Mʨzy Ե/7T9=h(IotE/30ѫHq׾6\BwH"vXë ?˕&kH:CEh)"`y/(+.8L~ˇ ˣ %GY K9%noV4` BV?M8 p<5.ǵ됋LJXilO- *SGD%wd =*r[bUxu71dՃq r`":ꬆ"Tu80zn Ŧ[X>J{hN7.OgNf=Z~S)lĮqn^+xjrHT镻>EB#E?( Ҳ =w`'HQ$^1[ƋJ#F'&Y)up mn:iDݪY`{_.(Rej:'f;SP8Sy )km|GqyT%@Iu')O"xTSK©\$}jb\y9i]^=j?r}s'l8mw]H<=-J$3@hvx.r7\a܊A<}Z)3 :/{NY)V l:l2 ;?QhdvX5@T~Xm[Ӆ])4WWcK',..}| TX !(YՓ1.xˈ5팱 0jaŒZE2uл 虂9AMZ0 Ok  B'SX;}>Ct+;a0Rz֚sKPP(ޗHV\ʧY+I<2jN{!jۯo*7%e- gvLTGXa*g'f2F&,YgQ$A=s)|xb:iwth^<L33 ^4!.u ƕu^b` /[g|g)Oh:HTմeug(\3w<0= W<9agT@n Ïoxa=GO[Edړ0ee柖0T6E6G/lPc^TQ" Si)']sG{OWl_t hC 4zpkX֤ ;&wu8dQkE}*a tђ< O=a^]]atHe>jK2T*FgN|&H2.z^@LQЬqQr|QI G/r]y  |p0}xNU,Qa{ͼt=hHUi^5jKv?Di$Eyjh4gL1]5ŗ_)tmո|گ`)ѣ8VXY#^uq25]Ȥ6ҎSrZlC*eN;Ϸiݝܸo(!6m<[!D҆d}4^i-Hb[a)P[pqE_%pyR(ł܈"y<ɚD @'+>IEƘ҉,aH=\/IT\tN iܚӑ͹ʧ3TЃ>^H/Vqypi}BОP<4y•,o`R:OUa` 1[T꽜vۮ~O\BኻyVAX3śZY:Ƙ,@r!j:;Ѵ[xDΑ1OneJs={<1hD[L| ncw),\uv,*ixXkF߉eb`-j"$4rK4π@t{X)q3MRzw/EЋLj ڬd*c5DNOri8qAeLA(~u\ p Le[a;J݅#%J@F06Ֆ6#ήq.Dc3{PUN!JOUYPC3,b>\yQ KW|as vO/2( Ŕ_,)dR`It{RJ(+t=gۖ'ѕ֦)A=?-~@ {% u61uk˥#S|JZ4DA{Ey~Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }~lMr)kz 2lov􆷀-L&K{? vef" .UAvq6a6Nx-ZDSYi]tU¨)4W RسVzA}sԯB3w!Ry^`]#x+:{HXܻ'[G;\>}l%V=ll--{T&Q"o0GxYwdUW=m51u7h`s}'vp L_6kqvl#g?@P}R詖o 3s" x=hJdk3FcW̦|¯( HulV& =FA_|2HX.ҫCƩB8-6G%C%?7D9W=@^s\K],YƠG /=|U,9r3Th\1@.G{)>~HmUeipTCp礌ťؤ7m-7Sb:j]rqIMTM7]q-l.mqTsu~s٘ 7StNAˍf]MNffy%͟^;ζWRtuD@Uo@npߛbnȈ%N '^ @LOmqQe6Pr=vdP자vL$}:駗! )ҷk6EdUF=l1/hE4Ebl6|(V:yi#J/Gmt0=ƻ99h)lǔ"[/rsռT%,$YNݷj)[x+O+rdjQ=s6>}8K9eQJ-s Z]G)O`GD f| Ng.-6Ybqm?7a"4MP)pI%'R Ξ" GLNxzTQS(VLv~QXY8]AřE>$ځDw$&V.Ь& rL<58nB/,. Cg \r8+| d0`cFeq%x27=PAqzJ<*.^iħ> lD]Tuy)42Xv%A&h8&DYN,q9!؟!?݀k)*}22 G+1h4I\%p 83IDŽƲYA ΑFy{PXbDnOt"^%OOShJB& .w<䵬gaOw^jvt*}KsP4: }hW9!#QQJU͘ꉖkaFV6 d/%0s=FUa v}uaj:8!Hkyh",Z\ǑeYrs:+:PPbk,!Wy'0moMl.S [O;f F/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%<*^=LB@ >'OdkhGХUpxH[x BGl6'=]g Ei`L>|Y_#/s:h˪s K'\ۼJB*95\ю磺c E:!5G&2hydGۓm~ޝ::^$oY,`;{]^{qp^!삂tE焁6@=m$K])H( WW}8Df$Pi}JN?G"O[auΞF;gnX/[(>돒=j0[&f(T=H$h9e5hs'Uh{"k:ՄcDRx 8Z7s4^jݓI$wIO$ZRÂ,Z 5_c.Ȝb$SQ('>ceUݱqG;D%ePnⅼfaN, Aj146L?sx?4unL+w),Jz__- `>oυ{6h2 D9[oYפEXo6Z#^ۍ&8pcЪBR=;D$Z"IjN[ }l޻i鯙mVIKIB]C!9H9KeTSLG>S㋊ %l*|qR]tċ}we0qn"PftLC!~9lZ m??fgJyGU+'FA?s;)}*`(?79Р2{Im^@os$0M`inFqڴ6yҊ2HDtz8tT[j1+ +u1wN7HvX"ˎ|l=Rx 0M Â)I$A'9KkHynb)D.#u*NXH>+)Gs%A/)$sN\r:C6P qut[j1s-[/Pֹv5>T;vs.[HhukhW/={HtqHIn۔NGbwAK@gcHtfGJ^0˫{Ek6J@_Kɕg+ x lC{X~S~LҷѬ0^C\؁{ 4!:]> <~d]nk,C`=NkO SpEĠ۶!NjoZ+uCГ_Y?]|P5&i"s, V9GA{e,u%5h.aQ# ,dc~ee8T!nU/SӃ x`/76JA~lb`-*0MB]c=z4+ސ'Ecl`_J/Ĩ=LNOhC׳2AY^(Ȼ5{ RFM;"^Q"sHg/[ *cbRy#u{iOS푲wĜB41Qf6O!FA<1у^teD%k^HcMw\NāF,1Zy\_:Ꜽ]e[ } wR5cSdТ ?\o+v(7bŜH-4;FW5/@1MP w> h5eSjCGBHT B *D<>7Z^"`^h㤯{r=.g/%1MΗ)AeduX"i7nbWHg]%}QQDg)s~kpP(70.WЏ}1IJpl@<$x#}(eN1'z8kލlcWwVMJ1@<w6."yz ls dd"FMc,Lj/|bjꍅe(=3E /e;'Yc;6S [w&٪/fM`Ghw zGHqR-O2}7bT6x͙WatA` F/ f U| ý!*J S{c*"0v߀V ˊN$;@gZ4a\VBɲ8fި,F0K"h{_$ ^ȓzaR@^{C32|*|̓ef[F>NZ)3hx &ڥ9aM\v[}/Waqu(' ;T^.j_2lc!JbayT#grdl 8|or,zV'YdNK Sky=N̚PǬ~&#bf7YrNܥ!y%훡BcU zϞgbU{PǘsΜV-|^/'6aC|2s4q1}Ij9^0e6_A㒨]Kzg,kQN'=I)e .hL` 4xWl.l>ӤzRU/w+W.?zd+I}g`BK @ffkYêpNfCvFҗSϮGC? zk¸UeptYqnZ:#,sDd:r`uPn!u Vҗ{}8<7U«z!"^*!՞E f5g V]$Gzv~wKGѰ$61T *a`vj. :5K#)s$FFK"@x/[':C;XL^׮yG³ʺ2yqdG!{}}Ss| oh2SaSF?9rc: 47 gOcrޯWOoREEkk-*c;aM_Ow  ӇcsJTo!f fc: Bԅi|b6 լ.;Q&>ve$_.xD9F%w9̔>A G胸ܩ(>ݱGDd\z|WT0Nx># }C?v*ok yl#^y&iA4dZM|5w^|S2&r$:vl~ CL;Nv,|m*F5 ^?nZkՓ^{UOBj-nأ%$w̪j֫EH#[J g9@vtdcKΫo%W-_'/^u[!ƁvIPB%=k#} +TZ l\l[1Ϣ^YgOZ(<{=YsBӟu9p Qhhe'.Vׯ)lcSx oXkI* mPh ίZf=RyD걪v_=:>B96^ &OILs|ѩwn%HWaOzX5)mV,Zo Ip[(XrU p1ux| e#zデ3UமI&>FmIś.\G`33hA0 Qa7=c@EVD&=8/l6[BLke kgt# R8^f6Jϊ>]`|ojzcוYrcE9#Fkɣ=--yJydk/1Di>.v-'z;e&.75 \GF <@'U(5 woo}d|}M=Y5G-wd:? ӰFlbQEKUW=>[۹.&0nߺi(꠫ۭ}A}-EEx_u}ֵ]dgy@CbsI]!y Åe u5ͫٸ%amgeyA%xB7YA{t3/zFSK[ @Ytuƽ"A 1ȩiM*[F7ڟ^l4/j ?c;|hxeFO=\~zemQ.+rߑyhvAg3PWjBЫ=':`F˭6 qSFfV47᧻R_{! xL{SԂrQXd)jGT8ByvEae2xD|%| ̙컣I3Ǜ! -wmϓex-e܆ co@HSC2Zu<|teV!Cyo[,sLi5-t)P7sD -EF#On"1*ӖIOp _#MR$#mkE$PtW6_|+u7QB*?*Ms^xC,1s<:";YX!D·>g' \Y*r(V><;)sZ;%IE3M&r^ԣŗm5cnF_l:jEϵnT!{ `gsyL/8:L VTe: T+rb mY+5#Ei7WaGҍ!zj `3)mc,%{Bk0ƕg.XQrHRH_lHtޔG{ۥ:k§U5~:CV-gȅ+V '8* i1yv(q:;EdGB #yf/cO7kٍ SGՕ}\q!NeU*BSOe P^=nxia#{ѠEE ^(kvrWkvjɈ..L[d_vB v~9MUu?SJ[%T0n{:RMbOL-#lΘ>14I}:1R},O༸RxM+5`(*ɲ|"_f_rs+ܜв]RkKBX=Gv>ok|/)̓WCS@ 9O=<@2m-jkJ@nϫ .{ϭ7kݱ6_?p6T)h׎H+cF&k{Jv4bH\'`"cbw T8Ms%"S?emy#%ѩ>xeb^©elib%lr.65>n3sɌՠs×vqR.zdZw)<ȋwoC%7%Ö}^J|阑QؐkP6nRh;[L؏E{Q Qw ٫nW`iךM<0cX/a*5rT{.-$w>* 1ًܚ&ʹ,Nxɹamԇ= &Qqѓ߷XJ(Y׸ׂp w()Ì`a|>z,_ЧnE"&%Xà>2{A4ޣLN`+#T 7ֳg~f`cBo}ˬ2bKr7Eb퍣`; dOa :2['S:Zrݣ8{$N(+Lg4R]6ҳ5t4iFUX&ظ~TۗnjIs筺^&Py:K@ @ 9\alP?ޗ"iǺCsqZw$]IkSGS*32%5[ZL326q\Bdc(ZާV7:PEa2̫Ȧ|޳bx͜pEa3eaPٔjuDFhl_IIU/I-)[UX<9^$m ):<\ŝ&נ_ȧ>Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJKqvfc[M!:gfVJ UHdˉ#6ryǴpΈʹ>/ߎhqWŵj'>E\[m`0G/_Hm^=BYXX6>QTS[ !xlL"_铥3tp/tӁ :5U87iJ.Hu:"NZ1Ü"Esa~Y OvgbcjTP'6{=p99y s,@sO`inؠ>_z1$#NU1a SjZ |:AO:b>pI!%fZwQd&fW8~z#D~%d;QTr.!4FӤ#8:b^ܧ?={4 ttꮛR˽T.83j68[qQzӳbl{'"RgIt31*sa4ד{uLNJN$JtpRݴ qs 'RިUfC;{_ 3N޽-T#<9c"8H9!O^N G}v-̼|U v WՎÁ'\aէ_?zE؀"2^ >8MhGN艎Ö"K>߬nNִ(Me xkٮ%2;~ /_#H/HttY[2( xoMɃb,ȿşJJ@qc}HUueG[f;!v|{~6IH^VqR:q8hDT̙V,AvQ0TcԡХx <.0-L &}edoY/ާ^Q xotxR*&'cWb* >Wbw3pJchNcpo)$V*z2^'P3*"B7TrC;=A c|_ }+Ls3[ʩR^3ۆ" yUefCGZn$/:^Shٛ*l Ǜb6 3-뎜}ZҢ彪44 rhx `-׉|a~SknW(^-Cr;a[A7hq":|g}7A4f$q觗 $ACx'z@w"`{]ethS<2EQDZ44yO>tJ{HX-qۊRmkƃwK(o\v <#QqF͋nLQ"40[|߼/,E?4Y1qQfC! atB&fał15Z-@Fe:}d>a@m L;_qly?tC$k}g>]3VqN] )od%ӄ o!~w+#9.3h3yoU][5> .2фK+뱈giY;φyujWEłyM9b|2`BNpEޭ ~Ssl:קq17b/#_?q,Tݬs:4Y++*g{a=p$qC?dϩp+5d .H!vV+MײԞk_ܾ~Ҋu^4,YYEy{v{0iJ9|_h߽n}eBb䶒p u174L-_+}3%xHUOr.s6\6'DO[x/Lj>Tɔ'Q47UEE2j9z '{`N>1G`u#4R\5O)*{"_2X~K'm:=^m}j>K&1oAW5GoH %o/m6cUkZRK;`YZj*k=~} /gJޒ_=>`ijU?Ze,̷StH4 f+'.z^Sd&=^7œ}3^ힸ}ӄ\{B%Q>_:{A|8\'%'1!`A jÚD/d{R2}%&|PUpuSzkto"Gfa9VCdR'-H.cW@LR:* |x ?Z/< 䑼zedO#3꽧 )JƬ/c|fL/%ttTDD5WI $Ge탷.<('I+c2Bݠ*Mp39cL /fZXzgl[Xs{^޴=}(n͚7H1ZƕI]ΪUnrwj>`},]s &VvA.b̖ފ >[0C udy/i+}}/n5`+CߺUDzY7t C+J6]Nbř5mƃ]2d0C.KD9u~_~z5?؋@1\!}vյKc4+jDVe!d*eB7QLG0S{n~"r|ù1rM!Ja;E`u'EJY@W;ǁ ocm!JLwB4ŹY9zK Gf(01l!rV((n߈]-XljNmzE-WG n>#Ժ8.omӝr֌ E@;D__0 (q<Ӄ>1i(Ul82_R sd{Vr*VhT"m  R\n`0F+oG{d#@(/<[U2c Nד#,cVfjhMPHǔ9҅l[JޅMses(:AADrΪjo]*b/VKIEe Ԥ(KIP(D864mB3)& 4g8,`?RߪȎHH춦ώd?q"REv Me5< V }I<(nQ/E ?(09?jZˀ6ڗn9N*Ēws.xRrmͣ%!JTBB0t;b{חw5F.F#xDx_HgcOdNɝK_gni2u\(JQRy.WSWЈXmx Q_e) Ǩ(""s[(IȎ.ԄN:{)DZGC36Yg˶v՝xoz6\YyO*{9޺E5;DM%5[ƦsJo%Cl]rᅄ AcxgTя@F4QRr`U7;LCD ^bJs=]Gj3=b=x i\FU׶w"%z}^W=F=hû1j gTUNKJ+7'!e`rOcGЂo@ qF$h$,ېQGwOuoV=np4,p :pƆ1no^zvۜWbg0<o[^'<"t{W8+lvKjyTԍ;Dod){ ֩@Z~Lo^XFN\ KgIT!ƐѠ-pgSGܱ3ylJ.ܛ3PT9D%ڼ.e/%8}c4 IП{y#9~OV.phR.}p4NW&z#.ɑVw*Z9Cr<m6 *v p;J\6<7='tR+3-o5ưO%{dִe4j3="u6uC0_g<oÎ{ֺ2=b|h]\`XEaT׈#(tb2DXN$䂿P,:9,`åKs]DN )/3;C(@`4@0G*b e}]q~Ο=tYa+,"絙̛)ucc5Ca/wkz湞jz`}N)B*o8B^eNmUlX;HU/g7շ ⲀwX%0EiԳ՞b jN :,;2 6L H~ 7eu㡛Th棿.^6 k^2QYưw@Ť]N@ ?*KlTK&B1%tv%%!,/ 3&Ltz0e TNR ߀Z)< om7a`9s|wXHQ7z yp~_aZ=fU|X 4]{=|&x"#'U\ _ %)2 {U[[nFDtu<uo5a ?>E@ V5"S/F"K̇M / .pqje"kD/aS +jHN]U @zx׸O^q=c0E6dq5M,mKpۅGAlGrhv,5'#: I%<]Lav6l`N8PO'/@ЊC ?6y{+ɷia<嵶QGW0d]#p<Ԕ"$ |K^Rny[Q` )ҙ0-\G4 $%]Y׬1+Cq(㪓s|~|(榬a4qS;sMSu(<[ˁ76Ӆ{օϟJ;8abq6܃u{#nk&w; 6`G:m!e!OӋ4 )i\ ޲a@fbY(-{6D^ =\:0/V pqy.E.X/8mT&[3]gSod?y9 -$/)BUKue'!-=m[90 SwC|dь'D <0ye㥒ljRikudwGn mI)d(#Q-|MI1aZmdre+m$mf5ISA[c3QK]dRt3] hྎ.3z,y{7[*VZh%L|v{:v^j K#%^NPEo^U]|+Ya;X: Ͱc;U*MYM=! K48W*`ٞ(#dDFr'+%{+җ.H6{)Xs8|s#(+}/AM>+]Z>s%}mIC+_Dv?I㧼 ڄ{TkxXoU00Ωd w4 L H?n .EԄbb'}&қ'ؠώ]"uQP`i;-]#ʈ6zyfwRx3 yLv?Y]c"H&PTڸȋf=o\HSZάN rhhD=c}x~֊["n%8-Mid?=V>ݴ'.vUrxnW`:/ 0 _ EX6ީ%ݸB>^bx&w=3Ҵ)w( V1|R{&ih<@l*q{'O~12=z憗pµVSzztD ? XwueBƿ.>YPl Aˉ FQrG"N5a ͢+WFPԵJ-=}o38Q,zJƅ}7 (NXE=6s.lQQp!rJѬZgӖ5Dm{wRKKuZLj[}(io'ﳟ?ڈs]X$q_WF  H $RCb: {YD>zC6*yT^o7L) qqʮӮfQ ݑ4#Sc3f~<Ú!,^X,: yA-iص7fG)>Xͷ| )/|X 4u/;yM=2;Ʋzi Lܱٽ$&MNYD!)A^|7c~-e4Ly]=Eӭ A{{;C4aXa=b7ݙhI&!DT;O#)_SKE\}`*̺P0kѶb- 9R*e\5 +ˈo<=7*[:^Hrˑj'?yjd{G3J( '3U`WW쑅2TZUȊ,<zyxQk#xgWSoH觵#GͳfQWo#\8 DmCi%-}R^HTa<wk9Y\JwE㽴$[hB%(aY;֫UzYZ<0b4Wͧ,2Òe帐H[`8ePc0FҪ, "_ U9+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕrF8{Y=^4HUÈbOX"TR:=snFIZP܁`tE vY=N}&9JF,T{܋a+yD XLzqmO&U2"A E Xmo`)3 3iC:dIVKPT(2#)wIop$[d}U b>, |~Ph5gӁ; [e4%ڤp0/x98~!#vM(qG(vCdw%6#^) 6 -`A,i&u9QE|%LdK+dTτ(RE Ow=v}r^}PS\*AO'Mo%2 _ϵvNv "cf6XכZCRO1O2$4@9s qEnkAtbV&(eCjˬR!i,{iP)ZpQiil0<]'M)X4"*P`-CvA4wYPX=w}ƫS) 9>@S;*[B菴&Z'#g܃2!Euk *|tS^@F@:L_wt+7R=J#OTN)Sy0G$\asFtt5ب<'U+GٟƦ:f i 2;KDe̒ rK͍ ~Adh|RşaJ z:+A)9&rbUNJ'$z^?A%n;RrYRw$6i:8jG:\KiwuTfE|iJ r8t;PP1 3uGbnX^gxp@Ԋt gȸ/D$}`~ a5{'wZ tY8 vdVB : Hsb@t$­w>lKSZh/-%{m׵vNrwGh=GȣH,(!;KӔ|m CVEU9̀-+ Tt)y$9NR1%M0@Yt%5|+`uH Cxi[02+'Fhy ,>Vp{ǝ(u/~ 4W4;؃I.SM3fiLW^Y1CO3t:c "V2*H,-Geg8~(`Q` (ѴA=cT{lʥ{9tS`3GYZ&x2lU"zN=^`cB 6L*Ĵ@dbhӊ1S ts1m!Fy8/P:.9FZ.% m]o8 )JwYspƇN7KrVe`aOduCtʊH GV"shcĐwnJwi g swDTo7P޳bGZf#=kg{p+N ^C9me=#+7XDP8j`.gU&LO<Ǭ2p 2># _=AOZ{&%\VzQ'\<wE8 ·%B\-MX`^:ɣ -J-[>TSqЙ{n#lvaAMZkKOQ*BKltŊhҍ[5a~7P:}.O,I 6 ]S)1{mCH|RPvb{_!|OqrfMHFE‹8 ƝecMm~saf6>+.rdo+֑*f  O-t1Hn;] ͓er&Х6NԡhOk<) SP~ḿC iG~SV-.4J:IaYcЍu亖8VDO3\ЛTUM"ǧԴpp9"2P~~J%kɌUta6'_;jr}|`gfr\CiYZ`'ⴣڞL@a9+'p)/:<&~fE"4u5%jV(yXWS@ 0<>%fƍhY~rPJQCӘBgb3ەXyZRIߒ1f::+`V}S]ѻ> Q[}~Yf$Kf`ig}C[.ruϩKtVK~ŭ@JX_yzMK狶㽯򹇁R?z:r" (C:]=MW=nGk,\!9Y+'Lcsˢ!:0W;0xr_69~'Y lr8j>IxQ8hX:Z/=7Emc>7g0l YKXa(,"%/r='QzNa4mCeE/R43\8y^vͨ˞pz9ՐRU~Ï~. yCgdؔ́M-Nz.Lbapo1 89}>uB/NzԸ=P8&Z4ZLs/6q۳aݲwY\} nҐV+Ӫw|5Ӛ;NuQTQHQ-nZ?q><ҩs|NC^%8`"U@z&=/e4pAPMQ>/38YXr}Io.\?H>;Չ$g:θVe^7?I @ MΫY):- đe ]t3iDo)e!ű n&!誩Iw.:ջhLIj `%-(/L-(){[{KNWHqtqƳh_T^nqlk+uJUe5,:rT3ÎD3^{TgqWLOo߳| Ga" C#CeTm(„jgꈧiQB?W"O<p[xA<'<tϟ_mlbm9IKCS3-ke(Y ["8U\憉x"lO}BCnΨКEͲp㜖{܁n}Osk 7a_@J˒V̢trV֜x'sBX{~ I" +ܫ̩qg)kɲޚm P8rqF^ZdzY8G gfl.=$D3,vXI/&ۗvXhJî=@yr^$9(JKTZ@MLiǔݑA^srS6m%Vh4Wz?xd-֬.[ʣCxц1q3ЦȺhdI,LTN.LuP26rmqȭ.T?a{+!n5y+rsGC P~O,l>d/9f=<wNrT%REiNG_&.(w4W^]'JZ*獭|}8s>/$*ay ?-zUja4,8O t&Juzv:ޮ6ݾݪ$=ݗkXE''soƀGY˘L-qTIGE~ V\DDK*1S=1N4,[-6źk&TN aO#t>4{u2=R&'_)[ }LanMBmEw%![Ψh;+Qu ׍^NW-lӦ ~w ^ҹo=ղ"t )Vbc;rl/R1hQH)C iX EEnV ra=eSa~E*g(z}d@z3ٞbdc9rWEjTIߋn)>"<^䫍U; b,zqbE}A@E}:<Ԧ|Ѧ gU>9 dk&GJ!B _C&2,T{] IϬ&JVV.ӉZӳW9OTm)=Kf8V]oZ?t*>̜] XUC07~WnǙCTra=wRmM@=]g#:N*ZJ (vmiJ1/:[e2M!.ܧɋNh3ԍ|ؚJsĵT{L\rY7w|*yCnc-$??g'J4vkI.-P4nB@:)!ݦ޴|8Z1SLٯ2u -Kt:־PXCR<6ow7d _k7 0N>3:I']R$R[^^pQ6iHiйqnBg4p6a739(\z`wnW3@gd~ !+FUqokT /;yXم1+qsrz66 T1\~uK(Rpmk6FvɈ rŀJ6xmUp"IH::)s5g'Dyڰ+P)XX7XY%hPnxb-4[|:[µQ{홛lWi#m$}\ckg GQR&_ .bV^B,+ 4ⓜԚb:}oA|GJ)V2+SG3BSduRt9!l+$Y?C֙˴#ѷ:8TVyvz@\ MN{)MðgCT !2'uXYqZ{4#{?q~ Ȉ^{} M>vē:=Gw|欔 7ܚ^ց "j{ s@4浹Jny/1;B͎SQL+Ly&ūW3k)F@R8_ӡtT3s3͚c=t#r~Ս$-oelQ}T Pq) @3k$HRMf-L<`"b|)z-Kg]t/ke^f!{v$)옱xhyN\F{qOD(/vu+q 5TU hNVؕ).>ۮsQ)]xvAgS6\ZjkʡwpP׉I-C;հ>yϒ&z"=tB^iT1cRЯ@Sۡ*x΍u qC #2Ez8\o@HBf U>Bѽw~,3]Dre\Rmے^.@q9I+e͌` 6v?Ir}(:fa<vhP ~c}Gت5\< ׇp)ϼ*2,Z. |/ f`t4pބK]zHCqk;(uR T6"$;O\DnXrVD( wxaR=-pH8n_.zI kS wϫb}rML-(x8}ڋŅ/nQHM(>qVz,]BǮhԺ9x5 MRKV_]4ˢ<,zn$;te ,5O)<‰hlue"יּ.Qns 2%'NGJ;8]+5@HA*24>((ؗj1PHWHx{e@GGGH<֟nށ{{O8ygx3(e$g4~ d þ‘E3F @\9 [(0(b'%op gK/ʇ_3|1ogaR%!YmT5d[yD MS~eSqX?)ϨTX;4j3dz[n1TOI_Gv. xVRcdZ*""x2ьKLW{S"Y&|GKģ. ("*9WiU򈠄޾,ȀpxDqj j̝M҃_{.1 {Oy@A|*&9O|\yأi{ZmУjdiQoM*~RKjC!6 :{,oa2ť6/.z %r>[ 5.`.~"HMo1UdϱTдJ4+Z_9C^JzH+4om{!~3@! FmsDi-c<o38hTD.U MASyvL;IP,~1Ue˻Pt&=_y6R Wn BL͵ #[4 z̵%3 g˕ӈ8e=_ĻMKPy  g͹(yJ@ƾ' G{2a;>XxLx2ي+A쉘KFMK Pރ^Iɾ|  <` _ r{\zOb0^z>%Q G/5>~5]P`Ï6u%̔Z ȳVG.Q dK=i}xrߓ_͟^JkU4\o'³=,&{rVer5uxHW9JpNraf{rbxB1=f}z*g o}fAJ6x NU_dPbƝ y<ˈ1@zCPC8(TBjB V>h;$'6Ac\|AG 7P1#7y'cRJl0jd7)X/v={6PI~ wmqoj6="|43L[F FFuYȏ)ۍX*ڃK5TM<.k~:j Pb9Kz@"͝)siz^v r+ ~k VZABū̲cD#M<G#/[XWĉu7jWb'Tt`/Mo% 6zXBjSGDZGmfǖSu[Uof9FK'VOS }PH0rL/w^SY3mgaEF8y$`2z!WHGUW^@fsx GvX rWn w~I.j9Wao@2PM2|˦n}+f$4tCBJ4ȾyOGh #^9DqXcd(mydL\kxZ\uZ >&RE8zmU&cXX;t8rk*B2,^Ȏ&[;)Hk=7{oEgh{/0,3Oxj:Vܷ͎bcPNI@X#Ƥ8y&j;=gkkEBA8L6>%o  :_G{WN ynzfMpozƐP8Hw |lvH$JTY_͋]0 G7~9S5:غ}bƞ1<~0ϛotQ3[%H!ƆZ{` ʐ'owHR59Ҳ;i[I|xę)kEu5ppiYmP(iZ žE 43 횕B& _QB+{sGQ aD PakqHˁ 3,q=7#~f1 %s\4)Ÿ2(p&N}rN;:{Ucnc/`~sq)FMiV|ʺ= ;vFdxTri#XOq8`!'צ)3 7GXysVҦe,okA`u!C\˷J=+$3도 S6AGc .io99sڡ{l3Ebyl  KG784?,j&Ҹ>2)螺-`>Bx[O(?) 0%s+09e䁂`< JhF1r8/lX,TVӱ&|Iq$_:xLX B1-wgcsOYiCVB]zw^Zzt]:H1iaC:ɧ14X%){OTǼKj`h[: yDV2T5sD($"l{ZxdO}lgD#/R0q<+j6  l 0부oI$LX,G7,Kǵ"xV ń*gwPtIC ͏!f;]t☀6}IP~ b9'q "Y;$GS#$a̼9>B?~K^ѭy$(}ܖ~Z^Ul佗9BJP#ϕނh|X<|EO# 3@ '{Eyq4:vrv`B,'v]V0z狎%D+O;,kDa& @ +9*ߙJ gW<yp+<"564Ò2c%"N"`gձV2ͻǺ74}LKjăを`'Id@A#^hdz5() -c4!Ơpv0C |lK/(cAJ}}+I: r,M?~b m`%:xE=8hf;qjx3-&~=r9 [ɑǪ<'0,u\=O7O:]\ϞZzCG{C|Pl  vm !(4%MW)c6eF=AFEnEe$'qɳф(z8\l V-xRP)Nvc^=3ClScCR@]M"@1TԃW";Rde`4@07/6Ai&`6pIϻ7q-<7ĹcD rt$fԊarbŇ6#ַ:U^Ʒ87!p.;5l;&xUA8x-O\=7\J;ʹ*)%wu[ɮRb 刦Vdt^vI{^ka.}9_274`u!)w< X{UUe<"JKsvn(Aljc]zP"bb[98PvIg?]Ş8}o-c\e[Upx5x{G;KENзw~zGO-9J'vd2ik*$[KR2E v}ZJ,;ͻR/]<;ڢPު0.ljQ>rL@buۚG٠%-oD<)E){Nk-誢pZ j-auPyo!O:q6/PF 2x~:u 8"[ޤWRX4jщN;U3j!kO&? 쨳z^\\^ǐg҃5˚vAj's(e@)R|n5Fe; wKF7BT?eו2ܽg0u;:|‘@s۾fJ22;>"#٧X"!ҝONmDnb@3˥^@y'fR]V1%dfq&Λ(@[~G~IռZvODpIAyc5j0),)xR0ngƩ !nDjEȦ {S6ƆIcH1ܹy6Vcn 랡,u>ߋ{ CUTYu_ Wxq-aT17Rv;u'Kg'}b!@hC]"0tђHޒ3. Zy#E'Q'- 8[lwyŧH3hQXZ=18s:Byy]GqX &54Y1-CwXNa 2 %$|t׺ q@oj1 $m$ 3a4"y=G&|x-\>FV b^-H"yF\S0 PgޓB]Mhay0xo%B8p"~ ?Q⁣bW#uJY;+k+E}ǂ .Xkb(ZM"m Ȕg̬|+REۅYi\C}fϨi:" eEqr9A꒫ؗS2@#`VvrމS:F^VlfY9J }J>XcN5Vt|%tz@2@+3{\\8>m/8]U\")Y=!Jitv]E%U~6ez'T9K2{ QG) ZOL1&#{4j|AJutelhn"LsWP-R@' {'>8lqlµUoo+*C, VyjKh+"{Xj#o2,s l(*=y}< ;J}8w\#g1%γv$>CMeV=͛KogI:cw!no/mI HWq]ƒ[mVP˅9Be#*N :*rrt+'od;n1N[ޞ%8.^y9Ou5gG<"'*|ܑjYXCMRqרˮ1c"g%HpC8*3F4.?EYUNWNx__43ܚ*Չ+||u%cTc=8lœOg8.E~8` f8f<ͰW]ʔ <#-h 8 = ]7|wFypDB7mMb1bɯI$I{oQqA c+D,Vm)AI/dw%bl_e͊QEÓwgF#b{ $I"qÞ&ς*!PLmN["ubKkvdy.nھuA쇪%8GF.~4 l N{4-E4G`oR*LJ{B%8x,KBYN?:E 42 /8KlB$x STfj&aDqM$J9?e|MDPVSG93־jOLȧ?sOCT+{=ۛSof(m; NZZ̅_Z}YʟW)dAs vO[g˧EGŭ/cE_5`(1nKbciB8vB 41:%3eJhԛӬۑB]0MJԩ9Ex32ʪ+ׁJ`1vS}C(F'nD#s{س9/tKg>xSBS"f=hkS̖OBN<5NUN̤Y]FC槄gt*|JhpjdaxΧwd=xDwi pdwݫv ڸW5kN&%p+ܝ6 ,3z9u)]KIX,tl$S +1V])"?Hɇxd6䇵Y" u4}" _1~ntp K1J@M9̀y9U[^)vsVk O~ 1E3rAp0| dk4-"O;ޗG嶩Zg839ÀZKtbc=btY*x-/d:jUAp Sȥ,roݧ{WAqަakUQn;}` -U#SLl÷H8o=}pqo<`KRI8[ e;g"|Ln)`&+Gt/z/ ^reT<=f51zK+1e|9摎@kd{/^跌3Nu30_l 0s; {붭FhC/5eO@Ϭd8zPY"k~X;FW##O\6\{ QacϏ smLw,\=Gsˎꔳmjab)d9hARF-|VUfVb~ߛb m5@ XӪ!=8מ6QqU$ښi(0 䐳lj["Iy ),-|GG6+)_0cHO!g>Q䙇礗!#ʂ -pm˦Sc9lvo@uk!ӕc{=]Qhš莻tg5YSd.++m*Gt#dJ(Wh\N^z_fWK{A9w c3XޫaFq0J|50k}9%λZ!<,!]+^y*N;xC\yr/Q9f(G_㥓pAV|P'󊫊' PS?}Gl%(dJ7ٝSY :j~o8Pv*ZG{n> jjo-HOa+ޮ1>s'=1vrty2 A,tŹMWoude>swt[ݯ8++E9/HD=ڒc豜F)Sbxqou,33"^̜0sUpOc %B:x 7ڵ˸_<"idT-AAL&{{U;?a;=gءߢ)odc`P9W'I Pr>GtIqAQJ f,+Fn0 bgMú&&{|HK"_wKsCAb@fCD\{/؂L$"XnF_A_Yxn(w 4΍MmA92@EFhl?o1%La#wF^l6lL$F {0"K+q.-嘉M0d)5ۛ3v%bPVzWؐ( ? qeT1vݼ|^tn% XJlJX|vHMG`C٭z$b}U3w<1%ɳSdc ٜ.VbnzQO`u\Jz(퍜P; 16;RZ"3TO"N=X:J!lP:d<5kc>`7 Wшfq4=O:X%(^zhΌ sIL2`FPry?%O\e+dO$SR6c!96hMu8-@<|gZ AltQ,m"돼he憨YPnPSIkc{\ʘWクԼDMGH{'ևIE<q1/hMy,D!3ٷh_E[{3DeK,r$Opi&Y$4}M Q%qU6jbp=ܣgDՐkUCOW(gu;m:ӷ3[[c v:{1OtVᙔ?0{I%\n3YB2IHh) 2Veɼ;:2!$d%!@s]##@k^{m>:d|nչق^2zu-=c,6dMF5*˒4?vÑz)eY =[|%/;ȟB[Ho#_jW u']MO$"1Ek%DuՁaQ*‘ [ϧ>eMK$cWFB'/msWIjn^j{zvnXhW%8`y"M5Etͥ E\r`l0]%˺5kk=E򥞉t^HK_93[}CԎXqy)ÒHRΩ !j@F7nR܎ ı%>xjXD!Wi%_; Qzօf;#\0Kb¢n[2W1B(:2+gPL|Q6+ 9E KRq@jcsgp/`A IRApVwEypc^rNav!s)0[82NH=BcLDv*i}-I6 7 RHA5I@fr? )Q7voAkJTNGK/n6 DU?@*zբSK_o -&$6-5^av S*zQwrҧf+&pi+8j zw+N1фCn0Jb 4bfti%w3\# mlO2K{8Xfcx#SXl6R Uh9TVb0}ʵ!"vTVx_=F'NnsQ?b9YYg6>  ^Qѩ -iD}T wzZMeTyeR0seqCڸ\䟾ρW`.t· ©imwP),K;)e1&ݮ3mZρ_d)<4zgi)/) edVa\&!Z%=nv|{CX]rs{d<{_ʠ Ԥ@]*{INl3F[2Ln (ڎy(*nh%ĩ~+"`):J^N۠\iJJIn31ġ[b,縱+rRä@ĵ >~=-L""7(CZy'3Ʒof=evy+İ O p(,9nQ腳\8iqG 6>]\drTJ;Mg{jQ=V:" (`^$)Pqpm6f7DGǫ>W&cd9]Tg5Kݘ !+t$H.6m!PC6uv$|=Eur7yךj}WOa;'vgsLA 4Qi5 DkAA~YGj:D Y~pxdD}7G=k"FbxQiXDd4 NMrMGWC9[51 ,|ŝSbXLQ `gj4vrcQ#ya2e^=70C^ʾ( >NpR$C$3jj @Q@8KķORk^yuF8)b}K?%vs91C 쭭ғ{&Fncrs6 J6Do9y $ߖh%RU4ZDٙ@kYA=H+vM[TcjZԝ(4p;bx p*?,ǭBe+ Q鱥g}cݾG>P*,|KFxQd⯟|Iǻpx[Ѓ,2|Q r`WUջ&v'L+0zYZ%jIbWk:f7޳kuVܓ:uKYJg{Ożu*uTP]^5sJ=ACMvQMtj3g195Lm l+BX֑J@vEn+7Shj&\ZS5X&2ن^1zZDĺ'od!tI4?<.|RQ/6̵z0C.OA#7b$Y!4-<䧁 HxԃUudmXㅇm]ɫu}Oե-@Ҁu_Zi1pJ!\`E V2z)2r|{.(ko+н/l"A&'{nIؐ䈹GV_mj}ힻ*tG=ݏ 4}v+5ڝϕRE'C{nޤq8\)(Ë=7h,).C{_#yhZkp=Tc*ZLdGR&˨9վzuoB&?JZ#c&5-z2òi1fģ1vh 6V-Qa%'o5rA<+9q]C=}5F>Zs,suS}B )WO,g>2skA^=g丩(qlAY˦Ʒs þySX<]KqVxknAu-,BȄB%,P6[g.Eo\LS'M_ '#6zb&]4ĥndԸ^teӛ,QTiUMʲ6n %k&gd41'BMa o=Htx L{ػ,3: 1w߻zN)zk4ek+e3.tSMX@(-̀"U{o#=if^kYw=Ӂt{pf 1qIaY.ޝEm@8"z>0EKv$xjC* )hP 0[ľ%Rf59+"⊾JZ/<7QE@+y5@ OV(p} /1{1 Yzk@U _3>Fdt3" <Œ̾zub rMw)9M*A/D<84>tKMh Io(h DޑtUTdt a;&Jݥ םaecENk3DuOkRRt[o"JN3;Պ@.[s\W]x Ocvf)ܙWʄ%CRYV3Ɯ@Ol֤#r5~#Qm 0o(ǕqSxV-ZNv'yWL./)8߁Pm@RX>,@r!j:;Ѵ[xDΑ1Og#R{Z~}g[xk)NB8VC44*<։kPTdAQ7ś@TYJ:\%8`u\>+|=@t,9ޛ-oN0ё{1cpP<\r}JT-ҟ/ KЦcn=t{heQXO݌A98; \̾y5Bxq>)=}‘u%#YEWj`gW8` WT1 =*w'ͪ,Nco1Dl}N(+AȰ;뉧OHgb/ߔd20ڤGu)qvޕIyʼnPmJkSࠉY N {z:ɵv)v>%-i"vڠƽӼiiB#w,E1kSi<>ȧ}XJ:2uXgǯ;YQn&'$r\0 ;~ϳ9\,O>Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }~ɯ#";~2}8K9eQJ-s Z]G)O`GD f| Ng.-6Ybqm?7a"4MP)pI%'R Ξ" GLNxzTQS(VLv~QXY8]AřE>$ځDw$&V.~? 2&SaU0JK)(Iz4'8$.߅>2a*;"}&rby<*l,Ca - >,˒#{a\Ձ҅Xc ulS?8hc|kgtu?tT /ąqdgq+LHƣq-ȆFW3܃A0ͧY?}Qշ'bP!:gGac=áLd333I6lᛁLKY<Tweh1T:4Tꐒj2*^Ձ*7J `B p̸^fw i*MnkRjw5>/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%8o^yn-]^ۤ-=R9i~uHRҶ@{{x=e#[x乳9sT߹>~Yj#-5Cb.Ĝ<(m Xiw\Gv!M|>7hl~;m'쩋Yua3|˵9|o љbxkU?O7iJSIt,:ؘy:]oߞ&qB!L4 ?$bڄz]<?=#ƵlQ;Ur"6!Tl~ir C.|r ]C#=Tlu.F0l۸a=*(`Y-?H7A8P`(NKdr᳅4-2ycAXV\ X \x<WWjRɩHv<c())~όI/<2!A <؞l =) =&y⍌` VG X#ňȯoB|a+8' ķAi#Y*Kh+Fw܋}Qv'nϹZUhQg2DKd6Y=P-É`{+{703495m*i=I(PЗ>+y4317gj|gj|QQM06^;xN 9M{]ʌus =d/q7ǚM >>_L)j"vdh!W갠?,v ~2wGINzOIjsaM Ǵ)KoP(s6O\L IdFf4?M)^m'(4@LLCǑ JE!@!r]xkq{t}d*拫  #@P<,ʚMd|=W-M2P'ߎ턅ӻ=>b+~4'[9^2>L2w|4:LA.s1d%ʃ[=et\EgKW?ۣV4ѳę5+ނhv]{"5QS9hpI^e^a4O_B,ljǸ9xh1 *kK<ߎ\:*k"ߤ@0ۛ?CX]EdCGDnSw/F$F1jHSQnҙE@ &^`T/Ņ>z+rYpK5C2#+K; L츉k[+f|AvrbZ^Hs 8aA 3h&ϳX9Xbxh #B>P |C2feJer![)7Ċ!N~[^is0#hrNb?*]5YW̥&g%Th^CJGXfv4ӈ9Q+ٜ۽2:4wV]^n1LDz2v *A h5eSjCGBHT B *D<>7Z^"`^h/Ig$K`KTٖ^qg >} jw/ 0qI,r ~JާDaz))K`JN`ݸeA\!%weGDʋ`Xa<Q_C4ø\4C?V$)ñ+88۾Q~$ROfRփ69Ɯ~z7X]_[27h+lڸ܊-&5h=H7gcDϻl3q)/174Dl(pgMu _[N-Ãl ܙd~?7+ F{.Zhw/,dO@vIy2QM?cKx$v47)RFjw9cX8L<Lq},᱊_5A@"Xzw!DW)aj} =\QERBj_AsY1s߉Ė6z Cv: Jz^(Y֔fy~B$t=~cO;+yRo:Y (0k/cyAƗ]y67lkhB+e `v$_44G#VӮwO1,nNDpTQAw \zZ KH>T,eN=Q|s'c^ i;Lv89RN:Ew9l<ѽډw1?5apSu-"ىYP QXusOUxDݠcSv߬&AΉ5$}3^y*AٳLyboWtΙӪ%F7w]Rf&C>nY9o!I "ߋ]+h\Uqk~)tRћe{-*`3g:)elͅbTOSj enʥ8o_T㌻8#[KԦ%Mt:P-K, N7>vHE)B<4ͺ*;,߉q~$#[(! Woj1)cU\,`ΛNܔB"}7SGA߽_د?,ۜҤ&$}t/b;GSUL5.]YujGF߾e'JSTбV8B u'GRK_ݾ{p(ZLlkШ^Axgl袾Nic;6[ s}O\[ȭCU; ǫZGo#Hp4ӊBG6QL&S]SS>'r9 5RcJJjtE;it` Ec\*\lӌ[ϓ9^?FqQUC"m $\YA3vZWY\㚜tB~/ZީߛqB闕cņi§=%c"Gcz758b[DajX rCB8@]rjOs7QH[J?mԈ5D9}^[~)Y Urڽ A0)݋h.>U%}%۫nPw=80uњ೼>j\4@>;/u ĉTO&<1+9}Kóڟu~ZP*xa{b)'DHoCvz!ɠQH͸d>p|"ʏR|myASx%~Uʟ mPh j^`>ÙfOv03]p|r^e]eID$1 G-vJ \C&<]"Zqn@x&L;Omu|7iG.3>dNz mu1=v6]DLcg@xsD@*& 7AĹO+G\+(mKfgV6*}ArO Yp̨_FX"3M2Ä GŸƼ+o߳NJ@ә:'lZQf!ԇl jij2c^NȘŸ ٻ2A*$0 ޑ]c~ھӒˍ->BBqF+b4בk//R8&{ TL:L:2F@H ѩ hQ|]NP ޜL-5%e{(^TJt4% 3gAfMK<$H6uK/ &e^8;* 8{̣m{KRe%)z7o%-g,,[6Sf7Jq\vkIgܞ U(rڌҨ0>+ϛz< whFoL;mZo#jcRKIAHe6<5=9*rvnsd{%HL׈ YP/Ǭ՚R+ pPL{qlwot$I+#-0nO >΋ƯobѺ JxHR+krٟOa{t)W!2Ѩ@Di]tic V ^:=Ǻ:[{;Y6vPn^C:7%]hx002&MVDe.\]'LdJB4S< Ky%ya_ONtu/n9眃QkD6>m4Ŗ!# ]R?'@jk۔1ޑ DiR=I&jCID ] iKv $D!=1:`F˭6 qSFfV47"(CZ8ҵߌbZt<.Fʨ3j=' KtrXٕj^^q,E8 WKkBw_H;ae2xD|%| ̙컣ٙ?''\osb~ӪEt5x4`)Dc52 gő{:LoOT:MlI[x{% <Ǵ+ ΝVӒYmB}#p }$}wLU6H ʚn4\o%U_{ywL(B?h60&) l[+"'Qn[Fsy=^UU8[W+nog¨@\n#˩TPY"a`|N4,ۛA4TdQ}xxb@βCM/ySb0H rΪAI`Յp=p* lZ d*Ιf*;X=_\߳3RPЪm>׺ RN;N*ȃyZVOLBU|8DAB;'NQ$|!@;;ڰ4YP9&Bx(7#9}(cOøMԥCR8?f@S XJ|~ԊCrpOw <ɨyXa'DSG3]Xkݖzz횂2™POgu'8Eb1ZO^|U ig 䫟+TIR##=&wN`*e QAeI,}c:QJ ,\꩑ơ[,_ЧZV&63=| W*1:㣛$OpT|)-ƖZlb+4LK$y\O-6&N"z"D )[Z0mp'~ijZOmٍ SGՕ}\q!NeU*BSLX_'ZMQǂԓ&yOĬN`9NI,r+^><):ؒ_[~Q«%#03n} 4UD[ROC=9`yxN<u}ƒj.K8FF@gLRE$V#L/tާ3A>/Qm΋ ,WѴRC(,˗!Vk'!HI3Igi"KQhzzx,vL=apdh+bN$.jqŞ71^mk1V_SjBߓ1d8_:ۖ^3>TQngQ'"#h8@ew7"JQE"7)Z_+P仫cF,Z!'ӊlٹhUmf DȘyѾȳu-GُIj:4A:)>W iП}sbҖ;Ѹ'*)r-ykV}p`d[ .ET֧|,@h\rjfy.p.Df`^ xAhf 1yk}:54#ѠG&S7EI u7/j 3RWQE;qk?,~~j((]2_xIziIp#HO#w:>kzنެ/ӳ/+C˺; z{Jl=}" ^~LoP7x *_Hq9 P8ӥCHx 1!+ mb ?x\y Yr/绋O Wk\;9U zĵce&J똑<3m;6?gsiby-,"=j!eMDpGձ=O7,Z0-Iu{m}`;]/PŦNSmb /+J]G1lk} fA焇/~_KzOJQnZ $?yWs,h:-gr%dȣ+=B穊\Fi0ЪH c'ZI Fe&UƹE4+xQt *^QMmop `Ϝ]S23LbLiV2W0,萁S/uߩ"OZXT[>_x~O(G50&{[D9=C)/9W59w=$t1:zF?!TuRT)Q)5z.A, dI 'M)̌#FN j ~, O߆0D@mMJA}dګ iG䭝VD/F5ԩQo g Ya/\9-ۧGwc8-0վFvM7pj^ H|O a= i@4N}bƟ~OБ:҉֒]y{$w*,FA_at=ZamN3s@dxZvZ۪]%ZĭڰD//1 DS̩=P{?K@ @ 9\alP?ޗ"iǺCsqZw$]IkSG{pe_%#(f `}F5GdQGOo#J>j/e 3zD>{}F1:h08LcBfёyٔq{vR `o(l2  ?RΟȵ=;lALx ,af׎̝W`i$flp3¹AZ=E\Y//6kXƲ Vߌ.l6k\R{kҧފhl_ `hվd?s1kX}DmGƛ!thg Kkk[a*:/oryǴpΈʹ>/ߎhqWŵj'>E\[m`093(d)]vӦ]KZUC8莈7TW6 H&H iDMA|}4T[\ZLsWsܷ{dxܤ)}ֻ 錊:MKh sN1cvseE+<͟xO2 n#§T:EACN8*Dԕ\A#5kxQ}|wNIF$cx~Px=Te7+|N63Ql!٤sU#nsqmYQ -7 3P\!JJ@7{}6:e 9fFk ^FUP\}"=9೗Y2S93R \LsbgYK ТD8J4BϪ>b !4wl<;>BX)+Q-&v0Rp~4fm<HE'a|O5dw"5AgP)&ahG0N|p`YA bol^Kh[_cO,?[d x-"eRSӔvdaԋ8l,ͺ F }]dMT2;@K+LO+FG=m32 u֦<Evn_727^rzs> /4YϨ䭑񫩴 7֧a1_U]v$Ke&b̷W`Ce'oiKDshg1Ϥ82hGl/vڵA;TH'1VfϞ8 '/BT[fʝ5RN6s߬zvȜ,S4+Z 8r#!ADT4e`8〶Y )8!M*v)yuc L(m! xF͂+q t94'2_~߶ub#~#mx+a|Hnق3 pk@ m0NDO9[&$|{/K{ҝ(x*B;m~jȋ(ƍ,5RA.i{2Z]ɺnD?<א#Pc='[Hh/@뮹 (z1fT7<{2<gj64^ɋwc67(*lUXsdd{Bgq 8oYն,M[ɶ~iK_~;ѕhM"f< ϬVG4VVs^G%Iy Fn LrN3U ez̥bT{M yvO](>]3(‧yH\Awǹ9Zd5u.p/{t٭/Rj%ۜ|K1hgF2O: 2 :-)2$W4RΟj[8 g{ Sr^YL̟n]X[j4o^rtTw05!Fg IYl}Q$lrb^ftv+ӎ"݋r\"d[r]rZ`K")x@ S;n  џ|UFxcΧu=r&pI8/ %L O"M@ (YBk_ũ7V' M :}kY5)ikkЬzo Ywx Rjg6P`P^L}1`;xo^0S`gcg#J{ZD=.3,)GHܟ~o#↛/upCGB6_-'Pnf/vj aeK0khY0dP A& gfV́LS!v4Z_eBBCSwlo4F<31.P5ZTRlxSZ}{޶䋻)M ʄq.śBFVJU^|6GFW5`8yܮ\@=;[9)Hybfw/ӈ;Ih %Ma@m L;_qly?=ԫ-$YYr/#b{NV9(.C bqz%uWLv BnP"X oegGT~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟ dy9RA2u]5&~zG4aJu.iUض%A9R]O o썯fe֘աXYV9ۓ؄S&Dy<${N O$^!&t^pArѴ=Ziz],]_3f|7o^EO!uaQ46*+=zF`b< U>wZYIyLlF vIxw[_P$\f5HGy M k ОjIeΆܴ0˦x2y{/B9CWX 5A4-meІ8:EA^`6 Zsto? yNQA14 d_\:iSԑqhTX4)x>$z=D_+2T}SSiҼEo8U-0[fd1kZ vV3Wš:\(p\OA,X3 vi⯒1//T ®e3vuFͶ8p~n>fijU?Ze,̷StH4 f+'.z^Sd&=^7œ}3^ힸ}ӄ\{B%Q>} (IA,eUԠ"BDQpaک#m|)}Bdɻ&ë<~O&42XOÄ {n4}ӗToMHZ=, *~L\jIOp IJgSE_/s{H54hn\EBndŞ"/άE'"2UJ i_FCJ6[No {OAYLED]ԯ@{^>xƒz86.! ntg: ;t[nLak/xƶ595^K ?}jamtu)5p@W݅YoIG˰EZb)bul+q|aXu5(M@.\Ę-} `b^wWL),_ %kVu#+ǫn4V~k{:!-"sn:@IsZpJ¸GDc_ppdB̈́k[(.hݮ#ٵSˤn_87r|:sl}\U\zZ\nY JRQMܓQ!X (|-R{l䐀(cB`{?HAz5-ӋY\7RC,^bnG @s /)}asN|>;~vŻprC~slgN;lNeTV' s`V]YU_-+[e[ j>7H Tu)9)=3= W?QK 8<,:W!# :Nż8+vz OL8)u9uQQm%eO޸ȪT]7BSY~ Ȃvd208[AT틁z$CdE.LΏ2MÃ[Sʫ<\ o9^F:p\A*ω8a2"@<=|1 XFGhˠ 4F=ī1C#*9,cu 쉐,)sm|9M^]E5J*` |^[A12 >z[P[]cTF|9A-$udGjB'h Cj3pq1 4T`3Ƿ%b6K5j-LăԋŁDQ" ٧{<޺E5;DM%5[ƦsJo%Cl]rᅄ AcxgTя@F4QRr`U7;LCD 2 z; /m!x0F%դsJ,TuT?=ɣ-[wuUwͧc~oȞ(gdc`#T4ۋݘm5zZev*%SBÀ201K[hh`~ m^x`8tK^^}mHNPIsp1ޠ*?> Vވ%`"8!jdV'>:t18JhNۈ}+\5V[^'<"t{W8+lvKjyTԍ;Dod){}O1E>DC[3z Z/O{/!h ,ȞP@'7}_B^e RjQ(:Rz9Z"NU$dEAt$^o =1TI}0B R#%teͲPv}3OIK1 ;(m|# '.E Rԍ^B?/wVYUā&_;6y;M^6I)Ga0aW.uCJoCU+{8n2=];Le>^d|G~ul^mCӢ(I4e1! ʔm> -r%wj,^bA G(١V&Fr[k8 /6{R8(OD e]>_Ԯw3X|\SD!n# Jf?W" ۶]xv 1< "P9L GȮuջ7]MKRU?L4EzկŵgJ@+AG/{W/ɷia<嵶QGW0d]#p<Ԕ"$ |K^Rny[Q` )ҙ0-\G4 $%]Y׬1+Cq(㪓s|~"Tޮk?qwW3hKk.^鎵ZJ޴^/U6]} XBSًO%]08O ׺oN;6WRV\S r*NkÌHU' C96,/zLL P=u]C[%&QnfࡑTʦ}..W汽`}7~,ʳG/f[QC!lGktO4 )i\ ޲a@fbY(-{6D^ =\:0/V pqy.E.X/8mT&[3]g[t~K[di/Gq`M̓/BЩJ'Kxbp=(u90mxLŹ!/J"k;}S{ قa `m=*ϋ5L|mAm d¾wHsN;pXB5ԅBLJk~}盂gM >q,5s{ž~8 |I ]R(ƲaN,bû5і|=ONCiAთ:T3oL#|D3dLbSHC];y1j'zys8Js[H$/ʰp[+GЖyrc2& q M#Hq9~4h"J._ĩ&L9YtsxJV[ pm{Q3T'J}XP@iܸ/)=Gfe0*=X>48\8s\ H`?=8()&E/I 6a4fgE+V1ɋc~-e4Ly]=Eӭ A{{; ^m[:u0 Z!,_N55i{GhZ'bH\ڊZB'7dC"Uv]鐸*̺P0kѶb- 9R*e\5 +ˈo<=7*[:^Hrˑj'?yjd{Gs^]S W%OpHf-Wkku~&Mf!@*Ż8J}44詑*(OkGBEÏ&g͢Gp"چҸK[ޑ)&y8h{s{i=Hh8фJPZS#$wW )y6`ph< OAYdH~&Is,XKH@`Fzvcw74b"G ᑿ{Z@b^ae;+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕ{Tuy>+*a} R]ɔTDcj4>H c*ZEd'kWxSleτFIZP܁`tE vY=N}&9JF,T{܋a+yD XLzqmO&U2"A E Xmo`)3 3iC:dO4LJ`1DEVDt+QXIgC. $5,; ə-ۼSt03_`;tNl}YM6)Am &"= ީ;O >(Xd[E=g1a~"BH9rƳn< ADT=_`4);|a7$HPwkQ' .:~pw@6GA-O"S{;V-w4޳'>ɃNiߥR\SdU]Aɗ!gT\ȯ+3d(ᖄlU-Yt;j-[5frɡ”3oҴM+kg>a_$Jo<8.lp#Tչ[/$MfcŞИ)Z&-o? ,g<(tA\WdE` +4J4 Σ 9ݑXشDzu/0ҷ O:IߛFyk=jxܖ0-#R30guRAB}鰎U0SC(K/ށӬ^͹hV幧"#{'*k-ҵԃUf]n4Ɏ1Tdb&wzS uȔ1P)IZªbr=m-HnXlHm5Yj62}/9e?C .J#- ]MǑ)f@Dg('ZOA $ͫC2s͑qgSg)gZJX2P ]V#9 h̩XO"3Pl#ɴ`깫Ll|HQ3{/Ň E,ݔ:?A%ʍT{k̑c1 `=W؜!] fD76*r ~Q)ui A3+*U"5Pz,l6j=+`6 )y~{&I%F)(\爚[U9)dyCx HIȱfIE!T@ZP; m@Қrk#,rށQwū3+5@AeĀ\OaAX{; fBRrqb RJJ V9EtckGAJM&JddϰoV#&\0}O.@ < V0@JhXi\~aU X'qiJ -{϶VI\. [GyC%dg x4vo?/::EDW~p,Vdifم d>K~({;>XaʳX[ t~ƞuWLa-ז6\RE>3{}Z#=[G%EC;2ڥiPt%ǹ,e/ Bw| LoDr|u*hPe[J.z;4`\1?{<"]`%;? v؉5~Kuibk.uvT]$66?7$zJx{6X=XX0uoB3`,`:o#Tfnx8㡁GrrPs^^x:;@zDɨԞ&gDYm{ɻa@X]lrqվoNus>)($KPzPܖWL/\'ɸ =e=-^r:2*>+ Tt)y$9NR1%M0@Yt%5|+`uH Cxi[02+'Fhy ,>Vp{ǝ(u/~ 0\'UPLxއ4e).]3E| oPB̨T EfB, )pzˑCY_q1( 9XEF8 i4m[H´,PcNi+gC)r,=߱}6|ڭQ_ PѬa8u ZdN`z|bx#u.s 5$SLA鶕8{1+ ~<"7VDȉ!<T >nL g,`3YFz(&rWxmeZ_|&ver:V=x8b3K~!My4,_=mVJC WuWQ/P {ΰ{^􄬤uF0qS0%L;7N;ixNJ9 >EcFQz8!S=&S$MU/Da/w^2ԓqJc~X}vvH6 q~"N;jK|d ">y kgZ ,o{-0O^WS"fAu^`{5( #:3PR la8veB޺0#i #Ud̶s~9è1LpA%c:~CMg"T; DVsj'DSoa gQHx.C5: nmEfVS ?. Yi{/B)a}M5-/^ԎJuʉ4 \ w4]u t sn(~0yfiΧJ62h6 U;1 {Α`A;zqlҦPp $Zۨ3d+j6^)03Nw3EQ[n}9k>hCf /`-KHɋ{IvT޽|X)r[PYgq g>F? N]3*'(El^`Nl56ws{?9>4@ -z2 (^+0ڒjYҏT ZFB9WP`sG'3nm>X.Gۭe.cEu=1N: 4b=-}wؑՈwZK, YlR=zX3c^h@U,Rj)WC8pk:):G4U&R[չ߇'z)\~UBd&ӥ1=D(=ZcQZN{9/#:J t޸Ϋ=$Zzb#eT'Ԟ0;Zx'.7:fI,/GG %t V @WA:& &ߍT12%O3e 0նvm-9^1#ѕbQwX+Mȅ 6 e(>w/_ŽD:>cFHC"x2e'ę:)aj#nqU%0yP ]}bic9ahjLZ9*JĖHE(%5Na" {-?&} *g(8z ( \]4챝iܕ#>1]/rW]Ue))dn3)-KrX 2 zYYs: a*!&$X86pΓ3=rѧ o'zkMn,H@lʅ <u[_xk]f  7 Nr:@ ?|Ub'1{8ZeUq8Re0(9Ҭ`@{}o:`=۝Қy)L日%N'I}2SzwGEO$z)M[U\B:]iw7>Cr=ioëԗtGC2st'N/ bU et^lgLPɅw2jZK7xv#D;h%r*]4Tڵ9p(żx>(V0N:XHleLH7o޻pқ'/n:9x"P7ګ/ a5F0rە.~}g*v\J3QfY4^ˇS3\*smNZpвDsi ϡ`y>4>.ųovyCnizʽޠs iqTϪnY""]%}xjVFvBn/;GԂ|ϟNlYv `Л8yD(J{(ˮ8Y-pw(6>a5!t`{9b^+?ȂnwDTmmsQ*van?ԇǒ$֞^H/@dYa X TH%EW5pM|{zQpe8`AGfv}ß?}?i:a `>#vWrGa _Cp%CSI­NgzCHݜs D̋W[hHNz=DBJ/?22C{6=ICHgqHVƲ (̤4<)rŮnd JFfVħ?3+qzmr).\YE"4RztmzጜOV@4{?%#?AU,NW7imӎ4QASPW ^㒬o6U)[Ɂӻv$}Yסyv֩֝fQ: !qsxJ.-KUi W:Ja7o|o_݂tb@k,U=1xuq`:9PyI\ eeh'9SiߦK{H]0#MVp P-^łq~i:$$M): {yڰ+P zkbkqÃmFl0t|kIc>@!"l$˸2HLLicW٫[;c82Cqi=KH]Ep|ozL"KNjMbw:e`"C7ip+H}!(`iEJޝEʡn*PgoBY sCqڿ~3-i5~OFy tp _YzЯ_Ria!3y*t]6V{!yTO=e#y8QwsaóG{Ɯ.OgxG<_2;C+5gTPDA֏ Y[Dz$b.ns;JjaN*`b)"ImeaMkn2YmUvHBug2>(xaZVPZYl:zZ=FtnWR7 g=N N}]_:Sp=gq JwcXVqGB jH )hbow('#Dfͱ]bHsmu$l[-yQ}T Pq_AͬğС4*҉@^%q{^QT"Ğ1Yξ!%aN'W>!`K.;",{wd˞t`&":Q=^M)Uw~BGhNV?S9+S\dۮsQ)]`BsԄEƆK\mU9J+%Bu"C!;dڢae[g<̊^i<,BaxYa| ַiqSՔr&^mHet#QzOJmq[ë(!c8NťxH/`of8ȅDh$EQh ^t`vhP 1۾{ت5Ǯ,1•Ν!6 K|z-‚p/^"p`Flu,ln0"]@:n<KsEMUpdatZOi1~tQ9H KʊT}!nZ vّp}o# *9@1t=\Eʈr`B=^G^p k "7-;OHlnw;rE֖~46Fcq8R.|9Ͳ^$=!?^jZg0L\L 0gppl}|*S@}p\"]qoHc{bcHަJNR-_>'hY)U0z,@d21X?*]>gSՖ/ l4bTCKG+M N pyXJůE݌Iv3}l Ė`d'Ir]LT*7rm^_%67خɈ F/MnØJ ҋdMvs>H k}3҆v34:Qj1Pl:8 =;8^~F XgݼHf=JڙF?otz&vY͛ω2aCŐ/PbpRfXk9`+'EV ɱ \#S줄w o([^\ϱ6DXVa&IHvb9c 7hpXz|}xnv0m/{ݘ{p. A O3J+7j3G[+nأS=%}t<p'e$FX,P\' TVJ#zY֗W CԘ; O>_(>0}N[ZQI0{繳EEb5Qv{›Fl<(0 S yg(2e$Iѧ uD5'S {ZmKУ 5^ҖmM*r L)Mnȏ@DB <2'IFy˼d\ Rs KɯlU.ެQi7tXC7^yVm1?kgjD]F 6%\z+}%{/$'JD2"]Td| A/a| rBWֶS>\Z6ag D-|o煮\>Ft.Sa;z;H$b0We BJ(:==_a~jy_ + (H~#佛k$~o4PK{-Y3p'-WF|,[MN~)y :6SXc!99ZίNĢuQA>f'jUy={y ǟ0?=2-S}ut4dE╊ {"Q{S@|&ԣjR١zb s\&Jp)q2ݙõ6Xbaps9Ae}~8vⲋ lF ]8u焙Ram%,b%摤=~ppDO}YR|j>eQY+?VZ{ κÎx9i\BĩI>EV=h' [e;rg,9%8'tØٞT)6>Ъc"e=Nt^YR&f 'OhzZiTݸ` B"CP %aX>"pȣYBtISMŋ`iV ?Մ;dh;|.,6coƘ{W`ch^>Q x܋I Sayۅ>9%WvzSU6PqDNJf水9~ >r8ީZ|2eЛiD+(#ˈs67,$~/m,c,Pc^Mt6l WClv7Tz˟r>4.zOރmsd}T7󑝂JxC~UVcP3uYv$12rϧg ݨBUI:b6ZU>5b.~CvGq /ѬmMeLy|FKHWe%)ޅֽS}٩X6MH3WqӊvŠ5`O00_Qϡ\2ӋÝ,dm(Đ"9s!LB/|7^W,1"ASn `oձ!_yq0} uVs ˀ|7@€J& #Uxw\'tH! yս0)ܐˌF s =Z9DqX#$(mag J>ŵ0R5}Dؕ*=vl2"|oN_nMEH=sk:b6(~xn缢r3o{26^R]׊ٽX1^(?W `&gR&Ŋ2!VWA+om =u.(BHʈآ5YI?)Det*q<-|jc9nzfơxz𡰓3|RPowHr .Z̈́# _TMsYܾtba,^3SwH>Lk/e5Fc )jL>̂7մfqTP$TA"OU} Nz\x,SlƜo:ʅƨ7O|oh/cOu쎤6e"/!`#dima+,\'VKAg)M*sTsղqmG)Vn-:mCaCi$HaҦUj=c[|=mf?g\MD2皦1Ag/]3-79|tC:5oEċinly:4֗gpMXV֤.}mteջ\{]VN!zyXAN5DI A9W{bv%6ޠJ4 RWA]{<1![17:)r&JxD!nrn.-*ma dh׬\uM<ԼG? 6bޮ 7Q$c vuku0QLܱ-8UEp~R#ζн -(s 5f}՛"I8Z9dc \Tg\46hQ0&k-AC= W?ާoX/ٺBNot'*@3Ι'Bd ZJյ7WR4|ڤr(.ؑpV4ng5zr\R&*_XwYSbw"pHi[&~,* #d8޳S06/e/ }ژ8x*n`"prmM1W/abeZ H@+þ9 HC679N^}=+O2gɃƜ@n]x)czbilAsR&vc3fkNdhL7DGh}ltDo; cd K(WBcҦ1#:h {ZB#`E(ͻ< '&eԺRAkp/ @*t&JC#{Jt5%UNibʆt'dTGߦo_lSr2^STxwmIQRQ捾"6:;Ƽ`خP5_tdmt='b JߢCWA*˜QCS dW+ nXOӋ=Xb1a!c= DxW//n荎\0@XCVSQCanxgWp z'Ge {+5{Z0KUt RMsT3AB#`;۲w}ʍwl,XQ{ \Xі"]g@h M>ZP&%ja{ $03xxZ*i=lװpkX{<&odPH6v5ƫwh3D2LO1depEf8V-D%I}#7b m`%:JxzV ⠙ĥkOyAA\JQgH|77dfOճ{%.RhaẸ/Y=tR=W d@t3Y:(TrpB;쁶{&EJXܦ$C'HHm/+I]Hy@z>*ak/MzCAfНjA2"^]d'2dDyؗ-}*0$=]~"\̚zȕ(tBjYi7Ja nl96AB7y,}?%>aaӤor_[-xJԳx $ݭ! _oYЃؙH/VgNQq璸`Gu<&kWύ=ҎrʗQm~v\,e0@ {MqxX w^]:ivtFAwvKqvInҀՅOA&07J`%.[h|"Jݩܰ(Alj8ۑJ(1$m($ ݧK Is~](~r7ò *Xc7a+~ƚM'JX/p|B9{G>{-8;dpizkbTL=E >F<9ֳNg.mQrxUL^=eyrUnk+n B$rKmғ!["_zQp |zv^kܽwU^Z8F- ڤ@a&GTG\eBЭBޠe R`hzou+cqd:s00>$~j*/Ys*]cLH-} ZnzDD39kO`GM^{]SSse`@͒]sO 9t qHfJ@vy5*if34m|ku#<}Gƫaqx^^Ʀ /`vt}@(m_gճ'9ˊ$"}B5vbd#λYtB;a?;WH.ZE rh/m>{@M~-BOB'a.x-ud*c$|hQ- \31fN'7 `n/\-XL7{y]*@'5Y[(,;|Xa 2I~)I&49yP{hxV-=_dtzjO_o`ƹ\B<bLEarz'l}{彩#x-͌ו76|w^Rrg&yƬM8Cd*sP-jS~R<̀~ mnuh-sP/C^Czߌߚ7ǜFy%11Y5WXδ(H/@ktzkA|Ssϟ`h5>w:*~H%aDwK4OOzrW,:hYr wb5m(J8݀)c.oL=\K± wyZx6sxUgiļ:B- B 1\I$/gdcXCGw).%?Wf:WGEuKo-&"K^^>0ͅOJ̟^>cٷ=J,8䑤Y}{0q׉tTWQlNH {['7AXj [/\ǔQrr{3h;!B'7%%,w8e_m^ߤ3T $ GҔ doL8!\pHCjŮ:\[>[|ӱAiUMjpˋoI/LBdln yL[V:_f=WHDӹ9 >r)V17Lp7-`Hjv&bϰ=9/ ˛EU眠<t5A10V=lW>0o^L)QkHZLO {zu/Ug dSbف|%Ȼ1H`niOu=.Ċ:h5|qdiWfWCGҊa؂DN _gI O+X:.қrLxO uF93 7)D-qoNv}*b rV,f d=!3:W &T{3N*ub&;ǘI ݘo, ymks8I\qUC(!O]AbmЮet@n8BxX%e%,؊֙sYBA'P \zЊω±!%Dj)j4>Ac4+Rݩi4]WQm3F"p|cUE*{Sf !-|'bjKSsyCkNc`Vsܠ-SY{RW^t=G$~v7w\Gx}P1SaM,m"+,yJi0ro s&JcvY%рJ?Qg(7Hڋ3iY 5o Sm.}%s H-ZY&hdD~OjITۥ o+PYɆ&Ier؅_ \-t/^|XvIqVN|pȔȄjaxo1)kF,x:Z՘J2)=EBftț 8\C{XV|i1'zɆq$cMMt6\ICx{/<Wޗ)$UOVLugVǣ֥5xKbpVJKb  9 9 d+X} 0jd}5 63EilSaq([QjV;;' H|my=vxM$)P앶hrDjP‰ej*:%.=}ɜqƌ+@ /8/X/:Jm:01$&j|@n@#;Gym[j[ҋzs-چ;+%g7~J;7Y V1"*[W0#\|0{̘Qq=YeIR{I"x,) ftD2isJpڑ&f9XD[kHs rÝcNbGiZXSg\ELC-g#dͦyvQᒧ:t=cئ:/rΖ4ȶf]~ *ɷTz#o<\3hPm#ⵡe{`^`"T <*E댠B= *v^R?*x j2jZ. I|TTʲ\0U ,zg}Mk-i;˱Dd Ug<(b 1š dQG!faf{ouu2Ս=w]I$[i#ԃh^ɧM zO*th끠J)C@K+F+ LC K ({ZRVܰ젏)N>hq} ?{)_4m1 @8cpBa0.!fW#9Y'E7>砨d G ,M hY(2z)*ݽYxHFci5c;~[ƞ~iV׫乀>x Mi#Kk{!H.nھMuYxP/ 6e ={.~o !N qHSKTIbF b$ e=;^,BCs9-{wzNQF!D" sO* ,P |QM$JKޫj^aADp:X?{"="[ =x| QY9Nъڴߑ!ucE;Kj-L;PrT<k8lP # ݖkM&.;pEm;@e3SAf؎+tuU$:YO+"*ʪ+ @wo}`1vSL!/F'17 ap.g 0^g X {\@ѸfhٞP}-*,9, fE$71]7< n@i8)9 uu~;/m]#C m\:m I xp+mAYfRF5RmNɇ XA$ȞN:# HXgwwlu刑"%Gk2p8`lCb].3 /^!WA 66tP IֻG(uݼ |&슕nHbR9dLƔ@է 7Pi(X*B‡$xIA>a͡`9)ay8ٻy;"eC̥3 jD1+=bXbr~{SԹeGAhuJYӶbhض@yPK {a(;'٪ʵVѪVX0y2_VӃs{ټ6Z$L俠ūapʌ &萵W v<E YA[ 3~ʹo.0P*i6}B/CDf礗 #S(X ~hNu8w<+G{ćB;ҝ$M=)f\W,r.m*H~F͡b-ᕼ\{eves&-#|ERL`i ;ş8UR%O9 QJs;c%e(MSm75]nwp0`$jBJh; \5<$Q8Q']pnգ6Oj+Y>({I"us̓բn ̌؞"Jj^ uyePgsz`>|4F*R[Vq^FN%\ &aX_'6,qs6ڜ Li#2Vods[2ǐsצj IgE*_xu @ M" y"LK 5;d벊3cxZM.  `v0"";^ g")oR/V6#>`RS= &bqB*?:t4\*yU|(">4fx.ovf&x*c:1l _hr٠Vc$zTwQ$m"y.#AM QZJ^wS)a_1s\j^&Mj~N(Z x!]/7[Sx[o9G*z3"ke's|d+LQ'@U"|aDP[݆q]EQBGW|Ѽvt cEPnx^詐5fkl.O1G]VwhvUj  )k!wOtY-Ʊ} v:q*I9;[QIKt evI*WL|6ZB4UԞD#NYn<ͮE0PZ4nwL )E$ujhx8 c#,}mI^IlP^TY S1v++{^/kPR"rxwȁ{ m-#i5+kZuU#䒣#' p0{-]ly)]PUg!gS":ͥɋ$( TD Ku1;kHbE}=WR3ӽ(rg7nvs&fX 0K@+GQ H(zSj&E '}8 0S~Ɲ-R>1lJ7:rq^vx; C8[Apt/PfAmq4Y<'O}DY,m0H }TsFiWMQCU/ -<5Nvh7IJ;%K# ^8Uγ2" G)~h丙i(JuF6% u‘>dugR=TЎXdJT/Ɏw_I⷏CZ<z=QG J^qw{jIT f ń~k)Ƀ`.n>yJ;@OLmi^{Dxd &YlĥA Li6P1}ңJ [>ܠTI3F(N+_nk32A06|f !טqd*3 FlP@ÁRBy=[y/ӧ\"bGe /%V;%Keh{:)Erpl6>  ^Qѩ -ԉ0ŲW wzKMZʨ_9 s%q÷qI?^9[xPOxjq [V\Q0{m15 Gl/ Wl?gŘ0wl }&{=&:KOKyJ6C!Va~ I7/+8w^`.!tOg/Wx @Mʨzy Ե/:e䫜;9jϸP/x_fɍaK~\ۑt9ܾA6T(xE>gE7~.W]H$|gXcn"a= aǍ]iι (L~&dGE͌W%bkzhBT%I !#eJʸX2ӾO>kFi+y@[/ 4= XxA!qEw^8YuCգFuEzzNX-Af9l*p}|@z T\Ą ѫ$na R`>zz ]Tg5CU1x0?yb-,%1?Y@k$*IqdR]kB<jOa;)M$`A( L`%\a.> J{Սг7 (CJqǔrejbXLsAqI+^zQLo3e 5q̏;eyHԞpLY{Wsca07( :{O)O3{>QZ6^( ʥI"o-]R {qƜ4l A׽]^=js'dE8mw]JS W΀VH#}8x21tR[h a*Ey?Mλa}s:>R,{^yHe3Wٰq&P4=)w.^i8L{ȁM1uD``2PXqޑJ08|- naiDO{J'WI{]'+D(ޤA}2:YLt,Uc5+}[%f]P0TNQtnyG: *٤M"NBzc{\R'O Y87';څe6x )YxevQr`b=iWg9x)_ {ObWq Z&cǻw/@cucA_"ٞ'9q GR}%򪑜:*jea~At2yށ2A/Ԟv t4<{ {uvCq6$j x^j x 謁=y]׮ńfUɨh Fن^ҬzZDpb k{@zN 'YS*u5朹V;f%ڜ)`&Y$"?];P}.No3`uUݳ6"=D5= t H|MEMN2;?t4mcRjUt7B )'mPYv/VJmEd3;gESj $%wGG"v}UjKGz7 ػ,3~T*`GIgwMf[=/l~`LINnԎ˭RYro1†>@Mqtt`$ؕeܩMONju^m0z<ħ )IoP 0[?} BRf59+"⊾8<7QcAnDy啰odM"<@BnF$Wf1=yY<n@U󹊇?bռ1< 2mΛwV3w &#i c]g3ڎVY*B-;$IUܤ1BzI =MCwͽ 7&,T JIet r2 |h@zӎzUpZR',W˨Ň zo6kQf\"hsGT Z rQU$v QxRlwcLm kM6O8 jeϷz8.Ջ#l1FB`Aif<\KN8 $"! \\友9oK֪`0. ~]BS.t]1 ]F@-D ,3жWXVO}waƔ6t&.h8 gd8EZ8Sx>عW!^$J;]+DŽabNg؛N/ G6 [cEIQ1smE(^+jZZ]t clԸ̍B8LV&KC@NTTrx4Zf-ZQ.v^ jd,rokC=ӧm6ubX7XԀ O.NU=tHHJ]Ux#ވuvL~QZf/6QS#p 8%yXGEm/L@D&RI3%\JKIe ZgCp=YJ.~4^k1ͷ#Qm x6IIQ25,[❷4ln 0+ڧ~ޣ |le%c>םhڭZh{N1 @9}`o;v:F=PxkyG{'$@\4; {2WggE,UG X3'FUoQ 'M&aZi[Ӎ5, G'7+ur6""q5: X QDӠWU9DZ'ܠ:.D)HEAQ7?k9S6O$)JpꜹD}^ʶWg 6#`{<[`#c0-hh B7o $ZNg_xW;7(<QN=W3`ZBD&Ln PZfN/hGOu-?%^ʟyw>ޑ ,ȼZW[6VHQvՈfspa7DPUB4NC Ͱe\e^kNWAȰ; KJ3b/xJa2|t{Rŕڽh̗;\?F @JkS딠xY'EAذWH"]g+y}(A|p)he?1xZ-^=ll#דr'Wzu"3 { 5)x:'"yrY@Id$.iz|mսgW!Q-6 .Q[OFFs.t>D.PO>Kg /kh؈юtx jӎ gonY`@'2D"!E6bߦlY%msx ?Rļx+B,, VrpTҡh\>^%zrVMGx7G -?*YA3Bqtl`$Xo"/D-CgFR6{MDv\bjX^}! ,.([vLc}~}rTі#U Pvko\^I7J(7!+rz,&T)W3E0N(0-xRs$$BFf 5:U xFC[zp@mK8eXfxh/H>(<1d1v?gZꡍd"]%=qBAYTfgG@x#-R␋kL0d= W4ix aBGН%c=GH@Yk\B4eO>*{)DLв>=מt; vHT0.;om;ٜ%6c]p#&n $XzRw23;g-#L&%t^$S* yʋ<\dtj+~ZLgm 뚓<{W^'H 49Hb3iۉAI_Q4V3uݑg?BohkqBxkұahaIjuC49z3+4T^ !mцzI ',2!_Ȭ>\#D,C8- Us'WLn2L؅QjϨZ^VQPUJJlb%$#wqYb6婟XtLS֚$n&(E®b-3e{{ff`80 3su6?\r(rWA9sD>fD/SD^YSQ(1ĪX[8wюLĞHǁ QZu&8^v`ToNR=uq9qAռp]*G6 mb!MP9y/%tuA lZsD7Zl&p/3@ު w(@zC>~Zo+g;rcy7 @݋7rv*F ٩JDKd6YtDJ(yf=MJ&:Z}Zb,  #BLAY*@b]_T /!SC(d}b'c/#8`Ek =d/q7ǚL €ZJh׈ܚ^ ޫZ>Y<g]"t[&){[~:%GPPɑ ԷoABTn'>o-[,%=CY w{t4EWoN$'6%dgotLX ҩdK[=%t|pSM`R/Rq¬.s6I4inԈ id˓ u8MS`'v]]2moZFu?gr'\^eb\ ~D Vi1=!G\ecm1K✩361z&'ޤ2xh*"䅘{/m&Ȁ"QU7D" WP0H*PUBY@\tܾyA2%,SwvďI2zQ@>>䄙\i`C]IM@6FXvq=+/% fgiwIڦF2%ؓA D8t<" !^+U0#sL7] zH&[xO:DZ_z*#".wN̍*a>[WR|Tu&s.@q{Z[ n"O%m68!A 3hzg?. CğګG|H `,!QI)k=}4*vAȠ!p5U4 '(?>rVԲƥDA[;<{&Il.59+hRڥopnrQN|ce45:C7C* yN `RO'#'5QT\UzT4K\9T.s,J:ㅗx-q*1ⲭqճh|FLrrtbAdXdOSv vK*vq  ޓrС,0Ȝ<`5|Hj7,llg~3DtϣѤe2t%QLaMz&Oi.`,RieesYӜEw 6X:걳?5=\j1(m FڛJP{FY.y2TIl,9jiɨlνx{e$l JjМ.aQF,$#LU&Y fĭ׏tmkljm5~G;R8HL!֢]?ӻ ^`-Q&; ]ym,^IC8dvzB?81|=+6^A.܃;rwzIBnOJh&#wAaY|{=`[~b-z l+6-m8[ *c0 WwG8P#u4T( 㧤׸[^c8+eعYo'xp AnGjA"\>kZH#Mw\{p'F,1y }0"4=c ĪMJS.:Ӫ =!H6͇2sĚɯ Wb&Ij_qyb Dpq 8egzܢҝNl&L'y\h5]{bTOSj 3h{r ?IƿpES%9(*{t} S7Ruun;Wm k=ʍ#BȻV'(o ֭Q=$6$m&`e4gp @kYux𔼁(#{=%.ymӚͺ;k^2%w>i{3mePe*^w֌;^|E(o@-c;JiƜfAI 06J|v$pM׋PλRZ[HxCecթry>!_F+^2)yQRLc/@uIKM:]}EQm9 R$G&hA'(n0TYMwjvQg$(:tZ}QM6)sIi*!bKd C|̯ɳ˴$^Jt&G3Rw8W(mĨ\.ChiO,m+5*2IkF= j~-Y8?9<7OW?2]R;ú+ϭC Mr# ն@H9bFs[Hjzal(聘:@> >(}@eO@$.MCFgH%lYRy)MkIݽҫY[ƾ-2J\!GIb-p˵ПT)lk {ΏfqXvpQļ&t#YicwIK$PP|K&nfŭ?r|||Իt]gY)l֍\{Iձ=I0R'iuJ:CR(J ՋVoQ,~CJJL7ÊuC!14%eѴmcSp==I+SҦt|o`9f{I> t6IJ<,ܔdWN9sgP?~(|Ӻ(۶U3UXo*۸{_DvGqpYX9< YLŞ{n4;L"9(wY֝ŒA} =<^42Ŏ \ilC%5jV|h(:Lr/hܚƝ^tғsО4T Uy:|ue6n6arZ S"3D:ǐxʴu?Ї#y$:Z3k5TokArIG$yG0FgZA_gs)9qֽ]ۓI3%ui2F?N(12I}3fN oFn̟?x#eFYӮl0^ XE6- |ȍ p-wQ}#t,یՠ >|XbWutܯ*@וABu|N ܙ] AD0f 7FE'HfwDqy`'Q]8258=(([B%)*I8i@Ɋ(W` XY MB 0aVn\g*˞=L9ċ3~8:+1hZw.@ vװ^/fනmBUݨ jyUн,XjB`jO0>Wvk ^R$rP  *Cr!CQvAD<1/'z#(,׆kMX7EHPe,q+Z4j%҆𓢽IK%sUnl[N&<%&{f&%[um yCPݫ]B,#>jg `&H!'\GcSp$5#SeyD牌WޘFop<+oI+^\`gKAL,?i!SuM'^,RNeKF:IT]tO\ICk·˞x8[p̄`]瘀 85=2wɛ=mE(P{Myc#$3l,"lԼAb6ƍA>-NnTj}$8n@ n}[I%yw՟>$.}bgmS0XFlnҥ jYWf wFk4X^]C$E1By9_nq_it0o9nkw-2fN[gnx-sc_`HVvvAsCFAa-C[,Uzʼ4'iMPAfE P]/7(>dEus54ؤf.tA ty0fBغAzKA9iQ>ap.$pkWvضB4m-|e)\a^)*|܋ScR鑦p-ӨrxPYdƘ#5Kˁ'.qt0AG;7,c}`Żʒutyɺػ/8tы[o'VGraZ+F (4+1SX߅zn%Wf5irf`KԛM*c^&AH5RGn(@me6PYìm:֓%zL^s^v CMCJ;mՠr+L!W1ĚQ~8dl$-ѕYZHq)2a_:Ó3z[*I5dTC: +궗c 㬂+VNj F:^N]"# ۽^jH˸l(9G%SYcЅ>PB1 _ݽX 3{.o9$ob]=9bgv(jD h+i$+b+wY M3+ 2WE wbbqؐsa*en:u>ytN;Sm9)#<y^4 7,%Pc ^ys /${xCv yY >38 ƮYg;D2,LW 6z/v+pahjW¶o#=orrj'ޭJJ y=2%cALyKE\ZW88 TggϲS?#v8%g6a(A^#EB~CFG 0zwش)/_3^3^>slĸ'y8GBDxIm;pYWCO@{Gћv=@ ;M(ºw[nJdO:Z^ j ' _.p-<2^ r_v冰8|Ѳ;DDJO^ǟ4S $Le*ΆE-6^3Sp "rFp镝v(SN;Ի~Cȭ!mJhlpUT~{o Z.9UEl8%3\Ja۞9 ЋV7wJ3xxռ~˝A p>SS&WϻP*Q2LniN69wov NlW+2 !uSDb׎YK68h2{kk567[pw!"l$NCi{]O@~L"D,+Ckזni%EĈYK]fE4l \382y8s4S9"gp ˢdK3[{f;,,!@HL'A&]C>ڒe۬Uʣ{SQ2( !ϜRi Ը?bیyB4AC#P~_'.;s7,r/q~hWm0ӝ^CCb>eQ1k83/YHz䦖Gs }z`@tE1O6`xËK |egЩiRӵ{rJ^⣐J! '}\OAx@ l p=۩W[ ]7- \;XaB2h  Զ#B/F2ڮ= 6PW=誋Hqy%`Fud05P3GrlsK{'XI-XySjĐ󮇇@:oD8`Zn^;# t5(|1-_>(zU;Je%{0\NO)]N#nZ3M 8ޖč89' .hҼ۵N"x[eh$I2 2xB/9s%$^,Y@nK{ѹV_$"W>7 3B"82MA*}ŋ# [ߡyqO.I/j#8&l yYzmd I=C 6Oc57akMO_a[Pd(Nj  '0w|P.q(]Q7y=A$37DIv3-i !z $`/1ގaJ{)a^Ikkt4˗L!zѕq Y օ( >@Lk,mlQA4JV-U)m#8P<8h燧gms ByYNOܐg\{/DG:X6iٞTė1\| dJhPF/O[wޓ|eRKLJH@BRem;1 6|&" 4Llみ4iwhi(MڰԽ3}$0U4^F<8J >|pZD-kB%Pڛ|H($8oJ5ozπp\JʱXqA/aX#=~źS#{R̠7ql=#˸6|, 橙 B*ͅJt[Ldv/v8^d1ݹFFϙvWڷH8WѨ> 8:HamcEOF)6#!t1 g+fᨙ|"nFγ$aj*K> zVُlGrg(gMtCi1*s1)&OEin8 ,9'J;ʽYF߽W ǤyU~ekqhW°%$)36|uYW@'$tG^kv~hoOqr0΀;ji|EYA:CA.+LARڳx2 tTb<e{8a讵+:>Fqz sLW/3ܴK k{F,J ^@Ĩ[zY3Svox>ALV&{rj"ٷ{<@Sz*-bQ$rH8 +4д^-4$Lk0@)'ˍnr|CԂw a.RQ=|%HZ eVqJCr3ag$׊\VbA}\U"0 HB"FDqC9*0C}O uAyL.rea9]^ c3O5itGK&ICsQY!MёH$XHTr2Ib,`_jc-)m,KRKK"7nPw=80y C8@rȞ)˳j{Xri+BUaS%D>tuZR,n7DNϕ 7 -/4:`0UqZXqq;P{ޜ/ G֡2+o׻6oT(3˴Rv ^f [Dv */.ZΛHxUÊW/_D2!JB1/gݜ'}꯰myśnnckd:7F54gUK2.~VGaaibЩD|^$tC\G'uBFW 6]}ճ KBlC֎puAHYb,cg%ËNVsǍW) k[n*+TJY' CrHDZArg>)|,mL&PT !5R&ѐ;~(2jKE+/y,h(fY?H%69^sY,9# E=,b;kNh4Au lرwjra/zLXNzFmBBX]Em+G8ۃ]Yk*rs(KGEPǭݼ^@h(0DPP GS^0\(fW8Cᐓex{ hz=U)6a:^{8N&_=0Lѭŵ=}H곸)8_e7`cVg`'wv Vy/-daDM"C /$ܿjtz 7qaI3Noc.H/^0;5uPR!yj%CES+c\ajiSc5:Gj5F6 EJ|#}n/8[dJIJc)29{o9Yw5`BЋ|!RbwS٬Mx>ui ,35gB[zHޕ=<<{Ϧq%omDg7H6T0s2MBe5G5>W .(E/Gs|]7>|#}}c N:)6 gcl_f Uh>sWk%v9TG-RI{& @Kv6j%ϋ$nRZ8/qLjpsNQ3c*> :o -X@ʝ8.ޞ zf Y2E⁅Xr;{6HKP.YRw=P)+VjJjUk#$1 M dTjN1=$LnS](RAAi&H`Mr"Ccac>9\*~ܸ Ry򮽺l1:\,yP3g:>|H.ŐB+ Gm71$/BWrGmYWh:x8ٖ;I!E]kaFrruAcg}ϝ/o9QU55sٗ (VƐag zd1NB?Mn෶Y7 Ad Vt" a=5wj$6?B^j N g@Ϸ3uB=MyIƋ*/%mx IoW S@r:Ldv{[n`BJ׮j\0q607il7P⭢: xD?m~`'蘭RT0-і.RD R`ˆ?^E% ).#~\?ĴšuRk1e)&أ >C3MMF tVVWBxK@&H2/u3,!fڙ*SVMQu;b^[ @ʗ9ub1 +R+5wFԩvFZQܠKQrrWv41!LHcʶ!bq(_UggI}`b/L! Y˘Z6,̈9Fx^gkq$wtn.urUNW9brcLY4 4בG:}3!z'.]Jc\ JF-ʷE 8"9&(i 6Ξ Ƴ3.^}QՊ;56=HPJ6}픭ΤS,q]HgB*֫ȢW^Wݫ~;tpPA IFC);"~thE $|m2Ṓ@`Ȅ;Lmr'/&s\vSD&2b{+IF4_^7ݏFD=ZS-'j2vA0*hr{n* O|XɃy3iSU&f_^(8OT6^)~^(U->--y^艂 >8]鄷N xH+pՀ{?ΒXdfi Q/ej)풖8 9&E4C/uIӰFlz0;~SP׌K/]ǟȠqPe -"ZV!WϚZ٠7SL */#.0GUL]QxSYH%."׈H,Mkfڠ =||dNXȘ*[dbD w}/3!8$6xU@$|)2-8|)ՈaǬdzα/X -^|&#}qo0'j,+=ig8 ‹SHt(h_DTXu(:!WxxR_}]dgu6%R__(C@tرt.*"гh|V6DXNp𞏍Ф?WX1]Uږ4]O _(hѳ5}]SV7%3\t@;U&bT0 P,@5f^/tПɘ-=ZlxP/q%O"wWϽ)L@):q1,b rΕ{F^:b>qgo_ף.u7RC7EY^cJ )bbSG ge/H?g%e}"8Ou5pLvQE7!zl@yLx$:uzl\^VVLJHB+9;9:Q($WoHiccɞ2P 'sal)%3T)}h0tgK^KS|s u +2\\U AA ogܜa0~k)fxR֮:FbKjNa!iCd4kSy_|ʓ7opBS&kW:7%)=&G d7ZfN/Ų([e ~+m@S8uWBBX,[:8R<'83#ccF1=Uo#KѨlɼm c!X߬ZĨ uժƹa{,z2 `jĂR <[~r8Rk  =áC0iG EnQKJ>k>k|& 9]u>ϙrƼ|vTڋhxVHuuY" CH9i'2xQz2ZXt)foS I$-L,H)l=wZm|[m |_PY?*Y㠃 7DeVhXU=Vj7s_ .)?٤FWދr$s?~qKg*ٴ|7QLhCi n_ӦsזKN'Qޣ'SH/wLCRC݆0 9>W3>^S@O\:1a]~[-oxEUj1 V\޹XmFeݡfl? Q?x0ᆖ xN5H6p+  tS@ 5 9ʓ" =xgTT< ݐ~3(qT=0!Ad5lA V0Obƌ#Z@'顎0HKVTb+Y4w"_ RdS;Fp͙%{F4 uD%zӯn4ɇHDcE$x|[vn>yp:0dٵi=s.hNM= |/Fa"F ]1>-$#"-Yb0ГM#+?b:SFlzE)Lt;o7{""4'$Bf0Zz:"{(KDKĕ}+dk>POp.wW%Jx3ɱh\zI::(AARz`+ԉ:L-0`͖1de&oz!fE3 -Vt_90G0P["6=& 9(v)!zLtD&X|Ofw\d [F`X?a+=xUp4kW!Rǚ:Fܶ(^JͬI$طs{of21Z1<+A!^ϕs8mNwRD U B /Xo6?p%9Q=Bq2(3kz76%=ma^THzD hPaվU䌄a|n4.2#~{2D };Vn$&;OƧP5DP"6ffV_k<֖*pϲSA6Xb?/h&F )+zemQ.@]i\R`a7=~3t']æ{`NۜBb9sd KΙؙYwWԳjT[Fמ38yNI={/j8dkXO9L>MbPv/f:!t:PrF^H`QnVd~C87N"(~9a4i- #E'ze>@]K^. O.f{8ABqj$w^z+p횊#9x0I$r̓GƼTSvA)%z#_ɞ8Taj/{oxزߥk7?z!"EV4yevRCDMwЋ>1w\b/Uip_+\pG >D65C:f`VT-KE mC*]2L xc d2kœps=x. L%ݜ=*A 憱cuuϘ|{ flfsσ}u}C$}R@t]6;(i{iaCV>ҁ 4}Ak$M _T`Ǭ/X*#+n獖usSY-z])P <+Qw@h;:(£ bWffTX7Vi4$V:eh[YOiZ/m<(UfE9@} Ǹ0,َ{PВB{\HGU(v4o3ԖOzvUחٯNt+Kw.>ˌ& a9D/o,qp9LtؗI7&;S^0#w jD>3#}p /%_)335S*"|$}oxIq 5#Pd#h"i?AK@1'0yPa!z[gzc= /#.*WµPP;,pXܭAxs%v/q ^!ڣV]N 1S#r/IA)Ѥ:F_Q[Q.=T&,{/PD"/_@ [,; M\Oi5-?'#˷g fYLHRmӗU9#y &Jr3LSF q^>6Ɯ3[CE' IMВ^WC^ZEK/"=U >{w/Läf mc/Gػ/=$Ø)diٝ3 Hea]ukt>PBk~r.dZ3KĀPVyqFu{j<pMs/^yphŻ}/{-ٵvpiBB`J=mZv%g^w6 Gw=TعwxjDLx٢g2 F$FI(>Evw+kÜ*uˮ4qxfsQ-:y9b`h_d|sʺ"X9\T\ j¬+!)$ͥ\@Pj),԰MrK`VxzrȁoXjLI5gJr_7/֞GV%!}iQma,^dmDjyrxh;g"*E/?)AGfSX `p>ĔWFX{+t9Y[틧/sEWW7HX&[oMǮY\p&yN@18;22e W0>@1@k@)+p]DW|>RJc m, Q5fLɶNቬ6M'o\qՀG#!> @0{WD>]#h}vFOod,MKxV҅f z֋bkH~QQ^'W#&z` .X$kATOҌ o m eb/HǧP-mԨoR̜jd\(gLi&i[씅nyCG=W|W!S#2_s&>}*63a7~R.dqK`Ybm6+5eꄵ%,$It1=7-9|hxv_ ˸ȿuVH˅R.Uִl y03ha (6}nt< @?Y\֑kۗN^{◲0|\ | Y^%O6ሺMqfa-6{b:+n.eQ᳂JjIĊ< U|Sxx2Ύ78y&Ъ ˪G&<SKС%J81rP#\nT)E@>LKC%`)\JF:GJf] ޖ}%}\:|K{1qYw 5ͣE'O-sCH^;O=*jp[xD >.^##z$Vv~؂oRZK @Ke݊ܡ7::\1;ߕVg6AG>+䱚}*JLbi}@, &<4򗎥8->Lz_&>*>K7*F E5Dg)mc,%r?'%*$gT)!T;1w%‹p[ջ{G,g-|~ 0EldH;~O,#XߴF .'q|˹u=.2-3t=2 VA*|GKUEb)]QQۻڹ&S0@^r[ZNpTzZ\ M'4R˞H_H,pan]jּSI waq$8p뭹[ZsFwoֽz7SdڞGLd5xrUG*c,R -Ju$2"S 0~-wlޯFu&EW&:|F8ô*lR.uٵ$ZD&t94iE:Yg,a 5y<ܽHt>5\tۃDBw/6S0 z4==Yd3b/Tr},8asU7UdrUCY샌Ǭ6xϊڠm=]}פ }w|V\vͳͱg*,4T_\KE }-*L -7i٭+N4u-iؒUެc Sa+;w^;je( RB_ Jz/_7C9lLΑݟ҃#*wͬB¬I6u&( !Ìhf>FK?ݡa >g%-y8IBj&C<.ՎmNkzSU& w;@ɂ%_cG+Xd;dLp-lZ r+oq6-d0QyU(N0,b|'uC;Tn{; ,y2AYD{xeKƜ͎;D⶧pMr@Hh7WG867;|&s\-+rɃzPn5Dee"mScSefdȅ+V K{ |)|%DA@WZ'`0CokqZ}/Caj4Xq~o;]-VyPW#-eG~rS#@Pl2Ieh9<0;wXuuĵ@Z&3䰦i2Pkv< B9_Ԕ {;"3Jq%PK6,]Ae@vr!Dr|RIVU%ljm ;u.# Gw3eaͯ³:a-iזɯZ~bIs!8J5}soqռ!\f^zn+OU"Ϛƈt~EJj&<^~XhH*Ʃ)Rۣ|(uC썩kIk\D+tO-(7Wf mݓ iF'69&-a ׈F}{A.?a==ḀRM+50dY"Iu6[)N291ٍiTyp- 1ql#W?" dq9̙xX23~+烛DcP>Wq-Fq d :-]$@[x*-(̀+u}!oFd.sYh!h¾S5)pnb0<(ML}5rNkgZx` P5"+0|Q4VIhǗB/2n_ܢ! Li9۸-j3dkQ-SOxǐu.`$7M~p~2Îrg{.B[)HWD:F=W~.p΢uKwH4Q}Æiq* M _TܓQ7EGDbd5/X:[:U/!sbL0Z, uYM E #ЅٶBRԵ!bB7 otKES)Ugl)6Cp8BI' aPnojqgAz7^zT[R+Ih:H@GyuK Kq=xwghcPEꆅ:i.GR;ܛ.IdInȤ=  YtɐN(q?}RLqz͓弅h$s4N#7yn.* zX8Le5;RMtIZO|/)[.Vɲxg j 6c0xwI$NH#4ٚHM;^3XCsA])(gzQRy.^:m{`>‹M\НKhFL\됧Yhls4WiX2 $EjPj액>Gk_Q]zݐ-U) B*?+\qYctv8q&{{vv3e^h.]mBsm++tapޥ S? V`ipI͐>Ad݁fٵSty.PMsVr$UQ;B{5>yܢӟRv<Q0/͌I《҆or;|o:W4J(Ө I[ڻK Fc/1W߈s.\탓M&ʿ2~H{Wza$lI-\@2Иw\ho-VZ0ٽPfcl·`( )㘂"| ;_D4ۣa+[ҁk> ۠; P!uxAib jhgy` e+8zZn@nAA!4Ƣڸsjtߓ: "Z* [JU-t%.64~<- ܖma~S 35.=!Sli=n@H ;Ws*l"&R7l#"EafwB$HMl>UMΦ^(2fF4ߗR_JK3 b2CdG=߻(3A^ᔋ<0lO.$'rJ,#]}%_Aֆd'M$e_{xd=`HD2r3H7t}0lxncn Hd(EqOk`4nVzm=ӢP4鎜6!r xPa%l5Aj4o*nf㉷zB:.5lB@BʼnP4/#@V< Љ]w˦&)=0<:gp)3W1Gڣp.rd[Iswd^M")E6Qj,:`s)5Dn@VL|cNDHޣ@|ɠnu Auu8i%c56S;z=jьbt8Q1.\F;V&Aj 3 h4~s/߹b:崄PF:a(rVGnHR`aZm\es%c;%\a~u Ls:^˥RPx z̎4Joo^|H6S^rߗS_N_V 7Oɡeݝ>J?G^# k4wUI@I*ZFpk*5^hsm.`"s4|/Fr4'=s/[U^ qfY5vrtju,En̳XPˌz/5g^Լ Nyenv*#k#j܍)UЗTεfJA[vDZi30J=s)chl;ܑ˪pbwU `Pˬ稘98s=/>26Ԕ#i i=y/q.5Y+AN\n:LPyMۤ'0yizqw`X c%N]qdsWu-W~ίUjܩxMb@ʼh96ct#փ^Ud2+ʊ\|UcՂmK"#Mۆ[297{Yq&HDEĠc|!Ǝkv"]v|,-˔_uc`Tq1~hwg0.BdZrszdJX"ԫ^Ѥ#_y]pZ}ŇQYmA`:ڦL!erBH a݅âV0>ϸGȖu%jF}n&^syl+45P6#aNyF[8\ KzkA;+MTr׳TԇU e-PŦq©e= /+J|mL1\,@^Kfr xCP5iuxVo |F;%d^`\0LFl#kh,|xEڍin9W_f9.N:~ǸbVد AF٭g&^D?9ulKWQi9zSsXn-gcuKv%B$mIAORX֜6 _ETkEIe1& (dic"v?Xn3g5D~c.Fuw9S60SB KXDMU__,SH(KQپ t UvtF<&o\EA0W{ov_k=r/袂^ &Յiyh⒣*y/i{ޏd J_S>cnW+ƈPǏ;b X/" s@ٸIՆ٢4+=b~*pƶ7^ ` P )7 1+MGT28R]o8unCabPqֳ02XқxBapS ٠>])UC$z:]![7$|9hg(oIH]^:P hVWcv {!݂lxq(1 &i:<:Á0>zlkbIAn'.Fy9,29W6FDZ"|l lڻM=Yt1G(Fz4LO\-֒P|2TtQ!H9`2A5|}{Or{W1ҭ v]D;,R#J*$=uGH uϞ=}](; )nHON6A2 "!cy0/JPjCh9S̽[J}qK:5K(T{N.R=۱!V7!F{1_^~y~Td/sk(3$0>#xK9w?c$t׽uFX2'v/\T\JFfm[k@ÙtAw o3:[T̚#|GL_ Z9yXk[S̩0|$Y&Y?QBQ߅vapͩ(>kp"xbF*Uv08*"%0;exq˴GeM;%\%F+n+^0<* -%cxd-z- B$*Tye6=f.( "U` NW"9wo3:5fXAvuux&y 8teQdQV# zƟ:'._.P=:Q ;YV)th[Tsh*_oJAw]Cys@9ZYH"y)Ie@sh|)a RĻC9I;e [7Hr5AO>Cӆr&^"[l4M]F] iBv HV~C6ܗX_bmE"&%Xà21#Hܐ3Ufv³"nS%X"ˬ|6,] /i&,-!n&]-tR6p<ou)#؍}=4[wH[]#6kO$(HyN )A Zm>+Ƚho-unTĸiE)ً #Y}>iU7Vpr^N>@zӸA!y*_[蓕yWO6i7Ӭos,g}8xL.,09kI@]l}GM‹R`Eݬq2+=NUFװieOjq!9⫖Nb{2N77B4B`"XЩr'4=./g-X`,}8t++, W :uɝi oʟX[uS%K*,M=͈(>h`|oYiI3yoXŁˬG_f4 :g҉1]y3IQu.L.a %Tת,l +2ULONFي9!^Gq:q %:1X7Io.uՋjÑ3[P l*t魞gISoUg\Ba""lZ1kzOܥ2!]r&OuQMj#t︝K[0UQw@xxͩ-,SrwM E'#:fF+tOAU ƣSy1NWǵY T|^1(_%_:@^fu{?]WWR`sܥL$`i znk0^Vz8L,wo mV+oCRԮ{&Zr牛)NNlďui\/W^e y ).SrI:HfDiAc6.CqPVڧmͼr \'A,dK-/fɵ tĐ {.frV׋H֎u m1vqZw$]IkgL[עJC^,GTg r38.݃{;|.oi,DgNAr,޷sr.H34Xp+}v`PdSإy16KYR 鄿еŬp<{LB(RZeuP^LVfɈ3}YWm bZ\±ƣ\rث/^${S`J%ˊ^d4Š5B ~Z@P'/j[q؆7NfrƨuO\(UOL< %EQ1P*4o2upK@4ӅD/`UF ξ5$8zWQZQNNH;#bZ`rQ M/DbԒy5u) l[~37b^Adp<-~]k咚&}W߮`^fe׋cr4O)[oih]z4" # ֮L񂈜үE4 tq[a-3* 93Ox`-R).MZ*GX{1ƋG!!$Qp_In 2mz{ƥYrUH"u{\<-@mQp\V`EY}x:VƞX_nl_YS_yRJ옗}`Zc NB"EHp*'ktqRhOɂS{A=z Wg{sdGxJ#JG=qxS4Y-jilJva]l;4ő瞷4Up @* rBFNf [ʤ;p=ъwhx&Pct\ԚdPg-M|FB=wk&B8;PnwkJqһdxYŷcoz<9@0* Ӧ" L^G>dZ >rbÇ߭ANG$ɱ(l2wvݕ% ыK/CŴN1wU=˻ 5iJ.HuCEP%zYĜ#ӗӜqO5kfNI :ECķ(e mnԧiբ:6`nO_Tq KrZ/F+WLpbֵ<3FG ) ߄G6y 7OmQKUI56k'ZS>L ["w%e~C${-B.WB5fT}nV:ͧ(lƓlRuU׀W6 lxl^2{`9jwptpT# yP湆@TAY)u"DE1.LP R t8lhzq\ғ}Qvؽx$&tpݜK-!w'(V  \#= . ' >-x ]F)QW-'IĀgO9h ѓ.6w꩚@k 1gqUgڴ&l&7Zj;n*:ќdOgȇ$d"b ]macRKBmsז>Z,6 Z,1s LU`޻#{ qXZ}'ht̋v8рԦOw{iA _5@06Ka\nzܠ(C@ML # -dK("g]ݫ*x8:ZUp2.2!լy:#/B8%dSK%@LszrlY\ѥVhMz"/J4B4,Nq6JֽQ8 wL:L 7"Im_R] SToZ4/gFМ_Zd@  Ē !^vG3~|ΰn.iZjI {"h_xY۹1!J|1燀GB-tj3fA=3-쉄z,^SG l6@S3'EQ tGXf<~'+EҲr@H/W!.3N}l[mP#ۮQ[CjOy\S'LH(zF;DЬ 1pYȅpͥ?g=@rvzOCm*5=-|t@bAR>.u&mh7k@DMϖ⭀GxeGRS#>);Im -0mƀ`\KKy&[O {6Û=5'E~HCrw#Vrz ;VYJeML ' Krԥuw:NAA&aϗa_a1sR߉{IsɃa/pz Xt "N! {MSǣECzZ+2!tvBxyLh@tC4tD-pcV|ݯ!ƐkUZ0=iI`YqB۫*xxe(]: ̀ J9>w4fؑTlgn zhz;8&+t@@uF.f-,68iio$pE&dXω" O0ūӦ=%jJu>ii]ȼ{ijpnjKkYA,1E obbGH%'_?Z7|I)K|d& ׹q/NJhGR^\S(_?4$yuns)dQKWv`'%Trya $۴D.9] Fi j[XXZL[=fyA=b|' 9`u,Hq->~tӗM9y'0lAvk4z"}D*}HeO[iippH%֍35WF^(a= )tڶёhd8omUr5Cxҹπ`BB >-b擊v -]fGh[ث=.~1$xr/ -:v8E6bc gbFjX zvM U.ބ 319-ƈ{^Sz)ۣjl,DD͚<HAWc*w*F@G8/ Y[_ūHQJǸ'a7gS@YBuJJ8M[6z>`-[s a3]4xwgWUFomVh,RDž"=x]dp8!juUQ3OAaE {(pȴ-9("x嶒ڪ_HO4ɛ%*\9ج$ ƍ5fU۸۷qKM [zpf%V:+Y@c^j^0U9pɏS^8r%s={-\Ҽt~\w& O{F%jrԵ33,vYbOLPPJ}W|,W/67HD;K2zUѡGJz9BͨޖCP=wq+ ;K:Z/fi`gssRusC+|hl<ڨ7^?ukeH$WxBy6_I֡=/+)z ̤q!5'.Lw*2#'9On^*O@ Pʡʛ* ES>vA||Sc)3Z08M(r)yWT5hnxS}p:3U rbm-ltx3ҷFV@@%'yٍ}R OΘ4)%c_:C)Gf:^A9gt Ci1p`#Q0lgv P$Mg7U^m"Erw[*mp7wZZܞ]֭Bo}yw6=lUy\PK-\(0/DGx/&Q ^k%NA>fYبTSV&#.;IGt82yϯ0 *NJ'mwMkl.gMk$"T#+cM̦}U}g16G9lneE^1rg`㉡]AO5f A˫Gn1Mw2qF =%acSRֻ1r/.({E҂KLkxF"9 prN m <{o|)&# $,9F5bg=W#veR7SwؖhAʀ 0vp&%rF†CzP*7 ֵC&vpvAf^1Gc}v|q[&D*)Us: :bX1QDBmsͪTO/ =Tٹ7 ^&Xe&W4HY9 ݊wt$Ea;D5E:|2揵 ɦQB,×g_=8HN{Q.ئ>rJdOQ8A6) X 3hzHrbnw[^Sc!#1 /hh$;`!aMJHy@ܼZmwU 'p$O"K*ZWV{0̪^ k=lyVhh$u_v4;9>u{H)mϪǐ*Ŗ"F8H6wY7;@<;|r@gQG7MF$5HD%=$% [=d dN׵WVR Y5u{W0>Eu.vxK9uV g#sP$Y9GOjǑ 9uZ75.T4e?pf& @,h =t[3Pp£v$wgC+ģN8.hEB 2ꤓdI9Ofۃ:x#VLhMXI_Ab&-}I{)WÄiZԁrKLƲyHcͳlC[ ڦ 5>wda{~U7OA3ji!#k_;,}m<= !˓JJqqY3@[ӈW rJޫPsUz¯hxjspolhspg4%jw!ϳGw4$Bx5kK:9V}}DI,<*E`nrR^CtOE ̄>z(" 3| ͻ IͺJj ʊzk.ksY~$pRZ+/p(I+5mX{AJ[MD,vz[OIe4/ӂ:}1qUo Wz˹f>a[\o|hDt$2[eyMsO3SH1K5Gj2U'>_׊5-gDZLXA 4=7޸8:qoA3ˡ0|m/:ac1vOĚIMgWg{iݾ '[crkHcyO@yvJzi($r{](dTh`{yc:B +ww{b 7.x/djE?piۋڝ'ܛ>%8jpxonڳ-XWnKnnT/[ī^\uxӖk]pχM]dq0 :1Q#+2/ȔCWqS{ hlR`ܯ x"愕yfZ)~ FP k)=5:`2;#7rCI{T$4WM8)(_ϒg{sq*}"D7jyֶ\06@ZP1l ^MXt{2Diaఓ@-]KC+WS x6Ri.sMh݂\V)O?U/Ր#P==-$j N8%кWAM (z1fn<tZ{=S+9:y[=|t%J&D'U!+=5e(qYtd;xגˮ*eNhZάBވiq"x#m]&'p3)E>Zɹy% ^bȝu>2ܼLR1d0a=gXl~jYgҷ-eߞgytZ !Fѓ`r0ΓI^t7;cWf` fiC7nx4h/b .&MA&F -Is$uhs25= H;Jhc"7NcRDmksTǭ,+2\#݆"Rۣ&]aW9:Ka-M"}02ɣU(u}xwڱڣjW;giPF : 9Y+A4A{5n}u"mAб_G{X!Fmn_. OsVDV&PPGT6v4wm$:m)<~`;k"ܰ) @*OO)H22iA<! '=QZ ȥ h< FClfTD&.ᩑ΍_Im`D?\3E|^Eb4q\j<~ gGH Bsa`ƥs\TQ51Hk)3p#W֒~XrlF++xavM]lmO7$"sG"DWwO)>+ !i!tIRN \ -I@'KŌ"OӐVz M|Q,uxq{1Ʒ a]# ևU3,S72_y!2CAKG;&O NM)[Ps{]!tt6Y"5Vq6w_}{I-jզ\!(ҩqe䪰ʊ0u) _%O9X-IDfp^.D K10K`Z'y@0,rs0HaZg<x>=ve“]kp;n0lmT="&e(}V,Y +"h!}Nit1S.A:lEKD502@jG_I2Mg,8")˖܏ɏAb=n~gv˪RpHoFLfsОȻjiI'OѰ,z\?'zºV?ͯm\i.G ϯ7[>YV>|f'ZwVbWUo%H|%IuBkXPuu^eAd"2?FYt0&oiC7&: ζ'd66>R<&t jSskkЬzm u`)5 ls'k|p;o|^s@6}ިJ` b$^MNسxOlMHWDFMț(g6ؙuC[c֩BN#ާ{ Y3oR/|-:q{-,!(!|p٥9:-_g1yhߓ"v"BE}㫼ʲX|sSʥ4 ۻ9}ɃF=}Ѽ\լVJ -"%p^#dƶ|GОaCHׅQVM#qױO%e)D30qdUVgxL}o kK!h}:[Zwt+㲠ep0^3HqR2 mUËHK,e^HN(dk;yI=[ b 㖔ͤAtoui@ò2ht\Og 6fI+E- 3 F*6([;THh.4_[YCf p`\~⫒vIM^Wk0Bˋ:} ZTօC^J@pPXJ ]x5*wpzH#\ރz8l۴)jD{nYt!X\X)AiʄrVTg<S%Ty3ˏ7`{jO=Ԅ%9$k4)(/| SfCcFt.ҡ3$4 :Ri,kp˗42t()WR09tl3Ɠ؍AX 6bUa x1󺽄ssjXzb,ekDwГgZ*8<2qr\;vyd}!KQqPnm;1boqQO ]Ff 7̭v jVe7T^c 0=+z#OPN: MRY2 S#|Մc}55`WЁS"} UeTuM/5e-*{=ϋORݢ7g˵De^I0fm[Ѕ1xŏ޴wk$:bg),t5ZPU],>\(R p^E.@VjӑР hA'c7kn:6(oq'$cq̛VpЇAV@$޽h["36fґ&X#2nXkɽ^bJw:$egԆe$5_f]{HzX)YRዧڹz,/T b!!¶82LD*(4 iBQ g"!)D%J0(~%\wEϟ&\Nj1I~͵Puxt z^kXATXv^nAumXۗv.w{19/)ú8^Φ*>!ku3?_7C{^B>2$Ӓ]4ĜZDB3.qfή^j2Lgwʦo8k {B0DjZָNcm$qai'6^XBo;>F(eXYynRƱ .TnٛMf$њx N`Z %[2JiGN]0S!8 e!ھ]_jZt7ssc]_y@g9j!zyf . D-=t89,kK޶W*j*TTFt☄Kɀ|U3R!eT6C*oH[&Y Yꭴ{ӻVpx7&;3<GN..{kvOZZWœr.~3 D3EKAy9[li:goufe , jPYqBFmyҪ^bg;>/y^]:A=L.drA`BMK*-ga3FZ&` Etӊhur@=ԟ`C d^#9~|9Ӯ v./mc4d.A<cf#΋sۼA&L@ @cr RiIrvk2mޱ5N_L{wfgXR:ಔ=K8RG_ҹ <6ʧ%8 -qK4NGH@s6M 6d⠏w {a[I^]gM_1Sc 2Nej5HtCYy]$P:o_ub<Vwx̠JYZdq^n6{s0`F|C_E\=Iӳ(ݫֈ(>YnB^WxC2Vk a\9i|%XYa*=-9yF w!!> nQ,}0 Z^f K  4+а㓳SF;N"d{oA҃5 9r%x{|L؁oΠ+Ô$>-r" *W"xG iܷNR$c*x={yKռ#sp9)$WZ7Lte~dhshk$4D&%(n޻MԡLrz]x)Iw{<,VmxǙF$O@\b#-:rT_%b)=ײ@[㚽A;n" m:j&ސ듽wVsKIp\=$ #hC~KՐuƢc^S:hĜґK(l\+=a"hvnyvt x/cvLEe#y嘉s/}R+_/)rW4dlwQ>H|EPξ`bry2)l=m9nj(X }ا5tIGJߕjTGKn/\t&RXM?w^r(F,޳L(BX tb %^ͼ$3 c⺩wyP 5@ئ*ȹ0nVZ`VsCpS0Jg ޻I0ζtK}Qg U`ԗuҘ4Y2"8=w0Z:!faʽ#{oHjɆP2) j|Hcyyf^rY x qѾ쇞:A%ss\p(vk,,'d I X yLu+J̀iGc@`H$+viRT9΋g&bѾFBͪRspLrԪiTVaew^+vEdŒUKҝLJ^B –\,D<{EV}b) V_X=> }7+\F[=:^ttV0̆k&S; %_òқQ,~1Vuئg<{ 0Aҫrro A@Ӄ.QT <[nCB6ˈig.:"MB1D/0L`x+r بSBUwFO^=mn3͚ȓ@'uPԎeAbK9NBi9)bmAz] N:drky"HE!`H\ybP@Zઐ-y9*ℽvK;/Qν26T]ptKlmwԘ2ne ]d V^ElAe ߹%$l;ԊW 5o̱u=ޝs@垱la 7H ,Z̔cK"q"Gs,;Bl]\Rn9,ێWO-pFuq{hhb+î ր$Ʀ8 w6|,\o,\r悌v&q(kr:-I[`Vy0"-㢕=DnD7ӛ:$ )ųcs˦!V)%'ϔ%Q_DӉzLP%MC7Fdk᡾*/V -XQi?{ؼ=Lg2 !Zdys?ua 6+rRo|%ƚVxmsݾ. ww-`xlZ!Ҿv|󻿋pۥ+s;sh&yM_S:{,Ւ5ó\@oGkD"[:?҇I݇1]'.0VvXO!INYGtgݬ{dOlwXl`N$"u瑷HN ,\j@H:RZJ/^Ai7gOZ[<~yx&ޫd`ГBamQQ."ɭ\c<'}ފijutMLo#UPO[PL4hҥ[nxIa[h{ $zFDG+FJjL'cq?*i"~|)dxeM}hq{1AXn>^nM$ ~״QM^s"3猹:u 5$(*/ը+ Q9wj%X6ZI Z}ok0s;mrKɓM>m# zi!%b +q9`xT`k&Eߠ84R+ɾK#XdiBmt|C+ܹlou*OS+۝ƕc X}zmWD$27L |T-^ڐɬ;͖guUIVZreIL7[- Юn=\){/`IyMh„ipBR"5[>|X%7%×xxwܭ\&!Fn+ Y QwC&E+ DK'm:=^m}j>K&b xчM+x񈧌P_Nk>Toy*W47]8(.PƸõQ ED86Tiਘjͪ\PGI}VBXNԐ70dJhsUf^Rnq–~R/\Җ):ޅy@< 3\k ٘/( l,'pq@wbl̶ƑaE]f:]T0U`CJ||Jm*PTz*(?SHFqvir1 lt.~>?շ}H${ >Ê:YLo!зN'd01ϗz_ꕏ(>^4~<>D lr'Tڵ[ =|1kZGWdv߫&;C?=uWpUzt' r2yS˒#A)O0!,XXژ%ZD>9GU. <ĵ!eū=F3[|VfIZNF]i Mi.[=~ ק.JtL$$| J1" [zt"@ь; f&86088R{X߸;!ڔ=ٛ)&Б{xAPX2Mݹt+əsTׄڰ\xvUc~簆]`#6OF9[%书MQ!9ј<|(˼7bCm!0{` {"M#ʗ\4-rݲՑVI@"a^sWL!bSV7N-6/y5Wըz!a賾%NFx+g?H,@Gx ouTe|Uγ-"wF wijU1B>,L):$kfVO]b7{8|YIg;ԛ[hA76ힸiB?,?*ad'>k(|Sݏ*^[vJ87eyoH'ΠBv4-zӾM|)|;5DI#ּwGb7yٔt7=ްDH$Ck?5]gY\:Nn0Mt J;)˖+(q@TjJEKv*icGs'U*p.' ]W)wko_<]8DA7?54dPئ枧ȧyW{ȶ$*AXU13隘47f級¬rΝBt )Gh{f\uZN89+&XiP'<ts3nyӐSꍶz/G[a2Xr\ g.Mfz@gx ЭDyQ6SKENq;*Zk@JpMz/f5ƪNԯ LRu5wEYv<4ڛ>dzQB)pg!&IBȥ!(5r! >K>4eђ&QUp5|h/x'r$pov_KncGh3I.GR:* xc?[2֞= |OoZP#w: t{/"7ɬ z'^%y19H^Դk2V_?3{^?TPyū.$,E) QL"VZHhB6 |N4Cs|#"+}nAЮ %AZE}ܚ6$ ̑zSA}فNOON^ړ.G+@SDfRp»`#2;/˥H3:25<"Z܅D8)fsjV6 )sTz,CڅK):$"9&~ƃ%!`22BEyRDSaܥa;~U˔'Nc:uF{.ޛ &*˞v9w|j늣¯5EV=MPqդg aziS KL]]Rޤ%C\!lzq$ܦk@|yRzC}n;Y>SJC^^i>' U';9jMRdTu`: eVݥc-ɬ| ok-'Rl 3&yn8N>/j4W6t rc+ /H,ۂ]D@+eSJz}B o*"=q:Z^NHZ )*b &pxA5/[TJm>M9ۭ& 4t!}썴BkСwF:03$"Lta<!ωTF۬8 tK wJHׂ3}hOZUH5m3SY`T]{|+>F⦶ ݅0ZnY!uv;睖Zm :%/~F@a/Q*p!^D5KsU.uЬY}!ݠF=ogJ<Ԯ=S,LftOd*GH7U=Lmz ͼxJd;YsFsϦ;|OucEGjHJ=TZFA6b zƴ8ËֳF GX!%#}QEh,i_H#j0h3Cj@}pENO5.tNB=<:;f7)v6E!tN,}Q7*`O7o'_`Ѷ $qcrf*r V#80nwGyൿA Z,Lmȯ:NgJ.YnBkCmt~Ғ^XɽPa:Yby9~7uAl=Y_Z''2chqTEL*¢Ukn;GJvT oH -EwH)VT>5Y>Fg6@ECN/ʆzl6:g˜s|Y%1c68ezr=U|{W8n:.e}yoG8,}\a 5)5U+I9*uHt !R.C[~  D%X ʗd )j\aঝpcAkxFMO %[(#{CWR'D8吱:shf_٪se *GL{'FZ"b %יnahR#񞞕QtrG+YpNJzG:FlUw4uj__YcyJZx/(Lǣ}glHfRTUZq[PWINWӨS ;m {o,.3RA9ZC.y|(a`o8܂ԼXz2qh|nvT߀.v7*J`11;Jx8!>{+}sLzh^oꊿy Mi !9S_s:7#Jp6#@w{J'ȅR<_qDq++܊ щA3u6Tzo:Bϩpu>>D1&FA2B~V硱xv|CpHS. -m<"]e4`\aL(;ጧ`gѐ)q_/c D|/zO8_c RX6UCΈ։F~Ptvx3c:-Pn5>j`EԤ}X3}JU<@15XV^&;Jni٘`:^+0Zu/rПkI.RT{It-)paĉDwf=r"z#0-TLO4rF pxX' )a z<󺌩K.iRj,8iIҌyѕ8W#xX>=JLLFGaS6VQR|Pgˡ5(9cZ2uaFQ(nD^hhiZެ!)͍(:N&BjjH,?$0\nw-[dh0,/dU9v+p+A«l4ǃSh;GG@圃sz "Z[NJs0Qw{Ň>:x ]_/ ZLצ@Á/ >5<lZރ~1o7FrUfr]R %4 9 Gi9ӥD4 /H;a[2`3C7J D%yd_1ujxt7C.w+4`-VѧsE\C0UL?Ҍ R-}*SU{vh/` Ag# |&MQ{bW#>2yҳxD;ʨ&D * [3Jja$C5Հu֐zhV S~݄n .&LܗQ!4{K&^1 Ĺr ?kC}/^փtJeWȼob^9Y6LRzZoE M@S Sd~$ gb3@^m +'g]=c;ԷpR%a(`f*;\CSUz:kA@߼v',ę c'*AQ[d"8 G6 p{m7yu[BU% Yϳ`2GJ|y@Π; 7j}IM-4+^sPv]=;MII"خ$7s!#[@45FU).gOdHcZY^6qE!4A+uV 2I,ClǠ7xO؏NEV=C+i+Go0T'ϳ]ܭ^:Uc+,g\śh}1YFOk b[[qڨV~8l*Uj9w]ӴD&0`׈{\!_YQN9C zlL+/65Xo 28^=[)kpY{[oD_@9^;KR\8YR &mMmlf}e"Z)_LиR>7T_t8q>iW^^niu*!sԪ}~m Tw p;J\6<7='tR+$vdV@o(LVV݅(4^G>eN&8x:YO@mf"О9?eixPb[@y3E{ '֨F\#mBÂK2FWAwx퐃"%J-kdMmW xlDE,tud9y}Hf TH'0j) ?2+=?Hw1TK4 cQ"p`y9:ZAmgn ]}vHEy[-FИh|^-1UFG ἅdTKTS .`d۱s/ܩ97@MǕnpsäJXK>ƱW2[ZQq'2T+ûY+Mn۞(mw&| $)=ߝ1iG,OcƐ;c(*?Ó0@jiG>vx7%ڰ{ é2˙Q#I=XL5,ʁJW c8Z~nI0⽲̺="6npc!=a$/}Oa+,"L ϔ{o#߉v=8xʗN)B*mU/B8]S2N=A ] *pK$g I/\$[/u\#PWgcC5OrPz?H8CIzbrrDJ&‌vע ._"ӥt= \vYYP;HC!,"]µwh\ (_ ;'I9 8G* 1~BBh) cw`xz )_hʢ]m<ɫM̋٠LReYd( HiY uWz'~ojztM( {"x3]#S6$dbA{@*7|oWY= cSs~J6XwYzza2OUY!M os70Si=uA`< =Z^8(?\sB zs(&cCMDh2oqdmH?VFoH<땮ETi kmh-m=,5<vtɨ &cWzp8[t^&Ź3I173Y ecm#%<{FŞaG=:>h G|3:u*K[Ul巬f4 p,dËJwOVLdE}\9qS)Tp?/˜tjV e|^b(9w?']R%D6Ҍ/`vM$)9a6kw* J!zWJ=;y^6֡0lg/2KlS*(3!r$x@^`(oomMmdØ>mۛo[cĤ&` nF~o&qDK-ozI uljyS=u[(NՄԒ:"' MAYǍ W0C ZsK$`rSOx)i\,tge!}_:M\PQAqBc;~_pyz8$cM/ k 4]{126I7&橸pW:'U^G/eI9@}lTK\^<[wzzױ!.fH{c!.>%GyE&˼D;+|D( tJV5$MirJEΚn=’_V[?)Ga4eBI8uzW} y;,׵=S2SѨf{#YRJ32⍽gX|5Vcc R*h2upeAR&pͶjIEZGelpGcZ;2z-yq]>uZ[1ݣ1 v}y$E#ZmnI{՚#&0Gd,{b oF ;)?bl1kK,(k&pbd4+Oܑ9H;c־Ƿlz띎 oZ>oNL+byHEx@R b 3}\B*N-1~b_,(!P+Y#z-k^^=TCgfX)!9Q KU @bok\\2WlbsLAFFx+o\M(l`v)h6#=`K!k個}m?||ՉF`]s X`oVi(6Ȧ(NG;無^.!r&LK43䜨g}XX)`VVsXy fXS2Z>fX*zO-ḯ\SgdCn/c.LFXL~u, .A.}Oov!&ĠZ ﲑySjY1kjˆhAHJPI2Rhрqy8{MVxFW8QQlMOيr]Srd3SSB6ܰFB:7xXK^R(}1r7\b8 Lg)3:eK6s`>Wr[h0lWw.~B;(ycO a}E΢@M 3ߣsQ;%hqO d׮M/288꽼pkOٍz"[M?'H/!M|ݦ={SP^k+U{,luRDSBP ]/tI* ystf-\G4SD Ip'q?]GW{gYބxHbOhpsqct-`~& 59{D J|\ej*HwG(`]#7@<+Ȏ^}D Tۂ[B_<؋זby;.'wQ|DjލZ2ZU%Բbh׸߫Ex=8ݍ Z$]% g#Q{Lb~ Se$fŀ`v=XsjSOKg?i-њ8Ϯ`XXҖz[ML)݄,>,#;[J1lf'䆢BTsk$D<ÒaZSّgPEdUڮR9]iWBjiohNb WGbY,Tl)BV`UH.]'e$[BS;;Ỵ'"<`'9cS3Ռjj*ZNbz?5y!۫`q5|ů9 N,rl,pBVǺiF_J.q1<}P;0ee鷌5X^nm(K>v"݇4X!H!&z4` (ިM=G  'Q/}/AFX|}PĞ߃i:khWq;i 5ݡka5+^b輣7Eۥj.J)֘t(c#+8X!9{ ?eܖLT]9<2.4oTRɔaOzCN<7ߙҼd/cUS'eM axW|}PJTŠ2^!yƵ6ƛb,[xvta:P-RZ8uir)r?V F{q+r8\]q/^}VB1r "OADӜ>[#$US*D0$YXY@F7ľ~*om H|Z;oM' wܼ)&5 ^*w 8 Z:c0.RTbK6ucaq]g@r9dT/'i-cK(}Mlngn9oC~mQE.ÝFM| inwER#cкb^ IG%~N9d/˽ "efCx) ./βˇg4 8a{-RN_*6)fjl85I>dfڞi] [:'q4PPSF2=|#4F"$΂7TrAdYU:Z޵퉆I3ݭ ޳3n3eJI hvyxr"9 <<:I=W1TL"r>< ~yIgWyaKeOvNbp&!3AP's]M.j5i\49.mMy 3hP|ų7 Z0{`~#&,bR*!?2V'C\b.,-Tx{w1D|vesOٌx0Y]L' BuFԔi2IьVw"@5tF#./|+-Z55ܓSE"n!O6']Em2PZC)y6 2xiY䤩 YÐ/)G^>DN.FǢ*`' |aUtc T{=W"LjJ~ݏqfN@#׬eIT3z_;&(PPkh >MjI%EE C);/ﵡyMƒaT3RͧrHqV$(@5O{Er7M?:D,ؘlYͪ!\ZmM( zBXU!Wz7f+݌Չ!`,[TVI&Cp+<v=HGb$F4 ;m^oJ 0M4E}W3sRO ._r>׏ѪZk ({Tڻ0 M׾}]&t//qsӆ2)B+>$tfdYC^L ϠL CT7%ZF*a ;0!˺h]M^vf 4'bdBNЍ \1pݢ:Zt= @2,1~c4REU+_<:{2F3O . mdݼwč*UMYM=N%}48W*`ٞ(Gʝ6e$q)iya5`Vf}!ySMX3F#!n8r ^;RXlQ*x83g&.C.]82*7JZX ^Oq22~ ъj͑4((Jcg֋`7w Q.I¤"dIS$!+*!J$E,7 w`'zLz"HӨ72H ]Vecq'Bo[#U3A]=ks)0l{ Ŧ񂝦2>~C rĉ0NzD7-嬢 F_FϺ],4L625.ߍT3YVĻWk% dcwMTg`{cH|.t5WbOrq0hк[UmW;h#Al VρO塺;49OͼVN앶uoUy`q "yD {tzF}hėH_V#eŨ++Q/ B V+(X>ڄc*ϋ5Ls3=E"7AFFhCJRîn Ai<`;:z0*?//iwS㝸鹫T岥xn5S,6@'KLBN(ˆ;U|o7-=[miZJa9}JT 8uMi?G (S 6pI/1or4ȦPFZ GS ,ETQ"Q:Zwfґx ] 9SnocukI4P}}ڴs]:þH~zDЭK} 6a@(JC}DICq)&*)7! kLJuasEBێ#8m8cB%=y-" >K4QnxcS5ўeRlx ޓ}/6G >9[uhr|ꆞKlCU6'jTGm2] q^Jw l e\ZW:=GSoMZUWcۍңW0-(J͍' Ҕ 3p.<~91* 9^'=}cCXtW0&* h & |%d!NC0Aˉ6CQr!&SMryYtsoJY]R07.>m8J`C}D<IBD3 #+&Bņ< +S)v=~H;Ki\q瓐MaI;Ï@vbT3HjUUQ]jsI|!,^R-j/&ShqyWsO ]:+䮱IxM3ySbӑ6}t@֯MpAҕeG uGZMKw0]1W7mcZ-1L(.rߌOl2LH:܅@Hgp'sa:i6H@?[@zpJvHLa/E*K ٘?2b~Syݏ3 (^(PVvWvsx5Jt;Š$B&yׇ6sC,XG=q~f6tp^"Zsx=+`^,A8DYAR]q%h2Q-՚I!p%G7{RC t0\,x' B] bp*_oO WB(r]@M :dNUMIc][&sz.K+W&[?E3(T'~x8cRlӂʤ J>)s 7jOQԭÛZHDQQ/'wL¤Xٞ*8sk4p{wPݝbJԈt*)iwRM Cȯp\cW;y1ٛͼcvaBOCjcr>kgЍ_YTCbII_ {/|V4EHեyn4q'7mPW"_N* n_ NA׾0&Ii;ć{Ru+ 4usz5dv˘{i kuq\y#~5 I9/EfU0rvMH {l Ry%< =gECyF<Xt뀹ٜY =QޘwDd{dĸQ|2H3݉-@(3t/IC0:IJ#b-Y'K) ˜:yhGIT)RHm6%^"k 3:'fΛS`Ӫf(U ==$rS󅎫eօ"'m<+Iu !\)LOF6Uÿnx#ZD Pt#=:@ߺUm@X37>l/9M%ٗd_6V|~r!NoD4bׂ=wC=JX3jV. `Ewq7*rRﵐys󩮫αeg/X Tezk[N=~Z=Za ?aW8C3dv,X20Ux+$yh;3Hϣ\g%9#8\ A୎Zb7ؖq HDf$$(ܔZ,Y <~+`͞vO+X7aQuIchlLjS@,:yO4A QÕqZ$-^y!.ܺ bTGW;P3fo벲[׽Έ \iu;L̻xA*Dc̣tw&VM/V^%)0IW6zwXa5lW.$܊ib^a}Z`65(#dsumpKZVP_3ծtM}&5E:L85iUO>=%%2[h6?)1;_z:FIZP!vt!d8Ca5&As0ٗS%̯V{03Qςb=x~@ ۞&U2"A W{4`ET:Vf}ƹ*OݸavkAyH^$=r}u^5pvR`h/dUB6ĵ {cE\t96j=C[!ǐs;Ƹԣw2;\m~5%Y%+xd33n3E=n"ʺ,OrLS5'ЦHiCU32+8}SJ.t[1)U j@6`bS\+]lK[})Z^ 9")MFB~㉪e۞).$AMe(OŒX`6h|NiL^Q|WÊOUWP}^Y~^㺎̐[:lU-r5c}Z5^fC);36oҴM Q l/ڕ.U4Sd 퓖u~cOH`R"7t"w!ʖ&1 A vޙw W>6w͜ڝT},Jzptdtn87[.)=AJ6:BـJ4DFɜ}zyT@h&Dt.tz r1W*^sA8uZGe.`PCaT+{ >X4 EP x;+OS6Mtĺkܒv=c0Aq!sa={(; mÅq#,K&D,#Poe cGfk[n@{!Π{H5E U[dc|DVl_mjfMF$.Yf6⷏xN┌тB$C?G Vk50ZX"Sk'BsLVnciJ\]4$Ξ=bj_%\;Ե<{0HAh,"^=;~$o$bnlQBe(tA\ ..YXm&y M xMEN4dDӮ4^%nșpba:՝@lPK2ɠT4)(˾^-a*%[ GBJ(ST.bֺ,{= :+da4HZ*{;svNz^ш zFQ׫x Y= nT̔'GfF;3}Nj k ,T7`1_3>by$/.r3^\byaAz+B YՀGYE.=eK,*W:\B^f /4Rsz>Nz Tϓt<N[ѡJ$];}PѬ̮9 ;G5/ n 6u'߳(]KH1+z}MpcL zM̽:d0P$탄ªzB{" }uc1+(eCjˬR?C,wi wz6(4tl<ٻ/YR @,hUZ5|8.X)[إ/0roq~EUq؎Zv&|[N橍XЏj+4 d<ET1qAg15CQ&18eǜS3g| 02JBJDl|QbKVv c,ɽnck@V)r+ =H+NvaQ4 z1BT>DPMZъ 6ɥ9Ėjt*#Űk_?ix|9톜&D|Zf3]>M i#{bOgt«g4ɲ~. !"XP~BJ)NY︪lm8P3iMNFǣFF1WA..>T8(2ȳtS^@F N K&;:5g%cyŊ5 s `+l!]xE76*Ei)Ao&?[t5tї0 >[¨󙿎U+'dNü}7'xu(C< Q}IW!8 0 5d0^XcVSpn  %V2G B:yJhuZS88bi{iOw,/0`̬XeQStPY$F#z,Hp1v{lC=x#"h _ d GDdͶO2^@uOgT7A7C\9jFZ]AM!tɽs}TQnkZ< e { ?zB@FcFAzLb+\J&=C`#Ui¸$Ѻ'Y bχi:⥔\4vqu^e6ykn9؎ڬ{#0uMdkU٬6X%|zlK/RSxE teMo8D -X<@GP%ISRISQY Jղ#jRl XI$CϫzT=#%!:%qPMzrЂ"M'GMȴIk@]{dʑ&{ZGܬo[YTF{,uGbnXq/x`֊P(I%B29o=HW|B'fR1Sd:G w\O^z`[,BQD"x0,>@Hą>aXSldK5e灼]JS(lO2|c;Sw8` TӊXT4fWﶗ'Tmu!cx6uj}ϓ=mTXj1OW5 *9%{h- Mt"LcZm=~IlLWhuu7 {p {}J\QC4<{wc}'2bhTX@\rvE @ F ykn`P{v5bmR9<.Wqg]0=NIZQ9(qx'$u!+Ch 1mޣv%!*9 {,,\a#=Z;7|ƝԗNu5_ItSHϐ< Il^qn\|b]' _{<V OyOZ t- vdVBˋujv Ap+'Ҕ:0-rŠ1۶]j9%7B󬸎I\X8QBv)AcõkƧ@YÅp=6Ϛ|㖊ZA" )N= ߛJĝ{I"\W f4oȡ{-3lَ/'&n8 P4e1q94xiD`&E Sx'#&$`;JVw4$lՅݻ W7ʎ6r)jW{q~VdY7t}Cܷ`lkޣ!j&'ܭ}*1OؘrR<Y" 23cnW5cr`<MrF0/ AZm蛣zQNN$b:I:Ws'{z/p9U1s5*/9G@NTMjLj t:u'+1Jo<7gjLy[ܖ g x(nfƯjÞ/ܭC;2ڥiPt%ǹ,}^ feyDr|: 4-j%Anڟ`\6oD*JvNDɜ\5V3k.zNCg\ga5L&k9Q񌕇z~At%gyGM#I]?79Q8%¼<cFmf':xen+s€>eu Ӟe=+ } o0}1Y) \Kߜ#!F'+{E3_wߵCAy#{'¨ib4U;}i 9}$y0O`,e*Zl-ڧN;0T]%zspyAKr袼#'j=|ؤ5R N_KDM;twX\2H%x\U䎨^>wGL''-[ß#[V OO)̹B##llBڭ56ǽv:";ĚuT]-K%рIBv:Ɣԝzsm؀NU}Rf]_iڕ2< ::7Q'_`,`mG`qK*y|eC|@0B G7p{ДSOڀb:U(op1M {ɪ^?~/ ^D2VB6XCSTqgZhRoӘO~EF"-): U7̃`G;D=&\l$yfCOZ`K v-ykDC"A'Bй,愿|-f&ҡx߳c@+=zL4R#ʴE^=4l1Gp |n>!RXp9|b\@.[zupcjcpx}X ^I}uh:6i4gT/R%r Jex#N$W>O9J\iP'|uo7`g9/≜Vk;ilaqP)&m#393 BKr$9#үVl33te^G&vb^9PxqOJpp62 ]Z>S–d'WNAi{dzQܶT A"/eǍ # gf9 ]{ǧ0^nmO BRQ5Blׁ+QH=% /Ģy8C?ꑋ<<HAWeF}]jSJ<_)m_<)Y,c߱a vhT"E7h0u ZdN`zŪ)Q,?Ws( ikqڠ&0t 7'_0Iy>} [[^ BdB8~59xo j+P結tgxl3Ioz 9%dVGjT]tnOS=^NmC!k+ܬ\E5<9>6{,ϐ$skڄn<c˧dDGD|σ@$SUJ<B R-hs'.3҇L)䏬Kph Yubpd03ޠ(1tJڃu@G:CڳGu/« cKH5P 3\wda8TTYȦ^޸GQF#PkC*x4B!vY+dLMOp+M Vm![WT$H镺̕y7iԺh>|f \¯S5I5^SLVFk:{Nl 9#N9fB%z 2o/`=[pfYɹi[JTAMłϑ)'Ř۫.ogFC2M8U;KR+u7z-GYlwgJƶj5\{5=Bԑ߲'L#In GLR=gLGvM&VĢڝ17[JS%߈ELzr0bhF W_p^rK<)ݜ]4,fq['!m0Q@&#؝eȔll(Sr7Qq34;v6Z3ڂ7Tn*I9'@5C̆0_ÉAX:^^.G$~o&",Ex* jzv}W)Z;CF#eDLlNzl1Q] 0@VфTd;x##F92aO2uCtʊH ǧD%1Ҽ3|DTS(V ،,&HWnd'^[Ը|CEE@v)ս:~N:OsIX{F*AL<]sEt&-'Ǘ$\ T]np=G+ Gژ[[QFrM.y>I;J PaմF zBk㉒A լ:8xxv4&@孊B,r' ʱVCX>;v1Z Br  W~E;8\Oq87Bs9> >C2XxPfB+İa'I=M#1@iӺL #ggJ 3qzt 3( Ik)Ĺ@fDjq'uU +5Pݬ4;ć^)4ʱe)N~[J-[y UTYAgVF jPײ'\k_bRZf-V&^+ &_%LǎUNG]kg]vZw8]X8$<\}&} u0g@AC5͗$tyڑ#vG*5l'W|[b02{Cb;p9[ҏy%<:嬔t$+@E26:ywOu-CB Q))6=9g&[2qBG҂Q}\- _l(&HhSKt^(~i|Alλ{PK k 0 Y')t׀i%Z1<1QVN)[7@o4uͮy%RA+bY K@sӝ`"~{ܠ %D AfJGx`xߜz,slKIU$"pd-GMQ|kE$2f7x D)>{$ĺ`(̞.&$8玚.ؙ٥fkHSx+~J]u/Woz]E15Ǧo{H62Ta q *䥛%+3yz)s*PxMjlah˘(qfW~dF%%m~Q6eզC2t.WEW:HYÅC ڹ{klݱ<{Y$KQ]-^twA_ 7JT ӷ\ H(M cyYwAƧ3P؝֜ ;h* ǯKdJ05dceaR5?IP\x7 c(J 6zm&TWw>%68u^-oԓqJ{vH6 ["N;jK︍eb˟"(SQ6[t`fED= XˢKMz ϐ:)#׻;~DɦN{#}PEjzC?2é3 aIfC rlq J't(4Mek2NK "K \K|{zk{m{Z=bdL [T3G_ PfZ{W+GG༲JT'= ;J'uf*AF>~h5N;Yu)yT n\jIrVR ոUp}+n(Nj5^!%+űe`J^@;?7dz7D&=>c78 mAZX%CcOC} i {OKăزȑ>f4޽d^pp8Bgo).]?Tp}psb!SǔO/fC$zh7p&<.%ͪdѮmmSZVG>\hHP#Pp9My% &OɻAYRŎxl(Sv&7*1]& ,2Z&!`bsHY嫅slyqQ2)2p(KG' OfdX][\^ɢquϘ^ <ݲ^ÎW}{OJ!;ĚiM]ph@U컥ލVk)ׇppktMt\wħ!\ H=>syAkG=>PdG%ܒ "$4p!E(sufJ!QM_^M~0i>^aZ#{ ȏ|\lz`lY\(gjPv(7exPUuzD8(B܇`d@MU0#\Z^Kd' 1Q2:H_߱9Eyܛ82gyz3ar<:%`$P8[E)`Qfd/ #ڍiftr9CdGUMbl)udzǣ6Ln8kz#P 2{$4zgD.:v^;V[y\BPCb{ ݛjR^`Yp^{Ab1tJ[ F4nS(Yq , 3X$lk\0/6)m:n`?!,Xzd=}KztgcJM̦r4@j^ $$rN <+H!BA|r, ]!fot@s?>/˼{I)[fK^w!#_HPxvJN~twϐʜMu܏)H.T5H38RD ӢC?KQdv: #{1xr㊃2b̈́%5yRkQ6Y=iX&To*z3n U0/.$qm ZpBA0:0'H?*PE'F&KX9[1}/t4 =V|'0yI~Sn;AV¨{|;o٤ B6^;+tVN͋01 6}TŻQ-Uƺ$H:/\z`˴-\&oB ( ߴ[H+ujG)\ m6WnB GY=j>9H]My x +WiyBg;c"Y|,4Q]( Pq)-Q+. ms&{w{"6D8cرJ J5B"pz<|[NYW,s]4ےlt]d&'3z߳/ X$z)sS6mVh̃uv! kV-wQ!VBo1=z6 ьgӑDNEvRwy^h%q-!;j "H5γ1.\pÆK|{B/7w4)1 o1=䩸q=`7/|+bc=BNx~Mא*3 D&K#uEMNjAQQ-,c `A*gюjsD^ϛ3{OIf3GI*DbHAFX\ǵ$fZbdH%Vࠉ1UR60J#wTuKiyKWr5e^8_)&bm?E`9$ly*.A@O.ϫ%2G>w ĭ_T׋>|'gAHl!K*Pl•CYgOHh@+X;MFw* M`nax<xٱ@im=pfI k n+{A7£fUzL*^ru4\ེB?"tSGE;v|%!TꥫC=~< Rr!\˒vo3Q?;.8XAzOEpzt-UGar"w=9{YV}cp,ЇP8Gӊ!Q #F\6< r6;?ډ,굔U˥}ލR3]UZk;xWEonU^.F _dmkLKmHi+;cNvX2Vzp-#?-6Ba/_o^F +WݤfF|/Ɇ>1|ZËEC›LzX ݢ< bl&ֶ?i&c`wb8j !8=xtO $frHڢZQ 'C2 M8QY81*#h'h ]B<0>c"uE[óWV`X9`ls$FȪ'6YŊq/_y9zu0nj@y)Y?qr*T)#CD݅rC&>X)Kt-''zT3TJ|JvBj@8W B띻ʁwXD8r qy֬䥂 >$t^eֆ2tBeJ|, 2B!€ -ڈ'O'p^7_;HFQZovyԗtFCet[8 U5 sso p+4ؾ:4< {A|OeԴ^W,v߄gdNV"EC5Ԯ-R Z8`#=,{&G}JoX8n:_my^{(/;- Beq>V31|n6׀A%g9f"4}dKg\D )@PW R4ZpølV{ 7k?xX-Й"v "̫G3fy fUGL룤)8lROp2+ae;=my]םDgO7 GZto5R2l'SN}bROՉOTH"4 9D{B칓8^#Z`]o5`DMLkejӃ+[ViMu\jIW]kliTpgv2&τP㶝v ģg;ةJDn1Vo$hN6Px%%]/$ V؄PE $6ވ{֘dY--)6U—2(䏡h \A D aSԎ6W½I  %y{e~$i /-X^(CחTҢ JSܔi-Ta"amvْqiL=W͕6'khghY9lZˡ94bm؇gR3:I']R$R[^^pQ6iHiÌχ1nzCRE,mI# "~v[XEo$޵rfK Uf8%~VtcOswI6ߍ#G)C wTR[3~|P]= ,\}OY֬ :EԲ[]3lTFf=E>HW!GfC" A̴-BIZYx)0:[ 6 WW*H›~q>C~Ԗ:ݷ4><0Z(5TT7#R(ҚFҰHF0T)<~cOS=U;կ%!{ΞJī$yu-jKjWA`9Tk8;;H;>Q^^WL į/Sc]c]&fN{SQ(=ۛF DXsɌ1 <=7O9U\`H Լ.[q *[[T_]! X4O%W  C>R1Ht|<%/v/_z66 T1\yuK(Rpmk6oPlU'w;H.8;śѥOCuMõ8- @]fksX} ["D". T Ϛ4a42E6/{Ln(Ȓ&ר:W춓/M?%6{6ɹ<-er#Ҟc"]fGL"R0FAʑTsbxVQsVC Zz4=QЊ|Я'3HJ*7#9{IuvPTpEBY%*5,B3R)/eۦ.^T {C էI^dYx. a+ͪe39YͤEHpXeTDtgJDz``zG@>H>"ʥTMR6OFC`q(ў dM7U{vC7: t[|Z% w Exڤ ?-WyC`:0Ef^r#+R\u]qze _&˶375:ej=Ƒ/|˦zn2VblMtzDklP Лl;р#D*K֙өc7RzPޣTnv@Ⓑjv|wai]n ;2CLU08w:C#D|+Z=lxQ0䦬ՙBZiy $q{׶ujT;_(דbKU=)׃+:Rct;}NFw7q05ƄZ\Ō?:{sT˰IR'íF^i1c$ zQ}sj- 04fv;|)%Y@<=*P&Cr.39p@؆]}"wCv}{My\O{jɫW2C6`{whz[V55`r㡓&p3#ב̰:RyF1u: ru>2|O"&މ(&=j'\5Cp%CSI-~Ng=!nr D i^o'=P!~oGqnMOPdF υjpfreXMbWn|eJDi%@dL| *ՐWт#ˤS$퍔5`%U{44䪨9 m2L5!C^7\ 2K܊UCg=-y1Nw]-`Ήޒ.3aٲgqQOϷL6C|mYݚ@x96xc: i1cfܹ4g+^R`cL?Vwy-\7/B&*aӜUj64vDAT B>KA;mJ-a7ˁju<@ЛZ"ԅCWtܧ_ΪEra}KL`OE;\\-5L5= ^ꤗ"<EׇX{ @F|T;^Xt՛ LQ'#i22b@]%H69%Yi6U_*>޵#͂=YYZw6{!08\;^zP>}Ui W:#XnbTZ[xX;%3PF TWɑMBt؞_/YaJi#P[8E b!|8 8젰y5K;Zצ4l/MJm|֪G:dY(ĸK4Ҧ{UJVoΣdc`" f$XNy$!hhj"lO.aWր2-S Slg+XK'mKTs빼ډ٨ gW/F$}\ckg GQR&q .bV^B,+ <=3iEԚzuײr<_7G.N\eYLK}և8Md²dS@Ψ JQsqřԈ1AdJCDD\=⧺GTL/%}(\^*CNxMR ϻz:Qs+ IyZƌ܎d0sKijs~eO)3Aaţ‰QSتb/`WPuݥ"mbW fbP^;g1x.,zye \ӪsyʻPXٌj[Ye&LD`wx[B$|WۡЫw+4ɀXeʛ$XfIg7IxvOGhEALFCJ{O7Geݸf?.csoN`t!W(8Qˈi`)%~Y «ZoD1:蘩YR+ô:{4 ֯R-J/`/ϴ\՘HFyARY{Ea_ia<3cC̉w]6V{!yH=ef: qs>&QevcBޕ+5gܚuAADwOBa.Xc+_ sbv_ [iP8vSF"ǃb6N72OjQȧ(QNs.!W؎HNQKP ]k/fѐa yD)*L E!I.˕&o(o!l{RռAjӅ6r^Sy7Y" 6:oMR9J%#BYk - JX.8W 6|˒إnuqmui1׬^4XQA'W.m3ҽr~^ܳx952.2% 5лlKd0·v92&kxYIM/}x4;+Ku=;)OjyW[Glm쾃ʞ×sSGU%d|[ViY}J CL;iE (#(^?dXw*2#I1F/rteA.KF&\)#̨ x8ڊAWϛ(څظ+g4=Pu\wm9A'F_ w4< (^l"i>S_WJǰ!&{/,IYktpg9ewNGEvfy~!/'؛b׏fͱ]H\$C ̫[-!BTp_yc* Pq) @3k$/uڻ.ndG}ˆ1sb–_6A8b/)fm֛Dîpz2F8-tt@+B_n m<q5v4 B^9K^ce&vcVAD`*Ӝ#AJxD $]ؓb웦{ ݳeωhsw `MD[ꌧ7^p.{K w(DsLĮLqmEMޛhO<~s:㝚pi*҅buD^ȑ:dSͳCۮ7̖yYPEzF0+(Ҩ<,BaxYaE1X/J{fW; _"e>ÇO:MC5lnQzE^/Fe3gTx'O\vqUQMuN? ']*gV@bqGͫdjqyBNgK &lH xO<-3j3aIF,q(mw,|c7 #q. #7c}֪M5۷rBKZ\q9lOLoP_5b+S|,/jxn,Uv/8gjGN5-Җ[LhZv =צuV!琇p#v+2sJAiM7 ؽzYK#)*U Gя5w^SVGApsfق3*m$ENhyqḘ]>VJH UgTATw𵌽1nU| nPH]oG `]$[u2CF s%Az\d=tE& CX߹w4i;3QEȅ 8V|weomyH, \ yZiB r(F`b(BAVb5N?9RuwyQy\*d]"̮Z AGZҡߥc^h10T7{N Y/x4y\DJEײwث!6?2/{ik|MWP-y2Vƾ̲.`5 RAq\-xǬ S뱨=? |}5zgg7(qb"Pe7v5nM*Z>ƹ3[K 8"lOhFQj%\t)ȡ$7zYJΨ#-)L3 86w{-o=4+OYl>MXdgjhA}=j WF ){6FEsIHt3$B3I2ue<}a5͸Q)LBOB0GP8~_o媅]54~c$)P:6O*U8Qjb8918Yfi+)s&#8}6٧"iT%0|y*ψ5ϥf񌣕 N p!ve,}MQ7casM٢4ƭ{IYԄ 7': M_{=a2QdL&]<$G/]]{«;xӣ`P܂Ӌ&1E4kN$O3 .%ˊ*:Q梦B-6.*.<[.]wbbtXU vBejZGk= B%d zv[wT4jcLO_ Qy= m;{t2{(039#7@-P̵)mJZd!PcɼL}(H> [3;VXetՇg}8{OA>ef}Õ%^-W1"^7c B y-Qm4՛FH SmB4$LxBjGz+[Ay4:IalFf۰"WM1@Ś y쬼dY HOě%kjHgy"rJddլw4я۸UTsX1\ThzYp@ #}:TBZ;#mRxSUVm5 ʖ{䭃2le:=B XgݼHfy{,/41x?2Qj|I^=mP%S\^bpkxn0 רʟ _۴f/=i#T;ȐH=IoFIz o+蘚T% ߚ K~>{eUO+mԪfʅ18DФJxpNE}YI9潃q G@!e4:ٸT~,lݑ<bIvDʆL KXPY98|[ xgJ@:0'g$WpM\Tq?L`Cn)C(S9O HsQ*{[ʢFt]GvKE'^`Xx4 sRcdZ*""x>ڙQ) ,nLJI|4h bYnP]SuI`9Àm8?-$b[FZX{btKDǛX^ϾOθБIPȺy)FM"]'y[%J)>Ύ$Ė0G\a0urSQegXpT+Bl8c NsTW/[su͞j6kHaT۬Uw{xޢ (`xA dŒpO͸5aԛ<|MMײ\LCi2`4"P)$[RD{&#yp{f4_H˲c( 49J F~çfN4D2$B0BVe9hMvlVۉτTM2"/1&m*)ڄ39 !]i*yRţk05D7~jXɡܒq=iR!$[|`//Is{x{i8 A(ʔ Z0ɢH˔=iL:^s#5X|`waluжzFXm!IEntvB bՆ@ 5oa?!]ʼڀwɸ-p##O-H,A%Sت]Ь}^Xi7X$c/e *8-s[Ee.D5R1uV  mpy[j8rj^)$yj/d+~qBWֶ_Di6ag DIU TD.Uݦrya֩˰#ם$(O$be/rA˞0Q7/żgk5Մy7P|~FM͵ >&[4 bjҖ,8g˕ӈ8e뱉_0sa?P؆f0R[n3wo󕄾3D,+V%(tޱG"!{ÄG8T'gj\Z&F{0Yђ#ˆK7 v?ղXW|w[e@ L3%Yj/;jXi(#N,&gR|bpVIA!ثٳ\tA·:M^{1ǩ0(6zMgp#$TMlEZgq\1/\I{ɾCExQx <=LiYs'n-v!hAD!d_76 t2Dn!:^X3gtq\lY[FES>{^{G^wa,A?d9GQ-+d'-uݸ~Ko ͇-3-n'=4׭V%R(Ŝ\= lMWE슽(AganRt s[~ 3iٛ-Swo2TQ31ڛ' `5&%|  <` %r LwpWzq@A#'$jw!ȏkn'.^@c ^70Sj1 lݳϙ\)QmI1e<9HufJ.jXB5ze&ͬ]q!sD|&u?Wq6Wl< F3T kF;䓒l, <;oA\7dc}Џ0L)MtjHM^lHi noK 5x0J7+LeJΊK%2gR[uˈKI#^8yv MkNZrgmNpҍTYwzvQ`p ̍b1C!s*e(+-! K7+%zh04{wf0bV;u#tEl7)sh퍧 a)!Z .gfct^2BucZq`xm>܏I/.5L'&K`M9@ig*8>q9+鐤k1R}n de&wQ@ P$/«zn%9;e]<y"C=U̘c]lNk^DS*k|cG8E̤Öl+?i^ܖi}\sn33UA-gO j#~OAYOE`'H:O,H)cl?f7$$^iTݸ`W ъ RյW^>Pzw69CtISM`š@(!SbaRMSJCNra Zgac .KӗḶ!{X.;6bp{̜N;̤xo05=+U${&V{ܓ-#ueV@'f}o=Eϙrm7OjB4d< 0Y`*E~.gg2dg7q碧.J%Wމl,B\5t(v uqjWF |A÷$M88Dg¢?]dl@33Aؐd]{5qG^Ҭ)c":j;e1[NRlei4s%78X>bM9L0LsBp' e'1O9֋o$1`>BA6.W*+MXc3KF]}bEIc#N]m,lc !_yRǸZUHF48 N[ &kuzg4XIז́Q.mze$%)./S-;&V,`A00ϊ|< U {04Xw+4yB1ΚFLj;1]*|Lm$/m1yϬ 1s\(SM%>yvt.&%"Tk'I{I+]t 5-(y=s F\%K%WSۖjF&{y_+HK5J>G~Yxs#Z "v׬*c@я98sD,sf6iPﱶ+dl"nxToz4 0lܽ;nBŶs4M~ύ̦ǜ1ߓ$Jͦ,LmHO6qm"Vwmz&q;؉De j%RBEj$)SJ+AZ8#/ڻr8r'̚ơxzƐP؟=q2$g;}%r .Z̈́# _TMsճn+tba,^OߍN45`f Yr=l8)(×S'nRiٝӷ=E ߡs +a'ĸr KBi; ӉP f`r{j%D5ʸ'ɋݱ5rm$?I~f(rա.A*X.$❳%>2zG3Nf1ؠgYl3P\ M-g%&(PKFI櫍WIՔΕ #O^C$N44;|\Du7ռ}Zڃ)C 8&8S\MJ;dn= XנmӰQkz`Z"20 ?}s$0=b,w`9tI[5umwN;H+5kH6O1 ;0ڶ3NM 5SxBȣQM2mH2[-5 κ3v*I{BM ⵨s߅au<&& ~ýᩯm)ZM؜c"hJ{Z֤1 s AUf=/Đw_,9Pl㎮F^w8uK­tBYf}eHQ3gYUAc@@!~e djEZe̻[iK(ɡsfv Ǥ!JKqlH+}pVI?tuE{'QQ󪽽'Yo&nx=hr t7zMy<*q܃b+`s$"̎+4UzH/'C_Pd,+k>jζw@鲊be6k~+ zyX9hQOJ@b͹:%\Ј,Jr,mAu~XoxԵe$ɳUAPp{#9Ctj`LRftpPĆ|0R/])DŽ^{ )(Eu+ɶ -XW)##H.'"Qt0\;﫳$p}7oD ^;t22XMˣEH8HO G'ئJ5@}o UAEm[nQVZ5oSM(h vy IwUawWd+ڐcLr#C紺ɰCq͛Po`"V'拮uue6ϣ8{EYGΎ C%M骥=s*H]s:|oug!Id;.+!fH_bx 3 kAt-yg#]Vei[Id<]Xz씵{pii?Jޠ&QҴ;|}60 2kV:Mj^";~Fg5%2;4S3p"{aֹv4 i%iVl*Xiym>UPi,'Sf{l6+I1{U.BZ /[Ʊ煌kQZ_G5\u( ÒgM]+0*6 4"i_s8'A.`˭ Dr{xsGm{mᎱ",ʓY-]>Uyt:ϻkKC(_45[}xzGKP؉GkS7y<>&xTY,{EӞRwRgW+YiG0׫376h `LZi,64.^ '^R%0[7džꠐ1ݟ@*yn8gFBbI=Lj'~Y]{s%a5x6S9]H@[ΧVoؑg5 Gq v5{ŘzI2Ģ.4oSՍ@D-V *d+cztOYg;er\S;9FJUx "#6;ԯ ze%ѡٻ\1yLU8 kD~] v ֹ& LKiqwyohy-qBLKSU 'xR\늴~}"`}H2 הҥ]l{w~<{ eIK%;xoW<6rM 6= ..aKd$yݚucsVIBݗ;ccI)_ijYk©4;jɗ`s6sxT wHy]Xgz(eM/=OewZOeTۂlW[(rX\45O}qҶGOq2\zŦW/aI12M˞@+?þ9 '5 8yzWH2gי ) iȭK5dN;tl_6S^_[7[;Fz0A'f)f2A;;]'T3f4Q-(OmU1Gѡ2 n2]yW1![+̡a|i=rB[JE7OJ57إLy$Xgmp^Ӿw"_XF]9<; [^lQGtjJ_>Cmfz2ۋ4Nx[R{HML*,`LYYT6B5~P49KC:ieSd7'8Fad(}@l3MWbӂ/bʣe"2vFu.tpe-|M &<=~B/z'39:0yU$ 6/ e.Qv]`zl$H8 ̕Gx^ٓӾu#7+'&V{KL[D5~\S`x6 #SO J8'WHhHm X0HI&nz?Dyxb ˳azl^0c\弼 ybf-4)$?ztz&G ],AJme6P n\afc}?'@1zT@( PUKKNK)&-6uR[')<6uJS9A$|c^Jj`h[:y<"+T+ ^OJ".uC8',o-1<+16[-Ei%Z#uL0#+V@Aj1$d;7wȽ;v/ N,DTAN^%~V/E sY:bELbL$;x]O$5}\[w"@t`(e>r]X)5.El_C;Ƈא4v>Iԫđ|үD|6 [lJ4ckýh*iaY䈩+a{ Eg>&QyO AO&_󼼮\Zl_5{ʴ#g"58ӓl[=df"(vKq 9gKe ~b(3fkdޘnH%0%{%9='z+ kp~.O9^˖wGѪ`ЉMz(ͻ< 'Lk2jRAk&^T*L#1J6= n}b:A%ëDa/b<{tm#Am҅{ܕR#Wg{ꑫ J' Ǿ Do*Jaimю.$FRUzTauӺxn,T|^!G<@-PdwF7[G,8z[6B2{y{ޠA{1?NS}Ȏ/c_")-'/'DJ+M`v76!wJEhVh=j$Eҽ7S[',(ǽ4&^½[ߗ@HiO.C%E&A&h>FTv^bx1xt7dzEA ۾Gvy<(rc1X Z(Lxf E̪ʗDAt;Ńߨڻ Q43ǚxᵳکdh^\[kiP}鞨iû>A[ dRXEJ-p -0x:Ίn >l8`[d@] T,zT ^4`fb(BCjV*Q,=KҖxC4gm/ߢy;Wu]+G;L7\ hN}%G44P1=jxC`r*++-6Q UOWTN>W4 qd2 p_i xFx{Uu`m)cdj{p A,p-@ 'ٖMHk4j Q#ݒz E6f^$xHqӻ4`ԃDD Q2i0RoZ$; \gs.Μ)+'*b @ r4gWwD'-Fxa{u(ED=4).DH<eZWEB!Oy=C╽l>LT=䔢$U,TBl" XVBc^:.bvJF {9ŃWwo:KvɶwHC; W,P Wxfbȸ!xPf j,SdX:%iEeEҌ3? 4Ԩ]ȇd;y 1>CZ*8n={[l +0 Gz|ZsWb)XaE!هI5[8fޏ|Ãz-:AT剗/,d XNs0JsyYH*!JeFnSyk^i& x Soyϻ,c${4u +sKDyڑv5S;Oj='#oYjrȤ'JFŝK#* ~x-,{.*)%wu[ɮRb 刦ŭb%zqvq뤱ڽa/^]8;[|IVX(57ZU~pAw9;7l6ĠDP.q%>m7ЃwI%_|aJ'l\C;^pv!B` m_-Eg  |K^&+׍xiɜL(ʍԟskRƗ`ҍѓhKEwNxMvWHX ѧ=i;pՋk!JE%8}i)SQ..IUeQ.t L MwVY >ɗ=/L<}OG 'XqH`WQnp|oyl t=VX5qԣr/hd ayY,ixk*$ޚX”)R0Mocēj=[(4& H(whB;UU3y/Nje) 1:"=2<<ĤW9pRoI<[7|EI19\{%]U- C\mR0&GTG\e ''pP0KX#PȥP#84AgS9{#N"wE $z">i='q{ʗu uAv$zp UC2`ҝ޳uI~HuBxuടGƍT!I Qiq4l ,KF:ٔ[)@ n5Fe;lM{ZbH7OmP /yf{޾nxJ֕(2%vЬmյgm OJH7aYaCj(V=P1MTEX榡$#&.TL^Wv{.ҍA%-NDɳdq]G̹]Ci΋kD`R*qVdcGŔt n  3颣м2SRVK|U1ɤ~Lo[#R皖ʍiQJ6h޳ |Bִa(W4-\! DY4*َ`r}$w 8AW"(cuHHzP/Y`Ev ̟A,3^:|ot]`.h %VObT b9ջz 2@ɍ[pZc8{A;'?wJ%N6xnAͮp;`آJ1HZQp^]G6(o 0|"N8Xeƽn;#*:W0 yRBa1Ra9dГB&|MsMzo;sxdFhV-_9a /4wzjכ>q.hp9.jHIbLEaAB9'.U WG,=rTf\ XI1+mKvp(=p"Uo`(GOMC>D]&GύI 9+Y .!dn}ȸ%JEGUU_r`$(>=POt~dw& ׀j;}kL'wЙ9iM];8tٷxc4No9vWDި#Kg߅ k {GRE5`A+m|vԡ\DVAd<"ո6B e() qKat G|g>4sY'1Xg;/=ި[?ކrl2(}sM50ϱ1ύOscvϦWNlYc|tA%yԖYBwm{pk=_B9gqEmPA=}V*٦D/zhR5mXAJ#3]y$ R8U(ӝ~X{Z ECZ"|y6%,#r̕ jѰ홉oqq jB9ǏzF\ae:Ӣ#Y():-띮rN='- /O ~ O6d2 ޖjaE !ooYSo-8цh*W@ޜHŢ`2jq#2 OG: U-#zhH^7VifBb@ GʌMTB5{,^F㨑f_za UtFq)݃Zִ'xӵDR+/E[!7=F$]m\g^Z}PK~/ii,;l5|DPݻDlk3Td(u6e:[-J،"!D^tc1= K]Ć0Eƅnc~Y-(Hxjɝ;CM4ۖR ֽC Y-B|u@Rt j)"k"S'g(uO1P !HǼXS%g\P(S^tWS/ΤWnO죍 MdV0)Q\9 V34Fז!EV`Ro98=*] sSi? 6ŧ9o !hV(;VyjLZ){zyb \D; IrΧ?=$Җ+s8SC ^ftS@B5W'|9dZrk;L7Q7r~(TzԾ#@wzp^*ڍWbujA 'WTཙ!E]Hen/#T<+3(DwRʧZNםTgWk>N]nyL"?iιkcW r rgIJEؼe; s˴VwU_ed]#I%}}0A$Z16aOӸ PkOVw=)~&xS^M3= 5> '@loW*]p_Bs/l=;Fyɩ`8I@ Aop5dI0j%{/L\k"po5\yRv V5F:wMjUɬ̂qbBõ%2Zə(Dz=<$YpG>̊ۃN\]}gJ*]蓛xXjtϗcJk N/i~ @JSRR(xө[+gjtٝ*GO‚KϰiLp!\pHCjŮ:\[-ty~jpˋŴI\REDvŗM N1e fb"Y8hғGrѢV1%f n<79ƴ~ <]x 4qǹeqT_۔g6@.+~E4*<Jƻ h(-[=%q<2 \M{1˭In<ݾ|޳vMjd R f 8FD'Cf+ً1HI^:<|ыi] PPz5]sx} c7 5lj#>,g-kKh$|Du]3s3ܔŊFY6Ew ԥ Da&gާ3 [r8$SK;$R)m"q'67'Vmg XC+>Ayآŧ%mf0xx/&BI^9c\$j gNM Q$>&V{W<2TE@[SMuO̅0ڜi=fnu9P rnbw٣0Vy3=l}`hX&hjJk ^ŵJ0LAЃl!,V뮌H*@ޅ~|Ptk=vK{"-- u!V։@dɾ^7[ :>jV oD};j2x-1K$>KZDr2R_B[e ; zkJYiH= (p@؆}xΪ5UQJ [mb0M-My2ǡz5]{ODŠ*chؔb5AX0h 2-)CSJ~C{zaHfjL]L{Hbp]a^|.=c%U-*'ݜEq&Jp^&S XHU){ݹA—Mc^03'^EF!p[Dӣ\8Q v]K6&u 9~x;/؍E7ӱﺸy,jt*OUrCVuV2a knϛ"dڽpȟ'DM (]Wə|:&˒,.I[/Gh/Kw30F=}}&x5]L)kVPj[YͯAOWhaXB}R/^jYC+"Lj2`m&쪚s_=X6 gDF}VoਞH]#˷Y;+k+/VӋ( 6_=SsG#um1MwLE)gsfVԹ9DǸFCv4u~WlFu6(XqVTS X! P\r֟gT7|| (J=AjpЁO*݄nT ˀ, _9@eKt T&W!2pu^Ӂ7tSmc[CxH"\aT27.X[;:_͢{q<*c,' ;C"g_[VfPڷ|*J ۊ&i 3z\l*̈́AK; 9h8Z HncggPPMMeVCt*b{KvJ(:(EK& xV|1si8b@Z'iDm߲c%dMUaS@KF#uy(StEثYJ-ɑ*QU]ޙ1\&z^Z+C6mYYh{S+y\ ,q](CuЃՕfd7"}I=n4tePibiH&$ ~/_q^X},u\P #&a"{|±+KDR窉\"ҬXR_v]E%UfDLyIc*"=~ySf !2^w≘)P^{iy穫 ^k4zTLfl;Qt3zO]jN~c@a A_-MlXE)@ U/,R哖x 训F0 HQϓ$8dJ6&0źf+ {r1n$.ݲc; RTyo9xќ'Y$xfyHg?J"):oFM2ٞKVmКC>ѧ߃Esk% `Eo> g<iBv YAX_/>6r{I Üf&b{ 7!_8p]:},h=o*q\cDbz{LH5^ 13ؽbŲ;="P5~J)Ƕ ̵Hھ+e ϛM ˻ JWJ* F_[Sp[rmu $}iW`I; |`h$S$Qnf{ ه+pu!|XJz'O'[|Q/((k2l2;@zsCR4 0p̝Ν~?˓xT趴 G6@r@jbWڢɽE(SSqw _}A 63Θs7EG[ ؊6@/9lQ1:@`W8 e s?-ۖ<0/W+ a_5uz<=@^g^e1l&Z"eiiIۺx4/j(]VV(ױٔ -]_*K55C2"Y}[pA;[Zk;_wQo8&]3c6|#($]xZ=3z(OɎH6S "n_k?{ilÄOޣx+mȗW Bgk,8LܵЅ(c9l%lUZYp ppBUC8g$`[.q`T< VfD~6CAZea<-l1^VF,zr׳/D"Y:wBe²&=Ycto {Mq/ ԰&r.HUjBCdW >aHhEC/,|i=U&q`9Dp$\afr3J̾[+Ŏ='ǒ"ή@5=&O$mn־v|W|p8qxs5$׹sÝcNx"ﱦϸ`EL喳=d~CvQᒧCe ~l{Z:/rΖ4mʹ2:4byE1XL =兌֯H ;heL ݅u yq|'6 '6E;w 8^Ҋ0 x o HM= '&_$⠲M٪bU<&'RCHN0USCR\KJ>ėEH(n p\0FVYHjl /vN $`Ԭ-{O6̩E\= JDX:s7gzbD}a:]OXE88rZ:KSnZ]k@v^v:/7/g;A9"CsIݠzmRۤv{dwszٮ/-ĉTv]@ ( tiZ4g%,\=U$ ߚ"*vӵ}f}kԓ$3vt(ģSuvR47AFh"A1l_+ _2_VryN\Wd߫#*iPY [QȾFIi iZRrǽr}"2|ê3/b 1cPy:R 1 +p4cPi:uGt]O P犕VGuƈf:"Yb~ z$t;ZEdreh1Pq5\0 q;q#x頚,Ͻ $V8%Ltddl9 7!S1+Ph!,2X1JҲy~tKbiiqG2w.X=C.,@#BXY  Q_?ó,QD1h$^JMDoIQ,,qACWA:C뺯e70k xۋNlh :Y<9qnsc8]QNiwUܩqE3" p:; ϨQEbPݖ6ほc}Y{\MCA0L^ʸJc% =uen.{>$e)Pm4"8.ZtUuc,W9*[yt0}2}x Ms !CL@rDKr44Ҳp]d=;yױP3 eFY&&ϦdYe&?qG½_cqPbpBa0.yT#/yķl!tDWwwF̉n=o#aXXD&E4ah\o->L[*9t}erqI8eTIϢhsɐ$x;X 7 Ӥ'Q,8 =&I,z䤽XQZS D,'6ϔσ8dw/_%+{"I$p29b12ѡ˞Ƃw)PKk:KT% 2ӎ{CGc7G=m|e#9f-cY;Si65W{H ]J&wMډldgIM``}*(l7mo`Hb߽0Cp.)q ӎׁRMIsBѳ|`x:+=YMhZ>2ߎsתw8;aP^tq {cNq//wgГ -ZeD[4<38DрlE\m+hz7=3AO6&eIT=ma,U{c,L N\mޖ"FcϺeѪ8z+58;gF/W1ë @~IЪ$=c^ ZwQpV"=m-JD;ZG. h\X˴/9 RT!i>Oމx`h,H z Bb46͎̞p] HNhy8Tke"(u2{!NAvs(B F&t*#l<1tkdAE!*0}Af1t5*F/WЩ)f٨9b'Ey9n'ჾHM8Jf~)sb;T2 ^d=%f u*ub'G)|aeUߕwXL? %%xS{]i<txml"ށgke5[Y^ D%TlBV1y&]ûMA/L#++|y>Ma>8]w0Mvg|ݩ]Sޣ:xbKoU|'VN6Նʈ y*xUt7JRLbpjXLj!%bBCPo^H< )䱻sMf3_砍qMDNCT#ćjs-MǖxSgH_&5_EҳP'̹_J%=Ԅ}'D!D|˽^\%TyDΛ~ڞެΆo?$$ď. zpNeskm$BT6/At j<޶"Y5ͪ ƃޘ,i\dxœx?C4hK16޻l C\PC/&=.rĝJ޾ 7V &(,w>aʳr`ְAx/wo.yR n@4l)92:j~;)m]#C 6.n&eF/Kݨf+D$dŊDID!3+E_$_Օ{/R{d~ 1֮f@'ALiEr=hfI=:jMt2A*Wh!gzίTh K*HV;%+ P}Bb$νLp ^{5@h ^Q&6zj~4!3~5e )[Kη% ZDX9XJj3+EW-#_Gq>-n/v7k3GK,PDŅ=Xb aBN%N/1˻%&YdEfwp똞 SIx ݲQeelLj׬8$F1+(iq%[m.WONƪG"oqkCPt2mWh[=E (5t֫d3Ѿdj"]koy{+>*M2 c{`0 ֒@gF+j{.Lнg^tg2-;uAux1ˍ\ɲWM:ZC '~y-/t@Zj۪(q{}` -U#SaλE:f8^>I8J-#7"w%$^(ec6\h w&0VDr.#zs['N' ۯMȺN&Dq_7cEA$$%KF|97N̳+SvB!s%!TuFLbc.V^ۆRVl'dWJhyYVPKmuA2-)E@2jnn^uוtagx;VnPAĽ 925lvc z9ډ{M]'V,VH *϶y-6"|~mV/)&|Md֨+ÆjvMX +My#;9ll<R1tn2g+hȊ7 ~я2բb]8ޮQ{ћdxh[c!#Li/z[[IHve 4v6O)z0<$UZc#D֮W'!%bɬJsa[Ua5|BmX<ofg7U6h5C@#/OEꢱཋ |!n> uVgz9gV28zs(,?<&ˆKg~60<*7Ww1 younٽxeMۊab)d9h҇ZY ss\kljÙB iUȐ'flݫjD[3m G=9CS*6EO3yJ:-tkznezRe&io˞(tL8BGgA-nAIFn2EhUs!6\ 2[8Qk m:W6ڞ[gp<",)@{NwYA~ˍhNmW?l20+[5MjZPT[=X} 4Z<>`G}"uI[XT{Pg3.Lz.zVBt%>^QEʱȈ|/l$Y>,yRїY-yqV\ n3( x4w幗XyKG7n,Z2zi=*V{ Ejvru2oT[<|4ױfзH<[ >o͸ T$JSWzB}[c: G"oqN* ZR(g)LhM:c9x@[ =(4yBҝ|z Sqa\slWA@2э0͡b-PѸ&:qz_fW6qP{y~^Q ۫y靍$axk`L'ߛRb;%c >e(Mz봃mo"w'J(݁V,}c_O⥶.+W(1XτhDfd{ȫ%h5_.f<\LOEnkoLIߎ\ڑ)aj^{]QW<E-@H'WQ!1Z>>J4|V>;$ZJ7Uo8Mm+ptXzT-3,+M^a[g؉Orf[|$[1vourd Tr*C/w8Ɓ KSm.Y1S(α(`#A4 ͜a5KFȦgץu6GN../3İ(yjjʋ#kH;pp{2Aܡ\ANrBU~Ro5 [2'Z)Rs/S{ qjg\dW?1 {pS:2ŨnZ2k{*Z:/i)zk  gtpo̮]^9 tk[lLL?w)RߢD="-=ըc45aJ:<<}7(jQi13#c<'བྷfռuy-ZF8~HOer < =Vy{j+7ԍO&x <Fyg"DyM >dّr0JhQV/#'h=9wSDLUux~kZO">1DB-~6^ lUPv5xZDg{]K*{c3%%\?tv:G'h#Or5YF!Sg ^qGM&Bv^Vc^Khh^g@񽨃0ק om L0u= z݈}Bk5 ]VT7 UꑈUdS|RgsDT Yǥ) 50a^kѸ{Z)e-bk1'РxqU>is<T5OM~ x<7 3hDy؀4'9aې0gLbԗj'v >tI-yXv(d$%B9D+hN ),jA/ȲIMF I\fW"9ZAN.rۊ+d`:3Wהwn-uP?ިY苘"2GX/g$HFtMnjgkP{!5WR.tø)AxKPH:֐ 01#{o(.b^LG7oj ?-U.l&i[ j=jc+5*wN4:.GHv_#J~ٓPOXqͫ_j1q1Ohȹ!D 5nTQ~Ej5&b0wѢۋ*\!إT4dQ BO:lbZRj e32 KyL3zfC?GE"OZl. Lny8PP'qC aT}+߰dY{(p)v5h." :bz z%ѼR!f(O#k&^oZ pf57%i1 1y.Ś㼨jj=m \m|Y,,OHphքh^f*ިoڨll~l7qI/,YDwK]N@'C(a xJzZ3\ea@0 s3 TT#Z HnUXGs튄Z-0L="+p+h#Z#{mz)^Bj/$y1C*C؈Bn"ciSܺrZjk\"Ez/-C '8'd)Nm*UQٙѬt]bT<}=w#yan[\FoVSvv#@{bvTB%>^wD=iƧ!y@ /ISwyޫ5&ʲ (FUE$ PNdy¦f)P>`m&^c 1@}kcB@r%qObY +vc{9Thj[G{#/ |~.ovf&x*c:1l )Ou4lP+1=(]ԓNG]u&&Bvgܯ!j50TEq+}W iE:8<6D{uM(d-FNBwxw<,JX) XaIҏdt ӤnDH2lVyŸGWu-:l/B3xn縈Bޖ#<~\Ba,q—oW7³1}xGkR19ǎ:spҏWwIb ~:Tzou 1pV6, ,g꘤OM Mm4K S{{]C䜹dG:Lؔ$PTFqEJq Yz9ZvK0)xi8R/#ħR^tjRv$#+"vhYC)mDZs|դz(^={5QxihBC+O(`8"[c{vYJmWc<,w[k(T'U%i~X_1vÑz)eY [@90$rVhk-NYq_;}{FZd<#]8AaZ,X{kQÑaHOY+ƸH3zE'7-8D9Jq m>mJVwhݳJ=;7Oh&%8`=+A&=0D$-%jL K{O(s(ɺ5kk򥞉t^HK_93[eEy~Ͱ>`, wR˩ ՀYoJݤ^;.KǾ&NdB5L,E+|i ْ5'ONj| a!K^|yϏ͵0[0065(ѣmvGsD{X2ɝBkLDs$Jٳg Qzs奄u|86qh8޾nD$޻=9]Eiu{=s:ؽ72Jh2˄,iʹIƀZF1?'L5leRܑ<{{ [|Cudiq!Sx9nx{ܡQt X}_ͳ4xs}q s@Uzcqo)? ~^O,Ju=ն{@;R=GN!Ut4xƟBX^C]aBRLwsw9AbB{l ꙾eMrWQ4V/aR}o-T7^vPxj!MP7d[e"X`* sQ|% >g/b 5ʱ_gԼ*_ j Az+kvqc8Ν}#Jr2,NH1=LDv*i|%3ʰ-I6 7 ^CBV-n |Ev5LDx.27%Mn<үnm@DUc@*jaԒ,@ńĦE?|>h*#Zp8S6s5;Q3S zLU*uC*/g=(x6:S c UU!Y;}Oް3ʔ tx!F/{/&cz-ےl4YA!8N х)AoG{x@)>Fc#{e3Z{QIA@G\&}]e`' _j(^^j3eyGTJ&Gpvm/zwoG:KhӃkʋWR݆GZ{SDV|AHjz a%e:=sS]9—;L .\Pݦ' GHzaSx>M$r 1(WjU ۸r§6%o!f_] GJ碱#߀;wʣ;dL&r1:Y3ǡezuן?ƙhţ [>xD*O_)fnxqZI9B@V AC5C 1`ɚUfLa=A:} EBS zZtr /=e"T/뤜דCM}Y: f蠰L`^#MXv'@8^9_A52Ǣ\!m\|ۖ M0+O \DiNͺfewǼD7ZZVr3!.CU\/ @\mhlA#PEQw:gbhA27_&~Ul#D~u05qPRqJp'ql֫8p3|'T-o'_bL]g6<%j=׏MwBId}-#c 2A!O`U"l_CB x'MƳm< @Mʨzy Ե/:H;9j8Z(Jo21̣dڎ_r}a ڼz~L8+:pۗAGwt"ΰn"raQ{.{',Þsr*GtRKue3DjF[j X[q_hTcyotѶIf-;aQdv6Juz;mv3BQUʺqXϲz1̠tX3>Fxπ LĒ'V@pI!H1ʶWe/ ˓l0\x4`Q0@9\[W-&@J\;̓7=|yZEpdJAU2<v޶oDNkFv0&a!lBJ\NA犖妁|k,z&D6@Dt乼ֻF}Ip oYނK5Ssz/Ls!ť(T+"F|!]IuYɡBB`AS |0*. ܓ< 0xǢ!/nΨ.n+{A_5 xE|/xN׽?Y.)ҳ J#F'GFR1IV4n,1=ŝSzObx5F; "ؙ8vʾ{F^3a2e^ {,'@I38'>{dF>QM-a; ri[jb8cNAѮbh܉3z8mw]LuV ݋S^ս/^NT!8 f˰drs5XmNExϲQf£& .b4e@P0mem?`.&Ź`XI뚨@ Zx^ h\W,1[ʇ^JS Ƣ {J,y"9 Mȗ!V]~ 5"dXD{xM >xOcbΓ%F ~OBS9S.6)L<z-qIxy `TƝX!B Q:Ծ|M6TnIkn)Ext=2۰}F\}'O7yZ!ͣ]$:3sz% 1-7UU5Rޮ㪠yfWG/lsdTPI!ُ lCnn.;rVI=#r7ycrs6 J6D'[ģ{%Z {h \-؅-w`ƭӇy>>;hxZ`VPe lX+ϴeKa;A@?7 Ol^;bx XmZӅʊUޫF)N,Y,^]\@w@<)\F-Q*1.`;1kƂQדB,cO1UERW9dMu f'2RAF\OΎu ;8 %HV" d']f7uL\$0$ڃ4 &b,a,ڛ&zQ$I&^8)`)8Zeo1B=a|޼vHK%]uBm좎h2 E )]ym *4U L M J5Cfb[`ͳQߋBE4?Uz0o[ WO/cWQ -%׫hMӡdJ!¼Nl}0͕BTmzrOxLu Sb3y to +˲JjpdbMHma)҆ (5N:+K49r9 t|pY{E8sw(Z[䞹ok K315{y ^?=(qc6p`(O4M?mЄ6iaA·Yyh*ce\(=.y #B)ihɕnץXg%luDMaeGMond-MYAGB]ąUẌ#X_.ct hgP/gݐrY--D=& Xd`@pHCd#ߦDn߳^8^{[c J"!ܦ5ӎa/Vl7#;Q#Tgx`^̾,nC.k3ChSS{noxQ7*=V˷A8=C/ev׋~Q$4D},Z{YJ&:,Uc5+}[%ͺ`:F!Z'ީ: yG?4'<&mq"g̠S{:nKq <(Tqn6NN 'lςR즓ȁUXWW|M$,PM=OZ%jIbWqN=ٵ:LHbn;=XDl]dPJϞٞsPR Jń|yuW'({}^`qhQ'$WJ <=ߖV=g/7 8Rk:ZPm[Fi|Ed%rhq+PvUJW=e&k*Y6%bH}BjC[&g!2Oegg{=;d^6| _p,YXX~%+KmsX OrTrNr8X{y7.iϵ8:l5)U2M'h^&:-iy*x&Xҋ߻:CZF뮀pr! cœ%1B}q'T;>ԃ@32:5P -ệՈ%PwbʎT!dǔ\@HqrAR߽z3܅%wؑlʩp݆A| iL&3ѸmQ61EAvoayR) nEC@z=IgktOF=ɻM}|+a[?ֳFarB̈́Q գujˤGo߬ޮE'ֱSɎ#tIc<.dM(j9swg!hsNA#7b$w4>[ra| /6#kڸ/H]am]պ2+#ж4xqo^J!\x@u*e)l pe9>\segkp&m]zdOҍ_49)/LtZn&v([$qלW:mܘ;?qxWTkK'\ҴNx6f*),|`xupWߊ? D(wB}ϵEp(DJ`Cw$5{%7N&L]B,g.Naz;rF0UaX Lt]DdVw%ggӪMp&blz.ƍA룣6H jl" lUbcUݩ--0nP<|tu)F*Pa~T>^p&iߕs13m.t}wtU>J8RݤB,(WMn`F0qء&3 k V-QyJ,<5rA<{hO.ګk2V1 nͲݗJw3h|ň+2B)w;еlӅ6{͙n Ҝ8i=~e!b*8U1 tO)>m!ka3Y4,IeSnn#).g)"$"Khs"ykKz1J.UI枢HCG&ߍbt03Yx rD{@uOQLZiF?- Ay`".SV)qQ2U@E:8 PǨAJܚ@i5y#" a֘{Ru*ϠtV o=:TZ(V&]$5}xfr-#wpYnd<*XT'4Hh`!Wq4lt~n -Cޔ;MviD#aq*?-LyHṼ.l{{D;{<2ElQC~|~/bfJaW==~RWl'Il6Ժ=չ;uw7Hg&4zyIOò&]01;!ڀD喛+ahnX'=,Z C(iZոK2T*FgN|&H2.z8LQ"Ьxo$FɑӣD8ry.๣yͳ dL7˺Se#*/|C~omb@!Z AF\׽3UT2jI!Bu4h_ KsZ  W}F!'l%F<@Gj5TkjUש{eCƧd-ڑ4.bxyv%O 3&EӚF1Wmp3%?J*7(hO $p"rjs94{ %AR2®]aN,k&]|(hD=>f/\5 nu!0]!utSadF J=rXo ,*Σ\hJ+l^>~Gk= ;]]5}_wǽ(=M}ׄޡ;{IB^ڽeB6ާvs [Y`P|n8.[ƾx(1~t[O:@;gー2qAKQ.gn)>Q'j#lf1ӓ٘'^P@MkBI.MTQZtp>P >ȀFs:U>" \nS XPZbzfyzte45]Ȥ6ҎS؆.09|iݝqyPBl:m0zƐ "iCJx>eT/4 bX^'ejQz+b.諤 !ս r#d-};'ko;r3>ϧP IEa?J'!n@U ¿ZB>->|)E3|Uu/p$DH/'%XADˎNVҥz&7y^몈<2 eɄTAvަD] y4+xISORa,wv_XygO 7A|Ż@Y: -}oVR)C ;R3{dg,q(W 'ld#CaWZ<}h2Q W7XaBH:seبmdl;I*\ĔoM0<\*w23x k k{to(c z l)sJ'/irVpWocz L.qeI-O^IgvyKO4Ȕxi9|y]_ŚpA]n;ع3K{\ży(X(e҉u4ݻ2^ 2#L͙0(G5oY'RP0E%` D0k"ٸwuUC69l sܤVqa84>tХ&46B MW ܟ&e頼00vۮf2:!Pg\q7/{->o MfeaUS6w|j㹨*>v Q )1K~m kl4H8 jeϷYp\ G7شcd q;3!9k` bt\rR?Q Q*'d ⯦E汿KΌ&w6Vʮ*AxLqkS޳v1mB*q:=!/yJ!fmG6HREʧڔNcF=GbW*/ә0iW B"T1*eu9т=C֋b3[tM1:םN x$v JgᮈiZ̓Y/G-ɯr.#&$N jҼih,X0)yYG"*e$X"pƹyav\͋ٺTs.[n{2Rϼ>էoVnIH-*4R~/8浵#nРPYn8#ZT6qSdU\(quŢў_>/m j%B'PO=9x\eyC|<57{1Aú.<N5uRk|X#5l ##C 繨5ɑu^H7FMdYͭ "tJ!!Kèf#/3.Z[N-Tm <#z+w;^^{&Rp#|^2$oxƘI͚4Tp1*\܈ijlC$W'ʁ^SxV7?wFM#zK w=:Tke;H.DMu'vL/2h,^_l!:Ys@kLjmw=΢IxdfF;Ntѵ*fF:H|ά5d1A2+@[8ܚ:{[h &L±zkR= _;U̅IRs>ϕm(J f &6oRY,)%-ѫy"OY=uyĠjvoh /Q+NZ2.8+?UH~f(VA b(9g+@Xvg47smcg57pkEzzޡ$~"OXo7x\y6I@C+Q!ڦG~N>"^h8hNrEl.$d]Yd1Ղ3\ծ}Z輦 .OҒyy ["o Յ<0K9K'w1j$et.~tDˣG>FEA9 ܴKy9_}6Ͻ/4YUG<)`(ػL2 E-\\7f@5 Й0YesE^ԡg̋Ap۬d*jZ&bƣy- &:ti9+9>%*tIЦc K9Zƒݱ^=7i4$o:GPiQ]TiHvirA 0GR-\04FIaq9K_yb@˗N]_>7$:>` :]h&}]^6R%iߔ/y5$\Fp"UYrpXܼy^MA҅iuvF69g^a ق3q/YK_KB1`6Ĉ{0V3 /Ø90{`Ax6oYT|WO"(O'z9!p}/oN_b+k(&[M!&bLw c;;AbsS&1 -ޖ#*=–^̶zR:5JN H9ϫ7SDpDIYtdtZ 1g@F ڈtܥjAAc#yljP덷B^Er9_A8_cKL8Z(]aRȻFSʟHڵ;J5Us)I ϡ|U$%'9:1Ax2B/,€-{)L{9/u)5ɗ3b6—}͂ř!I܀`uNaP`i0P^;Ȣ}{4YITn2blxFWl0_zRTXU4Ap#:P:@ M|:sno[_ |\C=1]rЗ=iF ⎘ !>zb|;dGa2rx#cn P"JCFMIjA c*y*TwnK=G2 QWVi虻85>7< ,_) VQ`+}Ϝ,[K]d5 ?W|&0Ǵ(Uqg6& kzA27=q4o xrݖ֛'vp;(a˖,}zlqgօ` eŘ85E{=Cռ^du䰨TPe |Ixl9RˏY|N<9^VZl.1$՛w)/xe =^UֶrSxPT tM.#sTn(s@&e/콢bgZXtK~^ C2@mMʥ Ŗ6!rЭF䄒B9̞qT#J8Q|v(Ӵq|d3u;zx1/9Xb>* @ET=bMi+Bp a<#Uԣ7Ԧikb̴Rzcjk%.;e)0MXKU"UTaFXbbln]X$dQFbiƎt3m38go&}Jg_uw\5 P[D|wzY/%m~M8rܞ.ALEj#N_kg^?uՍٶ3{/ 1v c ©_Q42r;Vb亮J&݃smUO`uՃ}d+jxN/HW?+K\+ohS/!}@CO`%$hg֞G%;4ݐh,2X+4kе݋W@`gg'`2cqp<à#jx+zquU"=%NFU,w-f2NOƋe1NX}b ՒRڪx0iCփ4r|1'q>ޔ\txK%w;>\لk XG\R;=TeHo ݺܫhˑݪTbsw^/ ]琗+Mrz,&T_f` Fk/5ArChx1<IV)e䍆:o89*n2qʰ񼽠 tBqΤ80lo1zha`ծ KxYyTb2(K*0+Wxd=q{i({ ,)yCkO^ϩjռjhCӚ1Ͱ<(t7by|W|ٯ5B*S|X9ذm39QkK NhM4'+)W@cY.}yO Q!:X:Cɋycc+=Hc>ɧvdYzCSA"J5뎱#|>)Z RbষZtav&5B-ʺʩzlhvH+ᐈwVl(uE?#C\6dv/2BƥŽG7(;Ј ,ֿ4F*,XfBA[ͱ Y%b߃Duhy SX Àת[6SY r>RoV=-^>6#kEC1gO| ed6_S`W%7\PH%0He: 3yhó~nJO|\Vj, Հt-#eWNҬ -602J}/j-K.AS{ ѭ f|ӝ\Zmu6gmug nDh~8fI|~hbdfvgO&%t^$!ԣ+TA׆49Ҟ"ۋ|4 4rje8S![ƾ &MqGb!5ذr5<#p9ޕg'aַn5JYQq`m fm8`;59DFs7cK$uO+,*E7Oqȩ\fj[2WzW 4T1Qy7A wy;Gf\w\!5b (A0 !+UGכQU6/n.q3= ]o|li1G'C"$-_yC#f h(,ZIΞX.ۢ=XY[KՈdahc IZVQ߀ &EnڣGM/p߆Ӯi!?@MigNOgM{LCوb[q {hb=o p9W[콫`ՐW *T:gJUM0qy@pUZ>RGv/J*o&F!0͊  ){Kr1Y"F>Av=Z~d”떆H*lu'.y߫ \r8+d~n2 2^%x>Egt%%C6`Wo_]H$X*<#ꢪ=ɮ$R ''ve/z9!?@)I8SO\.*y8ljC0A\6lxoKfh({Ӣ fRda*(/RB䞤DC= |Ho V_ -@P>p/0%^7wǠ+m?ؚ$\ђ[x䛁2^a]8!FbN ax ^u\U3Zz&'#T/'CgbCyF<~wL^JcWh} ^H^]Su%.0z39mug[Zi#ށtns j!̂VNC 4g8BRߥ5̫ }dUx)%` Xlxit,@PmqrV(>n^(\hI蓇CA8byWAV[4vT4ԏ7JBx,&[VV4: U4ȫێ(Rjs@TY=r-LyǏ=EZ2ZN CO$QEn|xΘiN-Oq' 5T[,Hō VJxr`b[Y*ƧD&" EP='Kϛ6rph"O^aлY%G>O^W(](5e/O⠣! e_BRƚJym?ĝI'Cnvp BpR =qvMoyCcwM-~ٌ Ů;k|7a}ƽe0m&j_h p,H'QX:%mU=+k~2 ytKjȥNCZ~71`\{U}ng6.v@qԖ>6ˮᨭ|Gz`WÞHXCK-:hRR 7Py5ol^\H)\!%u ^+A,]l" V- ?y#h:o߃OxIr+Eh羔i{A9HFdߚ!kKy CtR4(dG΀85J!n-AÍ.XopvSCAdF5d:w;TS؝N@42q246~['B|icjvVn[x Oyj7hv (m'E,Ժ0 w_m;BG1okM$lm:@lpgNCt3ܤ8!`St^LP/@9=\-X%*.z&xɣSV!ʕ4'e47Eƥ}![φqYm>rjK@qi5V}ήRKGg|EtvN +S%NH^쬇A-{HXaJSl#zx]<_ΥWنzyu%B肢SIVףqJ,t5K1~.T J;BN8"Ujp=Ӻ֩=*MH0R8 k  ۔g&PUS &TJ-<+ 1ʟ)S68<GQVש=@?#ȥRdj&W|v#<K1d] mU6*duEY7#ܵ/q;l$ !Ľ{h l X^\Ky䢛 XF Y|ޚPA>.=z.6P`?NU)۵f^+ 9L&m>^EÁFkŹo1 qJR:i `0@ C>ܴtW32^!=}khGYK #m gqa ͘ ڬ'O1N? Eixm!Me4sbAs!xjm8^uV!thE:B1=kLȁ}]u}zyXFzw B5~$O5XQv4vybȯo.(xIW056FT}I[bni| Yz: k1N*xv{㲇f{>(5EP:D3PsAn Z\̲EB{!CfzMa})Ɠn +EZd88iM3+i={rF4)pPHP}!(t;޶9}Aחuw%q(D 15M ?rCSyn(qr(X+$\y-\L-bhß܆iR2$b,3w"WjlKH ԣx\b-!?DAb}lw]=5ϖ"O[y/PqG;{!e\L Y(2>}L<j`n ayk yWgl%:=>򇇖QmuxD$=ruEMHdt-L+=A+'j%f+9"36lܰyk>M]%/Fxx+ ƫxs): qZMB9*/M=&qbYVE캠^|jMJx|zM_ہ_#efZlDhKNNUE}pTZaAS'7oU6ċ,N4?U1qӻcDr92 (enx&p63BM8(3@hՅ;|BngIIalzGq,Fa Q =ghUE)zОD$Z")KjN;^ eg޻iҹ߻g=JZb,  #2LAj%ӥD/L0lB!s/eQEGp,ߩ&.eFus =d/q7kA(s[{|[?¶GU+'6;mR2j$(^jh59B~*M5T'YM&)v(WVCv xy$ʶZ0<^Z{%qTx]8cqќ7F/3Wwasgh 9\"\T*ZK^Kqƞ'ȐE;+^4;b wׁq`4h1t9'Z!D.Pqp+b$ 6HvuqP5wof15+eaI>G M0A-;nRyz3V)<QCX_hUbyx5& j1+*-vtg}P3n 1ku9kW6Z_gH(3;l%9ZkYdf?6smʢ%sRondk2 M`57qڴz+mҊ2l `b:=/t]2j򈘕SGwLc<$;,\ّW G=&+kJ`7I! *lf.pK&rQ>IޑU d+{c- d'kӇIN]̄ r_k@p~IJR.G._y  ,Kq({Hna: ډ6d!ƁzcGdVkPJAE41o-Тa0 ֨ {{)y6 LKX3'|5\0A$rB^s!-jÏ{ݑ>=ED"Ó>%s ̴J<?dWᯫM;"4g1Nrs zW(1FO>?anrqۖ;Ŏ!T0C?lxy"h0@ǚ)YE*}]ݢґCfaB_j9Hk5|b˼ʝZRNڇt^?1}z2F(ƥ!O=FPk3z GÑ~bG 1cɶ!kq JJj* DQӑ9ŹdV.?8[P,Bx7@Z8Cn*uXbs+;Dnьi`nY:9yך 19`{{L 1gE+ #I*Cyin l^heU6K̀9`z)&&~$`^+WX[v >qMX\YɓhxoXZqxh*3 1e"@tPŨ!MEIO`ޓ 狪~qLP"T3Ow1a``M nMbC>X[G3ײEx:lj]*hs=NR9{.[Hhukh/!z,f|!K'R~!;jJ%vu9D?K~ :/^CeHaj"^ou%,`UyO'aٽT1!,圗τvb|4^jl& =Y]m&bsdMbr; $Ҵ{Pk 1=LRRi%VDZo; iǂ6omNY͔t7CniYtt6 xݫWc⥿|CxD[<EFgڒCw 0B+vR Y#6׶}8a.T47Ɲ >hM₁2ߤ6#&q%{DJo^*+2~J͢72I>=;7͍ڧ.E~@F'U`.nHɒ>yn&B//v:me,s= #Xfy^u}y=l,yuLJZQT>ĿCNɕ6ԕp ]#w<e,鎅$mS]~dBcR#OPD!^<+U0{m3^zfG3٢=ỳ6[,/|e&;T{5scyS#9LRJS)jM r.@qA- FSDnsҦ|n62U8y"fЏ<|wt؛{Eμ˽eZJI;#.B_PI+l1'>*u[Wӊ-J{j}-.rdW䏰hp-1@GB48#2x ;/! h;{ؒ_3McaI |ϸ#ϑQ$#׺g[6巶fM(@&,9򘆉v)OIKMU@VS^w4y׊zaAf9:To/5KZ1c4;k&쥘< LcެU#f>虾܊l9u 7%Eѷz0(HrtVG?ד:tNԬAMDmtNtr'8ha[< nQTjĈ<^-sGvBl=6wlBKO b}d[ 2vwm4Bu}@ ׻>Zָ4&yA[wUuu<<\jrVB8K `?G9{(_3t?>WqHD3,-IK:9Iήԣ1Ŭ(qLRpα^>Q9^kSm%*hP]wQXk{[Nb!=X|sM)yJخA.\`gH]UPe푔@Λ;!R2-bidҟu ]_ k&iQYU:b;'yʦ$LZ*$lk ~&WF맼Dgȯpmxw4_)p۵mYKyhZa13mΆ`s8Hǡת-"3֔Գ|DɺvKPuh(0 :p@p}~Fr+}"- 9k>HpZn]V\i1!U%(X1H[)>Íƍz (w0WU8>{c wU}%7UP8K5/2 |h-D|dJ'NP׫ϸ`Ψ_ciW>p}|afIr8v7^,zأכ}ʯ06{T(^>qi~eg52&W_ZqD0׀4W ;w'}x/P!m{<^smV]z/_ kP)?8 >  ≉HM .{I타H{rL6qNāF,1yѽI\sCX#^mJdC3y+jf ꞋQeaxp"CT~{a1rE~i3g"pd?I/H&^&tb:y3-IGNYH =WHۻJʙO)^LS ]Cq2[/&I vG]=8#7"D5ˌm!e1e=ỉkZ.ܻ 8=3`wWnEz j4B"F'l%{=,Lj/d1}74Dlϛ)z^.9ؚ=j3\ܒ9Z >KxIwWA}D4KJVBηU`ϵ! Cz5񐦺qIkl t[Iv}f-OAf{7H)[z2Հw$@_ E~q9Yܠ;J:bhHj ZTȕiཱིي헖q85Ă֎KCPAZxPdC+=ĕ#%9#V< ґӖWXq$v*ý$ [qOCE@O=,89i4z?e7W6x_i{0,j˹8ڻ}ݶ)j-,PDN#2"^XG+q㹑|\|;7K9|u|Ȃ/l<ѽډR-zL湖Ssk|=szOP Q/TMH :6j|rs.} 9hyCcUgbU&T%{)iB℞bm$qCdt H9@bMh?}1}$5/8v^fi+h\Uqk)tR⌖gqJw:=3-[pA}@wu3iR=M*XΠʭۋo8_$O25֊*t|^2~EGhS˩LYwĔnLyf 0F$ -ؕ6^Ys-2n^ 1 궝b}`D}Y9Wf{&zWd&ZaѥQq%DR B+W۬4J֠bT“ׯMF 9E6WY{X]†ON:3!,.8p*px\8~}^+آMWap"Lg'/T1y;k.Wvmv{@"%; _cLԩپ|j<-[9 Rj1-YnޔG/mSdM,{ڼ{:~PO`;:S#BPS1#W3QlGO Şɡ␥u{挊ϗYM݆k W T5P>(y,m3 y>hZu+yqCF2.M{:HE̎(NS{܊)2L< 73C\ċ5X `H+$12qZ=c:6I@07w¹* ^ѹ4f#yLuHp"8YM<dkV *>,S$@* Gf ۖ#}@V4e.䍧諈~uXX@.a߼]<*UЂkSjW*hp+l˘5bIXT wQn{9sLngI#`LOn$\;W`8Ix7Pyr9ހ<3@$IR#g>O:SER J9gnL !#צi&䢚{Ŝ)'I1:4@֛90,P4C:Iv|VZ3R󌉁11IYf`;b(UOUs'5yE]ڞzZSU̕u3) dfB@e,حlča 4juBs?PlCez |nD)2 wp،lOEG$hڑ:vy8/#ae$7_+YUG[?GhfqA͇Ǭ/01^{#\~|r"X$gM} gz26C3)Vb!2mϻ (,8ЊhX/6$&eƎ VĢݡVp;$Md3Dhk#U Y$~dݚi+|+/i539 WchAЂTf9phnH&X̨ܒš(-b{m.l؎LҶhYrs_Gl={sRe═2!iCk5KR0cPQxVN仉7F8fo$0LZ:/N=v{"I.㑾 \M;Nhze{f&v(/\<DS~R7 op]S{ upw‰^USW9.6rFLv7,gś0:đrjޘЙC! !`, ~*ڍ/]WBdqtG;nI,xK_̱6p(xܻ`cORmb'F2ku2SԅBN;Ue}lEIS/H۳zd>Jx2oQҗ+ 50ƚQzE#v8%T 9y1;F`V˵J*CŨǖ<`C&f)% м[1ΐHkw%Zi2Qΰ.:^L| 2%:8)B&ዶ }!l^Vw,lj+ XsVO6Ѫ!^vv>< BYiW\2g}/XcVy0B=EE*IIYEX&2{CU̅…![^5(jO֝ =C0 n2Yz٬@(Vvw@Tc]l=:GQ q' 1nBWꐊvo$-UEɲ"? GLTJ-_ղ2I QZDHcܮb$? D)!e6uKAV՘8ִ5@|o.sa|2 `_{'z!VNI g-C4XbCeUy "È`}zLy`Sl:-[utXi|V+4/ꢆMɢ`Æ)0eTV[zw_t?3FT&IBOۈN_|2^?>@H3&mgoy2A$@Kv7hkSG(2^"@sHXL\2=…N:  ?Ƞ&qeQ-W"&:PWnDa [)mxy5 pO3]C%jgS ;%Tˣjʭ~5>B A>ɬ=2Y_&GNSUyMﻓ" }گeeplO^yl\0O92VۆX Y^#L6{a^VΨ{o}v#1o60)_A+cG҈!yu=|k$XKMX"C= Ψ<~N:Ϧ93݋G jyoS T~|d@B,P+"ʾy%.awf pme+$kcE6}';32N~6v/TuO~ɷ&hsZ9޵ZJdl(fjL' E<]S =~q"`S|p{WpH[pS_\ -?hdXK"SuC`iZ#H1VJW3\ (2)=!?`i[A6zܝI01{"ow}JA(Xjss &M6{)/L7j{6I\T׃̌oC!ʀ$vS,ӔLAyBG,%0{c]|DQ8Er u ;T< -t4zkS8 xAx ehy[HF3GLv97E{-5D{\ڪ3ᥦ#GabffxR A.?'-kwhT6ں[Em"/''oRiNckDy#VX# v$! +t]};H@,jZYkX ϑq'zݐi_\Z!3Nl2'n }\Y}&X72 1^eGdNX 9KTRޫg`k%J"KgWz--x8p8xkoвt(IŃܜ5Autf:-*{K;Ok|,foJY;1D43ŽR똵: &sK=mMuz:83=%ԳHCk 3n̨.SWyW@jzBǐ.Oվ=ٲ&2y6"Zt$bMT;ͥ[ 47HK2,0`Jʳ"51oī(ʪy.\`jI({ه$WTB\KbkIj‘|<0DDmd oӯNK[*WϻSZ(&Dt~T*M t?`1f1D3)tsAk ~?ϚzfU@$enAu5qzޣ<px2iRg}/ [S2&PWK- # _ ԃ"0 |TBxͬgXQ=G ('K#X:pIi Qx-1&\6Ņ9-tJ%:)̌%JJOWH=X_Y ykFh.h$NGcZܬk o+yY Fn ުXؖrFܘ}/aޖjEqh.1OiT\r]W븈&WxF%xjxXoa}KM,;KfyJlѳ Uw9V3 {e9c0l;|W-N-an1_HWM^D>O7!OJa(;&+yB(Od+ڱ6E+=yrf4{vDlp)o@'8Ot+[NGbZlPKEpWd|ـv Ro8׍H|eXoAt;ܸ <_daKu@O8#ތkcfgbWz(43\-ﲾvxb~yB4\y /,S[sz"j0>EOt { D`J51$_ amtp#}+.&QwEvL$GL , ԳbG7,"8>GPlDOxyز(,kY U˥n9@Zd5J4Sɸ ̺z𙽗fa8l3 PqY| T3/Ћ< ZY,&7^~^Q c[+q\ZQxOM9/m֌6 3X.̵ްuL޻u( -`1=c2 uHU yTO"8Xo.pF{TU"5i5=A7𝘯 X\pe퍳֑+YbG qk=4S-y|3AΖbS݀\Ix*~$:B(Z[H~RӅ4ܴO.᭱Σk XRLGkZy$oFgvJϜy5f?xV+vn{Wfё= u!0*2k, ]D[ zʣ+ f?`%{Y^}ŋ# [ߡy}:=ZYC[-63D ̝@LS4{.)pD1܆slҔB@c#m0r`o4 1C4ԪæV4 3)ԸDDt'Wp+ׇ$)MOwDnϔm/u)Qͨ\ѫ3c;z̵@*tFN&7gRFQ/x/6q!oP-K8t9:13]3r ^4V`wy$ $Γ@Ygok%oDg t{lBs8&95ݠ(N_xe3w 9 ad5mI(<jr{I-QH%6y9풬"'RrqDUÒ|5ntg(DP 977G ʭ=|6ɌΕK2xj)Ů{Vo4b#)!}0b J81 Y1I7CYy3zo1 LwSٻYz.MgMR[kB+ ;f}W M;:O &f-Jb\-j 6zh`rE^AIkɺfXx!iO=GfzD({Ce'0VFPo<ى &%Wz*}Bnz],;* On{1MydJNyOն/B8;UNsָHW-g Dh^ȍ3P*xa'X9_Ҹ@l SI*uǃ#=t eKUrE/nYe,a+gO1xjrODm ))WÇqB[%z ~(]t;KA>4^-Ӓܰ౨7s3(8|hD|\#1bQLA4D{h40+a.{_=B3zb⶯a4ʸZI'#aDЪY,,oI-##$L8܇뺓ճ=iv|e|lwl((JGɔ-͏% %DajfӃb,}y=“nγ DP^:l.0!|f ˕i]5Oޝe^aM7ÍDntzdD0|u +̦%/iL 9zQ :eI.H|f0oQ8 u@֌lpނ,@fYɁeU\z6M'Sv^x3z1`R)kLl(SȠ Id^<}OėB{ݚpt|I"r/&8 ]չF6+=D=8ձ]c!%Z ,U*CpЫ. wl24i\*>;3X}%Ih*tx0[0yy3>,Z0M5O5Y_- v#,=-N &&ug#X.W:ݒ{g|ovKk^Έ<>ImzC(nCp m*b`v+fYgEVFá{8Ae DűG\.}%ZlR]\3·%]O7J7j asv/m][xyLnデ7u*Œ;CX heaV ҞY%NQE|tmH(rh^Bjy CM&I5VG!ZONdž__qϴ2洁 &M-fBvqaYJaGvF*QTk\_ $dJ$f86u{G(F2 o*/9q[Cd8 :f{PYkE*[}W !jpO=IUa!cOE2T%G cGG^h#=u6%@u[V؈x `]@:Xm)ᨙy@mX)$ʻƨҁCxxh<ͥfwxg">Yp0y|֪evIRCK]PPnn4wt&ow)^FPz xl4b0b)7Y<3oBs/^[^zV/}{OaWV >!$`J{=XѺg.q=fD;#lBcp$*[1(2m~6+ :y(3+ ̛+K|::}&ͻc﹆"8>x|Xo(B<:fF$hCF4&@{L/fe !e O.y3"6 BSV=J0*%mPI1~z>6 ==wV_+4SչQ#3l"2$EmC6PGpz>( Īh](F mŋz3譃Sz!G$ Rn3o ``e D[&!:@Gb]G c@ sNrV`0Aqzn:0ɛN~DZ#JT3ޗ9_戁ˍ-2f!C+z\G_ꜻ%K+g%$\{gYPǦ +Oh!q`R iRU#)lyb.I)~̯qs"9M t' 2['V}$ކbs^ԕ܃tlro&LYҹ2<-:W a) |ޓ[ ,w̟kd{e}3o %y(xiE4mU0Xh a>G(/f`{s^Q*Ou[CeͶW5+-h;y1ސkC{{PӅOBTtC IOQiY x > t_@FJ4%]ܘ:6J]Qr 1n <慨1 lU#اro!-ucgUprīOB.Y܄pAn< |&:b1ax|ia:#M/ Tǔ$=zČ6JM Dݪʾc-GGbZ+{Os tg $ }m =Jݥֿ`[)[`z$ZeKb5:Tmxc -_CT89mզ:1 n f=y-d5R9Mp3PFl{IJLPFmi{'4(Q-C(8*SR+Vsx(̀pnË|L$vhoVm*@u [Ir{'DcX[?.i(Mm+āA:tu#wʧQb '='mNuAVeȻ.(\9JMP!ss޽7K3H8X.T41$J[5]{4'*9ު7O =*~3) o5[9=GqyeZdj+ Y.!I_<0ؗ!&ܱM˄t? ߊWdx'Gޖ~^{"c0"fv ɶ{Bxy"nU6Fr]i#%p͇<)Oty "O}\ޔ{_+Rg uWqt* cwFn0嬽4[ij`M)6 `Cl$7d YOV\օDZ2x#oRA94r9zݦ )c(Vzkxpv{=<.qr=m}^ai;Z.!T~ 0qiTkbAx!5`'`ⵏ]K6'VjnY9?~ujclGSmG{KHةx 7CagɉG o: L:LMjt$X6xnS[j.:y".SQ`[pvɝyNZ/-([w:&2% c*`c=f̀EĖ4s*QK-H XWQw/<>ҧ"!fjp33=tǿjgW;ظRvvIaBbR;#TF3=^ _!(GF")u9 m*B8LՖ_*B:ΑBn (OV m/E_<X9Nhp"#޻,áE. %{&H]91[tKʡ(M,zIF4t y5yFy2ZlU1D.>}&J"y4*Lea]`f63UaՙB*SsJhv*Ve8R{Lkfg̲qXOtVlT,zϻonGs" [ :3W†wYMv02Zs%B\i^hUkc8 ]PJ{ (nw:qyd|`@,t+cv$IH dqϒu:X5d>*՘aq>}-C*z/EV.Wb*<`ƽ2[71QIZFd5G[G<6%}N>_\f'd @O6ǏlD_<J#v/cZeešCRMvuY >n7g Ҵ05ŰmAWtC(P n<\eYNS!+dϪ瓒8vKԁTa]e/<(\Y+?bn?y.;@Nζi%Cҫ #  _5V c^M΀] PxD/(4ߌ 5h<v3ZMA:y/O˗{׉)05oıBo]-w|qf&jCE`:_]<ŗw29aJ`ֹI [ي#:E3BN4ᙻfo(T"mE[^͗؞$^QH}>nǂڏ5qVY޽Nj9f=Z,~(v5$\+ KqW3K0 H0n|5ROl牅[{;,ed+ o!/k+D37땵E!7%Wφ7%n >~zedn2Mglw"ѧȘEd`z|T0~fT'.틑ڌ]O-žDS3=yfZ"D_Dff_X YWƆBҼF\K͡gn|P'Gz6^[yJ"b o&c"U e8qI0ü p%>n7~ *t'Om1ɂoݡBM- xEQ&:Q0*^CAq #:$d$j6V*'.-?O{R 4Ӏ@ǥ$Ap#)D+yҒO\xw}N#=,(rpJu;|yom8ź$`|SZn 3֥L)VydLneQ$;&/dfeA SKtu/n995AkQkD6_ ՛ǕC#\*꙲djX,+ AW%zDπP6h76 +ѪeFG`hhUNab>enL75[Zz uStcE0|sRnd6ڮ@t}_f/>mDL FЍCepo'nֹ|dsF0<J׋we?Luӎ絙j]vy\)SwaPgD$:8 _nU"Y؜-r$YN1.V(\҉Fձ1H6>u_'݋z'=ٽr0*hJkNP>nGx$)b&$D0v55ySp`wO2Ɋw7#ToO=PHe:f!V'%}@B: |ET9IINw:m *9{/vH&$:6wf쬅(y:m.h΋oK!+-]2@t~@~(t,y {h ARj*owuvaclWwJ-Jf`{1o\@Ԃ!N Yh@-r!<#>z] dM9ϣ\]Py3};Z1} mL}:{^<2MƵ ;ˣ=^mFq;w1=DƖ飳VmdMGs|o^?3My7g` $3"rg$PC9wʃ HsQGM3 :C9L?ɮ8Y(3@!PΆ޹v5F(d_{\+A:;wRanj^x#M)ׅsV37W|[ɴ]MHci%e4ھT10q@.DAң_zeXҲ@&B65{ڥhuȎW=0L?ԣ5v0 V\X ȍVH*n!/躭f!`zl7ѯid6.leJq|m2t*Ő7E"O x,pY.`6aYGZok31DuV3SqUɤI,B V(<z XϱL4%r"6Z+EmP7-!]?xD .i΍ KW q4|\wizl}"^@N–Ji^Z1WM5b~05#Cӳ-8̮c.*^pus3lN4PӰդy/ƥXhClAc61p-xpC:K" Cg@!ZdoS\YX"bFqԴmC<58b#4dΙZZ7? rRIg `-BPFi{"!et{GqKQ()u*3m0l>X/<*wdpE)7Dc8\&@;::!SRXzD_a2`aׯ|%-̙,$_G$<ל87t="B3.űmW2y{.H#2NSk*HTeoFf4 ވ(.` fʶYtJ.807!^DE ZO/'98;ԧi~O{3vЈUgs,ף |]c\Q_23ߪ.mވւ8!Ly ~ /Ki<QB{atLYB:2^+_y69)UƈE'nC-o4DPYdvv!Jc[3|t@mdyeV3JYuF#a;jM*R\!t`iT|W cCк3DǸEA-X;kܳTc}FܝJmWm4;k {)iڴ:7I*&jq0_x 8`Bތ)M*M'Mza@Bz_}Yt(Ml-`AE1mhJ|NiI9yѼB.~snG_#_K1؜wĥBAhHVD#$@oP.6 sWtKp3+/ݼ&c)KR}SOV_J>F yǭWg0eV0ZպDK( 5\ضhKc*4e\_b{6zvR0aF¥üb[eADVi$-MͶ ayZG6|Q{Fo@aTt˻ Q;5v…G)1| Yn4಼4^\|nZL20Ɣ: iXn`豔w.'D OTxMe͋dp7&&u*~֏=v2=Eh51R9aՙYǷ=~< Mw c^棳%:L{o^/ƔsE}׫~˧8n)| z×FEӷqTzm lʶ"RzvI3_䕺ˣgd^[KC*XxCG.G1b^>JoQ6LQk-A(%~ǧ߼M6W$Uڗ$tutk Ŷ,S #wD_+9j7"PYk|UO+¸D>s84+ h jd=_7iXPD1ۺ+݀,ިCƩ-#y Iv2^utT ݱK!99(p4Z,?ZW`i (zU(X,֞|TrHQ.qSBּ=u7̜WTͥ52l[2RLb́,<{vd©z#LD!Ai8kֶ^ ʲ0ךUs-p'QԀh5U澰Nd!#C89gF٭uyva՝챥'J^.?١&Sw0mZ}6znj2kAݻxhomfi`eyz/s6B"n% HETXųK~N3Kj$Y 2\SCa8fy l{&qΔl{lAcΏM 5:3,#Ć~JJ.*RWWbC()Lu9#Dy1,=7j@+DBng8Ui83 Y=xw9Yˆs UW).Z’>旮hѼ+)؋z U=W/J)bfYSNq K:ƚo6?4}W9E ñÍ5Lg78֕T|NVZBk!AVH'@a ]C#,h4qպK*ZM"n(g^]s!<s.I047޼n"sO`0,>GIa/BDԡU.e׺ R&|GIy3^ icU:5z #Ypgfk|}x ɵxCVն)BEm-e_[7#5{$DKaʠB;}ͻ2`^9ǃ:Cμ)RzPN9Nn#1Y=!p$X <{Š=dߣ[t)2x.ݨ1 a{$Əb 6˖|d4)VU&2[t}ʥR$FZpLN]4h6k:X;0 WOi 0ρ Nh{SmD*t_&j:uyF})hȃM`{ӻJ]bC.q=rw8: [c(bk.+̚3 kd/.UX}*;ŁGUQ$ϕs}}ċr_iC(]U1d(ucZyXB>`x,Χޱ6d_>86@OwӼ-S3rk5B*ܔZR"j"5Kg{ oiu>|HA [ 3e"E C'i[>ƪ~<ߖJ[R.R W6gfGr3/* vu䑢~RxunZgJډ{#,=Ҕ:SA+7m6aˌL$iZ"QD:fWX2җJ[=<9";a4&LjH;}&ƽNI&|:]Z<<ńY/ٔm̃ OѤ3J[oX31.pMf%&2<ϩn\EJbUe}|Dؓ w1њ;wp:f}nVo*Z^ {mҋ"9,MbOF3  %޹]hk^-o8CI8^>/+ӬGm5Fǽ\4mÆp s7 #01,=$ X䱔PUqNI8Z#)U(2}kAn,k^t Vކj^pǖɚtbHQ̸OvIRI* Be^k:b6~NDLlSL :;wX2Đ.kpAls½9px5oMBVw^zkyc9年G{uqԡF%ehQ5 ?TtD0%̧a"fZamu;niӓ_.|dYH۔xrJ%|Ug{|tsG^_ f-yd60pSrW}+ z WgzM/KK{׎-YU#Ypy 1K 3M 8 hsDnH6\K!ZhlR8}hBB#eH I!֎HcnŭGbYztH vK>J!NMg~]3~cb>(I|#eռE-n.uVPvfݪJw-͉y$V{XiŽO-vCd>&0}]~@[۠t4ޣnWpnߨ3u',}ƣ췜~oVNM}3|cAq[]wPX& lֺ ؖMw-2Cf>}(wHL= hok2&Q. B)U wPdIa4-ڈ\h7)=Ծ[/epaB/.E8|` co48 Am1 6=QB+з2L>djQ?)+_os 8VWVMej/3L9J;:G@vUe%I5nӅ=^C$M''~@dϴerBP=BD2o5ywpMe}AO)G@Qh0rM ~PN"2yc4 P#ᣄCiBDO8e<0Āk uP,𾧳ltOoy^9n gmi&[tƇu7d}bs[ UWx* ڛkU*]ۨ8#ܻ.]5K=Sr5JxuY`tyD\&iIlɼeN+Tf{/9Oq̼yNq?7LTDf>bQć-9Xs w~={ݔ5u7UOBw3! m\Td=nծ%}kLp54PF{fԽ-sP$G=š^/~n6 lG![-хЅ 0ȠqnNSkty"1N3kۛDk~?cdcӺaS;=mlS0E 1/Cקf`nL:BFӼ268R4Qz3K@ҵR3h4Ԙ7#Ħ}`fʯҳ山ޱBPPprG |#p)U1mM%+=Pg^2+i{!ytRX-mAy$8HPrhps^`Q `q8}/Y#>kXHL{^`KnǾy+kr|5fd8Xy\V=,{ (42u2XpM Xi>YSr5XQ"ScREF)~SCKxKN`Noå7=lWPIh)"6/n]>+0|- { oSZn]R3B& |[t P:3oܴB,YgOn-^ӪTㄨab~oAtq5-]ox]Omdn\1.PGh[:B^?! kY{StU%@2W)0jp=8;b"xl2KݳElM,V đ1dA Q+GɜTgU%:>8DKrSH2E+5{e=X#=9hD]R3&dD4zYٛKV|S  )AL1THw\h/UV*>z.$ЧAb&c<|tHo|I=H.۸rY ׁdV? |'m_L|F a/ģ';A6@Us0 8dE`qpSփ:BH{[Uݷ{:8<}v(x8wRGFBb j,rLPgDUܒQ47lB}Jz{dݭ9 #,sRvBW]i> >(ObFu$ @@;k3՗cV=}ܙ3>DTRw֤]`!ƠkBE,k/ R= \\R$ &(4dy/ ̖O+psV#IٷT^$"[de$$*Vnߨ]pm>XbcLn1Qp& Lȉ.߫a :"W!9'1'!omSe1_߉|9V.أ7wf<ǜȹg`3D>G ~ ˇBh)D4N̠RY{Tw)hž+f"i";JƆeL."!ktŌK]Y2AgG{T; Qx<!RF|zʗ :DLK, ŢS/&'{olu]wDžu9X5hDNƒͺ\uJd ^d7>x-MJQJ)͠6tb npH7>)wDO'+.o)H,'!їA\j0c4Yz$z.ģb&bcԇH|{м9 o,{"%F }}=Yn-zGŠaGa[`#HyjtZ^d|$jys/{RF Ao';`DIN ,meytŤ' 3V~Kc(9KsRO4G4P_B,ɈK\ K^;#!ճz̢@e4qgcUp?zF2B3v:"(؆ |\.z"D43,?9>xQO0)KtVr{k,n %JmkQr%t>񃬧b[0oqP( N, =4] ` 3{6G%H`ԑXXZ%ZC2-@GX[\K}Vh /LBf$8dK飞]tϙ p؃s6ҧ\QEU9u5?ʓF'."JQr#565J #`s^Lhg4ԅ&ss'6%1c}o,n O9fcfʸv7 AH_)xˡdJ7ݕ-Fj؄ p')508 δPVXKhVϴ M?-D9!|:i z(eg=x.}1kUѨKGZZr&ZNJ34dTjBHAh@z9i8n (.GVE"xaz,HAv)2WS'4s|j=(@ud/n1嵋sHpVᥙ#V͘j)rF0v*s s16_̫}1G݂bSz@#ի (cǴ]cSNn feAXȬ3?+=.&b-j1XVQX5UPKR*9鹦J`N=WvG>$V ޗl_;]؛y(0&>$ ԛTl͕E#_}Гl`5U1U(CƝ >&0PgK+a0ny GR-N斾w{]^3 {0c4Kx OL#QH(6fVEޅ z[/ i<rd}kS<9VuIv͗z9mH,S.a̖j~j_ZEF-?W#怲#hu+3͊{~ol(J+D*خNWIÓ*sj`b]=4kwE{ Nݝ^>_ Hqs3IWʃo6%snxUIa~GҎRr gC<# ks\F~rSE@'c x' 3?WL)O'8P"ݍQ^˗.főwb5^[P\bK ԗUa|OΟby'֛r cU{jPZZ[Q8Ín,A+PE8"+ysS7\ ˫x50&{[D9![WՏamԇy &Q#0ʿj DSo}nZuu ޴:5{#,cB7qu|J ,0U9єpX5:!nU3 JZ",B,7z.*eDqcX۫lݳ._)L>Rѻqs|{/)+QJeXQ䊯hO*[<4`\iA1VɀB9j 2Ph@<2x(d(tewtu1)G<'&lzN&ZBH^ rUhG✰FeGkÈhTs y"k.5)rWA42n6xpC*a5zf嵼nZV ;zVS63#lgٞTI7' ۛwՕ 9XHl0RVL"=c\(1 _ՖP8:GbZ!/ȘjzWj=" 4A>0~,2"ҕ >;v/P5Eۈ§tJE%X$uj 5BeR'eM L2cvbRk\+@ @ rk6p(Y-j`udXwc'uGJҕtV8}tE]ݓ?TK/19sv v@$v]gu"Y`v*pGBM2D!ht%Pޣ2eU˕n6J광SWLEV4Y.)ͦ\QKى9/+5( jQd[g6FHP(Ҿ!;fh@{3Zމ{-?׈8du= Ezw4T̼4ڎ'bdiEF&N7&8(w_b-%&]@Mx}^ ; Kps;c L.HAR _}M&LL|}K_^/$R}Ú#L[~+MU@2lD}vڔO9CH>E}]ofEe k? Dh1{ &*{/KޛR7œ~6tA]4=DG1)q{vR `oKۢ2˰d6Ze@.*RjiTxjߕ[v.it*O8p s uG(ȼR+AGEe\)3ttg܅}*2Ut;[w ʽ`ۥw[-괪 Nκ3;.#9i!jL8zVg\r-B%>0(AQ xt 7 >ZL=%Jd#8Tɱ~29"k bVD'&iz=pOY$Ih}h \P1#c(glexqg3XK,>x;o={1xuWXDl<ڈO(@:oK8e!5DxdEAq=0 /gTaR`^x_3c]2z:"/EyLn6Zkk jBv-[F`q"$o\J?ח$jpb{}\_r1jIOm<˺F6t}1 I8lrI[>+oWJKqK=E&v20eƫC,"&4C {׭IMzYD>YťsHD)f[j1H5V_m[XWf'<:XEti a#-6ptyM6A4semj xе9~uvm\ )Wn.tY)Tf&Hf \l¥`dRd^1t\:{w-B Sh`1N9̹; m =B31=faڃk8Bϔ _K9ע]ryh!I'LI[+ z]תϔ\[Y6:Iȟ<}Nxַ9\k$50\i9i| ڻqxRz2F>|;`oj رpFjg7<,rdJxZкᯟM =wgړRMkz^v,C',8ZJgIbUN95nخͅ"@o[ z&kKF8͇Wh(xÐ!Rؐ=z6<\>rw/wP$ƭ}\\ sdz k(dq0n V_"v|!V'̆v_!u=𩅗ї^j TiczN/wkҔ>]􇊠:MKh9!³9cG؝/9+k yMz.+nʾ䍉2ӳ@& \s, JlW@d)Cݨt}kaXeDcSKXhoU-/n^-AC~B0bz TϣFn0:5QPVn{SM=pcA57 !a Mw  [}_R)tχg4bp,L(2SS$ua% '{B-O2@} #tQ?zIyȮt[ 4t.}dQ>(o]x0!VoU ;BjY?mAJ |c ݮVm;*a@X}".oy֓קloTHO!GG4clPZ63QOA{k'1z缗,\ .2,>"=C@đ ql4;,{gogq񾔉jUp]22Gjh¤G؜ 1XUA6I#,sc!&l(ӭl-[5P3XE.';LܰJ%ý;EANYb hi6]IQyWnF+ 鷝OhLWBM` %2orC zR bX K--b"=f75? ѭ1mIFڝxOGX?eZg+|[3 :fʶzL'bTvEB$myU10:?'rojWߎf#dLOTdGļDy5Z L z2g9a͙㻍mPNyRyVkwaY !H66y}=иE=}5MKGSC8h_ 'gmaN^T<7|2϶Ƽ/CeJAi骝-D,=eMKv2jyˑz z\ k'HV'۝,HT.ޅ8,2qf#, |@A eO QV:{ 4ֺ֋tDc;Xvgq,1w-@2(SDGE^͞FRyC4̓..kZh$^^}E O?=m —\bНD潩(ΐ>zQ2/g`Ϲ1Z^ajȃ)ȗbgMl>CZ9,p;JF1=ʹ6-}"揃b^]<,ч,&NX/-P HjYmM-D <[5e\_BV:j6ת\U{lSל4?׈&EZ`Y#Q>= ˚K72c/Nck4EQEvwJ0z]b-;Fr:0K@s,P$f6$Iּwf®vN!l}O*rU<j(0!Ƅ-V;c:E}ڨg'"]ned. %zCйWlhOԐThl"TE-f>Vd&`}[cM:m7 !\R}U2=d4.ЫhM%ӂyYhe̔P?Jky1/6r VMuSZ< 5{m+syR27-*՞jIcp#YdNum,8#pt N+V/oɇ~ЪB &8_!> í+G]~Ѐ"82gR$f)d7B&ًڊ/"4_=HN4,\<\RXzoE^ץY$uih|QOY_i.2:%N 2`l;ʋʠEҗWir7`o"2 %uup2W{]IL\Or %] vsF&y&%=t&St%b߀խ͹{ti62'-j1li5K2/֋/7@fÎ#vcqZ2e +ngy \R$^ޑcLx>OsUIW Oއ\yHB+2څԪ7$;.wFofl̉a>.R"xɂUd4m6pܰQ4cYWE vxF|l"j =Ё'& #G&TTF$FBFƧeXN t80/C8&Rt RN]iT]* GSX7 HyiE<)hb~;J"3w'{P2JQi 4зH EUB0JH8Qt^x-F-kW܀GoE'OqrNFFvYQ8o<[q{9i'1YF@/Hڻ /*`]ыE4)jq#\H ryBlRꎒ/>-e nkDlhU>8M)K ۏߝyÖ">K>߬n|a%(OA^?ճ}{l:Lsְ'(!LT4*|I&`&m}iU5>”w뷓݁hqw$q½,TȈ5␊+"1xjͱ jt4e(q ;鈦=&$CYN[=յB&ل珟yôQV{"AҥoX敯(o> Rveľd4 AX17aAR.! 1hdyI?VTUŨyY$»w6*K7^na㌇-ϠS9kM$^&d?mW3exd&'   DbMg;B}qѤI/&|0`FlpA0Y[ #:;jχ*|MBoJn-8ɜ&C)l1pURu8ɠxON`އ[ϖ){fBΊ^)O33 {~{vҙ]p3RUL`׌H!xK݄h8j1I3CĖW`Z-&#KV)U~EA;Ni({w8m֯_vHu8ݛM&5=.GwIvNwp'Uܻ y2|!1y oT&C&q-:2ɑgѢ-^+ GDKEY35by25w@Q_C^ zdB^;N$Bu~ 12sb8h"ks2LSB׾Nz/qd+(_E=0ִV\gyLr)S=s;\V $%֩&l%X-q> .M/7LUetKrlľrbu{@.JcqʏMStJ8{%\lD_m k ),SO(њB{@Wu\q!l={x x۴_)}ohw.vxk9uVd;0$ϕY9]h6xjX)uij\S'Seڔ͊xSgZr=4o.WjP JU=Y@j$$Ыp K(<|܍KBП#;d2֠u)C6"xw*ɫwQ c8RN"ٗTM-^$.S7=Q}ZGZiE:Vpo=*'0[:AJ6v ϯ7D\Fq/KZ1&$ x Ygֻ1[j#1#'ͦ #BF| vv]:,u7P%(y|{$qHGf5raY d&Y\3uTb@\ԫu+,+B#@{:'$[i!:}1UmKB{;l Lv+D2Aȫ, b|$i\ BCb?2xeO0`Xkd8N zrcseBF7\JOU&۰KV%ZK>}dd RGj\UcB$Mʻ}L`2X6Q vG ԯgJThBxrݻ>^t2Y4GhM}7z %nJ;L 3œ'g6 1A$c>.rkW^j  &u:r-Mb钎2~W:@SFBpH OtwkӔƀH*Qx,i%۳%*᫈ݬgj&J"+QiΉDς $CVtxDž[[Uiܣ0s䟪j5g;Tv wٻjϧGt _`5$X5WcS1xa>^G ~= NKgj6,$_׮P(x^=r-Q7{ՊvlCʒ鳂ɋt0qobFRf)ALք'W#II;@} &Zɹ]`- 8π)k͂O]4\GULkqv;F@ӌzܬ<&~"P/gI@W7hxZDE8fl3 ;יW¸z K*_ö#[e=d0Q,PbT7:kVHNNLf۪}eET/@G yr5{&[1S\@3t*%ii)G٦"^y xjCH !*|^ s ٪g9q k>]۝J|M۪ {ombJϤ{IӅWliy Fn>T?fⷧ9^OZgܨӛLJ":!;L i%%T-LtJ@^ $ ߑʉ0kIZ?tBlV.IlIG:&2[:K,G1`t "=ޝXwA}PYA `KȔ[qKz>å{Qw)owQ:ic',QI' ,7O7=o) ,z}IOtdf\.En Ѡ&5x \ƪ0ųb?M{mi?X~5ρD34ֱlc1J2S~W.c\t J<Z\`,LHM!BO]ל"E[TIś茳]ݓWE"2m&)qҎÞ2]B* o%x0y` VB)$E>&|%\ q(nRp+,Ѐ=WDREx;$ V1@o|2qDpG~{3#]Cxc#u 9`s* D\0&f*An]/gr78ᘷrSLcOS>C3#87%5wV/7{9҈]dP)hO#ueS&chƮEO WY^.BvЖcN zѲ1l'ϽԌ'/Oe2VqHǙK {9Oʾl ,[1ڛr`13(5U2sؚr2jI ^qhp-Du]Р= w=$)mj5qldbםQcy"fbRD{,~0.;6EI'ʅ$O]cbxYI,q#wWuWec]@ŀP\e@XYMLi40 hl&•Qj{~T|nnũ7NC +7o|4|e'lL=̪QLM'X]3Uoplם2becv7 <~~fD#"I;[ iޖ[5$1(?wAJ<կOD";N498d? Qe2.Zpu{&rllqOdB!DHtE%cl#"l[ХV{:N"_[6(yݧvɑIFD0rr^@yq?$yFѾ .~5I\^#;tH{[˝C%}Djm*ޭ38 Doa35m^$n/c^u'?Lȝ +6J^gB1)ҙDH 'ӫ+j)H;axq*(-oqe#fN~Tu1 [~_f-ϫ0eVdӃ맍3rQ>{#[RzB_^?M)s,Gƀ7 q4t+_'T+tgEg+ׯt$z{.`1:IyZd(>鵂t}Jh-"Q)1f]ev}1p|]OQ2IS)B"6a %ش_nJ1XJX,tjC//7Q+lQi\)-Kbi!jDeA`g&uX8$8r.!vyo6U%KbFi& LH;: 7c"S8 ֲf0x襉>P_ȩvUvXm @aY&yCgi`giFș^f4_<*~{a<;r=L fތQ-.ErLݮJ*GB:灷 g!e+gR$ѾX^͡/cw쑪_ؽ{L<ƼXGHK(fCWS 04Ha$RADb4~"an妃1"_44r41I^`)#cvw47n/<YGq! BlP[JQxq 3lR+Qr55[G3KY})P#!lP/^N[HK $}`H'7=h% 4cUP Z 9vaQuo1y]ywqӘ7Xa<+]wҏV g2ZJ4ڥK9/&84;lM`Лncʌƙ){1 &]K# w1 LuR^i5)Z=ݩ=8U2оԃ'X],RᏫwc':nJkhZ0gAvoGu{&7o`sӛ$O{A[һk7 )ܯJڃu" "M bkC|9̰_X2HH2^Fқ>Cu20YJqlaMpZk}?c-@(43>L}n:di3dX! 4@F:[(֔DhZgT=P^삣Ք`g[ytBV1vTg\ޥP{ICmjd kIon.[^sn[XL` 4!C7[] Gn>pywVH/L9'X!;Xk$By0⹑p{^A*uݱC"*6,n'˩/lll%) (4z Ȝ]Dl|,CqK D|Gp19aywvLt `D5ʄ&zFZ6nïFg2<󚔎V;8Ho킌E$m*.U3Bʠ0ak+K}}}Y x .p\{}o`[y*90},vԣ<ɗvG ރ~OEVl.bI?[pg90xJaxz^vB:H"h}ϮpdzE-xj ߬> SF8;Ž^5e]!8 $bG؉4]8}@d>,0b;6v$HAYzfv1 ;u1Q9pPE!ؙg+qh1Tok^A@վ>᧣0STy!!bފF/(iKg10eSx2ee논N|uh>Ӓ0=PװrtɇP5}RFl,P@\=3 "BϺL֥dǷa|lyk׫oBF=jÙxԴm&UAךhȠs}y;)w:͡[lO>,y&:7IT'#oU8U.jHCK Hm-PiOju,{!7?esڜX3k<KI`h xJCB$G;8mQ_r$1CUWbebQ/5$U“HTR|FrD)"oꙿ L}\.!ceǙ|h`hޠ k%qg)f"SֺE%65q$%}3H(b_?(~o9Tra7BBMА,5m JXh('8Y4U;h0MBZ࢟!R RO;}#()v /QPo 3veJDu"#TPM\6dvD2>!P SgEP4>9\$Q{!|ia60Ta*a?z @Gf+1GHMAOs,EHR?~Kǧݏ#^_b0`k×xbxwmROC[MjЎ&\'x2SCzn~2gPoZaHxȊV&O?xK$&e^} \jD@zӤ$1')>i2lYU -#87&<2uW VHҚs As^*U\q,tzٵƮ%]sĆ! (3_"%<PWmRq%~G1/ph !4IL?D*weNErá&%GPsPu>Aߧ*8J:5J3ݽq-^h yz RP> s9 %肈sgMϓRadF V5h0(X眇KX%Cj&}*|.V|w+KZXeRG=X\2ԴcoMĐ 6VNUG7A'o|\-fC'dҲ| t<6'|gs^3P[W3'pWxY\(;~w@N[;~Mk7r S߫Ʈ"`q<.CC4?_~k afyNQA)[NFFh8n{Ut8@}i:y#>gFy[UT"z /䴈s_z[l OYD!(ssyX;Λ(8ץi 7GHb1-2/T=OX~ַbԋ|xj3^ؗz&BeT:Ox`I߫6[c҉;5ZW$zé*eFvЍgrtբ۵[\M(qU٩q^+.$y˚]{MgQZviۄޢU7YiI.[ ӚcX }Y@)0 en?du{> q%,vB% !Й8]gێe,h'c8-vplK룱äP7P 5R[@bYxcrln,H@e<ic]|^,%i8rT ǘ$V_I= wԳ҅֠v S6{ ڜ!U箱+W|CI^9v9)[WhA"{V \dlDTR'5ms4cp8ތeVqV9gj^HIn<.lPQ:^,Qٞ/)xX9d$ ,d%9eL5B"ӑkDc mizYVw٬8̰fX3X^ EiMD,1xr Z]&Q*3ݘ Bij8w'X ?{DեTR|'h8"h /dLh, UWłe6E[]Yl6M Xdt EYz>TpuT0yN'U}Q/:H&+ZX/-ye+:Y}TɬFނw .֊k QlYϘgbhK+r/@t z).HF`dlVBnnc=HY ,]lF]CRaWWzKk۠un,9;^Wfە2΢cyBs6R1zXo"àLJP6H{UɀWk^w tfXމ s1-ތ7TO5=fF 7b8.͍S}DPu/Wջ-~U;=G}~`Pĉ4k]IT{V2g m+vbGpӞǺfo}IO]*@{I{+ ʃv8o\C-ATtg:STwGCr3_ )l~M95^`SV箹ƅ&֖vA/b[UR֕0GVbrW&(^J*%4`CWWqS1[|/c&UO{15\4bk*F[x<5J$/h;![EcPdHB8鹾3^j"ٍxOU>-4H5=gxUY{%C<*;ɡR$/ zo(n[cP >cg'O Vwc%<UFTh_G@g ^F9Bk3+: eL_' O{HmxX\E/T$N.bS.E}<bDGԀ+ qע]kn]`YQƒi`zxgJ=Qٻf3,L:)W}T7.g)bȬڛU8M5$d*vDV މ2w@\{4kPhl@!8Wpux'ZQGUCJL*0ΙAۖ/&r=:M }afX i؈_Ap[G LN֗%8D5Vɳ{w @U `lF8O"1 W)эjګGNOxZCM0MISx M7k!M ֞ b:G$dp8.3Wvŀ-rc,®z r!ĵa˾GlZL>UJLߢ0kP-n[M ~ ^F־ Q]fsgpKZ+җX &lr^kwJt?)bT^h s ^p%ȗvB-L=%GY9q%t3݀#1Y&gpg+ q7 oT]-jNkڒ"[֫My~tdhA*GF:.$F6i2ZJv]+RM~GJ o 9l)LI9 ``Ku v8Ꚏ0cuʭ,o(VGT2ANHp(b_`[lE<4Q m¡l!oʕ+?Vn䝆h`'A^Ko6dg $u)pV vYk3Gf#.I]ЇN:ImAf M޽luN.  xUn:h%dW_na&@IpZ$CHx|60>BA"r6&aub1TXlx/I%C>7 [4PY߂9^q%ϼ@‡&& 0rU./6[aN*}pT9&U8RMO[TYk`Ɍ1|d́nW̫44 v>zh󖅭]e[}rcc羲=oGJoJd{wV(RH˒Wt[[FX,U=9&J8G}|ؾOdMWI8F_>Zpe,823'S&Qe#n& 4Up!p ͠DPsi:7 R=UgVP7+;QzQ{>{E+)\(sDcmn*Ijl[#}4+vt["CG-U<j>~V0-C?UʣJHY^heqf{70H}F#Rr RZ_H w\ DBn}P9/БxÓb=b\5s{S=fܽTz&wdV腬x?{N;,R:E~AdDz/ͤjoݘdn154RԗP`e(qLt>s`,%m8m Pt`@s]ܗ` EyE{`DJ0AAWw=!/`Tn`:)bl*hmhREU$Ts}pk0fǠ_sx6)C)Y}|[ZY͹z$LdDL2$_m,͍lA Ȫe# M(Ҥ=CQ\Vս8gUE^{x }z/FcN ;驋#&ۛg^M:#"nȗbȬȅGQ=!^y09-MADhE #PJf[K_XOy yg9f8t`=*gag71X 0vhk-(Íjy{i; fi^ތl~70eb.AJwv^.><~4|&W =%:[j&xp űl0>/-.*M5hpJWi*+A0؀^ЮL&h+('"(ӉVTxz~Դ/J:rqU^ Ēws-rHF:p^A?4$@؉3:QS/m^B*rی iM47X#v{8PY'Xd z>!(#yO`Q¹vfulaxܩ:朚B-{GA H =i.gS`F5zN1_Hv}+/ maM=צⲘ;DV|ǠZs "T544}u1zd(!pG,Oe|xVop0P߫jWpzU0zo$; =O0[o^ECPYVJ";8vE7 /+u}#\ϦV!`Ce]{Y Bl M1Q,Is)yjr S\z`+)v 3B)uZ}đHPkj'ղ16{M>syt\.1E,''_09fK2a>&PcZGHTxTݓQ#bmucy%/ !YSs hΧS.t5rz0mmHF篠M: >-(](ED,&udGZB'I:T1?̫`՛U!' K7=mU*;R7Dk pcx=,RKmkeCzJb| 67C hJx士(P;e8ߊPLMY\&{1y0~Svb#*xj IQ_V!X306f} '˶Z ҿg2.7Mc h;IK49Գ0.m #\ԞHw`UUa)o1hJ8TLCǺ)٩wtMlfOcfxG#~<$D={څ$qLλc(1@3`xL<*SCZ{*7l8!5]cp:Q9O,Uy`藅.[xۊD5>&׃%5:M璱Joإ仈z aJ+lR@Vx*Z T(ø =KTTXn> 6!frYR59# ROC@Ʃl'N:%NyO)wFOnE )>(|$&0SJExSu"/'A -|DvDaK $s6KNZss*/ )69 |!mC֍.67Qcu)d 4n->@#imA:5r"]փ R(G4l2Wi5Sz{PqXM`6Դv;Ŧ5Z==wQd*`$E(L2D Iּ+-&XCt, J5*APϨS55c|XZ!g' EqrNt+N,b<+t%G{ )=TEr=X97i5ۧK`ZכIS"@ jsk4T2!iu^l3Ks}“;f~*^̜jәBmu{FP`>aЧ{]'S P{$wc(@ TUNkjSBÀ?'%e`rBo5eKl`8GzIy=XW!9PC+<͛YC/B֍{y\Fftdad>fmThMMGc0&rA{:*- B8V!:<  +N aLqu\[.w JץvV v=(5\̆5m1|Eya +\" I]>2Y:kQ7.g葎)pÚ$`x rkݱqB߫лgQ`T8p)) "g5 /N/a̛;X*fKr T="D{y.ŷ=rwV) B)b#1#/yix4"EZ6ldnSGr%<8ct\W\D i4,2Q\I!<x<߽ Ks9Yl1Cq{\R'Q⠕ zA]ʄ5ˀs:yyP76T\Yz,@y9X9x_ s+#4y28<]aPJ B?!pB)lv\#Tԍ;D2EDhS5S]JI GG^>l'FD|1\lJzqe* ?ynϨy"Km)Hxݨe%6o<}EkH_9i->XJ(]<c]('G:_k'<*㸲eՙf=~NzĩEMKe`ZSK7&hŽkeV1-vO8;kIqFd7գ |̕Ud<gPj_ulW%bㅶi@Vf~/Әd$^FI'.^KByIr|f֐!D2ez_lc3 [tS1ZBޛwVz*D31^3 .: ^e^oZIGǤBľȂjwϩkZ""\H҄yBQ++6 6z)=R 5wؙQ cobЈlUxf=mEHAd9!u&Z/qt4bmp@a$=i2dT/ѾLW&s84q?4_t8q9\5\F5:+yGV݁F( ΐaBLtd7nGѦgrM ю2j};}#*#.!ڍ73nQ}sQҗs37\cZC Xε^j܏,qH$9Cd'1i\zscY'm'M-#5/tn37+h-0_]|$ߖv'gdG#"B`p=e-\]'at]YN\NhQ,5Ec| XŒ=,mļOQ.+3UCw#-[`'0Y(b|${dh0ҌyG_.6"4׆:;o /qj !y2YؐrMنaWjh(ae*8y]ޚtn%"xfФ5 &-#;qe^<^₆铍&4G:c*p2sNpBdl]]AK7GWm<Ľ͗$_*rǣVnI#xGsQ*fnL[ޔS A5\ƫ(Jb'sOP%*Dl bzU#B_?HpWaXuz֩>:Y9 L/*Fp$ vi A#ź/Tz\vxuZ^^|"ĎI ^R ^{QBH; {l4 އx}%yԎr=V6qAH, q*]5>@b T㻙~ِb^Bdِ 3H-h$}GG6 ʚYU}V]cP{\;ڌC~xOJ"m[/jqnѹ1m*;>2Oų=sr!`{ToZ8pc܎2th[@CKX.NFfnȓξH+=s`W5VZ/eGْ֢;DV9)EfGpR,CpΪw%ٞtܝŷQeM8A{3] T` g2a0CGmk`EO0N"Hh1S!qkibq3X։( #×L_..s؊#̔91ﱽ%wkzF,=F%2)STagV[Z^;T+ c^JWQ3sgٝT - $. 2-%pH O%G'?*59AmAhԴN@Ł噶3 -af%)lUk0ݣ=z̾ilw1JCOJ[\>d&xPvx. ^;a IId;:L) } ·3dby.yͪqGlMBIUe(L?0%Xt߄BȲlp*lO~9bcы oE+8~/w19;G%~~$±O%͏.~PN^3dHNҭW}n wYo i ne i/g`޶Z&mȞnJA!R" q>^ɩ84_g٪WLMҫ'4w;>mPC1 ׏#BJhr={'މȜ̣W<.g'PL"uo@u8HȎ=lX+.bd]'ܓ"h e%&@ء x6U #/"xs4'!/AٞƠ: Bf)dɪTJ&"~$h9e^)f1 ? 76дӲup%h{~cP<):Q}9x5Uiqe3 BIځe;"M5 ǠKC-K8/CֱKaS5ʞ$~s6>3E ,f+Klpf7C NW,0]4_5j/72w΍ag)pF$F㵚4*E_ Y5C|R\o^8Y]Z8;ˢF < i,5Z0@ȒE>W iLH [I#cPcQHiD<Z*g ֍WJ &%,# ؼ7"{h8:O5ɢ$$X](M Q֞ZcuBwFOdDIz;:H=|$З3ŇؘTdqp*wLu (7nf] •٘6E]&4O D-lW'V& a_pK>n;ΫGEl^`^&̵r<ѸW^[ƨ*]<.0I]c֩gx\lKĦVr'ŭP,|/|c'M@dwN+ _J־.Enm({()€W67$a5T~AU޴#^ 6w8w%#wKP?dWR57@R6C!9 Fgc~_`x₊ZMD#IȻcy'\@~! ôvfv4)X  y#;M^MGatyup2=ݜ̖wωO!/-qbG(١V'Fr[k8 /6!=5 |k%x׸HasLUEAFRgEo%8P#_ cO{V֤ u4O4rRs`APGU Y%XL1j&5p.9mS`9-1Ǩ*YP )=z/^yأN" Y6/6bpt‚bGʥm&\ET9-36j78 ϭڃy)̓ AJhd,/(Ľv,LSq AVFP+aIUdr>1Xvך7Qa8Lv efꋇyqՑr(G;ځ7.;dzY-dqHObրy%͝~/fłFmcP;Ǡc܁Fcܶh-X @8O"=brK5 t}O@3%UHnM}@4r6,1={Di Xs:=݈M'v,Y)]NJݴ |bVQ7|'KP8} Kȧɷ׾Ո=Q ~<6=C7:ÞQ=@_zvh[Q`)ҽWxʴ\z4g /Ywewub|W,Q&#^E?'//Nvp!$TYt@z֦0%(bzdoS7dR4uM,9< x=4 5h@2T:C,lJ ikh_=EZvXeT+ÑKU])q*pd69qT{$ߔ3'v`5Lbݯ#=tpGD)q˩;kVDѲOCBm9R` yL-[w}"V#{cJ\q0oa(-2_ȞB5mQ=SO(ܟCVgy9CMhǼv=%#2hgG ʉH4jc_B!Z)d[g|r𦁱+o D8ldn΃mFtÛx]$T;Io J|wD%^XSSf3CBta'vWvyMw+m3b[6%SR SSIxn{x/ st2R^BS= q1 B7w{5 3L"<{S\Fpڱv-^qM%Ri@ovp WeyKW$.4yU3h*ynpwoɏsD^^ږ}m"{lEjTs0Mdb$ } jJ^H!C(iZx"Mp¤X&YSHi RAOq rѡyƋ K$X)!>8;VZ6-L-͠ݐ[/J`.rLSyF|LKKBɇ5/uwZJjXJlWkv ZaBRT嶇晙-^rӕˆAh!FYr*r ?MA}P=DN=v"%Dw rЅa*C6q<+sż %ȉ8 ӷ~38{*<>-m K6E6?"E,^^"}ƶ%IBWN[рo,Y]ҽˣMBĻJP^S:<_M Ap tS"~OA9ChrR}*om Hd+K<&"D&ujuNZ6J 0Idꉂ+w M/87ن9Uq'=6=QӴef-s{+gKJ\V[ & +zg `'!sB{MQ"F<^d#1 WʜDno]e[%BGjӗa_NeD{.@vԋ/gW+>AlȭAԜB;bnCBl2OXcYwuNnM|YzTp/1erɇ&*Ao"C CzBx[3HqYq݇ {؅T +޳`{4֯tNkKFIViOU \d gAV[\@wrЖ$Ќ)Q6j_yV0tg\6HJfg3~2&~K]y]<^ib`;씌ooaP=h喠h%6V{$C\94vjt֞́JF@FVq ,^?h3.Ax[DޙU5sArWŐqp<𚦁h=+Bܤ["xcT`ckۈ`ב:(Xʦ^{/lB C"YB:5Rvs1fyb8mu6w·@<@cɘ ִ^'jh3DNWKsׂԵ̝:^mef\"6=ᇏ՛zalIGdX˭/x Ձp炭oi4i dU8ʈU6ͼewxkWxYJy-޳yreSSoR,#i^5?s Eȉ'zPh|ve^cg-F<71KϴH`"e8HR@mCNAAc;jqL3sX{BWOm/S@dByb#ڑńjN.VP 7&%>ML83ڮfEYlJ^hQmYK4^(|\(=Ħ\"I ĥ; L 45;?5yuDX7B(KפϸH[[ r޳NYy'PWkyb􉼣ׂ RnzzOPMWַqxEP'rZL0Rt_ZzwBG,l .%JdV$ *hdҒsTmͅmsiA㣠:vZ!ʈ~8%y(3wRn82x0N0`1-EF^]c"h%PT>\[u{㚪>{޸j ;:-ȡ9% ^%b˗'n@GV]XzKQ14SzN-{ɜ`pu,&!jkkʲI}s0g(ln)[!UˆΖ2 {@HPqьqݢ+Oi] /)sX>RIͭ9lm 6R[ɦ^\yEuJZTC5u3|~) -P_E9=~a=d}(hz25+#z|QavN$)\w))A޾Ӛ=~~x→ CGaa-h5r%q^lg+.Y9\߾ɜ맶5>*GY/U3n~6Kvbi=Duu8s[eq™ּ:qeSEe8=_YT;XtoX 1iaY_>ǖg%O0 n!1zg,o)Pާ%nZɎiUy-+-8 |I ](eڝdލ+%}z3cMK)=ga4`>lP@҆JN P fldWP" l"˜%#N1:e{!O![K@dHS>ڎ$8J‰=iA~z wj6N1uǘλ`6 _}hd14j Q;bMqB?t< :a^wޏ{my2HDq)! H:XniFݗMe"'ޚSyqQT#!hi/Ha@:eJ;c T xe^}woĞ"sDM+WJboM!sJ~8O\a0ĬWX 7`Gpqi#@ݵT}QDQKD? ; R=2Uy

㩀wqf4~?2PoKByS BOȕ\",aeѽTիGP&V_*{H cl{Q<4'Jؕ,i<4,0\ؗ~ÀrFD*jO=z0=X>4)07u1VzG{ .7i[^V4ye:2Wm)FD̨rBTytyFDuuU@4uƚm3]C' &bj `Uhz [vZC=]rlؽ$&W IޛԤe? KT9܇o-/]I߾;ÈwXxe m8+#̖Rveus_b`Q).y$f MM*"q#\YC?`* c+n, &ez)iETx .Cۂ7jp(o{M r)v-Zp":ľ)YAg \iM)ʢUGj5G_KP gɞY&G)Na}kB-Jb)rW.U=4Aledߠjӷ^(CBq9hEˍG6ޤ?RwyFL:`P:(9[` v/3Eڈs]XIrq%E a41l91zHjvhL^"hB1yGuެ9D%IEa4nJY5^}>5Fta;*ҤeJO=6̽(tlc\reh0j7{T!G@\jk֮^'> PQ}7AO,&둅A~UDX$) ~E0ꋡ葨Y9w΢89w޹ܕ"1|u \^?y0P Hbc:9 2%4VÏ̀r̖N6c].;q}8'=tNY~If} P#`c4kGل`z`8A 'doe 1+SR{]m"kQP]ѪZabF }o:_x b7 8tl/x44g3a ͽ':L0t:=^bi`ɄI)ɘ{T ig,uxo=ڑE3}cmr츰\jԥ!yƳ:U, '\#kypGJوj0gxͫkdoG_KcaTj ymZoiڽ:V6&wªzU#"(` ,VԱ{kz*c!{%^>+P?U{ovHlӧNoG[$9sNowIٗޜ{ZFt< T.T=a4YrXb- LJ7 x&:dbFyD) KNjMn=RvR+@SӍtumkos &NnK¢EYA~srny/Vw.rzU $mM޸\jBoNq6(~,Iݼhv|$&@>0G20i-r&F Z%]],jJ }ot }[d,:xZ7_=KY#jVdR(:yfE8&tF" ;y']mNo-SJf 7W})idgibajGͳEϣh!\8 DڸK[&Z^rd|f@5ޜl\wB$_8фFPVSwgۮH)y6`p\y$:4gA[:c}ˈ8Mt8e4㼈 =qc>ъrvTz|1I_M, IQ7]Gj0r~ gE&tWB \t~pj!D6SPFkN c>x;nfa`%9hu; V.g1} H87\5g'['FS,_qXo0%/ShjuH]]G(!FXQɕKŌ5.te0p9p¬Cb&ڗMļt)*: (z*#>#Czo R cxYs>p:@,lMA`gkJ:1bm>c$owwba>_>TLrmhO dK-Al{N Go_sॆ[I}󔤕 *o~GB;1F5F: 7^\"{uDj9O7nt²S 8d#/{r5^W@<0/ȟ*PStIf9 h5MbYMt?z=D+*ŭ->-~CЏ^p9^{]'nYNDzD m$a4ϧ4lp'ơ{8=*A}ih1v٘eR-&R,h c :^Aa=G $} d-vV] 6nb+l=;yCX_,Z>t}(|ou$;('V9HǹȆ{M)ZimV, vS-s$.W&iS-n#"&n WVjl=NtQ)}e/4o-,hPOpS:Wb*F ^ *FMZrluΠ깦da/w\> Izӑm0'!T1'4eGJo^xO6y8ER?KOGm؈89U*½oUѽ73}4ĪWQK4#|ȵMO\&0,eƂ5a& t 8C.'c`jQ(©dE*9\T@Ǜ0ikņ+x!=\c NEhx~eN“cEU Wm:qF!sREz nov=%i)}]e|:Ȑ =E1)fF4[Ml!$ E9b#pЀպC~уer|(o2hn*Qk`/6qݍ+Xx<P~MEX#]>/9zBE:ݶb'% yul ,W$Vjn@K=PMy.:tm$%Gu]&Q4hF$.}%kWG ܼMӔ܃Z9=|L(Ϡ/?/o `l:pv'a6zIV@SԠ~cagO9T{nvDGWU簕QM8SfM{أ xNϩ=s`0{![i(G' #(|JEaD|_A墼;\q,ݐM0VB之ľ{fǔYN A=rsWj,i*=x9ۍm䩌xn*;x=R/OQh=lJ$zڂrVLveGxRn>zDԶp4qk.$zK4`d1MjeZ ys; nù s og:LT⑬ijn)̔"p`0h| h7]"rK[tҏ F,zJv.}gvK37n= LJQ;gBFgqLI?rѷrb(XH*7']96}`_^i5ˢ6AkQwjBKWE>SJkQI8yX. Ƀ" NU'@lw>E"4M4< KcΏhmׯ yE˥ 81d3[EII{T\Rѕ:pKJ'me#8@NcpQc+g\z0vќ+҈=5gDEE fRT0sN]-ѻKJj\t@ƍqܻI_ū/ݱngrp/AWAo?Ky^]O'{þU'm!גyY/!ĜO7, %YVNpv)V[9?~i>ױܽqn0G.cٳʦ.+{ph/0 ]Jz7|t0.y2TDĭAex5;:oQ!V;YCt~R2oM=`{3nB.;LDG, 4J8ғ L0 #zQ`;;ѩ372tS> lja%;v#$؎#ȇS*uz? Osh4ZZ"Xq>:b1@,2*cԉ'ox9pm7M^ =>uݭu|e1>.z,zJy|dWO;}t%l|=>؍Od<4db&w"i61PK $-CBTMaUfWOm,ferQ6>Yj~,oV$9e]7\,ly6U#{S)f@?H*[5 0nnt/e}T`ω\ H)IKL Mf܎ѳoG8=#I3 #W(O3(.9l&:#B?*DYY*9o|k#!)i䮜tv}WVf )tKRC-R8!tK{0[|o&ۋ߉ lgxnj3l芽O#wwdv0ڄm w8 xB^@6b5E):3Ȥ}zY\h[䮛 jP!TLF&!=.ZYһFCjhse/q|8ꠤR/Jrk-)ЗrR;!U0ip;2Rr{dfI@ZQ; 6l iq=0!,rށ1֛U 9ⵙpvzĀ\.uGÂ>x'B[KƊDرv༚'PRZh,Nd:8RWqd4?k^70do^ @8W m%Њ%S0B0e,raCPDHx5*-ބ9\/nlw Ӷqb? ɝMَ8&Ɔk]~.PcoS`mKHM^?%K89S-DA{†SØ2a]n6d FOη!zh'dp;_q=@ v%R%xqؘxIY{k^ǯeg:<#0[ԍ(y:YX D&Pg.M [0JUFs]\d?`2L4 0>}\fNr=*9TLC`9l K_==fm--}0t`Czu2KuTEn-*:YA{B=3D+;.|i|cM=\v),ynn=,=eU9(91WDU2֘}_tīI7Lc3YӻV9[om>ͬVujq]ŀH[r>Ah/_$>k-9=%"WR'dBnc%/QBv3.-kA6XkTnP?Bt秃7IJytj8u )=ȆA;^{s2(ygt=#%XU1fʧ"в޽tWlPiѮjJ%VjQfީWOktr`;%;PM1f:dp&KOgѺsZ :PkԨvʻm/ZhGus\yU=d1P" |rKܑ2ɋG#\r ,_j-wΊq,o6NxT U *< yh:9iA;ܳ e2d~rC` |6wv!&MIRae44վǀo5@!o^ucK:>rrh9; ;DnN{{VK{3ഀOuGX  {ZOjpVf2V˽ڙS'FV$o w}gpVI&F&j4҄^B>{f0n .qJ't4*baJ"%&)cLxx[QXvҐ9J&DNWIu4fnN|#89(jqWtWmIgzBt#U]^%{ WU ÄØ\r}>9XYjpӷv8+ n*ID=GȃqFTE uHtWᏵ'dHߡ?%X@wD=Z__q(ÇdPjֆ' S3\4ϋ xWY dq)aIEd4?4wlh uvhna ) ԫ'B'>_'LH]?\og$>8O3U>Uc.HG}I(YiP`7f@N(^#>a T*Mo >:=ԕF+<\v޳qT uk(W' ׅRx!H/sc2Jۚ`&KkV  ;"4R5L=SXl4a@(vw>G7() @90ST&CfJ檣HY)'߻3Le)DH-E C<bSZ&^W6"&n+h!Ha&4t|¨@$!E02-'f{*=iCDf7eU\s7 cFt  )Ac!^S _u=|Vݞ$٘"v!ϽX}fNv{H-N^g  ^Ƃf*c% /=,Vy dB@̃aJq"YѪ lwQ\f -`+. 1Zaz؍wu q`ە?"{/;cSW!SUų}ݜt''>Hguۀ'Eu]\l#U,k/tcLz{`yƻF\lóaZB1<˫G~n>B]8,b^ )pzˑX\ ^ԋpxftA=޲FZ{%)j=`_Ar.y+#@z>ш x(|p`שz&sB=̻?V Bu<͸lNɈ43 Q}x P,]iˎW\6"`@3Q%pjqj|fbJ^d}!B[ wt3Nҏ@wD8tUJ~e3v0u+x@\VM9Y.ʫ p1I}5V95{EA)^:\J/ f_T Iس{F36XE/),-(Fy^#<ǜR{*zjL Ed5CKJ2Ge`^ ?Lա1)})(ى[IYrUa9t_< {'I18o[^p`l'5eߘiiAXC6$K= #F8 K,'s¥ &d(lܷo^R%OĝCkc{B]Ɣ%bC '`Œ7#ğr84FՉۛ寽i?{v ъ"C^ՃI~f˺ 'w .kr7Rĝ΢5_]XxL3mPqL~wшV\jH,F. }d)ӖҪD 0ܤA쮋oӅA-CuZ5j"jA>~)BSԏF^o Oxcy];qc*6un@&f+fhaWK>1[zluELn8^;̜2bJsO~c6sQ#Yux6iF<оz 0L^kR?Znv7rPzױ, vͬlahB}$IhG2.R aŻz . =sr.u.aL;WBJ\PLNZ+w7$DOu{+5ߨ3qEǬڛjv49|.ְ/ZAa)K ؁"e퓕I*;׵XOw 0WbCu^&WRi˱u)ksf֖We/d MLKDEfVO~/)b:%QgԊR{olѤ?nח4`yR/_:U1w⃳"3;4?er}fQMՑ<Ր *XnHLj| aPIWYaYz65&9N1|K 1/gϠg~ҁ16B\E4s,ipE/\7*geB0= X䩗Cxq-Ф*{ {nZ@{l Ϫ^0=G7֑*->0fzxַDY\r䁕A4͓^[<.{DZƓ+Ĵ~~zbΒ9sq[\W!Ž*)Tx"b2ӽTW遲%h!PLrt-%Fd ǁ0@>s]@c;}SQ4'lM.z0S!b'^X>Dm=LlX2;[ <;\.a_Q|,dPАF:/w=:ds֝b[* 6žQ-omj.Ґ5"45->'z6vuD=՚Eqk Y$h~I<5 C${ԍ/'^Ùfs>[~ Vc4xyHHz8ɴ`l0$ ndCaޖl)+S[Z$%pSi{9դjh2_Qhh\{\26Ȣ ZT\Œga{D \ ,$P`[xE.h kxv1 `.12O^x!43K"GHejڎʐ8=w+ݔ1A(ŏHu P` 9ǦV0^ؓ-]@\޽.6[BY<RBJTh+s+2}*ZמP/RKlƓcCZgؗ`Rᯝb+3"[ P5l[('Q#DLd[JL*6Fxyx Iا~SĂO8._bFo 0-&[w\P3i]C}4Sj5ZGweЀ,G; TJȲ*D1%Lr2 ;x≓h@*6 1m#}&$-bŦN'4l~كC$+ȝ߽724 AOʒXx j_3%4:S&?]g≪{`V=qo2?%6$Ka/w^l=qJ,l>]J5[yS l-N;d)!PQ/:_{mE!,O,+}wPu^`HM-` "qBvu#VoI""b<j o\]&3=y›71Cd ȖU; hOq;L/'8XAT{OhwcJsj!kt[T(e%{cRMP AUcHYdzEé5euY,tu+ЫxlBq9(IΞp*o2k=1E$xx=a]P9j\HNgz7 VC fr6 =>ePsP#X)~ucMRUb2A୶ 6SNmYhZXyKF@]ɳandqX4m].&9RG&q +A`.ت}Jzg[Eb rEΑWurm gm} |᮶zU} =M-X=av*(P X&c 06Jm52Thjy[5,vH4A:.'Mal1ΚaԮb0ٺ, M2 c ]!4}"JKِ(gtv)'2 ޲v =s7JXa(^Լ>|Q({)Xz[PYxR4<ynj$OEPS,sbƯ@<ŲSKxpy%0sgpQds_CzsKuN7?P9Z crWcHLaf~Rf>;K}0mJ;'T)A;rsxcK|GK9z 8v_bdHj .&\#v r€Pр+0\~-U9r/y~Ma*1:v3%ޣy5.o]ދ24ymL)A}huA]q3H'p,M6DEDdZImRa4Q[ֺ+r=q d |iwr1hJn.=5W5Aɱ_/4ӎĢ'"_n szqPv[@=WN,jkfOȮ{{OKe ;j; n%̬ Yjz#fw)H> * MT|Kkm|o޸q¹ IN`>PLfsyA;V %swI ƯCvB@'eу0$3;7'Gh;}4AgDO:N)g'LJ],M! Y钥^KSi /kT d@%YR{g0pX1\XIF#z.^W94 bᶽ^(Ȇ+8\)3kBtt,B?91ʂxIJ4[7sc"rC.Ժ/q^ wxʯkf8mMWP;خД-(Eͽve+қ#\0fX CxTȁ>{/cKA pN[K5V Z7ZoED=y6θꙏ H7 $ ^,):+ {qz|pG  V8j#z+rO*(*fRwȔd/0|^Fi+*b3J"vws 9sy7n%JቋU@-@9F}9*P-LM?EG4muw̩Ew01.l}'{C $5͂L[ $S:\A<*v|)"D-KS0NhɡX0֒=@[F@/)r+|'Ҁyj]'RύtWUaxWa% y΄^,YvOE]:08 -Ἰw@(FdE)a9=iT_:%Wɷ!o)lA ;p;qoC/'_:[ʳ3[|\~jP=~ʄSglSYأLW.RhPmQ '<_@V\ock<kCc>y9H!^S5GEb%2UJƩ~0O HؚomE>;|$di^>.cX?hcQ|5;~"7 MV=7lY>>2Hهg b~P,DUvk}YG(P].$Jϋ׷PbF^G{x _ʻ4DV7g/NnQ&+SVO cE9N3wjo$@?JGRӊFeJvR%pNAҪl|<^>vз8: Z39:n8ϩ0-Kr"UBJK<]F{#6((xL()0e<@'3D0%e] ^'* r^,RUm֊Ar!v `Tѽp4As[3b@4mMUeL1!c ol \R)_dE?x-x:wN p LH W}ذʽ;5`(*q@d'Tm?yA &\C/ѶM Uw3p,|e8877Fg17S"P5ԕ8 uY-B(K`ٲ#;ɮҸ nƻz*`XA (~lxi0, 8fÂ&k=Ut1%0\jvغwzwk1cN\A(~*zmjO}f1,efl>0d;~ $UcO(vz'"6]Hv\Z{w3*`Z7zNDYK%FnksBL啧<Ĉj1(>b<6*Fd,G6oےy 3J /SiMRv=C+V9 |NFA]BWyٙURnma9r`,fd"1Э3GVE"6"\F^QҬ.1W D[Y[\5 <~zgܹ8׀޾GF(B !t*=uL4?v8:BT=ƪy\ 9f s(1X-_Å`/ʐ #UaCn}#uInx⮳f|Cߡy 71UcPYژ09`:_۷9De^ xdRza:GmYfV<,KZ٥C71$DUJ7 H UL5=o=כc1Д 6f;(V|a,043lG勵4w ݻ9G@ "\-س-Qͮ;]A}Œ$x,,uSfNށ X:^+|}642` {Arl:+j;oJxv S뤢ȩt0KG{/Q}duį2M> )91~ym*H0yA >!ԗs2S/p{E=W3 d {#՞Oo۷e+7m@>M̡L%G N׌ȋ[~hũz_0e˲q*J-Su\,~#q`Ur;Ң?eM0εZy"O-ӬbYudx;] KCVQsi#yキWq&H[Ƕry)'tm'+V5ql̼$[35JX:/Cc 9iec1$lǕeYr2Ӳsۄ3{/M!{3_O< ׷cj{EBdW]qKظ|($$=Gr`̏+u=,( Mw #-HCOAģ`ݹa܏L\En)ZbaEO-k 3Wu]FL4ϟrqIAI61eH[Sy3Am+}O;^g7cpIaMSi\!rR~M vwo'$_ZKAǫpokL^$v:+c.yqsrz66)K<\얺%ԶC-l~C}k6AGu@%/xƖbβ&wMõ{[(IhX@- -7HoTt{|0jX߽`04X(5 5ꘋhq {J BX3JcBBSkF7[m-&̘֐)ex%w:9jh sRBОWv 1k{zL<oI Fv\b4v}7DD{iVJڳ2݁7b$c.ߋh=+'A9pXB.B%5Q3y!.5N?07Ly`7ȷZI%NG6?g^'ۤ"Ui%*@b*S=fe |DR4{?lhb-[6. ,״[|;Nc"wD\Ɔ2WEYEre<~^ >MokPٍ~izޭdQM%15:VJjT?&$%T=EJqO&cȵ=sa4Cw( `'n:V5s8l<Xڥzpõx_/|M륻-ݷJ7 䩍UM9nnFQzQֻZyxIs=ưQ +B~bөO HX űlm8;;LmA\y+}bik/ b,=IIXl6F!N#lPXxl`\UwhmMùK8PLyc3 j5 l3 GaUeGu1Xo'tʑ#dMWR]^9!j:(jUg*lPCEXz?8k 41/DnC, OTȎ17tvN-}R`J[:h)qs gAç`Z `Àh4gy=K퓜;h<R1F嗕*0-a[C u^cjyۘ4y]:f-VTv3.ȡ7*XH!C9b^$!mO8Ub0%a^eGIn回$Ȍt $ Xv|: EΓؕ܍LAɨS F>(bI蠺"NlǮKuӢK9`\9$y81h="s3֡fcy2ݳ/c9xɛ+%nPIe}/{)^S~Jѕ9=/$\ZA腉[-ч 'M7MıĢ\{F=u,b|2hw4T$31דlEÅtE\ =і1ƊUa̩ 8j92[ dt1PPfPZDbvk)Sz sQMt:s\ [@kOllg Ck=<'/woK o7 i {-c,ѫx}l8449>sq{O.a_Bїb_`{?Hdž*a2m|k鴱ذYn+NFmEgn˸zȑo^Q<ڙc6UdE`}/iӦ[II.&3([z:^b{p;.~8nrkUFNbAϠYDR~|J ʚ+؆*gJhij [RzI@"_ #ZMT6 |\dbZgJߛI0WJ'1bh~.| izݍ, ͑x@QM`fb,_kMhXXe6aGlj\1c5ŹF foA>BwQE@jo ܩy[BgjϼN `Mk~O5Ի`LOɕ.V.:rü~)ejH}D̉2÷tpfo)cIR ,k0 ;$75vq4/ (>.uK)Pnsx>z5)C8,X).TuN^?-~Uw(0U׋-7y0Bl fmD9$%IOMg:mOtL6!իw퀆 =gMð|χNLBdN=}juhzkF"vdoQgnIyρIWsHhRQO0;!]e#_WXPm@@^\,uH?']ɭ"فz1#Ǚ c0-`h]hWxf<8|1+FaZ.Fz)-@ݡNѪ}ۍU@5 0 yxԴq^x 6KK쎥Q/0A]uU_vW$5w>lO9XxkC1@^z ∍~`X2.#SޢAfy,UD5HM>8P¼#HUV|&\ʍNVZDP YnSԠ[ђ$s bEjcnCzC֚o|7BXU4w1g@I>C>O~g&F D}#S Z8%tݧLϟc ‘ajKmu#iC[+%B4p_yhA eh:,ۚ-::X?PLCxlvogT!5ߴWpI#s4wF;~Lű\k y,}5O_۬ 8=^C99AyAÉj겻AE/Ri1P|j L6V_л9<5r~4w9u0|= ٩a6agND":}bjwRJvxq ϽMra +:lbn;7nhT򬅜ˮkuAKOJ薢FՙaqAȫ@"~bmYP=^ƻyi7'܂[- I{ lsQ$K)roFyMŕZo(j@aOF[8̼z(W13vmU? {.;|B}Ӕ1c[񜸌~M x"x3؈L68$WJS`aB-'陞g(o՞2O*'0B윃x%, 6\˵\CtX[-US=ZZ ww(z۵#[V [gN +Nj^cvQ$(т=>*F|nhR3-Z(sk4ZJ3ڽi]ݍ cý%}Wޱ:)xZ _zQ&*sl֫ў>ǓtT0BXdūeoAK˝XzKA5x{B]M0;) Ҟ3K>h@5Z+@K=F+lz`_zL)c&тϮ UNQ<#z;e("N~n v^旛Th3%>zڨLáYmctfKA9{QҐ$}P;0R|eiW1kc Jg 0-#xT&ª"#ΦczH,a%dֆ1j¸/t0lBS<#JeXr#vp}hApY$,n51rM hIm* .n1ט7W_>rW<6|^5b=zKGnq qti5p+lhK sͨ TK}h6'y2Bs//]ܛHۍhOCA$s{i-be.;ۗdVpa t*6A,kb-h.F{9Lb`^pp EjoBy퍿ޒjL h~Y 1DF\o\zs?]Fb(/jJr ($wq tlu4HKFZ,ːx:!9u&ث}}zZrnb&wir{#&[lW9|FnU#E{˒$yQhhp)lBA|=dp=c f=DSOi<К ,r5 FnDһhJHKmV EWƶy[zeR8?}a. mb8|NF9ٗPs!̢%]vA"ɾ6'^&IjE+@SF}!ZFVèCe!$׏bk?ZyJˏWUnR iY=<7m 4kNyArZi*fErI|բ a=UcN]A7׌C>[eo<:$uπ#YTKJ7,cL5ϥeɌ+K7/_`P4E̋a;$[IҤԚYr5jvh$4m'!&%ĥמnx=qhg+d6KքtH~~_(1>"n1xWV5 7  BsӼ6S$Oc=UU- lqDVצb2HB}Z(Qzv=oa ôVHk;"PJV=#74z[HD͙ IF"ދ\c]w9}k m2s o҅tsY7@zAI.f|5;}>AF܏mCPtF: VRLZ [-R^z$ BVh)c]l@(r4 x]V&'9sck0gbח]9bH*rfv(G5W:xÄůA% &8*EzRyr`?YZ6hS t_5*ήܨ3GY]phz⡡XR  2*mz@+5LUMmbYoeB|/gogx˜p9#CU74N8n0ڈ*Ssۇ?i4M=YRJJEz/q W#v gpXӘώf5NUq%Soo ,"gmCv|Cs m *`l&L:3x/uP%Ib#o᫊!KCJsV {uyzd'bpOy9Ԙ`@q-<W"G}3#B7[21`ˮ4 Uրdg\mʹ{!K1lZa|o`=QOs='@eoxiVB 4t]ST\< M<0!imHx\7zNݻrÏ Z{ 6h}T!h)F܊!m0,=ߎ/)%J18T < M|-(*h`9O,\zFB<5$ âVn* %zHL˘ULBd.FN=Vi>@3NsK =\,9x`w|Ae1ݦ'Vn& AR $AU?ZAJuLv)Z]kRp1[FG^ͽ]N>xkjwA 0E SƱwU*n,8@c@#&+pPxlH_rzCpxlW'Fy١g<6/;70G+@GnEO 1 ]zUEo`Vk˵S [lX-;xKWJ v 2KgMg{O.o+1PLeLhD?kXN0'}A`"xa{Kƈ,mT^=,zp9-/6,*ƞ481eyk< (?372Gi!W U2Lde8}[AlGm0#SK3tES~jR^`u:m' ʙO#@@/-31S<ꖥාeܸ&GI0!={({7צBoiYx02Җά=p+R+Qp|/N;G tI,HE+5jsV $'\J˓(ǪNEsN_߉cQKg?bdz#!hJC{m1TǓ gXҹ0W\8VC,N4U1 ^Ne ɣI6z3c3|8xw5#ڟ>c6֞T ';}Jg.$Ttۨm+C쬃i˘=nfx ;%4:]S{4c˘Mxf-<|-\@A<Z[ގ뀗"+/B{X'oB [2Ud~,&Q.%KLU^}-' &2O0Q|fG"dNE :Sn] ۢJ18~Hb݅\h8toN4uoh~}AgdVn=$֪$'VnQ;`!OgG B>x8Kh;XŞ)w[_r+%SuBRmC.w-ʀO-zM7/&f| _&-pʼn=6#XEJ˔U]OXj#Zyy$pު])$ц#\?Q/Dž@ gZ}|(@Ur~l:.rG]LxX%tsT0n,\4rP; {ȸgLFY5^'1,gşZw L638}NiLzμ XLM`_l->P|#r#3˽وQTKD˅x' V6Ogye%":w&0|Rv-aPSxQ'JwXbä@C+TR\~.w)f 0gaCv-raLF/'tTpe ĩ2of[xlU'Q5X#q<ڀ-ws~JPί49Ӥk1c&|IGֹ>- ,`b)cDLœ]$z7B,5hyt`2rpu? xXca@yn@0/m?=֝œL[HR$ijmX(~`Cke"/3Oyj:Vݷ;!ZYB=w&Ms@}-xHtG#071嫊i (I"{}ܘ^5@)fY!aݎHuDW4='pm;f`:0dY,u;Ҫ8 ɫ~,6Yon0a.=GlؕFVRt⅁<_p4 Dz]XFJO8y`b-ITB]xG^#Yt5S@ef_p!(ꪑUg֓{2bKH۲i\=ex\祿j# K0LiUv5 |Yo[P]4$e(gp~tQNq G6|n0)ľ<)A!|,ƒːfٲn˵(J X,;&C˜ P~regc<nUc)LW2$T ,,3^+yNJM;fsHZ1GV#JFK{a$"']6mC .ʟe0B[쥣lXJ4י..`t;ĥyex$jZ'|ZǙWf(cyr; 2B%ν_?a|%1 p usºR@vՎ'5L 5mz k$΃H $8G^i[$=hi]h}Cצف {$SJx yF @@zinHăFo읬Dp:ʄu j}] -,0 ̍幽o5Gb>K. Da&7! oHyr6fĉM^3|UR;j}z1**Ch~`Nn9%m&JVȾMju%oA*bA"\H ă+R$>*rzCn!eL8#|MJ-`0CE6;pwS{NM<#a@TqVV%k -^0RύZ0@I#yZ*O 5Fc>y+O \wʆӉtrܒbzK6oPՊRWjsgKz^8]a6H>WdoM8\OOW5E^DGaاW3-CMЅ)C\VPe(KAcr.C8NV:=NG&"M)g½ؤ7ka38+}R7F>7=V짢jfN*voDvIL˪n=`zAD$d%:6:n9_]ĩ1t}we<$0*FJ9J 'c[1gn۸(UܠvdtC@ { 5Wz- KG )Yy- +ݪjA=+̛ŢKj<ʞ{F,b7ʦ.84ˬ!͇X0%lKufwVnjp<(r܅U>&I{ڳVkBJgxSkz8W|a}J?yFs{h1 爹hSq'uJ(p&|r;h'U_"(Z{>)Y '^2%xo cyhF۝ 5Uʁ,n$gFCcIM&X_V\i{=[Ck7;mQ&08hܫ2he/'gLs1**\-1~]r4kdLN"=o ;2ɜ4͞*!Z޾iN4 "Ȳq0x'j4EScrR$$Fi3~, Tr 2Em˫cmm2̃k/c8(>w\< *dsc6aþ9 HփC~$ezWI3g^ )AS6A*4X4'z@!j $Uaeo^./ZLw<.ky̨K>~=W3x[([P1VÓ$ ?3rXh,QvY&1Q*wt:;!'Đ7XsnDa G"{Z-na8=1}!͘Ēl"⬒!J!g=z\.TOg콘]gFeal{6^m؍`K E UvFt!ދ{%+-pm,4ʢx -{!/˄y_}-F|1r8/ް`-[i7 GSҙ(d:VfK(V*ȶSe$P#E%@:WsdVb^B<eC )nm I4ZxH/b7S26vUYMD` {Eot>wqvTBt W,)*b:ruv((R7=qY^Oe^W5#nAm]tWQN|(;Q>$[&M)$)(!y=K'+`cϞ-Ț7o"W`zb&ΉΖ:k{q{p֓yi1DJOF-` iE,+!Zi%8A @`o 0$ۓog{P/#F5V=rVV(gNo`_LqvQ T}JͯJeci{z#|MDLz2zޱ:qRiL"{0z]v:A!v"y]٪24YGd"&z̎rr\"}65) OZ^+xi6tM RK3S%k>ʶ "$=Ӥxs$ 9k_Fٽz5AcO&]N^ECS|x{`S8ۺr1ؤ2L,vCږ {FŒ <ӷ_h6sԵGSZ ܙ-U>ֺcvZ4hpP`{`#^I {2z]Iz(=$cT xVNj7>p-Fv&Q^U8Jlj2xK\|nMWZj,?ӣyI`0ee׼]XnOwzIa4%T|"a Ipsk>.{it#J`u! -Ce̶0I;4G=ZMS岺fvԘc`Tfȵ8/8<4|O&@]&<K8^{c 6e; ]Id8OzE)LN7#ᾄLO8Gt)' *{txmh% %5 A>y|Nj+ Ώ5L+!Dy1Gţ5+Mxe-2B&Ktuwu&^>`^{R+'QŇ@!f;ݘ7׳c-&Emf|BO4s a{5?#ZxYϷY(At~d[];t^J=J(r{iaJ6 rՊ/]9-Lm<, ̵Gܐ:ݛV~VIX^g(KM-vm:9 iH>^\gx`ra\Y{o m elm ^=5@e*ˡd3.iXK$n2t)$(Cʷ=wC:q#/lT"7 1(s=[Pt9ˌyJ .ϟ+y,pLRp bR,~$}G:B8y̻~^AЏ!Y!S^_sfM>S$Zd%1e Xz K{/dzĴB,% UuI!$Ml+p*κZ'fb+GeBidъ&5snǏOILpbG@Cf*ag.[Z|HT'-swQ(jde;Z8 jpJ|3` F*-1Y?Y;b178:R0Fvj#R`ITx)Q"-3ZuHȢt,]{i"Uj8W3O88oEROabq{E . a R﹧Cj=8ҭV޳yx#9^fQUU+K֖Y׽\0⑿U#I {0=\()SI@g7 }//]lQ햛``Ҳ f+KjB`{ 4^(a= rQޗ,By/ïaN@`G;bm^6# x.4w Xc c Pɣ2֭y%n3gHF sF8J%:̮%"V|$|O wj`[_.=|qNGz <;t11%c4ⷜdy p)[FDnxLSlhΘ ,n[NdP!ۦ8 >[+NU7H^:嵐)-2F5 @JZo3Sۙ=y=ʥ#9ywI;bR59'45q;&* fkQ7ύ=ײrJJM'"sumzWRb tl$m׾xr.}9[dnv3ڀՅd! O4.۪87Dj5ݙ{c:NےTB=PՇ o+1z.rwz uQCy`*$6C9Sa%L "Cg -|M/ <ճ_ޑqVqDIQ9mC#_`ʥc'MEloqx}w9\{K"#h/+ i0L9"Ys]'#gSm<\U`«{-SЮMlFp"wt;(ݵ{wXYݯܚA ˷*\ PeEf+]x o^#q@6$&P>.{_4IJ\5xfn,Vh˵wۅsc;z-2qnTBfI%B 2:=]ik >o~pK1 `}%9ϙFhn܄MB)k=ϢjȪ1BCHuPNϲaȧF8a[,W)[fOt3:lh{Ox,(B!%dE,LD*?Ґu CMB¾I6PFNq5lQU0ҺLrrc#eؗ5\7ƒ2r_΃sh[~ Eݚj x`6|{J|N\A bO&]Ū};u59ۈ\ C Y|tnӁ`e\ ,r+(߭՘nkxoxپĺn>QڠU_ z얻׍2eDLݎ͊ )kGq#Y1,dUPtgSyNQE,>坁xӔ&Ҳc$EOis\>NIP-2]_EmVtHZ-fw7rin6V=n"J1y#}!ޒm\7scne}88Kf#o\[ؑ=5xK6!a`h/7&pĠ&&kt<ߪNxbLp^-eV,k臉 sd} _ylldSR*aq6ddT,S-InU棇R+]-*5&ۇgI x[P#)B4_m;D%~|!]W:.&A#OcXڎDHm`#Nόfc,ע2ދ!"g@<GM-o곋<) 3AR}baB;~r/VyΜ j<)<粈tˍg+s[N:^wԖzJi5Ֆl^, S&` '_ Ge賍wNGTu\2i)i Ra9> BڦɌOsZ2s^zasɇDД##sp UC %OGEx ٱ˻3㥫RYbr4ʛ7hrw^ZM9*3wq2^Y? ́/ A[~cA@ުrFt8}V0tioм<}f*aef#L)0F=V^4fu\({mgv>BG+YZO-RHe@y7K+! mgR5 Kb,A7$1͚@UQ NJ 'whu:GhBa"f|T륷Wl8[ņW<ڇ|s^j d FF @izNDB[.#t&A@EJ(&u=GQ> $?U;5|̍ šWA+^IrH=̇ Q!Rs3DEK3y/I 8y  rRr;I[B[׹1:2=U~Q~dUn{AWj=%翉=k¹)Mɕ+^bgO u=+{$Amλz^k rC]]˅ijus7X|QБ#`.ʶzkA}^垓'òf08݄pZ+„:Iಽ[ Nփ&-ILJ)h%aL9/v"?4~iwێiUwcX~P8\qaJhﱨ8j$Y?i;q>$LA~HhaN^{z Ц=V}l<{4 qQZK=B1|)8,1ڸ1za¥t& !wأcBÉܟ#Z6wƻ :xT˥` YKjUe5_e л\p>87V&8Ds0`6ާh Op ZYb%Μf04);&M]9cǓ ],/鲖Jej$Pd[dd{/Fexz͂-Ծ]Kѕ[aF5zzQ:p.z=i7H}~^Az$kfk~FXcuud"NE'U`~YK<\<230'Bkid:pӵ9I#N$t=s^PY/;j|s,m8K,Jm@9ԛVWJz}9 ; )Dm Iʚ< cAj@`Vt>!g=4T wd6Lf_Ѭ5%=@ Z\q3B.w #Xj\}S̮&Dm^}/Kp7^? 7L0WJ6ec.% v,3d"oc b z2'=qބ,@ފޡ->suy :_<(dr[1,z[n xN;5,X٠o&/ձZ5Wp#אZ3FlOIBe# R̺w^U>J1KV3v_&%h[)MsoennOQ U#-s-7'{ kIh܃]ΩRuOكmr["Px؝p깲R&Q!;Rǀ}yrt 7; Ya 94yoe8Q%RGAWsq̓MYe&*`\Z}`!Ӹ::|Tiv,N^5oPEA8HstyA9EF6~]ٞRyBAj`4\yH{*`J{»_t3nQ+iWV2!t"/2{/^Kgًz,[6e=Z(Զ P{ۄOUyPs/6瀲pdνEUZqlʣ?}y{CPxªp)4AϬ<+k.* R{ VBȮ4{ CyuW$Bc6-ɢbnYO}G,+b{j`VK {$?QշۉW!#2r'Aж.k n#猭%nNԉZ*d;K0RS)&Q3?~Ƅ1Q Ih vѹ]~$$!ZDTY5+8vF3cp@C̶sǢ\D{jn:YdNj>#᪴C33D!Ȯte3&xqX-#@Io11.4GeA=$'K_[YV8oǯ<_(i6TF3lǙV,<ގ3dh{1uO5A&+vp ?|Y; "j[3&D|^ZաʧIjlN'|,@ Qa(Qދ!i2Ya ##ޗF-fWPiw OBjא둅կHvs~%`N:p.uX&h+ېs{U 01-H8q̈A'D@nuc@0W"b^u'<沘)6O 83=H hKn,#,zzx0m*ьEB=D|ы-~H}a#.1Oeȑg P BWhJ*{;YO#U]cj䨓=OѶ>n T7XJ*LaoORT?0w#j$S| 0@![l62iJ{x$\}WoӉdayprXsVv+Nw TٖIsWD$3r [ۼ\9|'%tyrK~i LǭC h Cxoxֹd41a^*&RY8 O 2#[Nah}܃3݄slR9yb,Oػ,Dwc0R8%J Ǔ!ef#Ivg4wUu!DY*-vA)BN)uU{H%* Y4; eA78}4'Mq )pÖ$}Lʺr*((pʤxI;J,(1t/J9vuʭ%)-٧6 +=yLho/8h+^&RΤkImB/g,RHz .ީ?8~ʵU7K 񵩠* Rʸ=2}iȐQ+%86&aGj>>iƦg٩n*DUY̪ByN.R Ss9i%Yg/]aΙ C˃|wde)xY>DF0Jh3B9N_u[>KV+_F|sTr4 7ѐxX2: zUy˞O-;mNhpql1 "*j0~3޲]bi˃aC{LH޲揤eU ٫Wթ Gm y.uՎ3 TS#d , vW]3 F^FJ/Oo:i#xLb:XkV$O#xa[j<~XBpD^nzUP)&-PFЕ {uR$xA+s uzϛ}fD ͫ5Gc%hYkZ̈́):$8^n'&Y Ѩ5BF͛D-K*Oփ>YV[8s duYM4>#-GyFefyXJ2D60jP'|`ݗ `jt}-El=Cqp&7&d~0I⴬v~tɢAT&=/=zӮԜz k-^3=(z,2- wҜc6E2 jo0(ED8vf;Cmv$YfDAa RW!ցUO3qMqbzs =\ڍ+}YQgsnM.d.)0ĶWc=H( -gl% Ul7 -,լL@=:i'9]ۺ`ɗ5G]5(N!co5BY.dҵO5isK.ThAd¾P + KD"+%]K{rN/{,nUJ#!r_ |+r`n.pu-*f] .xf [:8/u()rotY(]&qu,3xwoP[a"xԋi u1T!Kr.\bM<>Mܚk +,z#"y\4&H)ʮH!pe{?9qdgf|VUz Gh"]܈"Bz=e &n0!*2J&[!*lt|٘IM=Oy_|J_*V<7UOnd>] 2S%4 eigA=\XߙxE,Nڏ)qF<9Tw~.W&`aޚzI9̶rrAH]vsM> t@g~c]qf+FFk^!OGɝq6t?6Ն= 3OFLN  ֲf}Elz|/LvmfQi3v!z,0-?Qs]yTGQ.R'G=]bpI(Z@S \SߴjuC)z4B)ӗ~x-7)pc\ymoVʕAu눊βebx9+Q]f.#f}ggR:˱Uu Gf<8b`k.R0㎴81Dh"4I\w {L/^nt$C+1ZmSaQy(=]~0/:+٠͎~jY#fk.=[ˇR0Qtg][,7Q(%cA70D[lƟ*M>̀MU|bk>"7gE,$60fvׅ izPDX0әܙyaUj7ϳgI{P;#TӺA"NU3z֜=±U`bz}` dT%@rgR q/ -!Obߺ9:F[s(*}h H2|RƊޛB1xωk|"equS3A{e[=ơTjU+ \$fEb U^'& 8'-׵7otLQͥ%vd{9Ûܽ­}Y*5%䅝v@wW䀝׃1D48*{.GV\3T>(#D{FmWOhRuÔ/KX#x"5r-0gk `ih1ś3CS)Wy./d^;G͠ۄN)/7|L(MΈ>1"RnOQ); Jŀ**^0akЙ%:sf ̙%T[ڍ|!SY/h}J,Ӄ@k-91`x%PvdkvLm+*vI؂f8G\h =hw&"4/OG#7) &4Y%L9ge 4׳BGBb)7A<.=ihY, #޴*@,4U@ ڌSG93 JOLH7hs\acӸzЅ\c#̨ o!"eK \tBOQ^U:"rP..";(=~P9_A R˾KNf[b6>L߲|IcS!;TE Xʁ"^"9ďGlX]J^B#֠Ґ.皇oc|Bl kx{O:b@iA22-Yb/V T">z5]:p ̕쭉%{ QeI\ϖFuXʒM<&Oػ˖M'oop?@mĻU((u~)Vt]ܶ&˭&I-À۶-_[ k!J+ +6uT#{˔"©%svufcfw,im7L22'q‹fBc4ʪ+ @wo# x1濾}C)&nT#H\ [0lmJ:zv?7y? IET=@1F/`F%Pl /|.F)Ѐ|+$H'h׻ձȬv9IѼݱ\ ;C+)5Ľ0I9ڝWR-oڲ&ud(VCxDThok4{-pdV,GEogԫ}FL钛\}TcD!w2 UCE1 4>ZkjuۛEqNʫo{`uঙLDPmDN K=* "f0P:Ĉi1X\e m>Zs5w{.9R9P'$d5pgƏyqD) 8dAwEg6Zt%>~C|kfė|F Q]ɖIf,M.=ܗ}{H뽮~Ź3P}'Dfuox/wo.e܀=zg W#pSSpxNv:2Biҥ蓄XtH˦\ +1Vɻ2Ez Gj " 1[ӣk~p Yv-K$ f(PC6+ TV,:bԀ:jQK}eLp`mqoByfO=&eBʢԏs= ųMkC F8 |/Y6OyHxu_!cJ~8H& m"UμvqW$# {aTN qgx~ BWʭv'&|"A,Sn-ޣ`n\;60(Dx SHA4HL sHpr9J1!e!|7(CIHaAޓ,w]vmE+תּđn;h!'R4@2GZT=(~̣\MJ9csH:pxdp޳" h=c۹=;P%ҖJbsM7:bq!tI==E∀fFqoL٣A20Nf:BU(d".b!8MXe+ʃ7K&;+ޤυ^WGTEuH//MfJ"AUǫF4KeM{=Py0xLoyvAۦjJu`ylsk_lXu3?E }o)}4c=c@s#j{Ր._A^u+y?/-*Jq<֪ъ)&D~÷H8Q'B'ۧ [)ȟg5li)gÓtlg ʇFx-A5wŮ 9JzSZ4¨ܓQ\MY-C\iYŲ`YU*nzm[ȤY9 A {1PhL[»K@0v <{ Yư[J'k^i"Is㛨V[{KlZ/g,anhkR+]_"&crG1OMN2H]!6keW \XlIu41$Jz-"\N3!搰f̈oվy|HrO߶҆_ZdO@Ϭf<q0xD. bikØ.fgG j*w,csdWOfY԰<1;dFn%7} lϥI3R[U͎aENͪ U{:Gl^|fǃm!yᬶL$aew!zVؙ-6N˫S351>ϙX1#ٹa?U?D QA0), ߑ8樱m]2r9aƳNi]Rۺm%(IY̾>?z\5Nvli/>.|Zː.(p-[>/?[=lPKK&};mVETxt*W**;Te>y$&`qBzZ9>\u7@/l,:56:'`qŝ( <=C9;ϙl$x.Q1u  i4>7(CՐg紗!#-, |Mg6rU:i%³c'=]QԇÌI莻lg-t ]f[ RnTh.֢>R5;3'Iʖ|¼[HE=~٨N+>>aN!AIJ/!-{@Ygsc!.iޢ|qRʞs*XWKrmw#hI zwy y6dչt9\ >t}&!WsI8qf l ξǧx.sl54V%"R[[c^BR|~pA)L]ryop턩+νO_FjqPdF&h+(S1@ha}n=kM9]rX&Mアy =Opw{ 1A~F ,j%&^OQ>md=wNϊ9n [3%K1XP}l%PίyvH0Fb6F)Gpy?13̨d |2Ez5lcu@1Eo+<: 8>}}/ޒGԣdJ:N)-y%"BQ]9NC;ԝ)A'l& |@ni >Ul8{; {׮\9V퓎lRb~ G-YYY.yF1ЖCjy45uxxlP>BEۦ3=̜UbSֽ~ϛk$$X 1۫*3S"RC"\#_;P'b1H|t.v*F ~B)h{HNh|v^nѥݸZPeujD,2]z8#1L5GjfqS GA 6eQ)sEvc#\~w0< ԌYb=c Q$FE6a_ಽ! g$kOF(vod009l 9ϑ\?[W8z"=;]Q3XF7V<R ^0쬩w$XUO4R]  0`qN%=ՈTb%ze5j܉@87vk^7]Y; *~řh=}|ٯr5HufsE(4 |K3]+quX#StKi@hx`R-OP2ڎ 4Ɖ` ǒi x@RMCSs})\]P#K.\-2>2|(^ {M]LQqEC*WOd`1p&@kHd9 2aMm{FUWTYʣF ^Jr(zTAg*]n%\w6@GQ;BӇz.ZI9^(ݕe_%YFH'|ݮP;bMjM>F FH@SԾV2\5%U'3FYO^A%YuϪ%ng4ĭ切\=Nl^"5ԗfhjqW"`p%MEa"BA^ z[/i ) uaOt1J4B"ࠚ$TSs7޿EKf\yCc,q-@Uŀ]7½$=F/U¢K!{8f8VFY'E?.N,q0 hF]0gy󠧖rߕ^UuՃUE*m, k)zJ׌l" Wwh5ʴ mU l5 ;NQcʏh,RfMI¶,zx nӄsKzB_=0{;"{jMЈZL)7\ UξDx}Û!NfXbHq6V6Gly'Vmb/jnN[}qtKCOW紮^z<꫋:=et+7!ƻc¹!jK7;%r[(.gO3l]\('K>,{WV98dbr=0)F}{Il3MnÌՄýʘN=xzo )RXJAH4~tQ:Uw1օhv2IsC,ZP7a؋3MTh'\ƘW"hST-wLYգ"ƒ}B 2}Q_$ޚڝ̠bk#,TI,ϒҎSni͑XϾ734cG%/PK_e"Kz"jK"*#B3O|dߢ+h3D/፲ ",voф0;D]/ y))Hôգ^ ^La3ȶeiN1 F8Գݮpz`K  ;!cc!*}9i9M\CF!hw1J6tp$YEo O26٫-9{eȷei>?e~]vꕇÑye{$(zŠ_hoIU}Gϧ;ڵsYa,1]ƀczU=T¸BC4}B h SZv=k_>;8syoh+`R ו\Lr$ܒuFֹ[ Q`@'C+[^k;[3]"aYݱ.Y?ObAp ;{X퐒0y#ur.]ٓ멬z SSW,\)nDm@|F%elSKИ+;|z=O3 N΃ f Ku='_!G$Ft} 1h\l٬8029E[ytxE,'Cfځ/Ct; z)pĆ+#MOkjb]w;"![4gixCCfx+#<|Z5A_J:ӷ{gv wJi欓fQ+^dH"f\͓yROcc%殑 wNg D@zvnXiR%8=ǯ7CD2zSMRX".9Y16 .Qu]߻אnm%vܷrw908x[T {oQ@rTAxE{ʚ [}ϟ1>sHN^0OsyO'"E{BOQgF6m9i=ܪʳRts|b_E6sWAflC8۔+=9.g(ݑY?2i=M2Vtk07N.µ/uF6t]jjd ̰Q;WH4A?~La8L=}r5eku '@hG>tftt #X)^H(֐q8[=Y pv{GWfI@h PrEmxus4#Ij;~y-^FŽu$YE^$`!Г(Bt5p )Ǡ{$_E&6fzqK6 :*>+}`4-Oh])s@lƞC_d(2lLoOK8V[')44<}Ge$% q_[AqzJm¸?5L=t]m@૽PfBs F cD!Ϲ"c.r{b6fyiq-͡j;>ݞjYU8J4ߑ Jd]JG=XV"t:QW 2sЋigm)y<|/6`y)wl4m.?ޕ"d蚮LF0rk FS,,+Yk齘_ ]37Kd>^*Y$%kW0 smFBoo( +$w)0'gT7:h 5cP׾r2T9-wz=h(nlU/3W}Y{@^.YEh&U X¡xj G;[ FnߡEν/:+)|| ]NsF(bvr^t2VzC[#"܀Ge _3w9צ-1!hrC*w:sEm2FA,ϸ;{Y Pեn!<.t| O޻شq KFxIsdOFe$+#z& uR5yךOr+FS؎wJFa _._XMQ%R$HAx̜ mO_7ئK*7@ؗv6)ƫ$Pؓɕzb!W,Pwȴ/7 @cyI.%8<3`3B{щw_LA6ZAyВw'Vϰ $rCnQfe0OQXN;dz;gI斥E#4 L'.]܈yp EyE`Q :3mzYe.4IzEk<اt$; VXЯk*?>EK|\/#|dgo@JQ8w4n,#WΝ `gj4vRʑ=0IjnLan* Pt:Sq=g|ǣm Q@8KDZVRW9i{z~ϕNLpyY ࣪#r cI?PφeqD"txɡ90MYx?hH857wIWбr.*HzAܔW' jR 1^=6r:sԣP"X4< !jQ:dW4WrjQda ]5աD\վ\N%wزr1Ρ 0T]gg_c %S$e2ENde`͜=WBHQ;*_=²~5莜aVΊ,Oz"-~CN6#3T[a+`:8 eHW{t[`ZECn ¸uyɼN$(\ 꼌!1[)V l:l ;1(4P;bx P*1CSk+ʇG(R͢z I2o>bV]BĬi'Q {]$ XO=@ՌP}a/[Uf$R Af^,X \ e(>$Wt ,z5njFvs"e =|.\oŶR`ZLiߣG~T4@!qƸ`Vl+v!_\krF-ywKc؛ϫsL\[' yD(5pNΤ"SQqPhs6N #[BkUt06 +{1ģ̨E[|4qn8{û`=x jxf%18ZuEa6!Ϭ'UPQ1j-xch~n1!1POq{6iOj:Q7.3?|9yQ4R_x:%{CNgK&jQuc~ꠦȔ, s]A|jYa$8 1>{霯oE])MMdlM?!`8ܕa'|K/ySAǽ5Lgt'sU:!Tm/q4W; *#1a~jJS W΀VH#}8x21tR[h a*Ey?Mλa}s:>R,{^yHe3Wٰq&P4=)w.^iRV=&O EoC\4XzTM=*\O4 IiScJ,+ţEӅAR"κެ3<+b`MF)M'Ʀ1B&^Tl:T-\`2BE|9ncG*{9bZp`nŤw!uFY CW}= %l)~)_" t"r{lUVQcbfn^A(5q^\:Y>$lI3uSωjoRlPz^  $qJh0N*iGMpV}:Zp07NJLuG]pq:.̛{1/T/{_uG*Ĭ,0>$vB];Nh*=쀇JeF8V>^qN&ȥK]Hmȷ*d}2"} ͳ)i":QCl{#>JfxP,=3 b=rw.ϸ{oYLt,Uc5+}[%f]P0TNQtnyG: *٤M"NBzc{\R'O Y87';څe6x )YxevQr`{U_',O7V`B$]|UIL3qS ]Ä|x[ht["`b2Kvr2r?$g=WԜ_^5SSS͞!̟bXfZ x5z>)1^A|Kq;tV}qjF a=clk9t\}APYOoFPd4of@'SDkнE@v7=$ =kjÁ// pۥP9L^:UiC 9!-YuI{7|2bS9 2QC._q"H0TC·M` ◜B,1;Py:;>Vx vrhħ#^d?#[Qn(zˣ R/sS3E0p>0'rMt6+$%xoXFZ7t7GP@io"?¤@蹲<كx5m,[E-lw\MvTuHA5njߠ }O*m('4kS8+'6j_&ś6|3]S }CY]IpGt9 >0[C̈́Q {,ҳ Y#"8ڵ:i%I-:x4Jѯ*9څXҦ,4 s G՞[h^MA,KrMؑ~0I8Mrf vAc73s&دYn.O8W/a|jO{xN<6W-`f]k+:xr!9nS/5}.CHPmcYUrP~;r-RbY7Ρ .wEr\pPF`;hsW*gA_}vǧt(`V {8) ]H+BW>$Q WHhW`NEI8)dt4l{q%Oh2^"yqQ0xOVn$ <!T\T@(8d^ Yi.Y:b4P5H1SU FF/8|*b;<[p@Rqwt,bW*4zԫwÓFas0"8p4L![]B{hZŃ5*ʧIYKO ʹ!D=$nS'ZtZ:S,卛3+–=yx\c֔ fÓBMҮ},@w)sB˗+$#ÆY5pS5aX< jw.`jRfy]3m3+::Mrl8|i81F~Q+"vf8^Z{LS#AQR>{T;~$$ӓ &6|C2ZW'NzsS_Om w2F?[}.QrC{$93Y1Z.j3%TC>ի~%RK*(nlHv%}dI`)id֩7 7fk!;x]v[,S^>$67qMsoT#(Ԕjy?dBgF4ᱩdi $S˚o|0컨:o*t2ANqR5"VXg?"gP˒uqŧP6H[g.(o\LS'M9}Gl鰘9 ػ,3~T*`GIO XEeNsI>o$4<n*ƨə \35sy|%x z(1'Ǝm}VQQdnjHKԊX"]Vhgߌkie5UxfqЭOګ uVBjsͭ ލ-oðۢ/wyNurme`1=yO!C21Zzb1P@M)-7˜_.H Ƶiǹl2f#=,ܩRe@D" A`nb<}*/j'vVis"f|C5 ,{CX?)/I_ "Uhj/mPN=І'ɰm^IT6> )*ӠJ(,Fnnc㫇Pc@3_xvAy{5JEfr zKJ!PG]Ā=j":apE\1zYv:?lH~{,MDګslݹt=83ц"i8ʡ|aY.ޝrZ[n8z}`sI |w-w C^&iqV.ɨS91 xWTͤKdj H 79=!=N\Eu^ w4T!n0HN^֝,Q!cB&Zw=hJyX~\%Q<>Xjb!jI$m8!gDq'vh;/a?l>=O[س~: T {IYC zadM:k8ɚ"] Cki]hғ{R:^D=R|mO؀^JіDFPͱsP6d]RC{RX&]OBt{}NhʥUt{!(eh5լM0Fn>vyb\lV{[oQ˒^m'ާ@7gawh_xOk\KX^Cyk3{D׋]+A߅LaCA2ϓw=w%Ħ{y a6p1OiCJxT/4 ObyYEMΊꭈ>-N< @XQ|4xhy%9Y񶃐8.ױ'Xc. .hǞ&,9? Jg`a5.LowzYYe|BܐP,\7N0pyRb/뺢㉷o i2 n)^ͣ$NiEʾDGy=9 #ls#mC GBQk1|&,VsdMKĴ슠^1p6MMOD zt$>(lxsC︹;*?@*ܤ1BzI =MCwͽ 7&,T JIet r2 |h@zӎzUpZR',W˨Ň zo6kQf\"hsGT Z rQU$v QxRlwcLm kM6O8 jeϷz8.Ջ#l1FB`Aif<\KN8 $"! \\友9oK֪`0. Kb{. *//첏u^%7=Ұa-o@F@\yn% cPlK>5py+d5]Ndm{ Dz2l6#؉7rwx7)Eg-^ܐ6]%rB !aLvb$7~n%^̗@~ɼhV2zȘd|BW[V%d;zçH/` ;>zh@o=6ٍ+R IףB=Uq5 6VS)(] i*OSToܡQ[q@6Zuߦtv1f'UOT wVY|(Wn\3IAbq+ /(Ðͯ({PۖOO4y$T 7ˇuRj>6%s'4xTteXT9= DPOllݘW& 832 WKg ;407K:D `bc+s3,T=°BLu {Ӊ9pȦa|`Zz7(0|0f`YxmŻkVXKK:na7QGd2>p{)|q߉JCEK"ػ2kWZsa!g"2 fkkUNq-9y@۳*zoմQ@}y3q.g^qUxz!XK5a3=S}-YL]r㖔7YNSq,s00A/[sX|{FTS6Mѕ3=f{Ўm˗_[AI?3*VlTm+ pyS.V(AӞN ݥ4mpˢ_^=GV?h WRTET#ly7KҊ]DcuDkԊݣ<3ʀ{Ѷ9Ϊ4+8}U>RQET;+g>&CC5U vڬ# ){tW:A}T1#r<'C` ]qߌfՑGtf ?~j@UD4J9P2[C ]T +)xXbyaxݹ$o;_TﴖًMTwF0\=NIeD^o3QD}:@u;fvՊ@.[s9!_x OP;uRA WCyRY@Vc@Ol֤҅W9FLmHTccMRrxmԯ G!"qyV7lt+D̓SAbL:oYՒC2Pl pC{WmѤ.+ Y8kI6)~DhuleHu{߫A7ŵnxӬ(fr].$涎$mv۰@F4ʥM;"zJHKlO Ok#TON3~UOa>=Ն"~1FU{c_SfDp}]*kɡe {0%7ܼGE:%{U+͋ON3C!#yǣ.[M;7J`swޒD<${Wsl؎Y 2@^ $Pz3X9Ҁy#T|o(=k#|h+;vHtxt\撹||W8F3sq/S1GRhNSe_#^C Q!~znjwL4d%XX99Rގ f=&cqݣOe@=O4(Qwoy @̫epecueW8`6 +f{Ct U/DK41 K^ []\P޼qE ˘K`dyJ43/b&:͗O.Q\݋F|yu~qP2:%(w1 lodP:360҃v,Jk}{"n'z>x{NiS ir ܝx_J{>3kH%L.r=x~&430ʙYW%P8Yh>Q.zl.eKNW>BVl lpP z]A'"ɟ hJܓ%e27!LȇmƳP=::O&׳b^<ė 'hJЄ4'zIthؼ^]/D/ŵNP)Wpϋ j$uv{A"aN>Tz1yhVز2׉Ѧn6EdzBnF3{SXuo_KxVihWȦ:h5$Ue"FaG mCqg apGGC5OpnK4QH` I2en8ó*E jLeJ(^U-&NvyHت`!zr2{̘Bzbngbgӝ DXVzCyVJ'S> yȢz][)DO1'TpeIs0C@lwe }!y-ʦEa1|PɝvcsS~b `/{[{ًF'N֩Dg@@:xiރȔx p^w@cVz2=7=kR7ROn`FL.U 8/(j8f;wd~ zV*/"/Sowf)46w%ˍB<+Ǹd嚀KV/2˹~8,&qhuq-s1zdkb¤چeNt$٫NxMf0:l.E4$ 4! *}BVKQEhyt˒SL(n轺Ge%3Lu$' ={t}@!w\)] Q³1Sؼކx^ɀF)ЊZ&<5+'g)xМH}VW"2K{k΄xgU-HCC9f,0tNlDW1(&K).Y]"^'QW!ZeJF޴w8RzGE@& <:FrMneʪGy8CRBSiL NAd`Dr>O{*a=46ZDU |XBxr-N 7S;b=IʝKVsEc.^=rRBl?5/COLWe;EBH3w <|HOxg١ǽ H8)(jJCFM餩ZU+wnz5Wx.D_];ydXx8J4N,i/ǔVĽV*>2g*46Ң 9>x#w C;]q;w'o ٹC̜wɕ-Z.ۭm*7J[]XQG d75"Hʉu>{UWǘNbǝB98I{0G|iw$P֑^ao8$+02wAjzЃztOw ߡ@t?FVAn N ǜ6o\!=$ 24 eD*7kFIأpP Ȑ!g;k Ke[xͅt-QQ`HƚzS>7c-5Wn;8۬7@"^sҫbdm& z<甡4/ )^OH2ƅjbb7@q{|΅۸r˟RX11oag޳yqp8s(«e0Ͻr/T4ҟ$X.A<]仧I528Оu` =iK PLZ#[ LP( >7k&c39xho+.ދeU> ~φ1)5Nr#*5㡗.c,Gһmx_G -ʝbK;)a!OCyh)X$L/|Jnp^S҈.%1RD҄/3}(Jj*y7Ѽm8H4d硃 dk|8-y~uXBϼϙW^^S?nqloߜV:?v E`;)>zvgc|CN\MHe3A`3}#">4N/-l.8϶8\@:q\6悩}jStNEF.8{ȠI]Ҝ(pI{^C*[l^\) \|\x-1Q/|j= 2^R<21; ܲNeEBmMdJ(&~yVXYAhᨸCѸ|IK{(>/Ln@:ZĦ<(M0\[i A Q?v[`Ag1mdq3nNscL%҃I;-$ܺ=dȣ%}e V= ΖIVZF9<oy,cؽ&s|/Hffj[x1=X"qRȭUp@A^d 0ɭ0u$y!Mk:/WˁdV Ȳ[}iu."(dM{3tzЯޠ\=|ni.,nĀPOS5gxXF $>%5,.([vLc}~}rTі#U Pvko\^I7J(7!+rz,&T)W3E0N(0-xRs$$BFf 5:U xFC[zp@mK8eXfxh/H>(<1d1v?gZꡍd"]%=qBAYTfI/85H$ L8jӋ'ܩO:E{PƐN!3oB^c6#b➠sL3zotSsx* 9y1ֈ(Yޕ`H*|'Ve '瞄&upzT!4yӖ4ԬjSM,tqelJJJqNwؤ)uۉVz>}*{)DLв>=מt; vHT0.;om;ٜ%6c]p#&n $XzRw23;g-#L&%t^$S* yʋ<\dtj+~ZLgm 뚓<{W^'H 49Hb3iۉAI_Q4V3uݑgcOеSԸ{b!5ذr7T0tF=jEyRnnjOgѵ<^5{ )Ð=]r(Y ݓrȕpB%pp VkкSAfhu|}BJqAsx+8(sB~oNtǮ,=TpkRr7f;yJovpī$1mQ Z"{LPM<8"27vkbD 픅 ܀ťY$3Q7C[nzcj訯vv8ra>밠-{;= ҴT( A"P}2':@Q bg oqppyv,sFMW2^ p #-+Mks%+zK'S^2>p~})ȹE"$j(ib^ [+a8R~طhDrb&lHXMIPgVR-XSK;tM%D>;R ^OC }}k^G$q1XpZDF' pO d0` 2՞Q%x3Oye;"w CQzJ+*Z'> duKȈ##ٕ Մ(ɉ7{]be^?D;@Usr B# ƞ"yEp,C/xYdcW."f z@JᎉbNd㤁bEcɬL Fyr1T 5v _V>n#D{~Zn Yo'ZԠ]oIgS0[b=\L5{"Qf^6DJ6/eDvpD15_ZcW#y.RkէS`_ug ,sFposȗ  Г7kȮ~L^)/%~n F(lQN*eДRxB8DPД$껥N!ד~ikXnn20鷱Ddi{0$%#cD[*cTkI y4k|CAVd4W`f? ZJzVjB|92ٻ'!+m0q@\#y2>ĶѽzjK2MϟFٞ]hÛT2Cm5ޠJ@s\MUDZO1l)o-LVl*\&W2<^BAуB ?}GJnSU10h%.iH:c7VG_;FŧVw˫hW9!#QQKfQQVꉖka;=l+ArJ`z7`퓤猩a4DR^Abda76Xq+łqneD`l Q&MDf;ӣ',ّ6.|h=*l,DH0EC Ee=/H( %6,1O`,:yMl]x] DA5AfsΖyT5 @^Yڊ%^>jjTh62idMkX("ַƋPW$ln bt  ^=Qu]Zo<@\q.egCh>z3,/9+KU F~,V:]6խ+i!d/!w(T~ CYFf:, #rN;2{w :0(C2;"bZؖL f^uB!Jl b$Jw'-@9>(mV/*pr'ڞseη578'ypY=]ώ#gE[Waf9Yd*H%mNz#Bū{{#b4#:gGa"]wP+}Fx&ÞFMy2E.e_l^=xQցY1,LJi(^𠡒,CJ3UpqPfLUV0yK8fT}d6I{w]eX}&7Mm)I _vGm%ݣf]hD^ #;:8hS[tKOCH}+eKX(3)Q\H)\ ({O_\V~p.cX@DGB+?>K| c`@%pfDiD\=.sa^%|WIjGiʓO 2EE?Gm``$Z<{-^DJD)O۬{H7fa@#5aGeӈEL;їjn|7J `R镼əbܶҢj-gţ iY?G2"'9xW"SAcbLd6X`8Wa#yrř`b ՙya*I*JS^2#wyֺY2ӓ!`UsDg干faA esHj{˱wu>(S2* i24Y"}C` ɨ7b&ap^ $]2&D"NK0f)S84~VX0oMO؝MR}aT.FZ5C\6R-1z1UBN:olĎ\LA#1xzzX]= .bC~TCSN/=X X `c;;uyypQB!Lq\<|wJŴEwh9g={k٢v%mk#C|xϣ\Vx^ǫ\IS'/ͭM >BV#&ZkR]."Zޫilw 7ut ˆWC '{_@"ӗኌ1=2aFŝ&-k CN>$R=_uI+ֵ]ʤZ ;77]3 Dڢ)r6˥e`.+KH9(I/MyϠ5l>kкgFJJ.~O_ͪb.(|S:jn6 'G㞴{glXN'*~sY/Pyљ+'K8d;z퇈 ƥ\;CD{WZl*± Q2Y ( ,eyn.G ʬոu+O-XcG0 {꥛S/ߎ`%K#Q ZaL"̙-# U fag~SÛF(Zo]әM9≆&u5L6S^ 5T,^j5"Oէٛ}J|WqّCN=D%vy+GcW aOd穙x+DR];k)@AU".1,]Kȫ n 61+"OD=SD@Χ-Bq7f={ѓ>=łYLY_M8v^[ !PPOŠhXލ~.jdѪBA{v*y MxV,er8wʠd޻iOҹlVKBrzP!y4stsJ.D.}%:KT` {_ ;287u(wZ'=>H/Kͱ&b0085Z5b?&¶V,"kOm:#:<(F R؜X?uWI w04}G#Ka|-ܒqB{(4={:TıtL^#()G}PqPoS;\E'Ĥː6{r. _.Ť&j `Yӓ= bCe"0b!$zDL =SmusV8Y_{Z!f\#[v,lAUGpy;kǙFA+p4:29`nx*j[goݱjCGc*9hH<^]y9yw !^nڵC_]5gǘQT-"f2 Ϙ'8(TuQ ǕL06hLdؐe΄|G+_۫~,wdԆ0ϑ4 hUySвSh8w"@!_Lą,}5dpW#+KX츉[+"dxvrbZ^:HhUѡܑqZIl G\V?q|unƒvO=R#IRw 1#mA{4cݧu䍤V%֨e7VR> FI%@t͙{gsSԤxsޞ?]MFWAaMk[ q:'&RXVBJK-2yG2T zM"bo;\9GN¡rSluF)ej'h+I{2U\vh!*U&%D${w{7LuNRԃU,_? yl>,yui5}@_!'JJkp<y4{9]y)g L0>K{;O6|4z)( Z( ?u'¡/P@8]fQzfGC2z{B̀lX)|e&;Tiqsbn>WLOقҗzS<51+pԲj`4Et6y/ɍn)_ @^A18C .{h0CTϩ080HϺZׅYoTv[ TT"sIYfzg'MȲOteǭyEYƲ= Uݡ[*z;Љϓ]F9^RSrhy4x8 *HzxhzݜJ >%@yY)B^Y#ly s_Ie(D{#NP6O@&_&IƼ;be`z%R֬MHb"jI(W(olߣ> >7/E E)ɃAm})NjZָ4!hRqG~td]8Ãͥ&g%TpCJ԰ nM69 o1̖[g&>WqHD3,|["d;;JSz+ 7gҖʅsEIXs%N;F\=z/Tߨ)8VZ^@@?N,> ~)SyJخA]};e J/z9捠t|#bn*ѝINwyVznMi[ 02(C: Vf.yS2n|b|d!ckɧ{=Qy% {>k3hR"+1E׋iJĒ[2Yd=7J`J5.f=v!CW"rY^qD&5ӂm8V{Tep5|+qH͠*kZ_:Rɦ;=sqx#{Vח:'D_hcnIy U[T{ѯ]^{"VVJn Xx"ZNJ)8-0S|w'Hi' "5<礲<ͤpT./SM+y +;L 8V+&*ZsdӤ*6?I}4o-ɱk͡'Ț↼zg80~o A"恚F"*#R[.ߤ_=jq T1A.Te Vph:}1v8=πe6\ȻfюI>H<(qO20OՔ 6xŭܧb٠F(Q/c3&VjBi3@kMQ">W^0/m\0^mؗZiYfБ72W':3Dݰo/&s,B(l1 #,XNk|B! )cH(LYgSLn2xiIx"#W?|1t{W)aj>zˌ+PW\Vw":Edx;HKe%=,kʋbG=`a70.^p'ºL<4|V;BER0")x^FC.vitl[$LYJ0x!uattP>܎Kּʩ%$?r{TC0q^^?(!^-Lu7sm=nLJڄwxӎZv'""'jHsĩ6"8YM,poCўP u)ş:1}o,zV! RֳFDRdµ}ԥZL\K`_sPNյpER9?"MLBG~&F#|bf6IrNܥ!i[y̡S汪glXb Uc)sZ8'6>qCdt H9ǚ𫇓RL$DJ?G;z-MWиOT ѮbxL[TĞ餔5oق [z` o\|,iJVrޭ?golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/xor.go000066400000000000000000000006261365325520100245110ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64,!386,!ppc64le appengine package sha3 var ( xorIn = xorInGeneric copyOut = copyOutGeneric xorInUnaligned = xorInGeneric copyOutUnaligned = copyOutGeneric ) const xorImplementationUnaligned = "generic" golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/xor_generic.go000066400000000000000000000012501365325520100261770ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 import "encoding/binary" // xorInGeneric xors the bytes in buf into the state; it // makes no non-portable assumptions about memory layout // or alignment. func xorInGeneric(d *state, buf []byte) { n := len(buf) / 8 for i := 0; i < n; i++ { a := binary.LittleEndian.Uint64(buf) d.a[i] ^= a buf = buf[8:] } } // copyOutGeneric copies ulint64s to a byte buffer. func copyOutGeneric(d *state, b []byte) { for i := 0; len(b) >= 8; i++ { binary.LittleEndian.PutUint64(b, d.a[i]) b = b[8:] } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sha3/xor_unaligned.go000066400000000000000000000020621365325520100265330ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64 386 ppc64le // +build !appengine package sha3 import "unsafe" func xorInUnaligned(d *state, buf []byte) { bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) n := len(buf) if n >= 72 { d.a[0] ^= bw[0] d.a[1] ^= bw[1] d.a[2] ^= bw[2] d.a[3] ^= bw[3] d.a[4] ^= bw[4] d.a[5] ^= bw[5] d.a[6] ^= bw[6] d.a[7] ^= bw[7] d.a[8] ^= bw[8] } if n >= 104 { d.a[9] ^= bw[9] d.a[10] ^= bw[10] d.a[11] ^= bw[11] d.a[12] ^= bw[12] } if n >= 136 { d.a[13] ^= bw[13] d.a[14] ^= bw[14] d.a[15] ^= bw[15] d.a[16] ^= bw[16] } if n >= 144 { d.a[17] ^= bw[17] } if n >= 168 { d.a[18] ^= bw[18] d.a[19] ^= bw[19] d.a[20] ^= bw[20] } } func copyOutUnaligned(d *state, buf []byte) { ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) copy(buf, ab[:]) } var ( xorIn = xorInUnaligned copyOut = copyOutUnaligned ) const xorImplementationUnaligned = "unaligned" golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/000077500000000000000000000000001365325520100236035ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/keccakf.go000066400000000000000000000233441365325520100255270ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64 appengine gccgo package shake // rc stores the round constants for use in the ι step. var rc = [24]uint64{ 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008, } // keccakF1600 applies the Keccak permutation to a 1600b-wide // state represented as a slice of 25 uint64s. func keccakF1600(a *[25]uint64) { // Implementation translated from Keccak-inplace.c // in the keccak reference code. var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 for i := 0; i < 24; i += 4 { // Combines the 5 steps in each round into 2 steps. // Unrolls 4 rounds per loop and spreads some steps across rounds. // Round 1 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[6] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[12] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[18] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[24] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] a[6] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[16] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[22] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[3] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[10] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[1] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[7] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[19] ^ d4 bc3 = t<<8 | t>>(64-8) a[20] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[11] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[23] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[4] ^ d4 bc0 = t<<27 | t>>(64-27) a[5] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[2] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[8] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[14] ^ d4 bc2 = t<<39 | t>>(64-39) a[15] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) // Round 2 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[16] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[7] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[23] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[14] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] a[16] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[11] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[2] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[18] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[20] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[6] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[22] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[4] ^ d4 bc3 = t<<8 | t>>(64-8) a[15] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[1] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[8] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[24] ^ d4 bc0 = t<<27 | t>>(64-27) a[10] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[12] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[3] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[19] ^ d4 bc2 = t<<39 | t>>(64-39) a[5] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) // Round 3 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[11] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[22] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[8] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[19] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] a[11] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[1] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[12] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[23] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[15] = bc0 ^ (bc2 &^ bc1) a[1] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[16] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[2] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[24] ^ d4 bc3 = t<<8 | t>>(64-8) a[5] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[6] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[3] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[14] ^ d4 bc0 = t<<27 | t>>(64-27) a[20] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[7] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[18] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[4] ^ d4 bc2 = t<<39 | t>>(64-39) a[10] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) // Round 4 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d0 = bc4 ^ (bc1<<1 | bc1>>63) d1 = bc0 ^ (bc2<<1 | bc2>>63) d2 = bc1 ^ (bc3<<1 | bc3>>63) d3 = bc2 ^ (bc4<<1 | bc4>>63) d4 = bc3 ^ (bc0<<1 | bc0>>63) bc0 = a[0] ^ d0 t = a[1] ^ d1 bc1 = t<<44 | t>>(64-44) t = a[2] ^ d2 bc2 = t<<43 | t>>(64-43) t = a[3] ^ d3 bc3 = t<<21 | t>>(64-21) t = a[4] ^ d4 bc4 = t<<14 | t>>(64-14) a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] a[1] = bc1 ^ (bc3 &^ bc2) a[2] = bc2 ^ (bc4 &^ bc3) a[3] = bc3 ^ (bc0 &^ bc4) a[4] = bc4 ^ (bc1 &^ bc0) t = a[5] ^ d0 bc2 = t<<3 | t>>(64-3) t = a[6] ^ d1 bc3 = t<<45 | t>>(64-45) t = a[7] ^ d2 bc4 = t<<61 | t>>(64-61) t = a[8] ^ d3 bc0 = t<<28 | t>>(64-28) t = a[9] ^ d4 bc1 = t<<20 | t>>(64-20) a[5] = bc0 ^ (bc2 &^ bc1) a[6] = bc1 ^ (bc3 &^ bc2) a[7] = bc2 ^ (bc4 &^ bc3) a[8] = bc3 ^ (bc0 &^ bc4) a[9] = bc4 ^ (bc1 &^ bc0) t = a[10] ^ d0 bc4 = t<<18 | t>>(64-18) t = a[11] ^ d1 bc0 = t<<1 | t>>(64-1) t = a[12] ^ d2 bc1 = t<<6 | t>>(64-6) t = a[13] ^ d3 bc2 = t<<25 | t>>(64-25) t = a[14] ^ d4 bc3 = t<<8 | t>>(64-8) a[10] = bc0 ^ (bc2 &^ bc1) a[11] = bc1 ^ (bc3 &^ bc2) a[12] = bc2 ^ (bc4 &^ bc3) a[13] = bc3 ^ (bc0 &^ bc4) a[14] = bc4 ^ (bc1 &^ bc0) t = a[15] ^ d0 bc1 = t<<36 | t>>(64-36) t = a[16] ^ d1 bc2 = t<<10 | t>>(64-10) t = a[17] ^ d2 bc3 = t<<15 | t>>(64-15) t = a[18] ^ d3 bc4 = t<<56 | t>>(64-56) t = a[19] ^ d4 bc0 = t<<27 | t>>(64-27) a[15] = bc0 ^ (bc2 &^ bc1) a[16] = bc1 ^ (bc3 &^ bc2) a[17] = bc2 ^ (bc4 &^ bc3) a[18] = bc3 ^ (bc0 &^ bc4) a[19] = bc4 ^ (bc1 &^ bc0) t = a[20] ^ d0 bc3 = t<<41 | t>>(64-41) t = a[21] ^ d1 bc4 = t<<2 | t>>(64-2) t = a[22] ^ d2 bc0 = t<<62 | t>>(64-62) t = a[23] ^ d3 bc1 = t<<55 | t>>(64-55) t = a[24] ^ d4 bc2 = t<<39 | t>>(64-39) a[20] = bc0 ^ (bc2 &^ bc1) a[21] = bc1 ^ (bc3 &^ bc2) a[22] = bc2 ^ (bc4 &^ bc3) a[23] = bc3 ^ (bc0 &^ bc4) a[24] = bc4 ^ (bc1 &^ bc0) } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/keccakf_amd64.go000066400000000000000000000004661365325520100265220ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo package shake // This function is implemented in keccakf_amd64.s. //go:noescape func keccakF1600(a *[25]uint64) golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/keccakf_amd64.s000066400000000000000000000342561365325520100263630ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64,!appengine,!gccgo // This code was translated into a form compatible with 6a from the public // domain sources at https://github.com/gvanas/KeccakCodePackage // Offsets in state #define _ba (0*8) #define _be (1*8) #define _bi (2*8) #define _bo (3*8) #define _bu (4*8) #define _ga (5*8) #define _ge (6*8) #define _gi (7*8) #define _go (8*8) #define _gu (9*8) #define _ka (10*8) #define _ke (11*8) #define _ki (12*8) #define _ko (13*8) #define _ku (14*8) #define _ma (15*8) #define _me (16*8) #define _mi (17*8) #define _mo (18*8) #define _mu (19*8) #define _sa (20*8) #define _se (21*8) #define _si (22*8) #define _so (23*8) #define _su (24*8) // Temporary registers #define rT1 AX // Round vars #define rpState DI #define rpStack SP #define rDa BX #define rDe CX #define rDi DX #define rDo R8 #define rDu R9 #define rBa R10 #define rBe R11 #define rBi R12 #define rBo R13 #define rBu R14 #define rCa SI #define rCe BP #define rCi rBi #define rCo rBo #define rCu R15 #define MOVQ_RBI_RCE MOVQ rBi, rCe #define XORQ_RT1_RCA XORQ rT1, rCa #define XORQ_RT1_RCE XORQ rT1, rCe #define XORQ_RBA_RCU XORQ rBa, rCu #define XORQ_RBE_RCU XORQ rBe, rCu #define XORQ_RDU_RCU XORQ rDu, rCu #define XORQ_RDA_RCA XORQ rDa, rCa #define XORQ_RDE_RCE XORQ rDe, rCe #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ /* Prepare round */ \ MOVQ rCe, rDa; \ ROLQ $1, rDa; \ \ MOVQ _bi(iState), rCi; \ XORQ _gi(iState), rDi; \ XORQ rCu, rDa; \ XORQ _ki(iState), rCi; \ XORQ _mi(iState), rDi; \ XORQ rDi, rCi; \ \ MOVQ rCi, rDe; \ ROLQ $1, rDe; \ \ MOVQ _bo(iState), rCo; \ XORQ _go(iState), rDo; \ XORQ rCa, rDe; \ XORQ _ko(iState), rCo; \ XORQ _mo(iState), rDo; \ XORQ rDo, rCo; \ \ MOVQ rCo, rDi; \ ROLQ $1, rDi; \ \ MOVQ rCu, rDo; \ XORQ rCe, rDi; \ ROLQ $1, rDo; \ \ MOVQ rCa, rDu; \ XORQ rCi, rDo; \ ROLQ $1, rDu; \ \ /* Result b */ \ MOVQ _ba(iState), rBa; \ MOVQ _ge(iState), rBe; \ XORQ rCo, rDu; \ MOVQ _ki(iState), rBi; \ MOVQ _mo(iState), rBo; \ MOVQ _su(iState), rBu; \ XORQ rDe, rBe; \ ROLQ $44, rBe; \ XORQ rDi, rBi; \ XORQ rDa, rBa; \ ROLQ $43, rBi; \ \ MOVQ rBe, rCa; \ MOVQ rc, rT1; \ ORQ rBi, rCa; \ XORQ rBa, rT1; \ XORQ rT1, rCa; \ MOVQ rCa, _ba(oState); \ \ XORQ rDu, rBu; \ ROLQ $14, rBu; \ MOVQ rBa, rCu; \ ANDQ rBe, rCu; \ XORQ rBu, rCu; \ MOVQ rCu, _bu(oState); \ \ XORQ rDo, rBo; \ ROLQ $21, rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _bi(oState); \ \ NOTQ rBi; \ ORQ rBa, rBu; \ ORQ rBo, rBi; \ XORQ rBo, rBu; \ XORQ rBe, rBi; \ MOVQ rBu, _bo(oState); \ MOVQ rBi, _be(oState); \ B_RBI_RCE; \ \ /* Result g */ \ MOVQ _gu(iState), rBe; \ XORQ rDu, rBe; \ MOVQ _ka(iState), rBi; \ ROLQ $20, rBe; \ XORQ rDa, rBi; \ ROLQ $3, rBi; \ MOVQ _bo(iState), rBa; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDo, rBa; \ MOVQ _me(iState), rBo; \ MOVQ _si(iState), rBu; \ ROLQ $28, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ga(oState); \ G_RT1_RCA; \ \ XORQ rDe, rBo; \ ROLQ $45, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ge(oState); \ G_RT1_RCE; \ \ XORQ rDi, rBu; \ ROLQ $61, rBu; \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _go(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _gu(oState); \ NOTQ rBu; \ G_RBA_RCU; \ \ ORQ rBu, rBo; \ XORQ rBi, rBo; \ MOVQ rBo, _gi(oState); \ \ /* Result k */ \ MOVQ _be(iState), rBa; \ MOVQ _gi(iState), rBe; \ MOVQ _ko(iState), rBi; \ MOVQ _mu(iState), rBo; \ MOVQ _sa(iState), rBu; \ XORQ rDi, rBe; \ ROLQ $6, rBe; \ XORQ rDo, rBi; \ ROLQ $25, rBi; \ MOVQ rBe, rT1; \ ORQ rBi, rT1; \ XORQ rDe, rBa; \ ROLQ $1, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ka(oState); \ K_RT1_RCA; \ \ XORQ rDu, rBo; \ ROLQ $8, rBo; \ MOVQ rBi, rT1; \ ANDQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _ke(oState); \ K_RT1_RCE; \ \ XORQ rDa, rBu; \ ROLQ $18, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ANDQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _ki(oState); \ \ MOVQ rBu, rT1; \ ORQ rBa, rT1; \ XORQ rBo, rT1; \ MOVQ rT1, _ko(oState); \ \ ANDQ rBe, rBa; \ XORQ rBu, rBa; \ MOVQ rBa, _ku(oState); \ K_RBA_RCU; \ \ /* Result m */ \ MOVQ _ga(iState), rBe; \ XORQ rDa, rBe; \ MOVQ _ke(iState), rBi; \ ROLQ $36, rBe; \ XORQ rDe, rBi; \ MOVQ _bu(iState), rBa; \ ROLQ $10, rBi; \ MOVQ rBe, rT1; \ MOVQ _mi(iState), rBo; \ ANDQ rBi, rT1; \ XORQ rDu, rBa; \ MOVQ _so(iState), rBu; \ ROLQ $27, rBa; \ XORQ rBa, rT1; \ MOVQ rT1, _ma(oState); \ M_RT1_RCA; \ \ XORQ rDi, rBo; \ ROLQ $15, rBo; \ MOVQ rBi, rT1; \ ORQ rBo, rT1; \ XORQ rBe, rT1; \ MOVQ rT1, _me(oState); \ M_RT1_RCE; \ \ XORQ rDo, rBu; \ ROLQ $56, rBu; \ NOTQ rBo; \ MOVQ rBo, rT1; \ ORQ rBu, rT1; \ XORQ rBi, rT1; \ MOVQ rT1, _mi(oState); \ \ ORQ rBa, rBe; \ XORQ rBu, rBe; \ MOVQ rBe, _mu(oState); \ \ ANDQ rBa, rBu; \ XORQ rBo, rBu; \ MOVQ rBu, _mo(oState); \ M_RBE_RCU; \ \ /* Result s */ \ MOVQ _bi(iState), rBa; \ MOVQ _go(iState), rBe; \ MOVQ _ku(iState), rBi; \ XORQ rDi, rBa; \ MOVQ _ma(iState), rBo; \ ROLQ $62, rBa; \ XORQ rDo, rBe; \ MOVQ _se(iState), rBu; \ ROLQ $55, rBe; \ \ XORQ rDu, rBi; \ MOVQ rBa, rDu; \ XORQ rDe, rBu; \ ROLQ $2, rBu; \ ANDQ rBe, rDu; \ XORQ rBu, rDu; \ MOVQ rDu, _su(oState); \ \ ROLQ $39, rBi; \ S_RDU_RCU; \ NOTQ rBe; \ XORQ rDa, rBo; \ MOVQ rBe, rDa; \ ANDQ rBi, rDa; \ XORQ rBa, rDa; \ MOVQ rDa, _sa(oState); \ S_RDA_RCA; \ \ ROLQ $41, rBo; \ MOVQ rBi, rDe; \ ORQ rBo, rDe; \ XORQ rBe, rDe; \ MOVQ rDe, _se(oState); \ S_RDE_RCE; \ \ MOVQ rBo, rDi; \ MOVQ rBu, rDo; \ ANDQ rBu, rDi; \ ORQ rBa, rDo; \ XORQ rBi, rDi; \ XORQ rBo, rDo; \ MOVQ rDi, _si(oState); \ MOVQ rDo, _so(oState) \ // func keccakF1600(state *[25]uint64) TEXT ·keccakF1600(SB), 0, $200-8 MOVQ state+0(FP), rpState // Convert the user state into an internal state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) // Execute the KeccakF permutation MOVQ _ba(rpState), rCa MOVQ _be(rpState), rCe MOVQ _bu(rpState), rCu XORQ _ga(rpState), rCa XORQ _ge(rpState), rCe XORQ _gu(rpState), rCu XORQ _ka(rpState), rCa XORQ _ke(rpState), rCe XORQ _ku(rpState), rCu XORQ _ma(rpState), rCa XORQ _me(rpState), rCe XORQ _mu(rpState), rCu XORQ _sa(rpState), rCa XORQ _se(rpState), rCe MOVQ _si(rpState), rDi MOVQ _so(rpState), rDo XORQ _su(rpState), rCu mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) // Revert the internal state to the user state NOTQ _be(rpState) NOTQ _bi(rpState) NOTQ _go(rpState) NOTQ _ki(rpState) NOTQ _mi(rpState) NOTQ _sa(rpState) RET golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/sha3.go000066400000000000000000000136451365325520100250010ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package shake import "hash" // spongeDirection indicates the direction bytes are flowing through the sponge. type spongeDirection int const ( // spongeAbsorbing indicates that the sponge is absorbing input. spongeAbsorbing spongeDirection = iota // spongeSqueezing indicates that the sponge is being squeezed. spongeSqueezing ) const ( // maxRate is the maximum size of the internal buffer. SHAKE-256 // currently needs the largest buffer. maxRate = 168 ) type state struct { // Generic sponge components. a [25]uint64 // main state of the hash buf []byte // points into storage rate int // the number of bytes of state to use // dsbyte contains the "domain separation" bits and the first bit of // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the // SHA-3 and SHAKE functions by appending bitstrings to the message. // Using a little-endian bit-ordering convention, these are "01" for SHA-3 // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the // padding rule from section 5.1 is applied to pad the message to a multiple // of the rate, which involves adding a "1" bit, zero or more "0" bits, and // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, // giving 00000110b (0x06) and 00011111b (0x1f). // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and // Extendable-Output Functions (May 2014)" dsbyte byte storage [maxRate]byte // Specific to SHA-3 and SHAKE. outputLen int // the default output size in bytes state spongeDirection // whether the sponge is absorbing or squeezing } // BlockSize returns the rate of sponge underlying this hash function. func (d *state) BlockSize() int { return d.rate } // Size returns the output size of the hash function in bytes. func (d *state) Size() int { return d.outputLen } // Reset clears the internal state by zeroing the sponge state and // the byte buffer, and setting Sponge.state to absorbing. func (d *state) Reset() { // Zero the permutation's state. for i := range d.a { d.a[i] = 0 } d.state = spongeAbsorbing d.buf = d.storage[:0] } func (d *state) clone(ret *state) { // shallow copy *ret = *d // deep copy for a buf if ret.state == spongeAbsorbing { ret.buf = ret.storage[:len(d.buf)] } else { ret.buf = ret.storage[d.rate-len(d.buf) : d.rate] } } // permute applies the KeccakF-1600 permutation. It handles // any input-output buffering. func (d *state) permute() { switch d.state { case spongeAbsorbing: // If we're absorbing, we need to xor the input into the state // before applying the permutation. xorIn(d, d.buf) d.buf = d.storage[:0] keccakF1600(&d.a) case spongeSqueezing: // If we're squeezing, we need to apply the permutatin before // copying more output. keccakF1600(&d.a) d.buf = d.storage[:d.rate] copyOut(d, d.buf) } } // pads appends the domain separation bits in dsbyte, applies // the multi-bitrate 10..1 padding rule, and permutes the state. func (d *state) padAndPermute(dsbyte byte) { if d.buf == nil { d.buf = d.storage[:0] } // Pad with this instance's domain-separator bits. We know that there's // at least one byte of space in d.buf because, if it were full, // permute would have been called to empty it. dsbyte also contains the // first one bit for the padding. See the comment in the state struct. d.buf = append(d.buf, dsbyte) zerosStart := len(d.buf) d.buf = d.storage[:d.rate] for i := zerosStart; i < d.rate; i++ { d.buf[i] = 0 } // This adds the final one bit for the padding. Because of the way that // bits are numbered from the LSB upwards, the final bit is the MSB of // the last byte. d.buf[d.rate-1] ^= 0x80 // Apply the permutation d.permute() d.state = spongeSqueezing d.buf = d.storage[:d.rate] copyOut(d, d.buf) } // Write absorbs more data into the hash's state. It produces an error // if more data is written to the ShakeHash after writing func (d *state) Write(p []byte) (written int, err error) { if d.state != spongeAbsorbing { panic("sha3: write to sponge after read") } if d.buf == nil { d.buf = d.storage[:0] } written = len(p) for len(p) > 0 { if len(d.buf) == 0 && len(p) >= d.rate { // The fast path; absorb a full "rate" bytes of input and apply the permutation. xorIn(d, p[:d.rate]) p = p[d.rate:] keccakF1600(&d.a) } else { // The slow path; buffer the input until we can fill the sponge, and then xor it in. todo := d.rate - len(d.buf) if todo > len(p) { todo = len(p) } d.buf = append(d.buf, p[:todo]...) p = p[todo:] // If the sponge is full, apply the permutation. if len(d.buf) == d.rate { d.permute() } } } return } // Read squeezes an arbitrary number of bytes from the sponge. func (d *state) Read(out []byte) (n int, err error) { // If we're still absorbing, pad and apply the permutation. if d.state == spongeAbsorbing { d.padAndPermute(d.dsbyte) } n = len(out) // Now, do the squeezing. for len(out) > 0 { n := copy(out, d.buf) d.buf = d.buf[n:] out = out[n:] // Apply the permutation if we've squeezed the sponge dry. if len(d.buf) == 0 { d.permute() } } return } // Sum applies padding to the hash state and then squeezes out the desired // number of output bytes. func (d *state) Sum(in []byte) []byte { // Make a copy of the original hash so that caller can keep writing // and summing. var dup state d.clone(&dup) hash := make([]byte, dup.outputLen) dup.Read(hash) return append(in, hash...) } // Only use this function if you require compatibility with an existing cryptosystem // that uses non-standard padding. All other users should use New256 instead. func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/sha3_test.go000066400000000000000000000275441365325520100260430ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package shake // Tests include all the ShortMsgKATs provided by the Keccak team at // https://github.com/gvanas/KeccakCodePackage // // They only include the zero-bit case of the bitwise testvectors // published by NIST in the draft of FIPS-202. import ( "bytes" "compress/flate" "encoding/hex" "encoding/json" "fmt" "hash" "os" "strings" "testing" ) const ( testString = "brekeccakkeccak koax koax" katFilename = "testdata/keccakKats.json.deflate" ) // testShakes contains functions that return sha3.CShake instances for // with output-length equal to the KAT length. var testShakes = map[string]struct { constructor func(N []byte, S []byte) *CShake defAlgoName string defCustomStr string }{ // NewCShake without customization produces same result as SHAKE "SHAKE128": {NewCShake128, "", ""}, "SHAKE256": {NewCShake256, "", ""}, "cSHAKE128": {NewCShake128, "CSHAKE128", "CustomStrign"}, "cSHAKE256": {NewCShake256, "CSHAKE256", "CustomStrign"}, } // decodeHex converts a hex-encoded string into a raw byte string. func decodeHex(s string) []byte { b, err := hex.DecodeString(s) if err != nil { panic(err) } return b } // structs used to marshal JSON test-cases. type KeccakKats struct { Kats map[string][]struct { Digest string `json:"digest"` Length int64 `json:"length"` Message string `json:"message"` // Defined only for cSHAKE N string `json:"N"` S string `json:"S"` } } // TestKeccakKats tests the SHA-3 and Shake implementations against all the // ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage // (The testvectors are stored in keccakKats.json.deflate due to their length.) func TestKeccakKats(t *testing.T) { // Read the KATs. deflated, err := os.Open(katFilename) if err != nil { t.Errorf("error opening %s: %s", katFilename, err) } file := flate.NewReader(deflated) dec := json.NewDecoder(file) var katSet KeccakKats err = dec.Decode(&katSet) if err != nil { t.Errorf("error decoding KATs: %s", err) } for algo, v := range testShakes { for _, kat := range katSet.Kats[algo] { N, err := hex.DecodeString(kat.N) if err != nil { t.Errorf("error decoding KAT: %s", err) } S, err := hex.DecodeString(kat.S) if err != nil { t.Errorf("error decoding KAT: %s", err) } d := v.constructor(N, S) in, err := hex.DecodeString(kat.Message) if err != nil { t.Errorf("error decoding KAT: %s", err) } d.Write(in[:kat.Length/8]) out := make([]byte, len(kat.Digest)/2) d.Read(out) got := strings.ToUpper(hex.EncodeToString(out)) if got != kat.Digest { t.Errorf("function=%s, length=%d N:%s\n S:%s\nmessage:\n %s \ngot:\n %s\nwanted:\n %s", algo, kat.Length, kat.N, kat.S, kat.Message, got, kat.Digest) t.Logf("wanted %+v", kat) t.FailNow() } continue } } } // TestKeccak does a basic test of the non-standardized Keccak hash functions. func TestKeccak(t *testing.T) { tests := []struct { fn func() hash.Hash data []byte want string }{ { NewLegacyKeccak256, []byte("abc"), "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", }, } for _, u := range tests { h := u.fn() h.Write(u.data) got := h.Sum(nil) want := decodeHex(u.want) if !bytes.Equal(got, want) { t.Errorf("unexpected hash for size %d: got '%x' want '%s'", h.Size()*8, got, u.want) } } } // TestUnalignedWrite tests that writing data in an arbitrary pattern with // small input buffers. func TestUnalignedWrite(t *testing.T) { buf := sequentialBytes(0x10000) // Same for SHAKE for alg, df := range testShakes { want := make([]byte, 16) got := make([]byte, 16) d := df.constructor([]byte(df.defAlgoName), []byte(df.defCustomStr)) d.Reset() d.Write(buf) d.Read(want) d.Reset() for i := 0; i < len(buf); { // Cycle through offsets which make a 137 byte sequence. // Because 137 is prime this sequence should exercise all corner cases. offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} for _, j := range offsets { if v := len(buf) - i; v < j { j = v } d.Write(buf[i : i+j]) i += j } } d.Read(got) if !bytes.Equal(got, want) { t.Errorf("Unaligned writes, alg=%s\ngot %q, want %q", alg, got, want) } } } /* TODO: To redesign those tests and unlock // TestAppend checks that appending works when reallocation is necessary. func TestAppend(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { d := NewShake128() for capacity := 2; capacity <= 66; capacity += 64 { // The first time around the loop, Sum will have to reallocate. // The second time, it will not. buf := make([]byte, 2, capacity) d.Reset() d.Write([]byte{0xcc}) buf = d.Sum(buf) expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("got %s, want %s", got, expected) } } }) } // TestAppendNoRealloc tests that appending works when no reallocation is necessary. func TestAppendNoRealloc(t *testing.T) { testUnalignedAndGeneric(t, func(impl string) { buf := make([]byte, 1, 200) d := NewShake128() d.Write([]byte{0xcc}) buf = d.Sum(buf) expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("%s: got %s, want %s", impl, got, expected) } }) } */ // TestSqueezing checks that squeezing the full output a single time produces // the same output as repeatedly squeezing the instance. func TestSqueezing(t *testing.T) { for algo, v := range testShakes { d0 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) d0.Write([]byte(testString)) ref := make([]byte, 32) d0.Read(ref) d1 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) d1.Write([]byte(testString)) var multiple []byte for range ref { one := make([]byte, 1) d1.Read(one) multiple = append(multiple, one...) } if !bytes.Equal(ref, multiple) { t.Errorf("%s : squeezing %d bytes one at a time failed", algo, len(ref)) } } } // sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing. func sequentialBytes(size int) []byte { result := make([]byte, size) for i := range result { result[i] = byte(i) } return result } func TestReset(t *testing.T) { out1 := make([]byte, 32) out2 := make([]byte, 32) for _, v := range testShakes { // Calculate hash for the first time c := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) c.Write(sequentialBytes(0x100)) c.Read(out1) // Calculate hash again c.Reset() c.Write(sequentialBytes(0x100)) c.Read(out2) if !bytes.Equal(out1, out2) { t.Error("\nExpected:\n", out1, "\ngot:\n", out2) } } } func TestClone(t *testing.T) { out1 := make([]byte, 16) out2 := make([]byte, 16) in := sequentialBytes(0x100) for _, v := range testShakes { h1 := v.constructor([]byte(v.defAlgoName), []byte(v.defCustomStr)) h1.Write([]byte{0x01}) h2 := h1.Clone() h1.Write(in) h1.Read(out1) h2.Write(in) h2.Read(out2) if !bytes.Equal(out1, out2) { t.Error("\nExpected:\n", hex.EncodeToString(out1), "\ngot:\n", hex.EncodeToString(out2)) } } } // Checks wether reset works correctly after clone func TestCloneAndReset(t *testing.T) { // Shake 256, uses SHA-3 with rate = 136 d1 := NewShake256() buf1 := make([]byte, 28, 28) buf2 := make([]byte, 28, 28) d1.Write([]byte{0xcc}) // Reading x bytes where x<168-136. This makes capability // of the state buffer shorter. d1.Read(buf1) // This will crash if sha-3 code uses cap() instead // of len() when calculating length of state buffer d2 := d1.Clone() d2.Reset() d2.Write([]byte{0xcc}) d2.Read(buf2) if !bytes.Equal(buf1, buf2) { t.Error("Different value when reading after reset") } } // BenchmarkPermutationFunction measures the speed of the permutation function // with no input data. func BenchmarkPermutationFunction(b *testing.B) { b.SetBytes(int64(200)) var lanes [25]uint64 for i := 0; i < b.N; i++ { keccakF1600(&lanes) } } // benchmarkHash tests the speed to hash num buffers of buflen each. func benchmarkHash(b *testing.B, h hash.Hash, size, num int) { b.StopTimer() h.Reset() data := sequentialBytes(size) b.SetBytes(int64(size * num)) b.StartTimer() var state []byte for i := 0; i < b.N; i++ { for j := 0; j < num; j++ { h.Write(data) } state = h.Sum(state[:0]) } b.StopTimer() h.Reset() } // benchmarkShake is specialized to the Shake instances, which don't // require a copy on reading output. func benchmarkShake(b *testing.B, h *CShake, size, num int) { b.StopTimer() h.Reset() data := sequentialBytes(size) var d [32]byte b.SetBytes(int64(size * num)) b.StartTimer() for i := 0; i < b.N; i++ { h.Reset() for j := 0; j < num; j++ { h.Write(data) } h.Read(d[:]) } } func BenchmarkShake128_MTU(b *testing.B) { benchmarkShake(b, NewShake128(), 1350, 1) } func BenchmarkShake256_MTU(b *testing.B) { benchmarkShake(b, NewShake256(), 1350, 1) } func BenchmarkShake256_16x(b *testing.B) { benchmarkShake(b, NewShake256(), 16, 1024) } func BenchmarkShake256_1MiB(b *testing.B) { benchmarkShake(b, NewShake256(), 1024, 1024) } func BenchmarkCShake128_448_16x(b *testing.B) { benchmarkShake(b, NewCShake128([]byte("ABC"), []byte("DEF")), 448, 16) } func BenchmarkCShake128_1MiB(b *testing.B) { benchmarkShake(b, NewCShake128([]byte("ABC"), []byte("DEF")), 1024, 1024) } func BenchmarkCShake256_448_16x(b *testing.B) { benchmarkShake(b, NewCShake256([]byte("ABC"), []byte("DEF")), 448, 16) } func BenchmarkCShake256_1MiB(b *testing.B) { benchmarkShake(b, NewCShake256([]byte("ABC"), []byte("DEF")), 1024, 1024) } func Example_sum() { buf := []byte("some data to hash") // A hash needs to be 64 bytes long to have 256-bit collision resistance. h := make([]byte, 64) // Compute a 64-byte hash of buf and put it in h. ShakeSum256(h, buf) fmt.Printf("%x\n", h) // Output: 0f65fe41fc353e52c55667bb9e2b27bfcc8476f2c413e9437d272ee3194a4e3146d05ec04a25d16b8f577c19b82d16b1424c3e022e783d2b4da98de3658d363d } func Example_mac() { k := []byte("this is a secret key; you should generate a strong random key that's at least 32 bytes long") buf := []byte("and this is some data to authenticate") // A MAC with 32 bytes of output has 256-bit security strength -- if you use at least a 32-byte-long key. h := make([]byte, 32) d := NewShake256() // Write the key into the hash. d.Write(k) // Now write the data. d.Write(buf) // Read 32 bytes of output from the hash into h. d.Read(h) fmt.Printf("%x\n", h) // Output: 78de2974bd2711d5549ffd32b753ef0f5fa80a0db2556db60f0987eb8a9218ff } func ExampleCShake256() { out := make([]byte, 32) msg := []byte("The quick brown fox jumps over the lazy dog") // Example 1: Simple cshake c1 := NewCShake256([]byte("NAME"), []byte("Partition1")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 2: Different customization string produces different digest c1 = NewCShake256([]byte("NAME"), []byte("Partition2")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 3: Different output length produces different digest out = make([]byte, 64) c1 = NewCShake256([]byte("NAME"), []byte("Partition1")) c1.Write(msg) c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Example 4: Next read produces different result c1.Read(out) fmt.Println(hex.EncodeToString(out)) // Output: //a90a4c6ca9af2156eba43dc8398279e6b60dcd56fb21837afe6c308fd4ceb05b //a8db03e71f3e4da5c4eee9d28333cdd355f51cef3c567e59be5beb4ecdbb28f0 //a90a4c6ca9af2156eba43dc8398279e6b60dcd56fb21837afe6c308fd4ceb05b9dd98c6ee866ca7dc5a39d53e960f400bcd5a19c8a2d6ec6459f63696543a0d8 //85e73a72228d08b46515553ca3a29d47df3047e5d84b12d6c2c63e579f4fd1105716b7838e92e981863907f434bfd4443c9e56ea09da998d2f9b47db71988109 } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/shake.go000066400000000000000000000107661365325520100252370ustar00rootroot00000000000000// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package shake // This file defines the CShake interface, and provides // functions for creating SHAKE and cSHAKE instances, as well as utility // functions for hashing bytes to arbitrary-length output. // // // SHAKE implementation is based on FIPS PUB 202 [1] // cSHAKE implementations is based on NIST SP 800-185 [2] // // [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf // [2] https://doi.org/10.6028/NIST.SP.800-185 import ( "encoding/binary" ) // cSHAKE specific context type CShake struct { state // SHA-3 state context and Read/Write operations // initBlock is the cSHAKE specific initialization set of bytes. It is initialized // by newCShake function and stores concatenation of N followed by S, encoded // by the method specified in 3.3 of [1]. // It is stored here in order for Reset() to be able to put context into // initial state. initBlock []byte } // Consts for configuring initial SHA-3 state const ( dsbyteShake = 0x1f dsbyteCShake = 0x04 rate128 = 168 rate256 = 136 ) func bytepad(input []byte, w int) []byte { // leftEncode always returns max 9 bytes buf := make([]byte, 0, 9+len(input)+w) buf = append(buf, leftEncode(uint64(w))...) buf = append(buf, input...) padlen := w - (len(buf) % w) return append(buf, make([]byte, padlen)...) } func leftEncode(value uint64) []byte { var b [9]byte binary.BigEndian.PutUint64(b[1:], value) // Trim all but last leading zero bytes i := byte(1) for i < 8 && b[i] == 0 { i++ } // Prepend number of encoded bytes b[i-1] = 9 - i return b[i-1:] } func newCShake(N, S []byte, rate int, dsbyte byte) *CShake { // leftEncode returns max 9 bytes initBlock := make([]byte, 0, 9*2+len(N)+len(S)) initBlock = append(initBlock, leftEncode(uint64(len(N)*8))...) initBlock = append(initBlock, N...) initBlock = append(initBlock, leftEncode(uint64(len(S)*8))...) initBlock = append(initBlock, S...) c := CShake{ state: state{rate: rate, dsbyte: dsbyte}, initBlock: bytepad(initBlock, rate), } c.Write(c.initBlock) return &c } // Reset resets the hash to initial state. func (c *CShake) Reset() { c.state.Reset() c.Write(c.initBlock) } // Clone returns copy of a cSHAKE context within its current state. func (c *CShake) Clone() CShake { var ret CShake c.clone(&ret.state) ret.initBlock = make([]byte, len(c.initBlock)) copy(ret.initBlock, c.initBlock) return ret } // NewShake128 creates a new SHAKE128 variable-output-length CShake. // Its generic security strength is 128 bits against all attacks if at // least 32 bytes of its output are used. func NewShake128() *CShake { return &CShake{state{rate: rate128, dsbyte: dsbyteShake}, nil} } // NewShake256 creates a new SHAKE256 variable-output-length CShake. // Its generic security strength is 256 bits against all attacks if // at least 64 bytes of its output are used. func NewShake256() *CShake { return &CShake{state{rate: rate256, dsbyte: dsbyteShake}, nil} } // NewCShake128 creates a new instance of cSHAKE128 variable-output-length CShake, // a customizable variant of SHAKE128. // N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is // desired. S is a customization byte string used for domain separation - two cSHAKE // computations on same input with different S yield unrelated outputs. // When N and S are both empty, this is equivalent to NewShake128. func NewCShake128(N, S []byte) *CShake { if len(N) == 0 && len(S) == 0 { return NewShake128() } return newCShake(N, S, rate128, dsbyteCShake) } // NewCShake256 creates a new instance of cSHAKE256 variable-output-length CShake, // a customizable variant of SHAKE256. // N is used to define functions based on cSHAKE, it can be empty when plain cSHAKE is // desired. S is a customization byte string used for domain separation - two cSHAKE // computations on same input with different S yield unrelated outputs. // When N and S are both empty, this is equivalent to NewShake256. func NewCShake256(N, S []byte) *CShake { if len(N) == 0 && len(S) == 0 { return NewShake256() } return newCShake(N, S, rate256, dsbyteCShake) } // ShakeSum128 writes an arbitrary-length digest of data into hash. func ShakeSum128(hash, data []byte) { h := NewShake128() h.Write(data) h.Read(hash) } // ShakeSum256 writes an arbitrary-length digest of data into hash. func ShakeSum256(hash, data []byte) { h := NewShake256() h.Write(data) h.Read(hash) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/testdata/000077500000000000000000000000001365325520100254145ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/testdata/keccakKats.json.deflate000066400000000000000000017721761365325520100320030ustar00rootroot00000000000000;o-:l2= Љ^XxYUOH˿5o?h~Ī6Uƥla< H,0_>)I_.?oo_0g/tw95+?lΣbJg___ B\qr@0 5m2BcFԯOxx#܋ӌ`o+Ʉ̘<'!S~}ʭP3tH ؆ ,~Nঙ(_-Q=*{Kc e̴%xVFQkpGcSaλ{>]{@<_<[rÍxA>pw GCxF;p:%*ݘ&rZ}#լ.;Q&>iE)% 瀒iN=Qy0>ag_)ݱGDd\zSG8l͔T%3AJ9/Ǘ_>at.U?x:]׊pZ gzO(4vzҍQ֕d7a%HWaWL]E4[/}BN&K+}}g}{XV2[C [#X yƼؤYha63H18<To}MAnڳs=z`΋w㐚<xH.f>O^Mo{=\.ymAZ-a,!O$OT2 ӯobrcPh =ui~ƆJtZPW{za6I1ϕ-~woNJLÖb=EaI/Bw&Z> d} V`Z$^"KKy_U@&qG 4(8ߥrUb?&*[ !BpfT/f./Λz<\ .^b#c)|=Q{478c9_Ĩ]u_!A>W?iSs12^8@%\Qz<_^GCy=Nj{>R@t]6;8k<3,*mFY}a~}:?p{!t9?0tvB \#BS]*bLXy-/Vn&jgZ{W%hsڒ%DG> Q4ங~o-yN?ƒ8W@7C]u,[mzv"5ƅLi6n4D bcx!x*$ =Q$x_|o%f2_}dO3wsd/wxb0O2zuFuTE5D0ΏЁö1_մl$1#ٷ3 X"@"D-CV-geEv)3x#Q5Q Sg0|Ug8Hp4 ;|Q=go]Kc>UԅdD, n )"-Wh.i/+C˺; z{Jl=}" ^~LoP7x *=!=$D g\saj UjCW`~NqX:fda28+̽)hGc)ąvJtZ-7L*ZMvu>;,PŦNSmb /+J]G1lk} fA焇/~o{`dнبOVӇ` :2['S:Zrݣ8{$N(+Lg4R]6ҳ5t42yU`zoYuDQxS+>UtYr|^b {.f)䭆O;*ŞӺ#%J]X=>7 Z .Lyss6CU]˻~znu u_41!ȼjlʇ=k)KKy7 w[6SfvMVϊaIj̖lޙʼnd O=˧K=Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJK݁ZSȲ8 G1Nwq̧ӯTii}_LI[+ LkN6} ^S>:tW!&a 7QU]\J %0T40fX[g\j TiczNv 4z:QTi a "t9rNc- E0mmUv2>Qf,&q [B.WB|P=ݬt;FdóχgϹW~6 BCInC뷤-n'-|R2KQv>GtsTB |6cs8#X,lq<=UtZtZFh`ڻKț4In*MBV3qƯ;}X1Go=8ZD<ܧ)Röݩ=qrYDwuÍɚELO`-O%l<{aPܗnOLɭ>~K4:a3*ykdj*mō#~GXWAcoء+&!yYI[hkZ}Q3xKYu ۷>iU_8OOd8H>QlUMC O*}6U%cADyy}\^h?{f,=0bGnϊPUL*b/+$R`Hg~!!v3o)JyznoV=;dN) _iNxM{eoTY0oq@,/,dM[3\0T}Yէ8е~dN_Lyįu_@{;l [pn-> Ɖ7gkUxB_h\rA&_h M) n7ϴ ,ް'\CxC=${w|zl!VcsP rl*/LpĘaP`tZcwҞx9{#u,"ԓvx%.Qi[0cw+"bExAY'hjk瀽$^K+ݦ5?fb@+(HJxC5ץEJ=lRk2B?]RJdr1fMLzHIGD@CA%Z䪓FSm+GUl}xJZ+y> >ֹ'H@O=k؅ k0O?$5F,WE:p*OeEu)ʻ7`$D\3R8ZJ v1 :"ÉRuC9W((|:kM0X˶{,d66>Ro'tf=BMz57f&)Hi``0ٰN@ nB.eTq=~brI`<"nYv2I#eŻ(=G+l2?RG7q$d+{ m<=V%ڊ,.y*qB?Vl+ JU&$;Ũ !շmKHѤL_XVx?Qi(z%C]']}٥g'Ry*+P<[CBP;c6,#Ivw}o|6S:DBq/cԎfIxNIq{ }4YK[ ŋxĚHų M^ß4ܝACW ):6H Pxc砺Iׯ;D<ս='xH&GD{~:#"Zu[R%8hV!y^ c)4&.*,"8ch>a"Nd0, X9>X01[#F%B7L/L٧r2 Ic+:x"'JjxI)ɌG0ND^Tw$?'JOV~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟm MUOw4w:Pno nVf9Q,l=M8unLԡGCT D2hIGJK$Mcu kYjς5CnbNA][%"dŠ[;Hs1V7S<׭LCV.<&E{xojIeΆܴ0˦x2y{/BuCp`W+q^Gw) x?qsQH)'t=/CC,y@ť6HmN5p܌%IᘂL+ã7e$OWrPP x =KO< . \k?sS|:z>W:]Y*lNܩki7 -3? ٘5-AxGWevɎOl JO7^CZ@~Yd`˳ >F<[U.U]|=ADs`;xB~bꥑo* *Ƥ6!\ΰ!kEwXxOW"\U۾/}!BL,q%tSـ#QypSM9ڎg+ q7 oDB,y56m"]іr7Aё;voJ9t臢:z'bR>.TWI|5KIgp@tΑ[]v KSOm>ZQI*i6x{2 30KpET q0e |Sl50'Q=G{\N fu e8izV^Ϝwpٜ4jNA)":Q꫾Z[W棷|Ւ})n`b5 RrRzfz 1ѽ~vX۫Y ͘7I-'ʑZh4ƺY* 8Wh*+aYLRGq+}1P/:dAѝLȅQZоtxpqUy'u-?on8h@`1{u^łKrA_~_F!YSrFsL,kTUա'4"j9:0b)ehJ,(-1*JȜJ: 5^o.&l«G^W1&JR߷ToY؋փŒCcӹh7!6. BB3 Z UF# d(@)`e*m!K"NHvݡve) 9Sjpu>gO: 6RL-@EAލyV#9Ufr]R _1%4 9 .{?| Nؖ`?C7J D%`܆D <({ܙDԴLZI/o+h$Dі^[^'<"t{W8+lv?y<*c7wD "^iaS"z+O^ͯ=vH^~Y4,/VzVX'%x:HK2 ب^׉WaP,65>%n~\lޖ;s@62Mi4bQЅ<{svz*瞨N^utU&- 0=MNJe KN@]Lиq;7T_t8w 4qիtWt7HgU2Ahi<AV`QzYV9oZ!8Kj{V&Ioj .!dԫD|F-/y!G9SuwezM9к2C#.$F78Gh/Qt(=em7HpV-Xur)>2Y93oԔJWV_4CGWʆ_x~ߝ"r^ ˼R>=V3&{R|'g9ȋ w锂)򶍰3+dzkj^;T 1/_ UspK$ylPA!׳e&(w(LTt?y ZĨZ6vޭcZe=;/5/jl'|ryu.Ѭ0ʝay@,Ouv_ fXH 1č*Ur,JmK%eDW+XjlO`f2["#SƟƇ Bχi%}coeŨ3W':dqEIdmOs4~{0ޠ^A ?[;MGy5n1ofa\K}AN*̟d>lq~3E $t &%pSH}2Easa[5 ?壠:vZGm8D1ЍZ7Mg<'Б~.Ɓͳ".̻D.M4\]qqI>{޸ Yxe4H?sg\=)<d#(8<{;zz*URxC=y4A4H&*{ 68H鉽'?%^,M Oٓ|΁fss7YPl Aˉ FQrG"N5aʢ+WFPԵJ-=}o38Q,zJƅ}7 (NXE=6s.lQQu?8#1ofo352샏6"r";c\#a41l91z쐘N^"|޺Đy^E~sO|m{8PbzʰZu >e'>GfX^/mi;<W\sI)223%hBKcfQXg̯ECUd moNV#]x/ -'P JXkjdփpA^2# ͕G#A)( O_kb?}ԣ#㤯`= Fs+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕ3{* M ;:}3ד&!v@:i{AaMAs0YΩV{03QgAr(i ۞zMdD>\{4`D&Rf,hf@G#tESf-X7 >}o0:UM>$=TkyϦgwf hJI j u?1\a^=Ny>oA"s(9 {$GBxNΩ=s,X=T 7u -< H $$$'Pհ@n2fk8VadJh jw ylO"S{;V-w4޳'>ɃNiߥR\SdU]Aɗ!gT\ȯ+3d(ᖄlU-Yt;j-[5frɡ”3oҴM+kg>aߟA,,69iϞ-fN3Cq ;o?;+,g<(tA\WdE` +4J4 Σ 9ݑXشDzu/0ҷ O:IߛFyk=jxܖ0-#R*?]'ƻO՟vܪ~8h$kLe~oӵԃUf]n4Ɏ1Tdb&wzS uȔ1P)IZªbr=m-HnXlHm5Yj62}/9e?C .J#- ]MǑ)f@D;xni@fr=ja7n:q}@Jw\U6f (iMNFS]ebC18+|A..>T8(2f!:%t. Wnz GSX`×Ij0'Qyp0YTpETw=x-s,[;M2+cq9IW1 :bV;H6ǥ)-txV=۶ZM;'q9{D#4l#Wz$a%iJE6!+n!zfnҡԍ+` 7 xݳ58SXz`eͰ1 x1\p;BW? }chdu1@P_kO@&? a̡tG(#>[9_=AOZ{&%\VzQ'\<wE8 ·%B\-MX`^:ɣ -J-[>TSqЙ{n#lvaAMZkKOQ*BKltŊhҍ[5a~25x9Y/̋0V=w9nT, i3ױSCxqPQ_U¸C| z.tgEE. z:R"ܬ2i߾%"IэxKXDyLZƉ:Mi'šDbrY|,'_giZF_; I ~KzID0R2A]#7G}ݔ1AϏCIĺ`P` 9.&$K6vGM\RnkHS3 # 6WOD&8Uoz]EU{ #/6}1"3le4i< ؁Z`'ⴣڞL@a9+'p)/:<&~fE"4u5%jV(yXWS@ 0<>%fƍhY'5!g$Ht_#=5TAdI{54||BBn%x:vB1Fߺj;xR;+XZYs_Ðֶ \dmf>s &/._q=t^Ex|a^άH>ʐNyWOUG@{>8fg#' a2nAdO}N2,/Pltd?xQ8hX:Z/=7Emc>7g0l YKXa(,"%/r='QzNa4mCeE/R43\8y^vͨ˞pz9ՐRU~Ï~7 .boi26"5Z'=3l>X.Gۭe.cEu=1N: 4b=-}wؑՈwZK, YlR=zX3c^h@U,Rj)WC8pk:):G4U&R[չ G:CŒJ$r%] ]%Ұ~zj^U&#zozAɻ9yuȖ3* uv*3au񹆓{ 9w]00#t[(uq,9]BU|ةF5[3yGk勠|{ ~O!jݿ" /HOv!Z,qx8Gj8ںvH*{1-3Ggߋ|24juGAb3%Y]O1S/ԴA]盇4<gܹ8WlͤH9D]HkD`OYk!8 E:.1)EVكa*!.ȭpyt}ƊU K U:{ }L9{2anb 3] &^{;V5-ЁzegG,Cpm]9ܥE*^S Z´H'E4ԛV}X+f)"Uڜ࢝e.R< C#k|h|]gsv{-xgb@g0)K4Pj1].a&0m"~QMI`Uq$ZIl2گ 0x*nm-Eb#+0s#nNN&4:ݯ.z P m͆ Vu2zϏbe[.2β$)wMõ8 @@́Vc-7!t302"R%<瞦 )ql?YOҡ4>3՘69ҽ$?C`TY/m= BypPLt^?QPiA}7q {7QQ]IqruZ$2\OQl|gj2Cs:2 V~g=ڊģT^~ߘYI=-O5`=Z'0_DE'14@01'NXψ]ռQq(dTlpәR7"8 #ӼmO8bPǼϣP^nMOPdFxB58 3i2 O't+ǹQD|OÅHRm1ZqY8ᛸ#Hm iH )WX DiCqɧ4l=Ti׏U1kGu6:պs,N|. !0KҲ\p̴Lo)%R݂tb@ky؂ztP]\Lly.K{D׃R&u+f=8.N>#Ip"IH::)s5g'Dyڰ+P)XX7XY%hPnxb-4[|:[µQ{홛lWi#m$}\ckg GQR&_ .bV^B,+4ⓜԚb:}gDPoDfxTx}J;Og89rV{@26Bǐ*ϮPhPݩa9Ŵi| !DX=됀<.RkF"vd'/ak{/]!IgގxRԜrA12[+|:@ADwOBa.Ƽ6{]-%f^MchXaT73"oXɋ>O۔Mck7|~hR:sأ)dqM5@l=cǰzAQ'n#6>R8_ӡtT3s3͚c=t#r~Ս$-oelQ}T Pq) @3k$ x1tXAC 16&~I MSZw1cݱ󜸌6&4P^ V"}/ykN >% ќ&S9+S\|]&S!휃x&,>l\CtX])9ZZ wa;|r۵%ۧM(EzF0+(Ҩ<,BEcxYa7Mz4_+ {Mgty*!t;?."2.mIJ FQ^{w\j{i\뤕2 fFnpHwU9 >wT{0Xw;4d(Tu1۾#l՚{ObمC8wNfjg^Hz-QP> 0t1qq(d3+ z5|=RC?`ME%gER`p\-Rˎ墷aTpٰ:y*ևX.[Ђ]g 9LO{Aӧ_\k+>ބx:?!ܳg[^`#^ /:,W-쪡XGW{@X m:;TyªE道Irǰ"1,@d;|B{tƣl)p$d L}F }.58Zir؜tj X[=ׇ\^SXd\lQxZ%&YIKsSk#@*bjޕt}tC޵)P댴"Cモ})*tezy^6A}t4zc@'wY:]VMNrLڰJ`1.i[93Xk;`Q͕ 0aU:ȋ| B)vRv p4Q dW0!.\˅AuFyiEmLEv<"\I ]NE/0,7^*>TEDX55dڙB;(D^+;MzG# G]e P\DUsFA }Y֗WzAԘ;˛&5\w`waϞA2(ƒ&{Ze[k'| Dhw Bإkq ˇ72jA:g VEf X0<54Rx@t{j&?cx5 ވW>Ξsݏq-)'{`| rCWֶ9 "״M[IU VG*"ݦE_ya֩<;&ם$(g?|BJ(:C˞GjGo)k+7Մykz ~FMLoZ-Mj =ZFڒ}}ijiͲOG^"GaȀfLc@2'B[iLe<[Ju|P0Q s͉/OLq9pmMq@\GNPۉ.(GApufJ-Yl+#|(Qm% 4><9TvQ/J)AƆWxr:k0<*mvT9T>Pqܖ:+9囇UP=jDȟ񂤿i)}3= ++!g5U7.|% @Z8U]K|1RBw6_,#z:SMx-BiVS G 5v*XlТ\?y~s5^/R# g:Ȓ<ФJqⴠXh,$U?CQ;vSN>`gVP&Ҏ-#u##?+l K,Gpm,%f{j&Nӵqf?IxG5NB(%kM{e XDFʹ4o=/Ob;z„pR fUfٱn"ȑOxtN+Sn `[mBaί\\Av^(3ś0B#:,# }$xkD Q5 /} vWsȲPJ5)Ep=}ȹ-:  gX?IzVǥ=MgJاO]:鲊bx3z]#4B'r $XJ@b_uJ,YؕX0Auf,iA 1a[1| n|(z9R<zVcxhI7DžQElI:t͚G!*%`(LAgffE 1;VO ~P+hp AI1~VmehXbJA3WkO2lщ\S?aSs vKHC2?{Y,bްupLLbc(ݥf($@vP=2$lfhwꓶć KVTQWc X%*5!n][T@(<ЮYX1!Լ`F=HM|=93c_zc!W$g:l!3p{6o2IךPN_%s]ؓ+W6 tI^hF1r8/lX,TVӱ&|Iq$_:xLX B1-wgcsOYiCVB]zw^Zzt]:H1iaC:ɧ14X%){OTǼKj`h[: yDV2T5sD($"c{X^"gQW9Dt1HMRmB0 e} tųro`-&T9ӨSaPPXK!PؠUXdh*iy"֮ͳ;'.B*:>IGnF Y AO&9{y]EI3iGDjyN1;/X %a9'`U["K}r1sCFiox)# O; ]{,nbl9HtC*/QR3 J=sb+ kp~\BEY/ɖ6)CA{Tj 8;/.Ed=TbKJ04]ɲ1?u=pGrMhlTaЭL(~rHlNW&a28& Mb_t?yFg.sh P_IPp'tg,Eaq*iωGҷhmUuF{C 5΁H\ -؋vˇE^p =Wn0n{== D ΎxW7Lc'Wmg)F !t8P΂qb7\a]A!wxnY¡JȹòfOKf)A`dѰro r{ŃA_xw{LK(χDOOJZ'Fa-(`{ $ aP9W6ٮguc eI\|4a BwU i.h'#Wb)[T0Tk;yWe+P U4 U(Y4 P)LMoZ$; \gw!K]<| :Y^b?&3W59dΥQq璸`:zƞKiG9W%n6X`@ ts*,Vˮ:ik9٥/KfWu.$2PkOJyǗsCDT3AНzi3e18vK@D z[l+1|=.rE;̠P(o{a,ğg|Q41[2rTOhdTH&0*d5Li-Xvw^xvEUU3a\Z-&}B́*r5)|ŭA=1)K"G5=)Zf=x0lS싼S% ޹õZUE{i3?z&Z09B3ul^CU3D}!Vh-+|>{zDij:uu: ~ y&=Pitv0瀎o\ 4r+(VjT0i{t-nM}#A5}A^^Lox]){S! >k$# .2},"/Y;kLF&f i?߫G7BH&ߤ{0o6XO|Rߑ._3|5ݓ'v:kP^3XLd { gۙqj2H,Qi.1Ԧ83 a6ksAg wnn>Ĩ%=h/Ⱥg(K➼iPU22pr-U&^\ tKx U͆ݎ9`nI@8P#w&47]$=*~BH? EWI>};m7 +W˺'vNGT(/(1 ߤ&+²{H9A6$3$U3e>s^P#4vCPΛs/'Zp]uʣA\SMl= !O 3cq8c {*<3J3Jͻu<ҫV=Spg=Đ-+cgJB;(rl`]z=}Gƺ+b{j[)^:|.^ S߈-8%vdyKMʡ+ =&Vt=_ә2UJy)iD.U݊,#J;sFma@U=(zPuP/]/4q9rFaE5=mmpW* 1:!!E{ Dڵ]#nv{!Pfx"Lr;rD^`xfу 2އt π`hWfHA%'W -nmBWa:q|?E< y -tdBhQHԲ4F+"Lj2xڏT#j1ÒQM|(TlG^F-8y*wVW8VӋ(]ٱ)ֹ㫣 8׵P6E)S2YV % 5Z 7Թ܇̞Q:tDt8+)Z9|}s6%W/$C_?SD[ץ/@=^{}Fěǜ\//k,9el+K(e,2V$g~8kp,}$VK_p&*K#D_ESHzBͣJm$ N*#TIs2e,J+(S^')bx ո y!qK=xVLAE\e5kD؜"Lg>b#dV#CV.O t{/sb8_ϧ3,䃺 "1:-4ð~[Tod "KAdPȘU2^ELL!M%OE:z=ܙ}{^w՞L{s΢uUhrw$VZ쀻|ߒuC= *v3^r㺌%;ڬ szu,\GTu=TVT=O2wv1()6c=MKq],"rkxaEO2T#G3=Q]ucdIgEJ:WOiqTSgh#=]~0]+mB 9hZvT8iiؐBv~˓) ygČG, }=}T#oķG.h08ΜHޛ Ȥ_3{ƌF֒ͅ/cCO7g+OK)J`ibœ!$x;LO 7 գfħI,P,8 `$19i-5J25H8acxª3=(ysTkv<}.tG)zl϶AZRy?^[Þ&ς*!PLmN["ubKkvdy.nھuA쇪%8GF.~4 l N{4-E4G`oR*LJ{B%8x,KBYN?:E 42 /8KlB$x STfj&aDqM$J9?e|MDPVSG93־jOLs}t&g8pZ S03hw7#(}nⵁw+QPl2ue,K 6m[L|,MZ`x_Nh&:FS^חzL̓zsb;T2cfwW5iuXI::='o&TF}xyXYw%:[ ,&nxҍHp#z.`5{6nt`6gIc.ڎ/jA 7,zlm]7oR n@4lNq9 wG<{.ב!B{iޤn&eF/ nT?+y>I+Et dxE"ʐ+E_$_Օ)opYүa,zI:S@GZ^yac?zjo8%% _& Pf:#ը&D TճzUP--x(g [)}W6UP2~ƺ\0g^kIyBNy̰Bl=K/哌Q_G-Tj:wTe\M:ZCvqO 2[8tx l-5*JmLjb s mԽGO.g5lI* gtl ZB-\}zzZ^9g4huϏaSuϵQu}u{\:Ec|H3۶ -->>a B&f)ay8]Ў<{Dps1 jD=>?*=z2ݱs.ۛ-;fDSΚm9J:掳sYU֚*ZՊ o2)`MB^{#C6G}U-hk ڃCK t77^A?:w-Wi~*߹C?Q"<|݈8' !UPl)n0_6 a{"^ ޟy[+ B.UGwܥ;ɚz S\pa\_lWA@>y4&(WBGt2_ ʁǼ[(O^#^ w68Ur嫁1]C<)1vD֒ a ^>(MSu6Wz[d͗ۮ.[bFԙ<0Yya+zo}GS%(dJ7ٝSY :j~o8Pv*ZG{n> jjo-HOa+ޮ1>s'=1vrty2 A,tŹMWoude>swt[ݯ8++E9/HD=ڒc豜F)Sbxqou,33"^̜0sUpOc %|Z-fӍE[N@wK8jb6WI Am 7d_$-@c9k%ZigE*)\:G%xHd2K5;lG벊`= -|.I x G]~0q-` 2b!~}e5܉*@87z^7]Y;ǔ3цQ&p ;/bYdN}&;Ԛ}5xRy 1oaFkYeL'm 婎>JpDJebntXDC\tG.57D͢uZJ^RDzť%jU?B;h>N*,цc\w^?xAkd! ɾEƈ/%ުݛ'o(S^"`%yCH3"$Ik`*|aDP[݆]E<q !6<=B#0 !&b~[c v:{1OtVᙔ?0{I%\n3YB2IHh) 2Veɼ;:2!$d%!@s]##@k^{m>:d|nչق^2zu-=c,6dMF5*˒4?vÑz)eY =[|%/;ȟB[Ho#_r9.!BK ,p|N<:=<S.rIw%1W^+#Xжk5a{7Av{V=xJ=;7,4« JмID  `Kɦ":ӂRX".9Y06 U.Qe]ҵ"ORUt//ƭ>E!jG8gxE<aIP $R)ԄG5 ӛRs7)n|pWB5L,E+ ْ2jb:7zm%DgL|Q6+ 9E KRq@jcsgp/`A IRApVwEypc^rNav!s)0[82NH=BcLDv*i}-I6 7 RHA5I@fr? )Q7voAkJTNGK/n6 DU?@*zբSK_o -&$6-kڠ`Qmu{ b2r! d3#{x4}ЇL*ͥ<:qZI9B g e avB1Y`X Hy8rKG:c;9rVS7s^<~ \Yܐ6.;y78eQ&oq(GMǖdk>C,Ƅuf-Q9pK!F,=-%%J6!\DؼMoo(+^S`.#tOg﫶X^TQk__wo8#rɁ-4T{BQx_fɍaWۑ|9}1EE m8xE?EWi4~t+MW)R)M֐t58tєSE7v_QV4\ q"F|N6g ݹ͐BiG$[#g%YOz| B31h. ~+pzl1yk\'uE&G^tE[o٩#"eH2w9-1ahvC*|t:sŘm2O90^soEuVCԍyqB7Oyb-,%=4`S'Y@kAȧ3YTZ'qIw WMP{Nyb8>Ged B㔃AByPDbp;KW(-E`u ,:q86J7y\{4n,=~/wNYb25FxL3)[l~)VEfɔLzU68<yan*$ :Iwܧz{<%lzGT.M>K^y^Ɯ4l CѮbhq6b.GuVÆRꘝU O۰ӳk"x5EP(KP&FO\Nw E{k$枉aM .[Gjp'uGǷ%Z {h Y+ [ Qc:wv&Z`VPe=+Ŋ]aӖ-UXu< ,6܎+܁ˡqkPY+JjrvzlEt K>%z2O#w1F-XR HO߹T(s0ÍPrc^;>q+;a0Rz֚sKPc3z]node=pkh("}]d:jW7 5JF-T֩,FlCyy֘Y=w-"^bp7F@zNeN>M(sZ=xl!hsƧpg1wS@ٖ\@p$Z:y RW6O.պҊLmi/Q-4xm%."`]J=g pe9>_=D7{^6H̀LQ=I7^ͮXneUA ngtSn dewGGJUjǽz7o8Lz.TFW[؋@Ec4f|VPԽ/ߑ<4z5*1O-&#D)W@EyeԜj_CԺ_y|sNSP%-S‘1vƖ =ra4w3;4| Uڂewʰ7\ fwѸ!Ȟ#xY˩dSDiH|#;NOiƱ@~3DoaEEpyxWɼ),y.oM8+5c:B ˖ vb!cdB!ʒuqER(3"·7./}GljXʓzD=a1sE I.R2j\Ye/V:_uwR(DeYMx5xgx3 xsIvFe! T0C}$d}[D= ^Fa]ki Cl;Y8 qP}U &cyN׎-I`SFk췑Z43k5٬@=83цfi8$ְILGwLhpȢ6 TrU\=%wy8/{⽤ >|4-^dTTΜLd"]^*8Y*ԣuY<iKңD^:*ŭvG.ME `Lӝ|Y9æѣy6W{R~O@%/3%{_N \5z# րFsDNUY|BW˷ =^Ck%~=\+AXӅLaC.8%6tApR政|ɍbӁ^U8_RA$mH O6pG!B$-2 YQ1WUz !ս/_,ȍ(m.Z^휬ID`|_xByD]mkI(c^+*Ui$GGh?Q9T^Flv z %*.4 _R3B4&O LP頼 v6 $F4`JӎzUpiKX?\q7/*}xY2Ksg=DS-x1EUM۱7D}#SݍY>nKXo yqWP|+ت>zl1FC`Aޝdy5Esc:.9Z⤵((ȾzUNmZ /1E٩`ydG, Hr6i7Y7UhJWmii삆 V/Dgd0Z8S ^|o(Eo%ͮ=F̰\P|bK3ϛO^K48gcQ1smE8z`|jZZ1_tبq{37 3y>v[Q#.sgXixshIDk-Ybt=m#l׮vb{ki=Y-V%w8N|u 3mo9}n0{,Ӵ{(wZK&xF0\z=ATum/Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }ĥ'P|4j7\(z惧Qkx>G}l'qA_8kF ⎘ !2X;y;dGav9o#njE4EX%Is =*awnK=G*duۈG"*yo6yĊ"dP̢h1E΋[>Kz+4j:RtW[r;BH(;~`T%GYNݷj)[x+O+rdjQ=s6>}8K\#Dp^D+* pH=v+}]FƕY@WcKRKm)x.SIX*uQ祼Ȉccٕ\jᰚe9~jXƙhbRzptX.sX$4KP6ѬTF$q,7S| ' .feY68GJTAU`?KЊ^zmh4$xXu1j[|Vnf >|Fao *'d#4^js@TY=r-L{="z'Ҩ" n`O.?LTux8yʋSx[ܞ;^ɛ\,p~1XZT"TlDzژ${'ME S48,K|PVqpWJJlb%9O⠣ e<;s))}QBɼxCiާX?}Lշ'bP!:gGac=áLd333I6lᛁLKY<Tweh1T:4Tꐒj2*^Ձ*7J `B p̸^fw i*MnkRjw5>/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%?e@F4Xq-pg)fAy>e>[H,~ᯑ9Ve9υ %m^puV!thQ1"ؚr#r`A#PNyCc,h `uT= .=R8ZnF|/vAN"s@| ۞6SJ 懍/>)rJR S3V|wB;[a}VwdOLY}!B" A#:I-ZnNY,'{'c}z fUl4^>zN5ymA ѹ5ZAd/]RT`!>BMh 2ƁTϘGYbUw8w<-2DIkԱx!Y: HhZo '9WNO#" ‡2X/[lk ̨7G.CG!j}5i0V웍VȹvB(N؟s=Т=hNe*l>ųzҡZ&xVB(n`firkcU{P/=}DW8hgboR"ѥDx `4lB{-v2Fabߝz sSP/!@zx_n53nA(s[}|ϭٙRQՊEdѦC3mP[rb+~4'[9^2>L2w|4:LA.s1d%ʃ[=et\EgKWF(y#=^,,)ʦy"ss@r0W/zin&X,TԜqs&*oc'.u}Ux1֖x,2uFi#UDI`7iZއ (Ȇ:y!2ݦh6_ H(bԐVݤ3\L@F$f@a_T }dV䢳jepWFV<1w#q&Wփm̵lC:XxPAkG^ZIl!խq^J M%kg'Nlm U}J.Sr yIlH x Fzyuh | 3 u%9OmG󕗲yP҈Вm*h#PGH䅎'zS(FAy`te f6Ӎk3C4 DJwsx=RᲗꮮyn"]@sL6q;;ٳ|kq}ps Dwm5U, J)֌MA3|.|_8rA,|#s# kx,Z ]׼M45OC%4ՌYNѪGO "R)d 1.tTkxyq G&)Sa=+zae/UpKO-$&SS2IqB:Kn*dg" $*8Ny3[+&Biq2h~IRceQW 'qp}ǣYHկ8-Gm,s289{Ynd-;eo"Vg!q[Mdk$ %{0"oƈ8wclgV{S^VcTo,,Ci)b/Px.9Ϛ1d|/Z3VwF{";qdi2RO1}7\T6x͙WatA` F/ f U| ý!*J S{c*"0v߀V ˊN$;@gZ4a\VBɲ8fި,F0K"h{_$ ^ȓzaR@^{C32|*|̓ef[F>NZ)3hx &ڥ9aM\v[}/Waqu(' ;T^.j_ql&}qk pjwۅ9fpr:F?ߛwu r@y{)>Ƶ%R-b~j&î%/8Z^Er;&&@1碟AǦXYMwkHIEf)XUF޳gX&T13U K d#n =Mh|rLCDN; z-Wи$h$R7˦ZTӉfbtRmق -;X 1 4jˠ?8o_H(ZpT&(*8ܽiT&f.=l5/LS߉᳠}`X=|[37OlZ\I<_ꮒ/ [\USj9ߝq~~HM;0H/H-Z4\)K_~}R.tE4IB!*>u^F[zU璋t{lMHg ϲxWIuOë '5brOyK-k}#oERg9(1\}5w p׽i2IpWY0 83c,2~wY]vM~,?a \4"l~{.*^_q#z"_N)ݱGDd\zSg*0=3a}Τ 5 ׆߃0~=6q'rwL29bKZ`oe$٥w{K@jwо[ߡ'm@+cf͒Gڬ9||{PdLHt\Oѹeٶ\N >?ŵnWpXElH {5RlㅩCxN۲q!RUxc)d|}%}K"Wݠ{q`D?o^mk],zd"R+-0)jH*ww&)<{=YsBmw49/ X^ E'i})Š}xiBclw~} ʭgD$/!J]`hÆiSLyD*݀"L fȧ=FS>wBX쏧ZB|}g}{XV2[C [Y\ŕyBGV&Q]agקKw"PQU5 j&gQmP ӜeVfJşl|ojzcוYrcEr-%XWY%R)(j@O*y:@?ݭ \nlj3ZA\3t XO_C1G@=g|nU$Ux {~ ӰFlbQEKpq""O<%A<15};OKj 2;󻷫L1^h(=Pq.)K=jLeąQٰe$V9! B[}QBEt0_^k+D3ҧ|ڢ\~v2F"k5zCز/VnC<[=AyBF/?+W!wPq|H&B fDfF+&<x^O%k=>| ;s<ٹ; pȦ6˗pO5<Gٖ46A2 i LJmN[d'! 5vM 6غ(Tz(cxX!o^u[Bh؆7nj!_l\ʔfF#%na{8fj$XTwq- +N>+Uve/'+$o`dHB-=.D ]H`M Vߑ(h+ۤ@19XZ2J9@ jZ;kp4-`{֐bI~( ;b&髚Nma,qMR>^ٶVDJO5IweŷRW9 BpT%X]|EJmvcaTىe{3>Ww2~,J𰕹URLYvϩܟBVArBWY%׺ RN;N*ȃyZVϚHV뎸y#Vxq)/vϸQVPj*|%\O?>7}PnT1^H[TSHHL1lc)}!IDYLR=iLs[ԬSo]QWU [=|罈P0\Uiz@!,!S|#r^W%׽6P; _uѧGXV&63=| W*1:㣛$OpT|)l#7 KJ-`ސ2™ŝt:genAy(+ȹbg9CʈS#.ST_A Yܩ'Iη=oAX^X )%WmvjɈ..L[d_vB v~9MUuSh0UF驶Ҵ^H3 {hwx& lKi<=~{Tcۃ*Ks4ʃ$e|C5Y [ d<JrKVbHf 4oFOAB_{۫)']y{u ޶So55V KhtՓ÷+]HIX9d(h"Ƨ>UNBqnn1BJNBiEW6d_Rmhvћh(/5S&HA8"n_wݱ@ 581WyHCo\탓M&ʟZ!ε5qQHՎWͬ*i =2~@z/JL𭋿y)Wc o`,߹m#45VB*RdI_o#IC㗕xMɡeݝ=%K>J?\7v(Fozm=G>]j.5)rϙW=x*3[;v_kS%X"@>ٽ6*ݬ ,JlV@[!o[8r6{Zp\Zt\nS}[ O]/"v;Th='uGJҕtV8e{t?ٶ%p˴Go_Ciq]K"槑Ϻ?=lA/ ӘYtd^5F6Cݵå%<h愻- ) ;ȇϦTg{$) - ;,$Ñe>a":߶XO˧=Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJKq :%p_y)O&q [B.WB|P=ݬt;FdóχgϹW~T訃wBl[QD0u7iꗀVL=o^}"dK,zD٩͙S . ڌu܎`ܳWѥVhMz"k%ы?1P !_Z9zI䨖`zόbu[4| k,9x/)DSkp$x9SSL0 a"$?878&(i=xg|f谌swYuB WB̀'UYG"OBxzq*G/|ѽI٪[T^=m(w$JƂ^:~) X{`;YμW B$lL z6''ߜA{VYwNif Ij~ĔTPňb6sx|fA9ˏ >QtVr*=xw!ٻcd -%h5WcS1xaE/# gO@L܆џyx@lhZA+F `"dl*X/\L?qٝJHئmp3ag։h#ZrZ9`/ItĤ< as#hgfik O9*2=gKb,h~fQP=qH tJ)mN˥Ƙq4M3i `#'] jNSOKVųe)9j}̋,&xNDZ;>_i (.=l!&>}4[զ\!vT^e<yԥ&sؒ+*ߔՒ^qHpk] *%WXq;^(t`:+uȶT޸n8w fAr/rz(|:pM0X˶{,d66>Ro'tf=BMz57f&)Hi``0ٰN@ n:5|0nY^ޜNa67)_Ӌ<"nYv2I#eŻ(=G+l2?RG7q$d+21C<[Fgt,mc_c;J=/ӕ!v4Z_eBBCSwlo4F<31.P5ZTRlxSZ}{޶䋻)M ʄQEE4=<:ʬ30| Iw#E@})v Hz±RjG _Ε#ʕ)xz##ܲɽ(%f<qg/B|eri䏢1o#3`@ Q]\>P(O|ViL\TY>rEqx|zE-`Yr|d`cFjVK6*opN_(OdP['>Wt6E~& xOx5XE:Ɠvkf iY!OGW~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟ%TC)ꀨutM쯼-|du,Ood7+ƜMJٞ|X&:7I\E&#o!s\p"J 4# CJc:,g!7Of1B1R2 Ҽ#7:ЂcN63W˃?о{ʄ:m%2A:coh^[p=.?Wf9K]l(M l O* l>R/_V!kW=PUWá}b`u#4R\5O)*{"_2X~K'm:=^m}j>K&1oAW5GoH %O/;E`7o򣘭gnH*]{Yݨ}.PO/gJޒ_=>E^ė}F<[U.U]|=ADs`;xB~bꥑoKFG&r$povmsKn?D&.5L|҂$:8fqx$/9]\:~м+Ku%f6O 27ʦSi4v7Bq_%+ m޺$$t&:v87]d1c$|<ĖiaA)S mMbay{S (֯=E K6kӖ2׭>},]s &VvA.b̖ފ >[0C udy/i+}}/n5`+CߺUDzY7t C+JJ2Ѩs{;3 ?O3{R9FԀ+$⴯tîv`fE*,L A5)hRf?_}-Od]UQo8W1&]ζ /rv\r\mTcVн @"B2j)/̈́2ыXBg8 887@a;H}@Aw3@.Fj)b{WshK-em:jpx/wƗy! Eh_?f^T9C'9 MG^J8>sl}\U\zZ\nY JRQMܓQ!X (|-R{l䐀(cB`{7&kF!sCy*" LN@}}] '^/ ,>=F|洽QVKeulH1 ։jh-U_ղߺ2Up_Hq@IPX3P}5?XHĠֻ983#cNB8ڝo>q:"REv Me5< V }I<(nQ/E ?(09?jZˀ6ڗn9N*Ēws.xRrmĦywj>Dw7 K8˵?^DHܹh}6ќ&Sj.d%rU{0uu fG/̭uJZƟ2 J@{ˠ|(/ 2'ཅBMsMGǯ3hLDƴh?.R!37aoY؋փŒCcӹh7!6. BB3 Z UF# d(@)`e*m!K"NH Du/ד *y0F$pB<86>Sw'{])^ gJ7^hNRuLezB6uUX2>Kzǧ i4|g m6>=:,;dSut!ޜ龀ʹ'꿧$QT`#-k)mWhVz,0i4J[{*SqCuLs+HWJǑzLpH;pV ߋZx-!s9_SAdyG~e创F:J.]Y36Gd; ojy{6}} ?oÎ{ֺ2=b|h]\`XEaT׈#(tb2DXN$䂿P,:9,B=z) j». xnbHuގݩ~}?_s ym&,fJXPK蚞y#/2XߥS 6*ά魗ySA,hǼ|.0OTaϹM;/)#ܒ.>HB \! õ]X/c7ܘYFXę3zk%w}@!. x:U^[F9*O={,AX)Ơ8=>i̠b]*sH*`ɤ뫞$wx˼psQ[wqAo0I-с~k> 2gl \yd2o^Q.ԛOl?>&ՒPtrLDd7D=|I0ˋ*I]a4LzcU7`*FJz+Oxkmh-'zX=kyO^;̭(#f@T= ywn ЕTԢb)F/!Ώb;LǬw@kza`]^޼k¤0uOdİ+ D!X7a=|kcuph螮οYZ"^$ƆtIqy^6l :S❟߽qł0QCLdpp^1l`pPX ɉ@|] +glCF~cx{%j^Uȵ4䢉hLˢ;\'p>"Iw}|SP^k+U{O0xtuz C6:CM)L)!(L*q"YA ruD0 jH[ݕe~2!2:1g\)57H=z72Pcqw^=u:VO{օϟJ;8abq6܃uC?g4_(I~]zXs|<ь'D <0ye㥒ljRikudwGn mI)d(#Q-|MI1aZmdre+m$mf5ISA[c3QV&jnP2m1 ٓH|v{:v^j K#%^NPEo^U]|+Ya;X: Ͱc;U*MYM=! K48W*`ٞ(#dDFr'+%{j}; ߅m_;+H«@ķm@5~A_q|2b+Qh{N 2X$'O?^oP-&ܣXT7GИ7~P0 qN %[X hf`R@P6П8p!i5[ă^t Vr;;=\}MlF\V:O((.eDN<|3v;)tc< GSk t<&q{}, .1K(* WW\m\RE`qǞ7.n)CbgV94G4^Y" R )^ejj xF2`+"7sW}=֏b_mYt$.|)ecٰz Lw xݚhKR'ܡ4O@|XKw7@2QQ$ơGJO<'TåfY+$MCWe"!T|!Ο]r<G&BEj”#AEg=w;(Wk[ {{ H߶g% ҃UM9AQġBG`wVn{]/0F$C Y$=~g 8t4 lf8F-g8&YiK"[1V1dΛ%zgHQp(PVvWv5Dp]<$B&yׇ6s38AcT?KqYx+!koH3qOgz:חc{juX^\ytsB&E,FΔ / >қZjWFa91f  aT2mW§઼2B6 7+ïI;GNc0 dBHqՀ G,#BzlkTGĪ{nx#-GD Pt#1no]k mnWg^<|m_Ќ(cHkgiv!MEYn詑*(OkGBEÏ&g͢Gp"چҸK[ޑ)&y8h{s{i=Hh8фJPZS#$wW )y6`ph< OAYdg_%Cn4T ەLqq$@}6 _/M?L~ꭀ&oK4Am>3'ŋ#[xʜ5x)iOukm4gxAv҉1"1igv%iս,,nxM$cRz# ޮ\ 77# i] d*NZz*17 }찞y`t4 FWi5N _l"4l9rNǽ"ޛG> D~OWPkR%#YڀEۦ{&0 2cA0:8C.¿\ sh4<4 73jYKriᴴk/o Fl:pv'a6zDPSqԝ'{ L,2-o잳0ORq{d!s9͂CpYRQLS@I"*IB|U /|uBgv(gw:#bOB@?>(OŒXxϞD$nk[[;=jpK pU;OUu'_%7;Sq!̐[Utd6Sn94zb%"SwfϼI68}vExdA# >Qtmr蛄 Y 8 4j:蕼.YXG Md0>98~!#vM(qG(vCdw%6#^) 6 -`A,i&u9QE|%LdK+dTŐ <^b·"J`KG4~zʬ+|=>؍&c81&CN`^oj2J=8{2NY︪lm8P?ҚLk!pƇ=cpW\\|pPdMCztJ\2!~AX/K^(aD+pyS˸4b̌=Џ5 өʝ\XTP#6s 8"w@Uف[&hLF%GŶoGNly^ @nO]i>Galg myEu`\vP25/׹#c⓾0P\LE@ 1Jr$Q5I-^R÷VG| 1f!Na#rl3`}iR)3Н9gg|bLM+<{*ݹjtfM>ٮë8,b% /Ģa rPqW\L.xenMÖ%R0- y녡SJA"s (,%%xwl< vhT"Ww<l4kbB3!Eޭ? cwJ:HgFYk9HdݨYdd;|gd3=̇<(x  }M#3:NjƯ\!L:8sU(YXn*HN*V%iDoCEQF=&PkC*z+4BL H v>1 x1\p;BWC2,ނire}-`yfL'1LRP9: Rn$*$96Þ ><"7VDȉ!<T >nL g,`3YFz(&rWxmeǥ*^dQcY@3 lsgJme=e|&rxj7)QZ/ώ:*)5Pݬ+1hp>DF/rlm-R5IofogUjJJ'άsa jPײ'\k_zRZf-V|Dn  U1y /ea E'+e"8Ģy{^3 oB0 u,^l\1TW=m0({nh 3s?]AY u &g4x^T07k̀exڷo)@Rt#ށVѼh-0.qE~ZIqhl|܆|շ#{**~ʋϯYkQ&Ha<{]M>Jbk`y=T,P0,BI)q&a^klu,'>dfCbA)L!o>!z<ހgS;!Bx o]<ŒDs)Ҍ,-aHpk[P.6rZ9uIJ{¯H k:Oi|vU>0PGSgVNaeRP画hc=exKt3D?ZPwke -N1s~.@q]:Yo3$+j6^)03Nw3EQ[n}9k>hCf /`-KHɋ{IvT޽|X)r[PYgq g>F9 N]3*'(El^`Nl56wxƳ  [ZEVК]CI ֹ 8Qvk@ ,jkfOȮ3ͽd{t%oφuzvdq5b793KC#[BOy$Lk;׵FPE!F˷Իjpƕ*ZNtJ; yVu.3*ܮ\xsM435?n[I?'Q})'`:LתL}>t)y5Kb1E%~8>9ZupV0~sx0B&|D!G;wcs-gT (:UfF/s 'iSs``GBO\ۉPjYtszSjxoi@˭A+gϏ}2#!6e8T?I# /HOv!Z,qx8Gj8ںvH*{1-3Ggߋ|24juGAb3%Y]O1S/ԴA]盇4<gܹ8WlͤH9D]HkD`OYk!8 i9*qaw>8McN/!V?W+/-T4&X1etO^@Ī膹 p+4>t7 {AXeԴ+j;oB:YG׉vRJTh7O^ tr(GEnWX41;%5|wgG,Cpm]9ܥE*^S Z´H'E4ԛV}X+f)"Uڜ࢝e.R< C#k|h|]gsv{-xgb@g0)K4Pj1].a&0m"~Q~(6$0ޣ(&R~ϲu>H  CW2^$v: c.y=W8ll~ KcꢗPZlxPlU'w;H.^vR,,kHœr4\^#oN@ }h5r-" JK8##"U³~i0X2dwHCj KLUQ=I˳O3M#[! eKD&zǰw3hEQ_ieٕ'W>N"|6,&3lO;S!kYM}j أxN=LpT u$bv[Ó^>ŴPTzL2ٟeԷm>M >u|FZMwoˆ̵7@'K燦=d`[`9@6Аn{‰ =^~edr+mz"3%/㐬eQI˕ixR< ]92%" 3O%~g-*hFS{ 0հq/rU X}}|:!I= uh; m|y8.a * q*#wHt~=YYZwΛE!ϒɵ׃b]Ztt ְm=TZ[U(sM#R[A+|M!:eov% U7&F AOv#\ʥdI|FNDt4uR4j"φO.aWS@['n7o0ս bJL`<_Z:iltX5؅k'f6D#372 9Fڞ+HLA\Ĭ*$-4 ۵YD W@`=3i'95Ťu/FLYz^ȟe^, B1bδ\! 1ʳ+4"ThjwjFCN1-l=?=`9g+j:$`=ڣQ3wxg@FKsHh#ԡ9=Bx++5g\P̾ `Y#s'%i3qό}ˆUOf='FMS@O">ľiJ.;f,ڽ;}|ʋ]J\o>z)Uw~ǰD!d*'ve϶\ԄyJW=<#dsԄŇ qښr.+%u"GRKN5lOnx޳~ ^H(fWEh"c /+_Tνk4qWlΙ7 d7|d{XfԻʸ%=*)Ey]q1/r rV;,/؛l ~ "<"U(< QtRx 2#(bАPlUk>yd9R yUdX"\GA_0 kiTz(mUU.; ?^.& }_/ZO2C?dME%gER`p\-Rˎ墷aTpٰ:y*ևX.[Ђ]g 9LO{Aӧ_\k+>ބx:?|JG,bhTq1̑nk,m/:I,W-쪡XGW{@X m:;TyªE道Irǰ"g>. <='*]x)} d-)l4c橰kBKz3V6'Ca)ףu3&١;d/[Vg 潯Ihvk mOHB਀Pi xY'NGJ;8]+5@HA*24>((ؗj1PHWHx{e@GGGH<֟nށ{{O8ygx3(e$g4~ d þ‘E3F @\9 [(0(b'%op gK/JZnJ`>$9au`obݦi~hSRB}.JA6y2J6v뺺89݄Ob4a&2-S:>LCbJE={"Q{S&ԣkR=-A(q(ùėm&㸜^6צӸX A#'OI y_e𣍠`]8u 3{K>y(6ĒFppEd*W} QwЇ5B/^Ry]f\#Sqܖ:+9囇UP=jDȟ!i)}3= ++!g5U7.|% @Z8U]K|1RBw6_,#z:SMx-BiVS G 5v*XlТ\?y~s5^^>t5ÜmX{}jb9eywr.͛yA˓NAn%om0#ܪT1H(xYv,12r3Fu3ZѭQ] Cwoo>@/{e|zGe!oU{E=":j;}0c> xӄ5s%7^Z=ezr'`TsBfzq͚)hC8K +7@#9 rE:76xtϟK4F8Եm:vP+OwQ˹ {Qg?In|uu-;nހJ?gb_&ӜZˆsFdm Q3+dDךx!C4Fwg"&ªc@z&jmĮT4c[I+N9N&ܚ >F(#u @'6g[Q9^-x  NmBE/_d+Tc[ӇgJoi\kޛWb`#>)h5x QYi/H g+'Xμ 7=qh7WcH(X ;P>6[};}%Ŭ.Z̈́#~Wl WpKpayg>1c?}7:JӨ׀-dHcCw0eyvp;Z_ iٝS[ ~Q~C1wv5oEċx^]h9ҘR֔՞-Q1*.DPFHT2sqצz{<oj@ 9谬_$mU.+D@wz37صk_a!bC)!8oԤ~gyHәfih3[k9E<\-i2K_gе0a8]VZ,9{ ^ϵcS;yo2CN5DK AN 4"1 KF7Ҍ%#\UP5:&l:1 PoCE/GAtj`LR"7* #0RXY(DŽ{y )(zNUe`s!Tϫrwn<+}J,'ҮZaN b)ϼ^=ɰ nG'bdbrMqL--]"a{!gK^Wy=0ML3atuh@TʐAC}OV.,qsZQF]=\r6\Zbm|$JVv|rtoQy L CfCxbŴP:x<{BLKJQ~Uّ<\U.j$>a y3y9RgmPb>GEӞR;)SgW+|촣+W<6hQ0&k-=EІd/)͓%0[7P~ꠐޘ,P\% HH,0dVeu͕T9?niwڬr(.ؑp/Y$'xܞ#%jZ/j҄Y^{fZ'L+ c9@`3]#8?cYLm`=<pe2\zW/abeZ H@cþ9 H5 smnr/*dX?|N9ܺXSli m#<ٞu{BB L/!$l>GGq_c3Kz'O,kwRTAa/Nݍc\p^ٰY*c MHt&37w)A:/bt+[r{p0p瞲2;; (^uxN++]%T$tbbZ/uO1bh:KS:hʩ"!yuѶׅu dܩ.k2PBIDbis)OjsM3e-% @{ݰ )OMX,G7,Kǵ"xV ń*gwPtX\;{cZAxe,²3Tnf2mI=Ep 9hZɷ /u0S'UN[eO1!DGSzg`l'.OmoįG.Ǽ:*b挅 Of#yA( k#IF:bKe0)4hKAyp)iRO)0 2,r$e%.r,t q=K& D`3Tηj2Mep dDyR,eKJ=B`m'-@7X}VCD?>u61z]뜋uwLz0fY.\Ӂ`߸2h6V/Pۭըl{a6yZbH>zFhj`r7R曻 nGgC8}nLIFf'@\d$9 Y=D^v טډM~3E9: _,.Wy-r3Mm3&ai#6zpCXAOK^XBЃ{|/ɛ&UQ.#gA>+}т\eB RlH1x{O ֝,V 5 qwl_HxEKңb9:`,!qFב$0ITOS(\-래nw9Q 8, !;,RHdhTE>Ϥ́{BV-K"_h C6>=5Rzכ>q.hp9 P5$\SdZ  >=^*yoe7շww^RM9f&ߌYi 9 $(nT3h iX`nwr$]ƫyYM1Q^ɏY+^gZtyɠuzkA|枓'aidd(flBoTS {k/pY͚zk6D{Psz$&E|BʜOt"P[ꋴꝮ֣# n 4m8ĀATʌMTB5'^FqHYoMg.@T}-T޸m:T"'i鲼[~Dھ\-5[XSH֪O@ Z\qSz\v $D\}^/MR=ѱF˒+ (pCP6pӇƴ1_6"^y[jV/ oD};j2޼9;L=R ĈQxD{+iq,ԤW@K}AwrZ-.Kkb0HE&'\tEP|ft5^-!r)TF/EW@ M/dNQ|cQxM+m[#իxNvHBH,-цvC׈|^#@r:ކH0F#!ރ~`‡!3`$kh0!b$Rgtɕ5Q-ML8E;QUf"ڷ SWha#BG1ZaZV\~]Us(ŸmCe+8*z5Rm-ɛU±^Ga},`^ώO_=Oy-؄-Ҷp̏Lzʷ/unpN/Qк]u>g ֡#۠`]YQ]dO' X.}Y?%qЯsNy)w \%v 0PfaI~%o2sr'u,[G&Zp"±Dh[-}z,}9hO! QJ;7f**÷/Ӄ@8pP%]/ρ_L޳Go*(D[֋ٮoȌ~?CA> 2KӲ@3 5IA"TJEY-ZYc704 3IT R+dCs)gRK̽r؅_\-to"=eUX;aScmz{$XTUʭ`9 W{|\*FX1Wygykh>?g gͪ33_T+W# e^U}>eXtߋ{uY7j]Z',#lETZU\:sH7D:5$PQaD=XX'[|`ݗ`jdkgIdNCkrc// fӹ_ KPG"9-myMPs.a Ԯ&J[49fT5(p~Fɱe+ Y/~ -u=`550_2%֓Ʋ3{K AWZ91pVLݺ1EpdDTCI3z=G|l&JcE𞤈?W5=&,ɛ\ӎ!M%OE:z=ܙ}{^w՞L{sO1 /ֽ;nchy#Jt[/RsG#"A1n c[nRUc\dVraxNe눊Nʲ\0݊Yf.%f̵ӖiI:˱EdASyc#HI wbVhGa5kn̘,,7Y P)4c̀ufѢy;mVh#շӡs<޷QOpռ܋@q|) ygČG, }=}T#oķG.h08ΜHޛ Ȥ_3{ƌF֒ͅ/cCO7g+OK)J`ibœ!$x;LO 7 գfħI,P,8 `$19i-5J25H8acxª3=(yϳ>0;b\I jer? \#y}|SYxҾ^%JA iKN<^x|mŽ,MgWmq ~O0OҟJeH=x"X) EeM!{7xxm{ E8[>-:.n]}-5Cu[ӯ5K!X/׶Z (,S:8Eޜf؎4UdnZ,VNN /› Q/^0VV]ItV z;B1:t#17 c ƞy[/X<_)YoA{5CY;mhWytM* 9)3G.ݙ1ݝv:2Bh_yp9͛pr­pwăԍt>/' bұN;b HX;wdkr#%" 2kQ580򖪑)&D6[$QQ[>I87[FnE|%$Lz3\h >&0WDry#:Ǘjyٝ^۵'lFmgʻݎ,F#E#ʤ0y)C]4 !:޺m?K 93+>/lbߚ玳G 1FTca۪'fD^׽!?SW@&>\LKwV5@¸bЁ|D7hMkQ rU5eveyPySb;%e}Př봃m7Ț/]]~I%=W@1nW vVPsgw5 [2J{sݩ=pՠ˸ȮI(.lSjeud꡾WX\;LrmO}Ђ4 V#9w#k.G'"9BWt^G6[?mv⬬,)h#qLhKbru LYǹJ#Zmp̈x1siV=:)gN8*~dK!zcbswΉS,fs6-\F&>- ~ue!sMjYp+ @`Mb !/!(vT=*na$u7$197$ `vHgVM"z`H[J6љ4,qɂQ:w|,bv֐yʗz&ҥf{!-}Qϐ7n) Q;b 9c."䙧 Ko J9&8ޔIq;.Ǿڦab(_!NȖ_Jl9bN$v<3;fE49㈁4+Ψ*_ j x[z+kvdΝC**w!+S`pd,zƎVU%3`s[l@n8k "@;~&SzQo.ה4:X_Hs+9y0m@뉪?~TBEyDep߬AZLHlZ4X9C͓ݐT 1lJ0{BV:>ßchţ [>`"@Vi.JJMfF8Y-3 dH^?ĵpd*3 FlP@rByŭ`kCD쨬vWzAʼnO\O+2>h ~:)rpl|\ֽbS0[:ԉ7 Ω@ʸ`x↴q?}mO3 c*sv9X&[LݟyXc:ݖ%OC|BpZFj%eBX`U"l&lx ɷ7/w)0'MƳUx @Mʨzy Ե/7T9=h(IotE/30ѫHq׾6\BwH"vXë ?˕&kH:CEh)"`y/(+.8L~ˇ ˣ %GY K9%noV4` BV?M8 p<5.ǵ됋LJXilO- *SGD%wd =*r[bUxu71dՃq r`":ꬆ"Tu80zn Ŧ[X>J{hN7.OgNf=Z~S)lĮqn^+xjrHT镻>EB#E?( Ҳ =w`'HQ$^1[ƋJ#F'&Y)up mn:iDݪY`{_.(Rej:'f;SP8Sy )km|GqyT%@Iu')O"xTSK©\$}jb\y9i]^=j?r}s'l8mw]H<=-J$3@hvx.r7\a܊A<}Z)3 :/{NY)V l:l2 ;?QhdvX5@T~Xm[Ӆ])4WWcK',..}| TX !(YՓ1.xˈ5팱 0jaŒZE2uл 虂9AMZ0 Ok  B'SX;}>Ct+;a0Rz֚sKPP(ޗHV\ʧY+I<2jN{!jۯo*7%e- gvLTGXa*g'f2F&,YgQ$A=s)|xb:iwth^<L33 ^4!.u ƕu^b` /[g|g)Oh:HTմeug(\3w<0= W<9agT@n Ïoxa=GO[Edړ0ee柖0T6E6G/lPc^TQ" Si)']sG{OWl_t hC 4zpkX֤ ;&wu8dQkE}*a tђ< O=a^]]atHe>jK2T*FgN|&H2.z^@LQЬqQr|QI G/r]y  |p0}xNU,Qa{ͼt=hHUi^5jKv?Di$Eyjh4gL1]5ŗ_)tmո|گ`)ѣ8VXY#^uq25]Ȥ6ҎSrZlC*eN;Ϸiݝܸo(!6m<[!D҆d}4^i-Hb[a)P[pqE_%pyR(ł܈"y<ɚD @'+>IEƘ҉,aH=\/IT\tN iܚӑ͹ʧ3TЃ>^H/Vqypi}BОP<4y•,o`R:OUa` 1[T꽜vۮ~O\BኻyVAX3śZY:Ƙ,@r!j:;Ѵ[xDΑ1OneJs={<1hD[L| ncw),\uv,*ixXkF߉eb`-j"$4rK4π@t{X)q3MRzw/EЋLj ڬd*c5DNOri8qAeLA(~u\ p Le[a;J݅#%J@F06Ֆ6#ήq.Dc3{PUN!JOUYPC3,b>\yQ KW|as vO/2( Ŕ_,)dR`It{RJ(+t=gۖ'ѕ֦)A=?-~@ {% u61uk˥#S|JZ4DA{Ey~Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }~lMr)kz 2lov􆷀-L&K{? vef" .UAvq6a6Nx-ZDSYi]tU¨)4W RسVzA}sԯB3w!Ry^`]#x+:{HXܻ'[G;\>}l%V=ll--{T&Q"o0GxYwdUW=m51u7h`s}'vp L_6kqvl#g?@P}R詖o 3s" x=hJdk3FcW̦|¯( HulV& =FA_|2HX.ҫCƩB8-6G%C%?7D9W=@^s\K],YƠG /=|U,9r3Th\1@.G{)>~HmUeipTCp礌ťؤ7m-7Sb:j]rqIMTM7]q-l.mqTsu~s٘ 7StNAˍf]MNffy%͟^;ζWRtuD@Uo@npߛbnȈ%N '^ @LOmqQe6Pr=vdP자vL$}:駗! )ҷk6EdUF=l1/hE4Ebl6|(V:yi#J/Gmt0=ƻ99h)lǔ"[/rsռT%,$YNݷj)[x+O+rdjQ=s6>}8K9eQJ-s Z]G)O`GD f| Ng.-6Ybqm?7a"4MP)pI%'R Ξ" GLNxzTQS(VLv~QXY8]AřE>$ځDw$&V.Ь& rL<58nB/,. Cg \r8+| d0`cFeq%x27=PAqzJ<*.^iħ> lD]Tuy)42Xv%A&h8&DYN,q9!؟!?݀k)*}22 G+1h4I\%p 83IDŽƲYA ΑFy{PXbDnOt"^%OOShJB& .w<䵬gaOw^jvt*}KsP4: }hW9!#QQJU͘ꉖkaFV6 d/%0s=FUa v}uaj:8!Hkyh",Z\ǑeYrs:+:PPbk,!Wy'0moMl.S [O;f F/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%<*^=LB@ >'OdkhGХUpxH[x BGl6'=]g Ei`L>|Y_#/s:h˪s K'\ۼJB*95\ю磺c E:!5G&2hydGۓm~ޝ::^$oY,`;{]^{qp^!삂tE焁6@=m$K])H( WW}8Df$Pi}JN?G"O[auΞF;gnX/[(>돒=j0[&f(T=H$h9e5hs'Uh{"k:ՄcDRx 8Z7s4^jݓI$wIO$ZRÂ,Z 5_c.Ȝb$SQ('>ceUݱqG;D%ePnⅼfaN, Aj146L?sx?4unL+w),Jz__- `>oυ{6h2 D9[oYפEXo6Z#^ۍ&8pcЪBR=;D$Z"IjN[ }l޻i鯙mVIKIB]C!9H9KeTSLG>S㋊ %l*|qR]tċ}we0qn"PftLC!~9lZ m??fgJyGU+'FA?s;)}*`(?79Р2{Im^@os$0M`inFqڴ6yҊ2HDtz8tT[j1+ +u1wN7HvX"ˎ|l=Rx 0M Â)I$A'9KkHynb)D.#u*NXH>+)Gs%A/)$sN\r:C6P qut[j1s-[/Pֹv5>T;vs.[HhukhW/={HtqHIn۔NGbwAK@gcHtfGJ^0˫{Ek6J@_Kɕg+ x lC{X~S~LҷѬ0^C\؁{ 4!:]> <~d]nk,C`=NkO SpEĠ۶!NjoZ+uCГ_Y?]|P5&i"s, V9GA{e,u%5h.aQ# ,dc~ee8T!nU/SӃ x`/76JA~lb`-*0MB]c=z4+ސ'Ecl`_J/Ĩ=LNOhC׳2AY^(Ȼ5{ RFM;"^Q"sHg/[ *cbRy#u{iOS푲wĜB41Qf6O!FA<1у^teD%k^HcMw\NāF,1Zy\_:Ꜽ]e[ } wR5cSdТ ?\o+v(7bŜH-4;FW5/@1MP w> h5eSjCGBHT B *D<>7Z^"`^h㤯{r=.g/%1MΗ)AeduX"i7nbWHg]%}QQDg)s~kpP(70.WЏ}1IJpl@<$x#}(eN1'z8kލlcWwVMJ1@<w6."yz ls dd"FMc,Lj/|bjꍅe(=3E /e;'Yc;6S [w&٪/fM`Ghw zGHqR-O2}7bT6x͙WatA` F/ f U| ý!*J S{c*"0v߀V ˊN$;@gZ4a\VBɲ8fި,F0K"h{_$ ^ȓzaR@^{C32|*|̓ef[F>NZ)3hx &ڥ9aM\v[}/Waqu(' ;T^.j_2lc!JbayT#grdl 8|or,zV'YdNK Sky=N̚PǬ~&#bf7YrNܥ!y%훡BcU zϞgbU{PǘsΜV-|^/'6aC|2s4q1}Ij9^0e6_A㒨]Kzg,kQN'=I)e .hL` 4xWl.l>ӤzRU/w+W.?zd+I}g`BK @ffkYêpNfCvFҗSϮGC? zk¸UeptYqnZ:#,sDd:r`uPn!u Vҗ{}8<7U«z!"^*!՞E f5g V]$Gzv~wKGѰ$61T *a`vj. :5K#)s$FFK"@x/[':C;XL^׮yG³ʺ2yqdG!{}}Ss| oh2SaSF?9rc: 47 gOcrޯWOoREEkk-*c;aM_Ow  ӇcsJTo!f fc: Bԅi|b6 լ.;Q&>ve$_.xD9F%w9̔>A G胸ܩ(>ݱGDd\z|WT0Nx># }C?v*ok yl#^y&iA4dZM|5w^|S2&r$:vl~ CL;Nv,|m*F5 ^?nZkՓ^{UOBj-nأ%$w̪j֫EH#[J g9@vtdcKΫo%W-_'/^u[!ƁvIPB%=k#} +TZ l\l[1Ϣ^YgOZ(<{=YsBӟu9p Qhhe'.Vׯ)lcSx oXkI* mPh ίZf=RyD걪v_=:>B96^ &OILs|ѩwn%HWaOzX5)mV,Zo Ip[(XrU p1ux| e#zデ3UமI&>FmIś.\G`33hA0 Qa7=c@EVD&=8/l6[BLke kgt# R8^f6Jϊ>]`|ojzcוYrcE9#Fkɣ=--yJydk/1Di>.v-'z;e&.75 \GF <@'U(5 woo}d|}M=Y5G-wd:? ӰFlbQEKUW=>[۹.&0nߺi(꠫ۭ}A}-EEx_u}ֵ]dgy@CbsI]!y Åe u5ͫٸ%amgeyA%xB7YA{t3/zFSK[ @Ytuƽ"A 1ȩiM*[F7ڟ^l4/j ?c;|hxeFO=\~zemQ.+rߑyhvAg3PWjBЫ=':`F˭6 qSFfV47᧻R_{! xL{SԂrQXd)jGT8ByvEae2xD|%| ̙컣I3Ǜ! -wmϓex-e܆ co@HSC2Zu<|teV!Cyo[,sLi5-t)P7sD -EF#On"1*ӖIOp _#MR$#mkE$PtW6_|+u7QB*?*Ms^xC,1s<:";YX!D·>g' \Y*r(V><;)sZ;%IE3M&r^ԣŗm5cnF_l:jEϵnT!{ `gsyL/8:L VTe: T+rb mY+5#Ei7WaGҍ!zj `3)mc,%{Bk0ƕg.XQrHRH_lHtޔG{ۥ:k§U5~:CV-gȅ+V '8* i1yv(q:;EdGB #yf/cO7kٍ SGՕ}\q!NeU*BSOe P^=nxia#{ѠEE ^(kvrWkvjɈ..L[d_vB v~9MUu?SJ[%T0n{:RMbOL-#lΘ>14I}:1R},O༸RxM+5`(*ɲ|"_f_rs+ܜв]RkKBX=Gv>ok|/)̓WCS@ 9O=<@2m-jkJ@nϫ .{ϭ7kݱ6_?p6T)h׎H+cF&k{Jv4bH\'`"cbw T8Ms%"S?emy#%ѩ>xeb^©elib%lr.65>n3sɌՠs×vqR.zdZw)<ȋwoC%7%Ö}^J|阑QؐkP6nRh;[L؏E{Q Qw ٫nW`iךM<0cX/a*5rT{.-$w>* 1ًܚ&ʹ,Nxɹamԇ= &Qqѓ߷XJ(Y׸ׂp w()Ì`a|>z,_ЧnE"&%Xà>2{A4ޣLN`+#T 7ֳg~f`cBo}ˬ2bKr7Eb퍣`; dOa :2['S:Zrݣ8{$N(+Lg4R]6ҳ5t4iFUX&ظ~TۗnjIs筺^&Py:K@ @ 9\alP?ޗ"iǺCsqZw$]IkSGS*32%5[ZL326q\Bdc(ZާV7:PEa2̫Ȧ|޳bx͜pEa3eaPٔjuDFhl_IIU/I-)[UX<9^$m ):<\ŝ&נ_ȧ>Ԓa˺Fg[~37c I^ذ㮵rIMIz+yWJKqvfc[M!:gfVJ UHdˉ#6ryǴpΈʹ>/ߎhqWŵj'>E\[m`0G/_Hm^=BYXX6>QTS[ !xlL"_铥3tp/tӁ :5U87iJ.Hu:"NZ1Ü"Esa~Y OvgbcjTP'6{=p99y s,@sO`inؠ>_z1$#NU1a SjZ |:AO:b>pI!%fZwQd&fW8~z#D~%d;QTr.!4FӤ#8:b^ܧ?={4 ttꮛR˽T.83j68[qQzӳbl{'"RgIt31*sa4ד{uLNJN$JtpRݴ qs 'RިUfC;{_ 3N޽-T#<9c"8H9!O^N G}v-̼|U v WՎÁ'\aէ_?zE؀"2^ >8MhGN艎Ö"K>߬nNִ(Me xkٮ%2;~ /_#H/HttY[2( xoMɃb,ȿşJJ@qc}HUueG[f;!v|{~6IH^VqR:q8hDT̙V,AvQ0TcԡХx <.0-L &}edoY/ާ^Q xotxR*&'cWb* >Wbw3pJchNcpo)$V*z2^'P3*"B7TrC;=A c|_ }+Ls3[ʩR^3ۆ" yUefCGZn$/:^Shٛ*l Ǜb6 3-뎜}ZҢ彪44 rhx `-׉|a~SknW(^-Cr;a[A7hq":|g}7A4f$q觗 $ACx'z@w"`{]ethS<2EQDZ44yO>tJ{HX-qۊRmkƃwK(o\v <#QqF͋nLQ"40[|߼/,E?4Y1qQfC! atB&fał15Z-@Fe:}d>a@m L;_qly?tC$k}g>]3VqN] )od%ӄ o!~w+#9.3h3yoU][5> .2фK+뱈giY;φyujWEłyM9b|2`BNpEޭ ~Ssl:קq17b/#_?q,Tݬs:4Y++*g{a=p$qC?dϩp+5d .H!vV+MײԞk_ܾ~Ҋu^4,YYEy{v{0iJ9|_h߽n}eBb䶒p u174L-_+}3%xHUOr.s6\6'DO[x/Lj>Tɔ'Q47UEE2j9z '{`N>1G`u#4R\5O)*{"_2X~K'm:=^m}j>K&1oAW5GoH %o/m6cUkZRK;`YZj*k=~} /gJޒ_=>`ijU?Ze,̷StH4 f+'.z^Sd&=^7œ}3^ힸ}ӄ\{B%Q>_:{A|8\'%'1!`A jÚD/d{R2}%&|PUpuSzkto"Gfa9VCdR'-H.cW@LR:* |x ?Z/< 䑼zedO#3꽧 )JƬ/c|fL/%ttTDD5WI $Ge탷.<('I+c2Bݠ*Mp39cL /fZXzgl[Xs{^޴=}(n͚7H1ZƕI]ΪUnrwj>`},]s &VvA.b̖ފ >[0C udy/i+}}/n5`+CߺUDzY7t C+J6]Nbř5mƃ]2d0C.KD9u~_~z5?؋@1\!}vյKc4+jDVe!d*eB7QLG0S{n~"r|ù1rM!Ja;E`u'EJY@W;ǁ ocm!JLwB4ŹY9zK Gf(01l!rV((n߈]-XljNmzE-WG n>#Ժ8.omӝr֌ E@;D__0 (q<Ӄ>1i(Ul82_R sd{Vr*VhT"m  R\n`0F+oG{d#@(/<[U2c Nד#,cVfjhMPHǔ9҅l[JޅMses(:AADrΪjo]*b/VKIEe Ԥ(KIP(D864mB3)& 4g8,`?RߪȎHH춦ώd?q"REv Me5< V }I<(nQ/E ?(09?jZˀ6ڗn9N*Ēws.xRrmͣ%!JTBB0t;b{חw5F.F#xDx_HgcOdNɝK_gni2u\(JQRy.WSWЈXmx Q_e) Ǩ(""s[(IȎ.ԄN:{)DZGC36Yg˶v՝xoz6\YyO*{9޺E5;DM%5[ƦsJo%Cl]rᅄ AcxgTя@F4QRr`U7;LCD ^bJs=]Gj3=b=x i\FU׶w"%z}^W=F=hû1j gTUNKJ+7'!e`rOcGЂo@ qF$h$,ېQGwOuoV=np4,p :pƆ1no^zvۜWbg0<o[^'<"t{W8+lvKjyTԍ;Dod){ ֩@Z~Lo^XFN\ KgIT!ƐѠ-pgSGܱ3ylJ.ܛ3PT9D%ڼ.e/%8}c4 IП{y#9~OV.phR.}p4NW&z#.ɑVw*Z9Cr<m6 *v p;J\6<7='tR+3-o5ưO%{dִe4j3="u6uC0_g<oÎ{ֺ2=b|h]\`XEaT׈#(tb2DXN$䂿P,:9,`åKs]DN )/3;C(@`4@0G*b e}]q~Ο=tYa+,"絙̛)ucc5Ca/wkz湞jz`}N)B*o8B^eNmUlX;HU/g7շ ⲀwX%0EiԳ՞b jN :,;2 6L H~ 7eu㡛Th棿.^6 k^2QYưw@Ť]N@ ?*KlTK&B1%tv%%!,/ 3&Ltz0e TNR ߀Z)< om7a`9s|wXHQ7z yp~_aZ=fU|X 4]{=|&x"#'U\ _ %)2 {U[[nFDtu<uo5a ?>E@ V5"S/F"K̇M / .pqje"kD/aS +jHN]U @zx׸O^q=c0E6dq5M,mKpۅGAlGrhv,5'#: I%<]Lav6l`N8PO'/@ЊC ?6y{+ɷia<嵶QGW0d]#p<Ԕ"$ |K^Rny[Q` )ҙ0-\G4 $%]Y׬1+Cq(㪓s|~|(榬a4qS;sMSu(<[ˁ76Ӆ{օϟJ;8abq6܃u{#nk&w; 6`G:m!e!OӋ4 )i\ ޲a@fbY(-{6D^ =\:0/V pqy.E.X/8mT&[3]gSod?y9 -$/)BUKue'!-=m[90 SwC|dь'D <0ye㥒ljRikudwGn mI)d(#Q-|MI1aZmdre+m$mf5ISA[c3QK]dRt3] hྎ.3z,y{7[*VZh%L|v{:v^j K#%^NPEo^U]|+Ya;X: Ͱc;U*MYM=! K48W*`ٞ(#dDFr'+%{+җ.H6{)Xs8|s#(+}/AM>+]Z>s%}mIC+_Dv?I㧼 ڄ{TkxXoU00Ωd w4 L H?n .EԄbb'}&қ'ؠώ]"uQP`i;-]#ʈ6zyfwRx3 yLv?Y]c"H&PTڸȋf=o\HSZάN rhhD=c}x~֊["n%8-Mid?=V>ݴ'.vUrxnW`:/ 0 _ EX6ީ%ݸB>^bx&w=3Ҵ)w( V1|R{&ih<@l*q{'O~12=z憗pµVSzztD ? XwueBƿ.>YPl Aˉ FQrG"N5a ͢+WFPԵJ-=}o38Q,zJƅ}7 (NXE=6s.lQQp!rJѬZgӖ5Dm{wRKKuZLj[}(io'ﳟ?ڈs]X$q_WF  H $RCb: {YD>zC6*yT^o7L) qqʮӮfQ ݑ4#Sc3f~<Ú!,^X,: yA-iص7fG)>Xͷ| )/|X 4u/;yM=2;Ʋzi Lܱٽ$&MNYD!)A^|7c~-e4Ly]=Eӭ A{{;C4aXa=b7ݙhI&!DT;O#)_SKE\}`*̺P0kѶb- 9R*e\5 +ˈo<=7*[:^Hrˑj'?yjd{G3J( '3U`WW쑅2TZUȊ,<zyxQk#xgWSoH觵#GͳfQWo#\8 DmCi%-}R^HTa<wk9Y\JwE㽴$[hB%(aY;֫UzYZ<0b4Wͧ,2Òe帐H[`8ePc0FҪ, "_ U9+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕrF8{Y=^4HUÈbOX"TR:=snFIZP܁`tE vY=N}&9JF,T{܋a+yD XLzqmO&U2"A E Xmo`)3 3iC:dIVKPT(2#)wIop$[d}U b>, |~Ph5gӁ; [e4%ڤp0/x98~!#vM(qG(vCdw%6#^) 6 -`A,i&u9QE|%LdK+dTτ(RE Ow=v}r^}PS\*AO'Mo%2 _ϵvNv "cf6XכZCRO1O2$4@9s qEnkAtbV&(eCjˬR!i,{iP)ZpQiil0<]'M)X4"*P`-CvA4wYPX=w}ƫS) 9>@S;*[B菴&Z'#g܃2!Euk *|tS^@F@:L_wt+7R=J#OTN)Sy0G$\asFtt5ب<'U+GٟƦ:f i 2;KDe̒ rK͍ ~Adh|RşaJ z:+A)9&rbUNJ'$z^?A%n;RrYRw$6i:8jG:\KiwuTfE|iJ r8t;PP1 3uGbnX^gxp@Ԋt gȸ/D$}`~ a5{'wZ tY8 vdVB : Hsb@t$­w>lKSZh/-%{m׵vNrwGh=GȣH,(!;KӔ|m CVEU9̀-+ Tt)y$9NR1%M0@Yt%5|+`uH Cxi[02+'Fhy ,>Vp{ǝ(u/~ 4W4;؃I.SM3fiLW^Y1CO3t:c "V2*H,-Geg8~(`Q` (ѴA=cT{lʥ{9tS`3GYZ&x2lU"zN=^`cB 6L*Ĵ@dbhӊ1S ts1m!Fy8/P:.9FZ.% m]o8 )JwYspƇN7KrVe`aOduCtʊH GV"shcĐwnJwi g swDTo7P޳bGZf#=kg{p+N ^C9me=#+7XDP8j`.gU&LO<Ǭ2p 2># _=AOZ{&%\VzQ'\<wE8 ·%B\-MX`^:ɣ -J-[>TSqЙ{n#lvaAMZkKOQ*BKltŊhҍ[5a~7P:}.O,I 6 ]S)1{mCH|RPvb{_!|OqrfMHFE‹8 ƝecMm~saf6>+.rdo+֑*f  O-t1Hn;] ͓er&Х6NԡhOk<) SP~ḿC iG~SV-.4J:IaYcЍu亖8VDO3\ЛTUM"ǧԴpp9"2P~~J%kɌUta6'_;jr}|`gfr\CiYZ`'ⴣڞL@a9+'p)/:<&~fE"4u5%jV(yXWS@ 0<>%fƍhY~rPJQCӘBgb3ەXyZRIߒ1f::+`V}S]ѻ> Q[}~Yf$Kf`ig}C[.ruϩKtVK~ŭ@JX_yzMK狶㽯򹇁R?z:r" (C:]=MW=nGk,\!9Y+'Lcsˢ!:0W;0xr_69~'Y lr8j>IxQ8hX:Z/=7Emc>7g0l YKXa(,"%/r='QzNa4mCeE/R43\8y^vͨ˞pz9ՐRU~Ï~. yCgdؔ́M-Nz.Lbapo1 89}>uB/NzԸ=P8&Z4ZLs/6q۳aݲwY\} nҐV+Ӫw|5Ӛ;NuQTQHQ-nZ?q><ҩs|NC^%8`"U@z&=/e4pAPMQ>/38YXr}Io.\?H>;Չ$g:θVe^7?I @ MΫY):- đe ]t3iDo)e!ű n&!誩Iw.:ջhLIj `%-(/L-(){[{KNWHqtqƳh_T^nqlk+uJUe5,:rT3ÎD3^{TgqWLOo߳| Ga" C#CeTm(„jgꈧiQB?W"O<p[xA<'<tϟ_mlbm9IKCS3-ke(Y ["8U\憉x"lO}BCnΨКEͲp㜖{܁n}Osk 7a_@J˒V̢trV֜x'sBX{~ I" +ܫ̩qg)kɲޚm P8rqF^ZdzY8G gfl.=$D3,vXI/&ۗvXhJî=@yr^$9(JKTZ@MLiǔݑA^srS6m%Vh4Wz?xd-֬.[ʣCxц1q3ЦȺhdI,LTN.LuP26rmqȭ.T?a{+!n5y+rsGC P~O,l>d/9f=<wNrT%REiNG_&.(w4W^]'JZ*獭|}8s>/$*ay ?-zUja4,8O t&Juzv:ޮ6ݾݪ$=ݗkXE''soƀGY˘L-qTIGE~ V\DDK*1S=1N4,[-6źk&TN aO#t>4{u2=R&'_)[ }LanMBmEw%![Ψh;+Qu ׍^NW-lӦ ~w ^ҹo=ղ"t )Vbc;rl/R1hQH)C iX EEnV ra=eSa~E*g(z}d@z3ٞbdc9rWEjTIߋn)>"<^䫍U; b,zqbE}A@E}:<Ԧ|Ѧ gU>9 dk&GJ!B _C&2,T{] IϬ&JVV.ӉZӳW9OTm)=Kf8V]oZ?t*>̜] XUC07~WnǙCTra=wRmM@=]g#:N*ZJ (vmiJ1/:[e2M!.ܧɋNh3ԍ|ؚJsĵT{L\rY7w|*yCnc-$??g'J4vkI.-P4nB@:)!ݦ޴|8Z1SLٯ2u -Kt:־PXCR<6ow7d _k7 0N>3:I']R$R[^^pQ6iHiйqnBg4p6a739(\z`wnW3@gd~ !+FUqokT /;yXم1+qsrz66 T1\~uK(Rpmk6FvɈ rŀJ6xmUp"IH::)s5g'Dyڰ+P)XX7XY%hPnxb-4[|:[µQ{홛lWi#m$}\ckg GQR&_ .bV^B,+ 4ⓜԚb:}oA|GJ)V2+SG3BSduRt9!l+$Y?C֙˴#ѷ:8TVyvz@\ MN{)MðgCT !2'uXYqZ{4#{?q~ Ȉ^{} M>vē:=Gw|欔 7ܚ^ց "j{ s@4浹Jny/1;B͎SQL+Ly&ūW3k)F@R8_ӡtT3s3͚c=t#r~Ս$-oelQ}T Pq) @3k$HRMf-L<`"b|)z-Kg]t/ke^f!{v$)옱xhyN\F{qOD(/vu+q 5TU hNVؕ).>ۮsQ)]xvAgS6\ZjkʡwpP׉I-C;հ>yϒ&z"=tB^iT1cRЯ@Sۡ*x΍u qC #2Ez8\o@HBf U>Bѽw~,3]Dre\Rmے^.@q9I+e͌` 6v?Ir}(:fa<vhP ~c}Gت5\< ׇp)ϼ*2,Z. |/ f`t4pބK]zHCqk;(uR T6"$;O\DnXrVD( wxaR=-pH8n_.zI kS wϫb}rML-(x8}ڋŅ/nQHM(>qVz,]BǮhԺ9x5 MRKV_]4ˢ<,zn$;te ,5O)<‰hlue"יּ.Qns 2%'NGJ;8]+5@HA*24>((ؗj1PHWHx{e@GGGH<֟nށ{{O8ygx3(e$g4~ d þ‘E3F @\9 [(0(b'%op gK/ʇ_3|1ogaR%!YmT5d[yD MS~eSqX?)ϨTX;4j3dz[n1TOI_Gv. xVRcdZ*""x2ьKLW{S"Y&|GKģ. ("*9WiU򈠄޾,ȀpxDqj j̝M҃_{.1 {Oy@A|*&9O|\yأi{ZmУjdiQoM*~RKjC!6 :{,oa2ť6/.z %r>[ 5.`.~"HMo1UdϱTдJ4+Z_9C^JzH+4om{!~3@! FmsDi-c<o38hTD.U MASyvL;IP,~1Ue˻Pt&=_y6R Wn BL͵ #[4 z̵%3 g˕ӈ8e=_ĻMKPy  g͹(yJ@ƾ' G{2a;>XxLx2ي+A쉘KFMK Pރ^Iɾ|  <` _ r{\zOb0^z>%Q G/5>~5]P`Ï6u%̔Z ȳVG.Q dK=i}xrߓ_͟^JkU4\o'³=,&{rVer5uxHW9JpNraf{rbxB1=f}z*g o}fAJ6x NU_dPbƝ y<ˈ1@zCPC8(TBjB V>h;$'6Ac\|AG 7P1#7y'cRJl0jd7)X/v={6PI~ wmqoj6="|43L[F FFuYȏ)ۍX*ڃK5TM<.k~:j Pb9Kz@"͝)siz^v r+ ~k VZABū̲cD#M<G#/[XWĉu7jWb'Tt`/Mo% 6zXBjSGDZGmfǖSu[Uof9FK'VOS }PH0rL/w^SY3mgaEF8y$`2z!WHGUW^@fsx GvX rWn w~I.j9Wao@2PM2|˦n}+f$4tCBJ4ȾyOGh #^9DqXcd(mydL\kxZ\uZ >&RE8zmU&cXX;t8rk*B2,^Ȏ&[;)Hk=7{oEgh{/0,3Oxj:Vܷ͎bcPNI@X#Ƥ8y&j;=gkkEBA8L6>%o  :_G{WN ynzfMpozƐP8Hw |lvH$JTY_͋]0 G7~9S5:غ}bƞ1<~0ϛotQ3[%H!ƆZ{` ʐ'owHR59Ҳ;i[I|xę)kEu5ppiYmP(iZ žE 43 횕B& _QB+{sGQ aD PakqHˁ 3,q=7#~f1 %s\4)Ÿ2(p&N}rN;:{Ucnc/`~sq)FMiV|ʺ= ;vFdxTri#XOq8`!'צ)3 7GXysVҦe,okA`u!C\˷J=+$3도 S6AGc .io99sڡ{l3Ebyl  KG784?,j&Ҹ>2)螺-`>Bx[O(?) 0%s+09e䁂`< JhF1r8/lX,TVӱ&|Iq$_:xLX B1-wgcsOYiCVB]zw^Zzt]:H1iaC:ɧ14X%){OTǼKj`h[: yDV2T5sD($"l{ZxdO}lgD#/R0q<+j6  l 0부oI$LX,G7,Kǵ"xV ń*gwPtIC ͏!f;]t☀6}IP~ b9'q "Y;$GS#$a̼9>B?~K^ѭy$(}ܖ~Z^Ul佗9BJP#ϕނh|X<|EO# 3@ '{Eyq4:vrv`B,'v]V0z狎%D+O;,kDa& @ +9*ߙJ gW<yp+<"564Ò2c%"N"`gձV2ͻǺ74}LKjăを`'Id@A#^hdz5() -c4!Ơpv0C |lK/(cAJ}}+I: r,M?~b m`%:xE=8hf;qjx3-&~=r9 [ɑǪ<'0,u\=O7O:]\ϞZzCG{C|Pl  vm !(4%MW)c6eF=AFEnEe$'qɳф(z8\l V-xRP)Nvc^=3ClScCR@]M"@1TԃW";Rde`4@07/6Ai&`6pIϻ7q-<7ĹcD rt$fԊarbŇ6#ַ:U^Ʒ87!p.;5l;&xUA8x-O\=7\J;ʹ*)%wu[ɮRb 刦Vdt^vI{^ka.}9_274`u!)w< X{UUe<"JKsvn(Aljc]zP"bb[98PvIg?]Ş8}o-c\e[Upx5x{G;KENзw~zGO-9J'vd2ik*$[KR2E v}ZJ,;ͻR/]<;ڢPު0.ljQ>rL@buۚG٠%-oD<)E){Nk-誢pZ j-auPyo!O:q6/PF 2x~:u 8"[ޤWRX4jщN;U3j!kO&? 쨳z^\\^ǐg҃5˚vAj's(e@)R|n5Fe; wKF7BT?eו2ܽg0u;:|‘@s۾fJ22;>"#٧X"!ҝONmDnb@3˥^@y'fR]V1%dfq&Λ(@[~G~IռZvODpIAyc5j0),)xR0ngƩ !nDjEȦ {S6ƆIcH1ܹy6Vcn 랡,u>ߋ{ CUTYu_ Wxq-aT17Rv;u'Kg'}b!@hC]"0tђHޒ3. Zy#E'Q'- 8[lwyŧH3hQXZ=18s:Byy]GqX &54Y1-CwXNa 2 %$|t׺ q@oj1 $m$ 3a4"y=G&|x-\>FV b^-H"yF\S0 PgޓB]Mhay0xo%B8p"~ ?Q⁣bW#uJY;+k+E}ǂ .Xkb(ZM"m Ȕg̬|+REۅYi\C}fϨi:" eEqr9A꒫ؗS2@#`VvrމS:F^VlfY9J }J>XcN5Vt|%tz@2@+3{\\8>m/8]U\")Y=!Jitv]E%U~6ez'T9K2{ QG) ZOL1&#{4j|AJutelhn"LsWP-R@' {'>8lqlµUoo+*C, VyjKh+"{Xj#o2,s l(*=y}< ;J}8w\#g1%γv$>CMeV=͛KogI:cw!no/mI HWq]ƒ[mVP˅9Be#*N :*rrt+'od;n1N[ޞ%8.^y9Ou5gG<"'*|ܑjYXCMRqרˮ1c"g%HpC8*3F4.?EYUNWNx__43ܚ*Չ+||u%cTc=8lœOg8.E~8` f8f<ͰW]ʔ <#-h 8 = ]7|wFypDB7mMb1bɯI$I{oQqA c+D,Vm)AI/dw%bl_e͊QEÓwgF#b{ $I"qÞ&ς*!PLmN["ubKkvdy.nھuA쇪%8GF.~4 l N{4-E4G`oR*LJ{B%8x,KBYN?:E 42 /8KlB$x STfj&aDqM$J9?e|MDPVSG93־jOLȧ?sOCT+{=ۛSof(m; NZZ̅_Z}YʟW)dAs vO[g˧EGŭ/cE_5`(1nKbciB8vB 41:%3eJhԛӬۑB]0MJԩ9Ex32ʪ+ׁJ`1vS}C(F'nD#s{س9/tKg>xSBS"f=hkS̖OBN<5NUN̤Y]FC槄gt*|JhpjdaxΧwd=xDwi pdwݫv ڸW5kN&%p+ܝ6 ,3z9u)]KIX,tl$S +1V])"?Hɇxd6䇵Y" u4}" _1~ntp K1J@M9̀y9U[^)vsVk O~ 1E3rAp0| dk4-"O;ޗG嶩Zg839ÀZKtbc=btY*x-/d:jUAp Sȥ,roݧ{WAqަakUQn;}` -U#SLl÷H8o=}pqo<`KRI8[ e;g"|Ln)`&+Gt/z/ ^reT<=f51zK+1e|9摎@kd{/^跌3Nu30_l 0s; {붭FhC/5eO@Ϭd8zPY"k~X;FW##O\6\{ QacϏ smLw,\=Gsˎꔳmjab)d9hARF-|VUfVb~ߛb m5@ XӪ!=8מ6QqU$ښi(0 䐳lj["Iy ),-|GG6+)_0cHO!g>Q䙇礗!#ʂ -pm˦Sc9lvo@uk!ӕc{=]Qhš莻tg5YSd.++m*Gt#dJ(Wh\N^z_fWK{A9w c3XޫaFq0J|50k}9%λZ!<,!]+^y*N;xC\yr/Q9f(G_㥓pAV|P'󊫊' PS?}Gl%(dJ7ٝSY :j~o8Pv*ZG{n> jjo-HOa+ޮ1>s'=1vrty2 A,tŹMWoude>swt[ݯ8++E9/HD=ڒc豜F)Sbxqou,33"^̜0sUpOc %B:x 7ڵ˸_<"idT-AAL&{{U;?a;=gءߢ)odc`P9W'I Pr>GtIqAQJ f,+Fn0 bgMú&&{|HK"_wKsCAb@fCD\{/؂L$"XnF_A_Yxn(w 4΍MmA92@EFhl?o1%La#wF^l6lL$F {0"K+q.-嘉M0d)5ۛ3v%bPVzWؐ( ? qeT1vݼ|^tn% XJlJX|vHMG`C٭z$b}U3w<1%ɳSdc ٜ.VbnzQO`u\Jz(퍜P; 16;RZ"3TO"N=X:J!lP:d<5kc>`7 Wшfq4=O:X%(^zhΌ sIL2`FPry?%O\e+dO$SR6c!96hMu8-@<|gZ AltQ,m"돼he憨YPnPSIkc{\ʘWクԼDMGH{'ևIE<q1/hMy,D!3ٷh_E[{3DeK,r$Opi&Y$4}M Q%qU6jbp=ܣgDՐkUCOW(gu;m:ӷ3[[c v:{1OtVᙔ?0{I%\n3YB2IHh) 2Veɼ;:2!$d%!@s]##@k^{m>:d|nչق^2zu-=c,6dMF5*˒4?vÑz)eY =[|%/;ȟB[Ho#_jW u']MO$"1Ek%DuՁaQ*‘ [ϧ>eMK$cWFB'/msWIjn^j{zvnXhW%8`y"M5Etͥ E\r`l0]%˺5kk=E򥞉t^HK_93[}CԎXqy)ÒHRΩ !j@F7nR܎ ı%>xjXD!Wi%_; Qzօf;#\0Kb¢n[2W1B(:2+gPL|Q6+ 9E KRq@jcsgp/`A IRApVwEypc^rNav!s)0[82NH=BcLDv*i}-I6 7 RHA5I@fr? )Q7voAkJTNGK/n6 DU?@*zբSK_o -&$6-5^av S*zQwrҧf+&pi+8j zw+N1фCn0Jb 4bfti%w3\# mlO2K{8Xfcx#SXl6R Uh9TVb0}ʵ!"vTVx_=F'NnsQ?b9YYg6>  ^Qѩ -iD}T wzZMeTyeR0seqCڸ\䟾ρW`.t· ©imwP),K;)e1&ݮ3mZρ_d)<4zgi)/) edVa\&!Z%=nv|{CX]rs{d<{_ʠ Ԥ@]*{INl3F[2Ln (ڎy(*nh%ĩ~+"`):J^N۠\iJJIn31ġ[b,縱+rRä@ĵ >~=-L""7(CZy'3Ʒof=evy+İ O p(,9nQ腳\8iqG 6>]\drTJ;Mg{jQ=V:" (`^$)Pqpm6f7DGǫ>W&cd9]Tg5Kݘ !+t$H.6m!PC6uv$|=Eur7yךj}WOa;'vgsLA 4Qi5 DkAA~YGj:D Y~pxdD}7G=k"FbxQiXDd4 NMrMGWC9[51 ,|ŝSbXLQ `gj4vrcQ#ya2e^=70C^ʾ( >NpR$C$3jj @Q@8KķORk^yuF8)b}K?%vs91C 쭭ғ{&Fncrs6 J6Do9y $ߖh%RU4ZDٙ@kYA=H+vM[TcjZԝ(4p;bx p*?,ǭBe+ Q鱥g}cݾG>P*,|KFxQd⯟|Iǻpx[Ѓ,2|Q r`WUջ&v'L+0zYZ%jIbWk:f7޳kuVܓ:uKYJg{Ożu*uTP]^5sJ=ACMvQMtj3g195Lm l+BX֑J@vEn+7Shj&\ZS5X&2ن^1zZDĺ'od!tI4?<.|RQ/6̵z0C.OA#7b$Y!4-<䧁 HxԃUudmXㅇm]ɫu}Oե-@Ҁu_Zi1pJ!\`E V2z)2r|{.(ko+н/l"A&'{nIؐ䈹GV_mj}ힻ*tG=ݏ 4}v+5ڝϕRE'C{nޤq8\)(Ë=7h,).C{_#yhZkp=Tc*ZLdGR&˨9վzuoB&?JZ#c&5-z2òi1fģ1vh 6V-Qa%'o5rA<+9q]C=}5F>Zs,suS}B )WO,g>2skA^=g丩(qlAY˦Ʒs þySX<]KqVxknAu-,BȄB%,P6[g.Eo\LS'M_ '#6zb&]4ĥndԸ^teӛ,QTiUMʲ6n %k&gd41'BMa o=Htx L{ػ,3: 1w߻zN)zk4ek+e3.tSMX@(-̀"U{o#=if^kYw=Ӂt{pf 1qIaY.ޝEm@8"z>0EKv$xjC* )hP 0[ľ%Rf59+"⊾JZ/<7QE@+y5@ OV(p} /1{1 Yzk@U _3>Fdt3" <Œ̾zub rMw)9M*A/D<84>tKMh Io(h DޑtUTdt a;&Jݥ םaecENk3DuOkRRt[o"JN3;Պ@.[s\W]x Ocvf)ܙWʄ%CRYV3Ɯ@Ol֤#r5~#Qm 0o(ǕqSxV-ZNv'yWL./)8߁Pm@RX>,@r!j:;Ѵ[xDΑ1Og#R{Z~}g[xk)NB8VC44*<։kPTdAQ7ś@TYJ:\%8`u\>+|=@t,9ޛ-oN0ё{1cpP<\r}JT-ҟ/ KЦcn=t{heQXO݌A98; \̾y5Bxq>)=}‘u%#YEWj`gW8` WT1 =*w'ͪ,Nco1Dl}N(+AȰ;뉧OHgb/ߔd20ڤGu)qvޕIyʼnPmJkSࠉY N {z:ɵv)v>%-i"vڠƽӼiiB#w,E1kSi<>ȧ}XJ:2uXgǯ;YQn&'$r\0 ;~ϳ9\,O>Q]=k w >S%Tr_~7'=: qק"wJ0Eb(,twJ@#.anmI H rJ%]OʝSD̀(t#3E)A pNI ,0&kw$؍hѡ{n`H]A8/(j8f;wdSӋ  @ }~ɯ#";~2}8K9eQJ-s Z]G)O`GD f| Ng.-6Ybqm?7a"4MP)pI%'R Ξ" GLNxzTQS(VLv~QXY8]AřE>$ځDw$&V.~? 2&SaU0JK)(Iz4'8$.߅>2a*;"}&rby<*l,Ca - >,˒#{a\Ձ҅Xc ulS?8hc|kgtu?tT /ąqdgq+LHƣq-ȆFW3܃A0ͧY?}Qշ'bP!:gGac=áLd333I6lᛁLKY<Tweh1T:4Tꐒj2*^Ձ*7J `B p̸^fw i*MnkRjw5>/j+aw]B#0 kq6E\_&%ŻY ʃ Pdоe*'st6R nHIdxǁk%8o^yn-]^ۤ-=R9i~uHRҶ@{{x=e#[x乳9sT߹>~Yj#-5Cb.Ĝ<(m Xiw\Gv!M|>7hl~;m'쩋Yua3|˵9|o љbxkU?O7iJSIt,:ؘy:]oߞ&qB!L4 ?$bڄz]<?=#ƵlQ;Ur"6!Tl~ir C.|r ]C#=Tlu.F0l۸a=*(`Y-?H7A8P`(NKdr᳅4-2ycAXV\ X \x<WWjRɩHv<c())~όI/<2!A <؞l =) =&y⍌` VG X#ňȯoB|a+8' ķAi#Y*Kh+Fw܋}Qv'nϹZUhQg2DKd6Y=P-É`{+{703495m*i=I(PЗ>+y4317gj|gj|QQM06^;xN 9M{]ʌus =d/q7ǚM >>_L)j"vdh!W갠?,v ~2wGINzOIjsaM Ǵ)KoP(s6O\L IdFf4?M)^m'(4@LLCǑ JE!@!r]xkq{t}d*拫  #@P<,ʚMd|=W-M2P'ߎ턅ӻ=>b+~4'[9^2>L2w|4:LA.s1d%ʃ[=et\EgKW?ۣV4ѳę5+ނhv]{"5QS9hpI^e^a4O_B,ljǸ9xh1 *kK<ߎ\:*k"ߤ@0ۛ?CX]EdCGDnSw/F$F1jHSQnҙE@ &^`T/Ņ>z+rYpK5C2#+K; L츉k[+f|AvrbZ^Hs 8aA 3h&ϳX9Xbxh #B>P |C2feJer![)7Ċ!N~[^is0#hrNb?*]5YW̥&g%Th^CJGXfv4ӈ9Q+ٜ۽2:4wV]^n1LDz2v *A h5eSjCGBHT B *D<>7Z^"`^h/Ig$K`KTٖ^qg >} jw/ 0qI,r ~JާDaz))K`JN`ݸeA\!%weGDʋ`Xa<Q_C4ø\4C?V$)ñ+88۾Q~$ROfRփ69Ɯ~z7X]_[27h+lڸ܊-&5h=H7gcDϻl3q)/174Dl(pgMu _[N-Ãl ܙd~?7+ F{.Zhw/,dO@vIy2QM?cKx$v47)RFjw9cX8L<Lq},᱊_5A@"Xzw!DW)aj} =\QERBj_AsY1s߉Ė6z Cv: Jz^(Y֔fy~B$t=~cO;+yRo:Y (0k/cyAƗ]y67lkhB+e `v$_44G#VӮwO1,nNDpTQAw \zZ KH>T,eN=Q|s'c^ i;Lv89RN:Ew9l<ѽډw1?5apSu-"ىYP QXusOUxDݠcSv߬&AΉ5$}3^y*AٳLyboWtΙӪ%F7w]Rf&C>nY9o!I "ߋ]+h\Uqk~)tRћe{-*`3g:)elͅbTOSj enʥ8o_T㌻8#[KԦ%Mt:P-K, N7>vHE)B<4ͺ*;,߉q~$#[(! Woj1)cU\,`ΛNܔB"}7SGA߽_د?,ۜҤ&$}t/b;GSUL5.]YujGF߾e'JSTбV8B u'GRK_ݾ{p(ZLlkШ^Axgl袾Nic;6[ s}O\[ȭCU; ǫZGo#Hp4ӊBG6QL&S]SS>'r9 5RcJJjtE;it` Ec\*\lӌ[ϓ9^?FqQUC"m $\YA3vZWY\㚜tB~/ZީߛqB闕cņi§=%c"Gcz758b[DajX rCB8@]rjOs7QH[J?mԈ5D9}^[~)Y Urڽ A0)݋h.>U%}%۫nPw=80uњ೼>j\4@>;/u ĉTO&<1+9}Kóڟu~ZP*xa{b)'DHoCvz!ɠQH͸d>p|"ʏR|myASx%~Uʟ mPh j^`>ÙfOv03]p|r^e]eID$1 G-vJ \C&<]"Zqn@x&L;Omu|7iG.3>dNz mu1=v6]DLcg@xsD@*& 7AĹO+G\+(mKfgV6*}ArO Yp̨_FX"3M2Ä GŸƼ+o߳NJ@ә:'lZQf!ԇl jij2c^NȘŸ ٻ2A*$0 ޑ]c~ھӒˍ->BBqF+b4בk//R8&{ TL:L:2F@H ѩ hQ|]NP ޜL-5%e{(^TJt4% 3gAfMK<$H6uK/ &e^8;* 8{̣m{KRe%)z7o%-g,,[6Sf7Jq\vkIgܞ U(rڌҨ0>+ϛz< whFoL;mZo#jcRKIAHe6<5=9*rvnsd{%HL׈ YP/Ǭ՚R+ pPL{qlwot$I+#-0nO >΋ƯobѺ JxHR+krٟOa{t)W!2Ѩ@Di]tic V ^:=Ǻ:[{;Y6vPn^C:7%]hx002&MVDe.\]'LdJB4S< Ky%ya_ONtu/n9眃QkD6>m4Ŗ!# ]R?'@jk۔1ޑ DiR=I&jCID ] iKv $D!=1:`F˭6 qSFfV47"(CZ8ҵߌbZt<.Fʨ3j=' KtrXٕj^^q,E8 WKkBw_H;ae2xD|%| ̙컣ٙ?''\osb~ӪEt5x4`)Dc52 gő{:LoOT:MlI[x{% <Ǵ+ ΝVӒYmB}#p }$}wLU6H ʚn4\o%U_{ywL(B?h60&) l[+"'Qn[Fsy=^UU8[W+nog¨@\n#˩TPY"a`|N4,ۛA4TdQ}xxb@βCM/ySb0H rΪAI`Յp=p* lZ d*Ιf*;X=_\߳3RPЪm>׺ RN;N*ȃyZVOLBU|8DAB;'NQ$|!@;;ڰ4YP9&Bx(7#9}(cOøMԥCR8?f@S XJ|~ԊCrpOw <ɨyXa'DSG3]Xkݖzz횂2™POgu'8Eb1ZO^|U ig 䫟+TIR##=&wN`*e QAeI,}c:QJ ,\꩑ơ[,_ЧZV&63=| W*1:㣛$OpT|)-ƖZlb+4LK$y\O-6&N"z"D )[Z0mp'~ijZOmٍ SGՕ}\q!NeU*BSLX_'ZMQǂԓ&yOĬN`9NI,r+^><):ؒ_[~Q«%#03n} 4UD[ROC=9`yxN<u}ƒj.K8FF@gLRE$V#L/tާ3A>/Qm΋ ,WѴRC(,˗!Vk'!HI3Igi"KQhzzx,vL=apdh+bN$.jqŞ71^mk1V_SjBߓ1d8_:ۖ^3>TQngQ'"#h8@ew7"JQE"7)Z_+P仫cF,Z!'ӊlٹhUmf DȘyѾȳu-GُIj:4A:)>W iП}sbҖ;Ѹ'*)r-ykV}p`d[ .ET֧|,@h\rjfy.p.Df`^ xAhf 1yk}:54#ѠG&S7EI u7/j 3RWQE;qk?,~~j((]2_xIziIp#HO#w:>kzنެ/ӳ/+C˺; z{Jl=}" ^~LoP7x *_Hq9 P8ӥCHx 1!+ mb ?x\y Yr/绋O Wk\;9U zĵce&J똑<3m;6?gsiby-,"=j!eMDpGձ=O7,Z0-Iu{m}`;]/PŦNSmb /+J]G1lk} fA焇/~_KzOJQnZ $?yWs,h:-gr%dȣ+=B穊\Fi0ЪH c'ZI Fe&UƹE4+xQt *^QMmop `Ϝ]S23LbLiV2W0,萁S/uߩ"OZXT[>_x~O(G50&{[D9=C)/9W59w=$t1:zF?!TuRT)Q)5z.A, dI 'M)̌#FN j ~, O߆0D@mMJA}dګ iG䭝VD/F5ԩQo g Ya/\9-ۧGwc8-0վFvM7pj^ H|O a= i@4N}bƟ~OБ:҉֒]y{$w*,FA_at=ZamN3s@dxZvZ۪]%ZĭڰD//1 DS̩=P{?K@ @ 9\alP?ޗ"iǺCsqZw$]IkSG{pe_%#(f `}F5GdQGOo#J>j/e 3zD>{}F1:h08LcBfёyٔq{vR `o(l2  ?RΟȵ=;lALx ,af׎̝W`i$flp3¹AZ=E\Y//6kXƲ Vߌ.l6k\R{kҧފhl_ `hվd?s1kX}DmGƛ!thg Kkk[a*:/oryǴpΈʹ>/ߎhqWŵj'>E\[m`093(d)]vӦ]KZUC8莈7TW6 H&H iDMA|}4T[\ZLsWsܷ{dxܤ)}ֻ 錊:MKh sN1cvseE+<͟xO2 n#§T:EACN8*Dԕ\A#5kxQ}|wNIF$cx~Px=Te7+|N63Ql!٤sU#nsqmYQ -7 3P\!JJ@7{}6:e 9fFk ^FUP\}"=9೗Y2S93R \LsbgYK ТD8J4BϪ>b !4wl<;>BX)+Q-&v0Rp~4fm<HE'a|O5dw"5AgP)&ahG0N|p`YA bol^Kh[_cO,?[d x-"eRSӔvdaԋ8l,ͺ F }]dMT2;@K+LO+FG=m32 u֦<Evn_727^rzs> /4YϨ䭑񫩴 7֧a1_U]v$Ke&b̷W`Ce'oiKDshg1Ϥ82hGl/vڵA;TH'1VfϞ8 '/BT[fʝ5RN6s߬zvȜ,S4+Z 8r#!ADT4e`8〶Y )8!M*v)yuc L(m! xF͂+q t94'2_~߶ub#~#mx+a|Hnق3 pk@ m0NDO9[&$|{/K{ҝ(x*B;m~jȋ(ƍ,5RA.i{2Z]ɺnD?<א#Pc='[Hh/@뮹 (z1fT7<{2<gj64^ɋwc67(*lUXsdd{Bgq 8oYն,M[ɶ~iK_~;ѕhM"f< ϬVG4VVs^G%Iy Fn LrN3U ez̥bT{M yvO](>]3(‧yH\Awǹ9Zd5u.p/{t٭/Rj%ۜ|K1hgF2O: 2 :-)2$W4RΟj[8 g{ Sr^YL̟n]X[j4o^rtTw05!Fg IYl}Q$lrb^ftv+ӎ"݋r\"d[r]rZ`K")x@ S;n  џ|UFxcΧu=r&pI8/ %L O"M@ (YBk_ũ7V' M :}kY5)ikkЬzo Ywx Rjg6P`P^L}1`;xo^0S`gcg#J{ZD=.3,)GHܟ~o#↛/upCGB6_-'Pnf/vj aeK0khY0dP A& gfV́LS!v4Z_eBBCSwlo4F<31.P5ZTRlxSZ}{޶䋻)M ʄq.śBFVJU^|6GFW5`8yܮ\@=;[9)Hybfw/ӈ;Ih %Ma@m L;_qly?=ԫ-$YYr/#b{NV9(.C bqz%uWLv BnP"X oegGT~~DV8em&ﭠꂣ \bkƔ6G[|E90xi%0\z= -kِ;/N¶s@નX002Rԟ dy9RA2u]5&~zG4aJu.iUض%A9R]O o썯fe֘աXYV9ۓ؄S&Dy<${N O$^!&t^pArѴ=Ziz],]_3f|7o^EO!uaQ46*+=zF`b< U>wZYIyLlF vIxw[_P$\f5HGy M k ОjIeΆܴ0˦x2y{/B9CWX 5A4-meІ8:EA^`6 Zsto? yNQA14 d_\:iSԑqhTX4)x>$z=D_+2T}SSiҼEo8U-0[fd1kZ vV3Wš:\(p\OA,X3 vi⯒1//T ®e3vuFͶ8p~n>fijU?Ze,̷StH4 f+'.z^Sd&=^7œ}3^ힸ}ӄ\{B%Q>} (IA,eUԠ"BDQpaک#m|)}Bdɻ&ë<~O&42XOÄ {n4}ӗToMHZ=, *~L\jIOp IJgSE_/s{H54hn\EBndŞ"/άE'"2UJ i_FCJ6[No {OAYLED]ԯ@{^>xƒz86.! ntg: ;t[nLak/xƶ595^K ?}jamtu)5p@W݅YoIG˰EZb)bul+q|aXu5(M@.\Ę-} `b^wWL),_ %kVu#+ǫn4V~k{:!-"sn:@IsZpJ¸GDc_ppdB̈́k[(.hݮ#ٵSˤn_87r|:sl}\U\zZ\nY JRQMܓQ!X (|-R{l䐀(cB`{?HAz5-ӋY\7RC,^bnG @s /)}asN|>;~vŻprC~slgN;lNeTV' s`V]YU_-+[e[ j>7H Tu)9)=3= W?QK 8<,:W!# :Nż8+vz OL8)u9uQQm%eO޸ȪT]7BSY~ Ȃvd208[AT틁z$CdE.LΏ2MÃ[Sʫ<\ o9^F:p\A*ω8a2"@<=|1 XFGhˠ 4F=ī1C#*9,cu 쉐,)sm|9M^]E5J*` |^[A12 >z[P[]cTF|9A-$udGjB'h Cj3pq1 4T`3Ƿ%b6K5j-LăԋŁDQ" ٧{<޺E5;DM%5[ƦsJo%Cl]rᅄ AcxgTя@F4QRr`U7;LCD 2 z; /m!x0F%դsJ,TuT?=ɣ-[wuUwͧc~oȞ(gdc`#T4ۋݘm5zZev*%SBÀ201K[hh`~ m^x`8tK^^}mHNPIsp1ޠ*?> Vވ%`"8!jdV'>:t18JhNۈ}+\5V[^'<"t{W8+lvKjyTԍ;Dod){}O1E>DC[3z Z/O{/!h ,ȞP@'7}_B^e RjQ(:Rz9Z"NU$dEAt$^o =1TI}0B R#%teͲPv}3OIK1 ;(m|# '.E Rԍ^B?/wVYUā&_;6y;M^6I)Ga0aW.uCJoCU+{8n2=];Le>^d|G~ul^mCӢ(I4e1! ʔm> -r%wj,^bA G(١V&Fr[k8 /6{R8(OD e]>_Ԯw3X|\SD!n# Jf?W" ۶]xv 1< "P9L GȮuջ7]MKRU?L4EzկŵgJ@+AG/{W/ɷia<嵶QGW0d]#p<Ԕ"$ |K^Rny[Q` )ҙ0-\G4 $%]Y׬1+Cq(㪓s|~"Tޮk?qwW3hKk.^鎵ZJ޴^/U6]} XBSًO%]08O ׺oN;6WRV\S r*NkÌHU' C96,/zLL P=u]C[%&QnfࡑTʦ}..W汽`}7~,ʳG/f[QC!lGktO4 )i\ ޲a@fbY(-{6D^ =\:0/V pqy.E.X/8mT&[3]g[t~K[di/Gq`M̓/BЩJ'Kxbp=(u90mxLŹ!/J"k;}S{ قa `m=*ϋ5L|mAm d¾wHsN;pXB5ԅBLJk~}盂gM >q,5s{ž~8 |I ]R(ƲaN,bû5і|=ONCiAთ:T3oL#|D3dLbSHC];y1j'zys8Js[H$/ʰp[+GЖyrc2& q M#Hq9~4h"J._ĩ&L9YtsxJV[ pm{Q3T'J}XP@iܸ/)=Gfe0*=X>48\8s\ H`?=8()&E/I 6a4fgE+V1ɋc~-e4Ly]=Eӭ A{{; ^m[:u0 Z!,_N55i{GhZ'bH\ڊZB'7dC"Uv]鐸*̺P0kѶb- 9R*e\5 +ˈo<=7*[:^Hrˑj'?yjd{Gs^]S W%OpHf-Wkku~&Mf!@*Ż8J}44詑*(OkGBEÏ&g͢Gp"چҸK[ޑ)&y8h{s{i=Hh8фJPZS#$wW )y6`ph< OAYdH~&Is,XKH@`Fzvcw74b"G ᑿ{Z@b^ae;+Wm j DNĘV3sP8Yt_Y FsTlGl!#vjWOo@Y\"YD9&ś72] 8_]p:ʕ{Tuy>+*a} R]ɔTDcj4>H c*ZEd'kWxSleτFIZP܁`tE vY=N}&9JF,T{܋a+yD XLzqmO&U2"A E Xmo`)3 3iC:dO4LJ`1DEVDt+QXIgC. $5,; ə-ۼSt03_`;tNl}YM6)Am &"= ީ;O >(Xd[E=g1a~"BH9rƳn< ADT=_`4);|a7$HPwkQ' .:~pw@6GA-O"S{;V-w4޳'>ɃNiߥR\SdU]Aɗ!gT\ȯ+3d(ᖄlU-Yt;j-[5frɡ”3oҴM+kg>a_$Jo<8.lp#Tչ[/$MfcŞИ)Z&-o? ,g<(tA\WdE` +4J4 Σ 9ݑXشDzu/0ҷ O:IߛFyk=jxܖ0-#R30guRAB}鰎U0SC(K/ށӬ^͹hV幧"#{'*k-ҵԃUf]n4Ɏ1Tdb&wzS uȔ1P)IZªbr=m-HnXlHm5Yj62}/9e?C .J#- ]MǑ)f@Dg('ZOA $ͫC2s͑qgSg)gZJX2P ]V#9 h̩XO"3Pl#ɴ`깫Ll|HQ3{/Ň E,ݔ:?A%ʍT{k̑c1 `=W؜!] fD76*r ~Q)ui A3+*U"5Pz,l6j=+`6 )y~{&I%F)(\爚[U9)dyCx HIȱfIE!T@ZP; m@Қrk#,rށQwū3+5@AeĀ\OaAX{; fBRrqb RJJ V9EtckGAJM&JddϰoV#&\0}O.@ < V0@JhXi\~aU X'qiJ -{϶VI\. [GyC%dg x4vo?/::EDW~p,Vdifم d>K~({;>XaʳX[ t~ƞuWLa-ז6\RE>3{}Z#=[G%EC;2ڥiPt%ǹ,e/ Bw| LoDr|u*hPe[J.z;4`\1?{<"]`%;? v؉5~Kuibk.uvT]$66?7$zJx{6X=XX0uoB3`,`:o#Tfnx8㡁GrrPs^^x:;@zDɨԞ&gDYm{ɻa@X]lrqվoNus>)($KPzPܖWL/\'ɸ =e=-^r:2*>+ Tt)y$9NR1%M0@Yt%5|+`uH Cxi[02+'Fhy ,>Vp{ǝ(u/~ 0\'UPLxއ4e).]3E| oPB̨T EfB, )pzˑCY_q1( 9XEF8 i4m[H´,PcNi+gC)r,=߱}6|ڭQ_ PѬa8u ZdN`z|bx#u.s 5$SLA鶕8{1+ ~<"7VDȉ!<T >nL g,`3YFz(&rWxmeZ_|&ver:V=x8b3K~!My4,_=mVJC WuWQ/P {ΰ{^􄬤uF0qS0%L;7N;ixNJ9 >EcFQz8!S=&S$MU/Da/w^2ԓqJc~X}vvH6 q~"N;jK|d ">y kgZ ,o{-0O^WS"fAu^`{5( #:3PR la8veB޺0#i #Ud̶s~9è1LpA%c:~CMg"T; DVsj'DSoa gQHx.C5: nmEfVS ?. Yi{/B)a}M5-/^ԎJuʉ4 \ w4]u t sn(~0yfiΧJ62h6 U;1 {Α`A;zqlҦPp $Zۨ3d+j6^)03Nw3EQ[n}9k>hCf /`-KHɋ{IvT޽|X)r[PYgq g>F? N]3*'(El^`Nl56ws{?9>4@ -z2 (^+0ڒjYҏT ZFB9WP`sG'3nm>X.Gۭe.cEu=1N: 4b=-}wؑՈwZK, YlR=zX3c^h@U,Rj)WC8pk:):G4U&R[չ߇'z)\~UBd&ӥ1=D(=ZcQZN{9/#:J t޸Ϋ=$Zzb#eT'Ԟ0;Zx'.7:fI,/GG %t V @WA:& &ߍT12%O3e 0նvm-9^1#ѕbQwX+Mȅ 6 e(>w/_ŽD:>cFHC"x2e'ę:)aj#nqU%0yP ]}bic9ahjLZ9*JĖHE(%5Na" {-?&} *g(8z ( \]4챝iܕ#>1]/rW]Ue))dn3)-KrX 2 zYYs: a*!&$X86pΓ3=rѧ o'zkMn,H@lʅ <u[_xk]f  7 Nr:@ ?|Ub'1{8ZeUq8Re0(9Ҭ`@{}o:`=۝Қy)L日%N'I}2SzwGEO$z)M[U\B:]iw7>Cr=ioëԗtGC2st'N/ bU et^lgLPɅw2jZK7xv#D;h%r*]4Tڵ9p(żx>(V0N:XHleLH7o޻pқ'/n:9x"P7ګ/ a5F0rە.~}g*v\J3QfY4^ˇS3\*smNZpвDsi ϡ`y>4>.ųovyCnizʽޠs iqTϪnY""]%}xjVFvBn/;GԂ|ϟNlYv `Л8yD(J{(ˮ8Y-pw(6>a5!t`{9b^+?ȂnwDTmmsQ*van?ԇǒ$֞^H/@dYa X TH%EW5pM|{zQpe8`AGfv}ß?}?i:a `>#vWrGa _Cp%CSI­NgzCHݜs D̋W[hHNz=DBJ/?22C{6=ICHgqHVƲ (̤4<)rŮnd JFfVħ?3+qzmr).\YE"4RztmzጜOV@4{?%#?AU,NW7imӎ4QASPW ^㒬o6U)[Ɂӻv$}Yסyv֩֝fQ: !qsxJ.-KUi W:Ja7o|o_݂tb@k,U=1xuq`:9PyI\ eeh'9SiߦK{H]0#MVp P-^łq~i:$$M): {yڰ+P zkbkqÃmFl0t|kIc>@!"l$˸2HLLicW٫[;c82Cqi=KH]Ep|ozL"KNjMbw:e`"C7ip+H}!(`iEJޝEʡn*PgoBY sCqڿ~3-i5~OFy tp _YzЯ_Ria!3y*t]6V{!yTO=e#y8QwsaóG{Ɯ.OgxG<_2;C+5gTPDA֏ Y[Dz$b.ns;JjaN*`b)"ImeaMkn2YmUvHBug2>(xaZVPZYl:zZ=FtnWR7 g=N N}]_:Sp=gq JwcXVqGB jH )hbow('#Dfͱ]bHsmu$l[-yQ}T Pq_AͬğС4*҉@^%q{^QT"Ğ1Yξ!%aN'W>!`K.;",{wd˞t`&":Q=^M)Uw~BGhNV?S9+S\dۮsQ)]`BsԄEƆK\mU9J+%Bu"C!;dڢae[g<̊^i<,BaxYa| ַiqSՔr&^mHet#QzOJmq[ë(!c8NťxH/`of8ȅDh$EQh ^t`vhP 1۾{ت5Ǯ,1•Ν!6 K|z-‚p/^"p`Flu,ln0"]@:n<KsEMUpdatZOi1~tQ9H KʊT}!nZ vّp}o# *9@1t=\Eʈr`B=^G^p k "7-;OHlnw;rE֖~46Fcq8R.|9Ͳ^$=!?^jZg0L\L 0gppl}|*S@}p\"]qoHc{bcHަJNR-_>'hY)U0z,@d21X?*]>gSՖ/ l4bTCKG+M N pyXJůE݌Iv3}l Ė`d'Ir]LT*7rm^_%67خɈ F/MnØJ ҋdMvs>H k}3҆v34:Qj1Pl:8 =;8^~F XgݼHf=JڙF?otz&vY͛ω2aCŐ/PbpRfXk9`+'EV ɱ \#S줄w o([^\ϱ6DXVa&IHvb9c 7hpXz|}xnv0m/{ݘ{p. A O3J+7j3G[+nأS=%}t<p'e$FX,P\' TVJ#zY֗W CԘ; O>_(>0}N[ZQI0{繳EEb5Qv{›Fl<(0 S yg(2e$Iѧ uD5'S {ZmKУ 5^ҖmM*r L)Mnȏ@DB <2'IFy˼d\ Rs KɯlU.ެQi7tXC7^yVm1?kgjD]F 6%\z+}%{/$'JD2"]Td| A/a| rBWֶS>\Z6ag D-|o煮\>Ft.Sa;z;H$b0We BJ(:==_a~jy_ + (H~#佛k$~o4PK{-Y3p'-WF|,[MN~)y :6SXc!99ZίNĢuQA>f'jUy={y ǟ0?=2-S}ut4dE╊ {"Q{S@|&ԣjR١zb s\&Jp)q2ݙõ6Xbaps9Ae}~8vⲋ lF ]8u焙Ram%,b%摤=~ppDO}YR|j>eQY+?VZ{ κÎx9i\BĩI>EV=h' [e;rg,9%8'tØٞT)6>Ъc"e=Nt^YR&f 'OhzZiTݸ` B"CP %aX>"pȣYBtISMŋ`iV ?Մ;dh;|.,6coƘ{W`ch^>Q x܋I Sayۅ>9%WvzSU6PqDNJf水9~ >r8ީZ|2eЛiD+(#ˈs67,$~/m,c,Pc^Mt6l WClv7Tz˟r>4.zOރmsd}T7󑝂JxC~UVcP3uYv$12rϧg ݨBUI:b6ZU>5b.~CvGq /ѬmMeLy|FKHWe%)ޅֽS}٩X6MH3WqӊvŠ5`O00_Qϡ\2ӋÝ,dm(Đ"9s!LB/|7^W,1"ASn `oձ!_yq0} uVs ˀ|7@€J& #Uxw\'tH! yս0)ܐˌF s =Z9DqX#$(mag J>ŵ0R5}Dؕ*=vl2"|oN_nMEH=sk:b6(~xn缢r3o{26^R]׊ٽX1^(?W `&gR&Ŋ2!VWA+om =u.(BHʈآ5YI?)Det*q<-|jc9nzfơxz𡰓3|RPowHr .Z̈́# _TMsYܾtba,^3SwH>Lk/e5Fc )jL>̂7մfqTP$TA"OU} Nz\x,SlƜo:ʅƨ7O|oh/cOu쎤6e"/!`#dima+,\'VKAg)M*sTsղqmG)Vn-:mCaCi$HaҦUj=c[|=mf?g\MD2皦1Ag/]3-79|tC:5oEċinly:4֗gpMXV֤.}mteջ\{]VN!zyXAN5DI A9W{bv%6ޠJ4 RWA]{<1![17:)r&JxD!nrn.-*ma dh׬\uM<ԼG? 6bޮ 7Q$c vuku0QLܱ-8UEp~R#ζн -(s 5f}՛"I8Z9dc \Tg\46hQ0&k-AC= W?ާoX/ٺBNot'*@3Ι'Bd ZJյ7WR4|ڤr(.ؑpV4ng5zr\R&*_XwYSbw"pHi[&~,* #d8޳S06/e/ }ژ8x*n`"prmM1W/abeZ H@+þ9 HC679N^}=+O2gɃƜ@n]x)czbilAsR&vc3fkNdhL7DGh}ltDo; cd K(WBcҦ1#:h {ZB#`E(ͻ< '&eԺRAkp/ @*t&JC#{Jt5%UNibʆt'dTGߦo_lSr2^STxwmIQRQ捾"6:;Ƽ`خP5_tdmt='b JߢCWA*˜QCS dW+ nXOӋ=Xb1a!c= DxW//n荎\0@XCVSQCanxgWp z'Ge {+5{Z0KUt RMsT3AB#`;۲w}ʍwl,XQ{ \Xі"]g@h M>ZP&%ja{ $03xxZ*i=lװpkX{<&odPH6v5ƫwh3D2LO1depEf8V-D%I}#7b m`%:JxzV ⠙ĥkOyAA\JQgH|77dfOճ{%.RhaẸ/Y=tR=W d@t3Y:(TrpB;쁶{&EJXܦ$C'HHm/+I]Hy@z>*ak/MzCAfНjA2"^]d'2dDyؗ-}*0$=]~"\̚zȕ(tBjYi7Ja nl96AB7y,}?%>aaӤor_[-xJԳx $ݭ! _oYЃؙH/VgNQq璸`Gu<&kWύ=ҎrʗQm~v\,e0@ {MqxX w^]:ivtFAwvKqvInҀՅOA&07J`%.[h|"Jݩܰ(Alj8ۑJ(1$m($ ݧK Is~](~r7ò *Xc7a+~ƚM'JX/p|B9{G>{-8;dpizkbTL=E >F<9ֳNg.mQrxUL^=eyrUnk+n B$rKmғ!["_zQp |zv^kܽwU^Z8F- ڤ@a&GTG\eBЭBޠe R`hzou+cqd:s00>$~j*/Ys*]cLH-} ZnzDD39kO`GM^{]SSse`@͒]sO 9t qHfJ@vy5*if34m|ku#<}Gƫaqx^^Ʀ /`vt}@(m_gճ'9ˊ$"}B5vbd#λYtB;a?;WH.ZE rh/m>{@M~-BOB'a.x-ud*c$|hQ- \31fN'7 `n/\-XL7{y]*@'5Y[(,;|Xa 2I~)I&49yP{hxV-=_dtzjO_o`ƹ\B<bLEarz'l}{彩#x-͌ו76|w^Rrg&yƬM8Cd*sP-jS~R<̀~ mnuh-sP/C^Czߌߚ7ǜFy%11Y5WXδ(H/@ktzkA|Ssϟ`h5>w:*~H%aDwK4OOzrW,:hYr wb5m(J8݀)c.oL=\K± wyZx6sxUgiļ:B- B 1\I$/gdcXCGw).%?Wf:WGEuKo-&"K^^>0ͅOJ̟^>cٷ=J,8䑤Y}{0q׉tTWQlNH {['7AXj [/\ǔQrr{3h;!B'7%%,w8e_m^ߤ3T $ GҔ doL8!\pHCjŮ:\[>[|ӱAiUMjpˋoI/LBdln yL[V:_f=WHDӹ9 >r)V17Lp7-`Hjv&bϰ=9/ ˛EU眠<t5A10V=lW>0o^L)QkHZLO {zu/Ug dSbف|%Ȼ1H`niOu=.Ċ:h5|qdiWfWCGҊa؂DN _gI O+X:.қrLxO uF93 7)D-qoNv}*b rV,f d=!3:W &T{3N*ub&;ǘI ݘo, ymks8I\qUC(!O]AbmЮet@n8BxX%e%,؊֙sYBA'P \zЊω±!%Dj)j4>Ac4+Rݩi4]WQm3F"p|cUE*{Sf !-|'bjKSsyCkNc`Vsܠ-SY{RW^t=G$~v7w\Gx}P1SaM,m"+,yJi0ro s&JcvY%рJ?Qg(7Hڋ3iY 5o Sm.}%s H-ZY&hdD~OjITۥ o+PYɆ&Ier؅_ \-t/^|XvIqVN|pȔȄjaxo1)kF,x:Z՘J2)=EBftț 8\C{XV|i1'zɆq$cMMt6\ICx{/<Wޗ)$UOVLugVǣ֥5xKbpVJKb  9 9 d+X} 0jd}5 63EilSaq([QjV;;' H|my=vxM$)P앶hrDjP‰ej*:%.=}ɜqƌ+@ /8/X/:Jm:01$&j|@n@#;Gym[j[ҋzs-چ;+%g7~J;7Y V1"*[W0#\|0{̘Qq=YeIR{I"x,) ftD2isJpڑ&f9XD[kHs rÝcNbGiZXSg\ELC-g#dͦyvQᒧ:t=cئ:/rΖ4ȶf]~ *ɷTz#o<\3hPm#ⵡe{`^`"T <*E댠B= *v^R?*x j2jZ. I|TTʲ\0U ,zg}Mk-i;˱Dd Ug<(b 1š dQG!faf{ouu2Ս=w]I$[i#ԃh^ɧM zO*th끠J)C@K+F+ LC K ({ZRVܰ젏)N>hq} ?{)_4m1 @8cpBa0.!fW#9Y'E7>砨d G ,M hY(2z)*ݽYxHFci5c;~[ƞ~iV׫乀>x Mi#Kk{!H.nھMuYxP/ 6e ={.~o !N qHSKTIbF b$ e=;^,BCs9-{wzNQF!D" sO* ,P |QM$JKޫj^aADp:X?{"="[ =x| QY9Nъڴߑ!ucE;Kj-L;PrT<k8lP # ݖkM&.;pEm;@e3SAf؎+tuU$:YO+"*ʪ+ @wo}`1vSL!/F'17 ap.g 0^g X {\@ѸfhٞP}-*,9, fE$71]7< n@i8)9 uu~;/m]#C m\:m I xp+mAYfRF5RmNɇ XA$ȞN:# HXgwwlu刑"%Gk2p8`lCb].3 /^!WA 66tP IֻG(uݼ |&슕nHbR9dLƔ@է 7Pi(X*B‡$xIA>a͡`9)ay8ٻy;"eC̥3 jD1+=bXbr~{SԹeGAhuJYӶbhض@yPK {a(;'٪ʵVѪVX0y2_VӃs{ټ6Z$L俠ūapʌ &萵W v<E YA[ 3~ʹo.0P*i6}B/CDf礗 #S(X ~hNu8w<+G{ćB;ҝ$M=)f\W,r.m*H~F͡b-ᕼ\{eves&-#|ERL`i ;ş8UR%O9 QJs;c%e(MSm75]nwp0`$jBJh; \5<$Q8Q']pnգ6Oj+Y>({I"us̓բn ̌؞"Jj^ uyePgsz`>|4F*R[Vq^FN%\ &aX_'6,qs6ڜ Li#2Vods[2ǐsצj IgE*_xu @ M" y"LK 5;d벊3cxZM.  `v0"";^ g")oR/V6#>`RS= &bqB*?:t4\*yU|(">4fx.ovf&x*c:1l _hr٠Vc$zTwQ$m"y.#AM QZJ^wS)a_1s\j^&Mj~N(Z x!]/7[Sx[o9G*z3"ke's|d+LQ'@U"|aDP[݆q]EQBGW|Ѽvt cEPnx^詐5fkl.O1G]VwhvUj  )k!wOtY-Ʊ} v:q*I9;[QIKt evI*WL|6ZB4UԞD#NYn<ͮE0PZ4nwL )E$ujhx8 c#,}mI^IlP^TY S1v++{^/kPR"rxwȁ{ m-#i5+kZuU#䒣#' p0{-]ly)]PUg!gS":ͥɋ$( TD Ku1;kHbE}=WR3ӽ(rg7nvs&fX 0K@+GQ H(zSj&E '}8 0S~Ɲ-R>1lJ7:rq^vx; C8[Apt/PfAmq4Y<'O}DY,m0H }TsFiWMQCU/ -<5Nvh7IJ;%K# ^8Uγ2" G)~h丙i(JuF6% u‘>dugR=TЎXdJT/Ɏw_I⷏CZ<z=QG J^qw{jIT f ń~k)Ƀ`.n>yJ;@OLmi^{Dxd &YlĥA Li6P1}ңJ [>ܠTI3F(N+_nk32A06|f !טqd*3 FlP@ÁRBy=[y/ӧ\"bGe /%V;%Keh{:)Erpl6>  ^Qѩ -ԉ0ŲW wzKMZʨ_9 s%q÷qI?^9[xPOxjq [V\Q0{m15 Gl/ Wl?gŘ0wl }&{=&:KOKyJ6C!Va~ I7/+8w^`.!tOg/Wx @Mʨzy Ե/:e䫜;9jϸP/x_fɍaK~\ۑt9ܾA6T(xE>gE7~.W]H$|gXcn"a= aǍ]iι (L~&dGE͌W%bkzhBT%I !#eJʸX2ӾO>kFi+y@[/ 4= XxA!qEw^8YuCգFuEzzNX-Af9l*p}|@z T\Ą ѫ$na R`>zz ]Tg5CU1x0?yb-,%1?Y@k$*IqdR]kB<jOa;)M$`A( L`%\a.> J{Սг7 (CJqǔrejbXLsAqI+^zQLo3e 5q̏;eyHԞpLY{Wsca07( :{O)O3{>QZ6^( ʥI"o-]R {qƜ4l A׽]^=js'dE8mw]JS W΀VH#}8x21tR[h a*Ey?Mλa}s:>R,{^yHe3Wٰq&P4=)w.^i8L{ȁM1uD``2PXqޑJ08|- naiDO{J'WI{]'+D(ޤA}2:YLt,Uc5+}[%f]P0TNQtnyG: *٤M"NBzc{\R'O Y87';څe6x )YxevQr`b=iWg9x)_ {ObWq Z&cǻw/@cucA_"ٞ'9q GR}%򪑜:*jea~At2yށ2A/Ԟv t4<{ {uvCq6$j x^j x 謁=y]׮ńfUɨh Fن^ҬzZDpb k{@zN 'YS*u5朹V;f%ڜ)`&Y$"?];P}.No3`uUݳ6"=D5= t H|MEMN2;?t4mcRjUt7B )'mPYv/VJmEd3;gESj $%wGG"v}UjKGz7 ػ,3~T*`GIgwMf[=/l~`LINnԎ˭RYro1†>@Mqtt`$ؕeܩMONju^m0z<ħ )IoP 0[?} BRf59+"⊾8<7QcAnDy啰odM"<@BnF$Wf1=yY<n@U󹊇?bռ1< 2mΛwV3w &#i c]g3ڎVY*B-;$IUܤ1BzI =MCwͽ 7&,T JIet r2 |h@zӎzUpZR',W˨Ň zo6kQf\"hsGT Z rQU$v QxRlwcLm kM6O8 jeϷz8.Ջ#l1FB`Aif<\KN8 $"! \\友9oK֪`0. ~]BS.t]1 ]F@-D ,3жWXVO}waƔ6t&.h8 gd8EZ8Sx>عW!^$J;]+DŽabNg؛N/ G6 [cEIQ1smE(^+jZZ]t clԸ̍B8LV&KC@NTTrx4Zf-ZQ.v^ jd,rokC=ӧm6ubX7XԀ O.NU=tHHJ]Ux#ވuvL~QZf/6QS#p 8%yXGEm/L@D&RI3%\JKIe ZgCp=YJ.~4^k1ͷ#Qm x6IIQ25,[❷4ln 0+ڧ~ޣ |le%c>םhڭZh{N1 @9}`o;v:F=PxkyG{'$@\4; {2WggE,UG X3'FUoQ 'M&aZi[Ӎ5, G'7+ur6""q5: X QDӠWU9DZ'ܠ:.D)HEAQ7?k9S6O$)JpꜹD}^ʶWg 6#`{<[`#c0-hh B7o $ZNg_xW;7(<QN=W3`ZBD&Ln PZfN/hGOu-?%^ʟyw>ޑ ,ȼZW[6VHQvՈfspa7DPUB4NC Ͱe\e^kNWAȰ; KJ3b/xJa2|t{Rŕڽh̗;\?F @JkS딠xY'EAذWH"]g+y}(A|p)he?1xZ-^=ll#דr'Wzu"3 { 5)x:'"yrY@Id$.iz|mսgW!Q-6 .Q[OFFs.t>D.PO>Kg /kh؈юtx jӎ gonY`@'2D"!E6bߦlY%msx ?Rļx+B,, VrpTҡh\>^%zrVMGx7G -?*YA3Bqtl`$Xo"/D-CgFR6{MDv\bjX^}! ,.([vLc}~}rTі#U Pvko\^I7J(7!+rz,&T)W3E0N(0-xRs$$BFf 5:U xFC[zp@mK8eXfxh/H>(<1d1v?gZꡍd"]%=qBAYTfgG@x#-R␋kL0d= W4ix aBGН%c=GH@Yk\B4eO>*{)DLв>=מt; vHT0.;om;ٜ%6c]p#&n $XzRw23;g-#L&%t^$S* yʋ<\dtj+~ZLgm 뚓<{W^'H 49Hb3iۉAI_Q4V3uݑg?BohkqBxkұahaIjuC49z3+4T^ !mцzI ',2!_Ȭ>\#D,C8- Us'WLn2L؅QjϨZ^VQPUJJlb%$#wqYb6婟XtLS֚$n&(E®b-3e{{ff`80 3su6?\r(rWA9sD>fD/SD^YSQ(1ĪX[8wюLĞHǁ QZu&8^v`ToNR=uq9qAռp]*G6 mb!MP9y/%tuA lZsD7Zl&p/3@ު w(@zC>~Zo+g;rcy7 @݋7rv*F ٩JDKd6YtDJ(yf=MJ&:Z}Zb,  #BLAY*@b]_T /!SC(d}b'c/#8`Ek =d/q7ǚL €ZJh׈ܚ^ ޫZ>Y<g]"t[&){[~:%GPPɑ ԷoABTn'>o-[,%=CY w{t4EWoN$'6%dgotLX ҩdK[=%t|pSM`R/Rq¬.s6I4inԈ id˓ u8MS`'v]]2moZFu?gr'\^eb\ ~D Vi1=!G\ecm1K✩361z&'ޤ2xh*"䅘{/m&Ȁ"QU7D" WP0H*PUBY@\tܾyA2%,SwvďI2zQ@>>䄙\i`C]IM@6FXvq=+/% fgiwIڦF2%ؓA D8t<" !^+U0#sL7] zH&[xO:DZ_z*#".wN̍*a>[WR|Tu&s.@q{Z[ n"O%m68!A 3hzg?. CğګG|H `,!QI)k=}4*vAȠ!p5U4 '(?>rVԲƥDA[;<{&Il.59+hRڥopnrQN|ce45:C7C* yN `RO'#'5QT\UzT4K\9T.s,J:ㅗx-q*1ⲭqճh|FLrrtbAdXdOSv vK*vq  ޓrС,0Ȝ<`5|Hj7,llg~3DtϣѤe2t%QLaMz&Oi.`,RieesYӜEw 6X:걳?5=\j1(m FڛJP{FY.y2TIl,9jiɨlνx{e$l JjМ.aQF,$#LU&Y fĭ׏tmkljm5~G;R8HL!֢]?ӻ ^`-Q&; ]ym,^IC8dvzB?81|=+6^A.܃;rwzIBnOJh&#wAaY|{=`[~b-z l+6-m8[ *c0 WwG8P#u4T( 㧤׸[^c8+eعYo'xp AnGjA"\>kZH#Mw\{p'F,1y }0"4=c ĪMJS.:Ӫ =!H6͇2sĚɯ Wb&Ij_qyb Dpq 8egzܢҝNl&L'y\h5]{bTOSj 3h{r ?IƿpES%9(*{t} S7Ruun;Wm k=ʍ#BȻV'(o ֭Q=$6$m&`e4gp @kYux𔼁(#{=%.ymӚͺ;k^2%w>i{3mePe*^w֌;^|E(o@-c;JiƜfAI 06J|v$pM׋PλRZ[HxCecթry>!_F+^2)yQRLc/@uIKM:]}EQm9 R$G&hA'(n0TYMwjvQg$(:tZ}QM6)sIi*!bKd C|̯ɳ˴$^Jt&G3Rw8W(mĨ\.ChiO,m+5*2IkF= j~-Y8?9<7OW?2]R;ú+ϭC Mr# ն@H9bFs[Hjzal(聘:@> >(}@eO@$.MCFgH%lYRy)MkIݽҫY[ƾ-2J\!GIb-p˵ПT)lk {ΏfqXvpQļ&t#YicwIK$PP|K&nfŭ?r|||Իt]gY)l֍\{Iձ=I0R'iuJ:CR(J ՋVoQ,~CJJL7ÊuC!14%eѴmcSp==I+SҦt|o`9f{I> t6IJ<,ܔdWN9sgP?~(|Ӻ(۶U3UXo*۸{_DvGqpYX9< YLŞ{n4;L"9(wY֝ŒA} =<^42Ŏ \ilC%5jV|h(:Lr/hܚƝ^tғsО4T Uy:|ue6n6arZ S"3D:ǐxʴu?Ї#y$:Z3k5TokArIG$yG0FgZA_gs)9qֽ]ۓI3%ui2F?N(12I}3fN oFn̟?x#eFYӮl0^ XE6- |ȍ p-wQ}#t,یՠ >|XbWutܯ*@וABu|N ܙ] AD0f 7FE'HfwDqy`'Q]8258=(([B%)*I8i@Ɋ(W` XY MB 0aVn\g*˞=L9ċ3~8:+1hZw.@ vװ^/fනmBUݨ jyUн,XjB`jO0>Wvk ^R$rP  *Cr!CQvAD<1/'z#(,׆kMX7EHPe,q+Z4j%҆𓢽IK%sUnl[N&<%&{f&%[um yCPݫ]B,#>jg `&H!'\GcSp$5#SeyD牌WޘFop<+oI+^\`gKAL,?i!SuM'^,RNeKF:IT]tO\ICk·˞x8[p̄`]瘀 85=2wɛ=mE(P{Myc#$3l,"lԼAb6ƍA>-NnTj}$8n@ n}[I%yw՟>$.}bgmS0XFlnҥ jYWf wFk4X^]C$E1By9_nq_it0o9nkw-2fN[gnx-sc_`HVvvAsCFAa-C[,Uzʼ4'iMPAfE P]/7(>dEus54ؤf.tA ty0fBغAzKA9iQ>ap.$pkWvضB4m-|e)\a^)*|܋ScR鑦p-ӨrxPYdƘ#5Kˁ'.qt0AG;7,c}`Żʒutyɺػ/8tы[o'VGraZ+F (4+1SX߅zn%Wf5irf`KԛM*c^&AH5RGn(@me6PYìm:֓%zL^s^v CMCJ;mՠr+L!W1ĚQ~8dl$-ѕYZHq)2a_:Ó3z[*I5dTC: +궗c 㬂+VNj F:^N]"# ۽^jH˸l(9G%SYcЅ>PB1 _ݽX 3{.o9$ob]=9bgv(jD h+i$+b+wY M3+ 2WE wbbqؐsa*en:u>ytN;Sm9)#<y^4 7,%Pc ^ys /${xCv yY >38 ƮYg;D2,LW 6z/v+pahjW¶o#=orrj'ޭJJ y=2%cALyKE\ZW88 TggϲS?#v8%g6a(A^#EB~CFG 0zwش)/_3^3^>slĸ'y8GBDxIm;pYWCO@{Gћv=@ ;M(ºw[nJdO:Z^ j ' _.p-<2^ r_v冰8|Ѳ;DDJO^ǟ4S $Le*ΆE-6^3Sp "rFp镝v(SN;Ի~Cȭ!mJhlpUT~{o Z.9UEl8%3\Ja۞9 ЋV7wJ3xxռ~˝A p>SS&WϻP*Q2LniN69wov NlW+2 !uSDb׎YK68h2{kk567[pw!"l$NCi{]O@~L"D,+Ckזni%EĈYK]fE4l \382y8s4S9"gp ˢdK3[{f;,,!@HL'A&]C>ڒe۬Uʣ{SQ2( !ϜRi Ը?bیyB4AC#P~_'.;s7,r/q~hWm0ӝ^CCb>eQ1k83/YHz䦖Gs }z`@tE1O6`xËK |egЩiRӵ{rJ^⣐J! '}\OAx@ l p=۩W[ ]7- \;XaB2h  Զ#B/F2ڮ= 6PW=誋Hqy%`Fud05P3GrlsK{'XI-XySjĐ󮇇@:oD8`Zn^;# t5(|1-_>(zU;Je%{0\NO)]N#nZ3M 8ޖč89' .hҼ۵N"x[eh$I2 2xB/9s%$^,Y@nK{ѹV_$"W>7 3B"82MA*}ŋ# [ߡyqO.I/j#8&l yYzmd I=C 6Oc57akMO_a[Pd(Nj  '0w|P.q(]Q7y=A$37DIv3-i !z $`/1ގaJ{)a^Ikkt4˗L!zѕq Y օ( >@Lk,mlQA4JV-U)m#8P<8h燧gms ByYNOܐg\{/DG:X6iٞTė1\| dJhPF/O[wޓ|eRKLJH@BRem;1 6|&" 4Llみ4iwhi(MڰԽ3}$0U4^F<8J >|pZD-kB%Pڛ|H($8oJ5ozπp\JʱXqA/aX#=~źS#{R̠7ql=#˸6|, 橙 B*ͅJt[Ldv/v8^d1ݹFFϙvWڷH8WѨ> 8:HamcEOF)6#!t1 g+fᨙ|"nFγ$aj*K> zVُlGrg(gMtCi1*s1)&OEin8 ,9'J;ʽYF߽W ǤyU~ekqhW°%$)36|uYW@'$tG^kv~hoOqr0΀;ji|EYA:CA.+LARڳx2 tTb<e{8a讵+:>Fqz sLW/3ܴK k{F,J ^@Ĩ[zY3Svox>ALV&{rj"ٷ{<@Sz*-bQ$rH8 +4д^-4$Lk0@)'ˍnr|CԂw a.RQ=|%HZ eVqJCr3ag$׊\VbA}\U"0 HB"FDqC9*0C}O uAyL.rea9]^ c3O5itGK&ICsQY!MёH$XHTr2Ib,`_jc-)m,KRKK"7nPw=80y C8@rȞ)˳j{Xri+BUaS%D>tuZR,n7DNϕ 7 -/4:`0UqZXqq;P{ޜ/ G֡2+o׻6oT(3˴Rv ^f [Dv */.ZΛHxUÊW/_D2!JB1/gݜ'}꯰myśnnckd:7F54gUK2.~VGaaibЩD|^$tC\G'uBFW 6]}ճ KBlC֎puAHYb,cg%ËNVsǍW) k[n*+TJY' CrHDZArg>)|,mL&PT !5R&ѐ;~(2jKE+/y,h(fY?H%69^sY,9# E=,b;kNh4Au lرwjra/zLXNzFmBBX]Em+G8ۃ]Yk*rs(KGEPǭݼ^@h(0DPP GS^0\(fW8Cᐓex{ hz=U)6a:^{8N&_=0Lѭŵ=}H곸)8_e7`cVg`'wv Vy/-daDM"C /$ܿjtz 7qaI3Noc.H/^0;5uPR!yj%CES+c\ajiSc5:Gj5F6 EJ|#}n/8[dJIJc)29{o9Yw5`BЋ|!RbwS٬Mx>ui ,35gB[zHޕ=<<{Ϧq%omDg7H6T0s2MBe5G5>W .(E/Gs|]7>|#}}c N:)6 gcl_f Uh>sWk%v9TG-RI{& @Kv6j%ϋ$nRZ8/qLjpsNQ3c*> :o -X@ʝ8.ޞ zf Y2E⁅Xr;{6HKP.YRw=P)+VjJjUk#$1 M dTjN1=$LnS](RAAi&H`Mr"Ccac>9\*~ܸ Ry򮽺l1:\,yP3g:>|H.ŐB+ Gm71$/BWrGmYWh:x8ٖ;I!E]kaFrruAcg}ϝ/o9QU55sٗ (VƐag zd1NB?Mn෶Y7 Ad Vt" a=5wj$6?B^j N g@Ϸ3uB=MyIƋ*/%mx IoW S@r:Ldv{[n`BJ׮j\0q607il7P⭢: xD?m~`'蘭RT0-і.RD R`ˆ?^E% ).#~\?ĴšuRk1e)&أ >C3MMF tVVWBxK@&H2/u3,!fڙ*SVMQu;b^[ @ʗ9ub1 +R+5wFԩvFZQܠKQrrWv41!LHcʶ!bq(_UggI}`b/L! Y˘Z6,̈9Fx^gkq$wtn.urUNW9brcLY4 4בG:}3!z'.]Jc\ JF-ʷE 8"9&(i 6Ξ Ƴ3.^}QՊ;56=HPJ6}픭ΤS,q]HgB*֫ȢW^Wݫ~;tpPA IFC);"~thE $|m2Ṓ@`Ȅ;Lmr'/&s\vSD&2b{+IF4_^7ݏFD=ZS-'j2vA0*hr{n* O|XɃy3iSU&f_^(8OT6^)~^(U->--y^艂 >8]鄷N xH+pՀ{?ΒXdfi Q/ej)풖8 9&E4C/uIӰFlz0;~SP׌K/]ǟȠqPe -"ZV!WϚZ٠7SL */#.0GUL]QxSYH%."׈H,Mkfڠ =||dNXȘ*[dbD w}/3!8$6xU@$|)2-8|)ՈaǬdzα/X -^|&#}qo0'j,+=ig8 ‹SHt(h_DTXu(:!WxxR_}]dgu6%R__(C@tرt.*"гh|V6DXNp𞏍Ф?WX1]Uږ4]O _(hѳ5}]SV7%3\t@;U&bT0 P,@5f^/tПɘ-=ZlxP/q%O"wWϽ)L@):q1,b rΕ{F^:b>qgo_ף.u7RC7EY^cJ )bbSG ge/H?g%e}"8Ou5pLvQE7!zl@yLx$:uzl\^VVLJHB+9;9:Q($WoHiccɞ2P 'sal)%3T)}h0tgK^KS|s u +2\\U AA ogܜa0~k)fxR֮:FbKjNa!iCd4kSy_|ʓ7opBS&kW:7%)=&G d7ZfN/Ų([e ~+m@S8uWBBX,[:8R<'83#ccF1=Uo#KѨlɼm c!X߬ZĨ uժƹa{,z2 `jĂR <[~r8Rk  =áC0iG EnQKJ>k>k|& 9]u>ϙrƼ|vTڋhxVHuuY" CH9i'2xQz2ZXt)foS I$-L,H)l=wZm|[m |_PY?*Y㠃 7DeVhXU=Vj7s_ .)?٤FWދr$s?~qKg*ٴ|7QLhCi n_ӦsזKN'Qޣ'SH/wLCRC݆0 9>W3>^S@O\:1a]~[-oxEUj1 V\޹XmFeݡfl? Q?x0ᆖ xN5H6p+  tS@ 5 9ʓ" =xgTT< ݐ~3(qT=0!Ad5lA V0Obƌ#Z@'顎0HKVTb+Y4w"_ RdS;Fp͙%{F4 uD%zӯn4ɇHDcE$x|[vn>yp:0dٵi=s.hNM= |/Fa"F ]1>-$#"-Yb0ГM#+?b:SFlzE)Lt;o7{""4'$Bf0Zz:"{(KDKĕ}+dk>POp.wW%Jx3ɱh\zI::(AARz`+ԉ:L-0`͖1de&oz!fE3 -Vt_90G0P["6=& 9(v)!zLtD&X|Ofw\d [F`X?a+=xUp4kW!Rǚ:Fܶ(^JͬI$طs{of21Z1<+A!^ϕs8mNwRD U B /Xo6?p%9Q=Bq2(3kz76%=ma^THzD hPaվU䌄a|n4.2#~{2D };Vn$&;OƧP5DP"6ffV_k<֖*pϲSA6Xb?/h&F )+zemQ.@]i\R`a7=~3t']æ{`NۜBb9sd KΙؙYwWԳjT[Fמ38yNI={/j8dkXO9L>MbPv/f:!t:PrF^H`QnVd~C87N"(~9a4i- #E'ze>@]K^. O.f{8ABqj$w^z+p횊#9x0I$r̓GƼTSvA)%z#_ɞ8Taj/{oxزߥk7?z!"EV4yevRCDMwЋ>1w\b/Uip_+\pG >D65C:f`VT-KE mC*]2L xc d2kœps=x. L%ݜ=*A 憱cuuϘ|{ flfsσ}u}C$}R@t]6;(i{iaCV>ҁ 4}Ak$M _T`Ǭ/X*#+n獖usSY-z])P <+Qw@h;:(£ bWffTX7Vi4$V:eh[YOiZ/m<(UfE9@} Ǹ0,َ{PВB{\HGU(v4o3ԖOzvUחٯNt+Kw.>ˌ& a9D/o,qp9LtؗI7&;S^0#w jD>3#}p /%_)335S*"|$}oxIq 5#Pd#h"i?AK@1'0yPa!z[gzc= /#.*WµPP;,pXܭAxs%v/q ^!ڣV]N 1S#r/IA)Ѥ:F_Q[Q.=T&,{/PD"/_@ [,; M\Oi5-?'#˷g fYLHRmӗU9#y &Jr3LSF q^>6Ɯ3[CE' IMВ^WC^ZEK/"=U >{w/Läf mc/Gػ/=$Ø)diٝ3 Hea]ukt>PBk~r.dZ3KĀPVyqFu{j<pMs/^yphŻ}/{-ٵvpiBB`J=mZv%g^w6 Gw=TعwxjDLx٢g2 F$FI(>Evw+kÜ*uˮ4qxfsQ-:y9b`h_d|sʺ"X9\T\ j¬+!)$ͥ\@Pj),԰MrK`VxzrȁoXjLI5gJr_7/֞GV%!}iQma,^dmDjyrxh;g"*E/?)AGfSX `p>ĔWFX{+t9Y[틧/sEWW7HX&[oMǮY\p&yN@18;22e W0>@1@k@)+p]DW|>RJc m, Q5fLɶNቬ6M'o\qՀG#!> @0{WD>]#h}vFOod,MKxV҅f z֋bkH~QQ^'W#&z` .X$kATOҌ o m eb/HǧP-mԨoR̜jd\(gLi&i[씅nyCG=W|W!S#2_s&>}*63a7~R.dqK`Ybm6+5eꄵ%,$It1=7-9|hxv_ ˸ȿuVH˅R.Uִl y03ha (6}nt< @?Y\֑kۗN^{◲0|\ | Y^%O6ሺMqfa-6{b:+n.eQ᳂JjIĊ< U|Sxx2Ύ78y&Ъ ˪G&<SKС%J81rP#\nT)E@>LKC%`)\JF:GJf] ޖ}%}\:|K{1qYw 5ͣE'O-sCH^;O=*jp[xD >.^##z$Vv~؂oRZK @Ke݊ܡ7::\1;ߕVg6AG>+䱚}*JLbi}@, &<4򗎥8->Lz_&>*>K7*F E5Dg)mc,%r?'%*$gT)!T;1w%‹p[ջ{G,g-|~ 0EldH;~O,#XߴF .'q|˹u=.2-3t=2 VA*|GKUEb)]QQۻڹ&S0@^r[ZNpTzZ\ M'4R˞H_H,pan]jּSI waq$8p뭹[ZsFwoֽz7SdڞGLd5xrUG*c,R -Ju$2"S 0~-wlޯFu&EW&:|F8ô*lR.uٵ$ZD&t94iE:Yg,a 5y<ܽHt>5\tۃDBw/6S0 z4==Yd3b/Tr},8asU7UdrUCY샌Ǭ6xϊڠm=]}פ }w|V\vͳͱg*,4T_\KE }-*L -7i٭+N4u-iؒUެc Sa+;w^;je( RB_ Jz/_7C9lLΑݟ҃#*wͬB¬I6u&( !Ìhf>FK?ݡa >g%-y8IBj&C<.ՎmNkzSU& w;@ɂ%_cG+Xd;dLp-lZ r+oq6-d0QyU(N0,b|'uC;Tn{; ,y2AYD{xeKƜ͎;D⶧pMr@Hh7WG867;|&s\-+rɃzPn5Dee"mScSefdȅ+V K{ |)|%DA@WZ'`0CokqZ}/Caj4Xq~o;]-VyPW#-eG~rS#@Pl2Ieh9<0;wXuuĵ@Z&3䰦i2Pkv< B9_Ԕ {;"3Jq%PK6,]Ae@vr!Dr|RIVU%ljm ;u.# Gw3eaͯ³:a-iזɯZ~bIs!8J5}soqռ!\f^zn+OU"Ϛƈt~EJj&<^~XhH*Ʃ)Rۣ|(uC썩kIk\D+tO-(7Wf mݓ iF'69&-a ׈F}{A.?a==ḀRM+50dY"Iu6[)N291ٍiTyp- 1ql#W?" dq9̙xX23~+烛DcP>Wq-Fq d :-]$@[x*-(̀+u}!oFd.sYh!h¾S5)pnb0<(ML}5rNkgZx` P5"+0|Q4VIhǗB/2n_ܢ! Li9۸-j3dkQ-SOxǐu.`$7M~p~2Îrg{.B[)HWD:F=W~.p΢uKwH4Q}Æiq* M _TܓQ7EGDbd5/X:[:U/!sbL0Z, uYM E #ЅٶBRԵ!bB7 otKES)Ugl)6Cp8BI' aPnojqgAz7^zT[R+Ih:H@GyuK Kq=xwghcPEꆅ:i.GR;ܛ.IdInȤ=  YtɐN(q?}RLqz͓弅h$s4N#7yn.* zX8Le5;RMtIZO|/)[.Vɲxg j 6c0xwI$NH#4ٚHM;^3XCsA])(gzQRy.^:m{`>‹M\НKhFL\됧Yhls4WiX2 $EjPj액>Gk_Q]zݐ-U) B*?+\qYctv8q&{{vv3e^h.]mBsm++tapޥ S? V`ipI͐>Ad݁fٵSty.PMsVr$UQ;B{5>yܢӟRv<Q0/͌I《҆or;|o:W4J(Ө I[ڻK Fc/1W߈s.\탓M&ʿ2~H{Wza$lI-\@2Иw\ho-VZ0ٽPfcl·`( )㘂"| ;_D4ۣa+[ҁk> ۠; P!uxAib jhgy` e+8zZn@nAA!4Ƣڸsjtߓ: "Z* [JU-t%.64~<- ܖma~S 35.=!Sli=n@H ;Ws*l"&R7l#"EafwB$HMl>UMΦ^(2fF4ߗR_JK3 b2CdG=߻(3A^ᔋ<0lO.$'rJ,#]}%_Aֆd'M$e_{xd=`HD2r3H7t}0lxncn Hd(EqOk`4nVzm=ӢP4鎜6!r xPa%l5Aj4o*nf㉷zB:.5lB@BʼnP4/#@V< Љ]w˦&)=0<:gp)3W1Gڣp.rd[Iswd^M")E6Qj,:`s)5Dn@VL|cNDHޣ@|ɠnu Auu8i%c56S;z=jьbt8Q1.\F;V&Aj 3 h4~s/߹b:崄PF:a(rVGnHR`aZm\es%c;%\a~u Ls:^˥RPx z̎4Joo^|H6S^rߗS_N_V 7Oɡeݝ>J?G^# k4wUI@I*ZFpk*5^hsm.`"s4|/Fr4'=s/[U^ qfY5vrtju,En̳XPˌz/5g^Լ Nyenv*#k#j܍)UЗTεfJA[vDZi30J=s)chl;ܑ˪pbwU `Pˬ稘98s=/>26Ԕ#i i=y/q.5Y+AN\n:LPyMۤ'0yizqw`X c%N]qdsWu-W~ίUjܩxMb@ʼh96ct#փ^Ud2+ʊ\|UcՂmK"#Mۆ[297{Yq&HDEĠc|!Ǝkv"]v|,-˔_uc`Tq1~hwg0.BdZrszdJX"ԫ^Ѥ#_y]pZ}ŇQYmA`:ڦL!erBH a݅âV0>ϸGȖu%jF}n&^syl+45P6#aNyF[8\ KzkA;+MTr׳TԇU e-PŦq©e= /+J|mL1\,@^Kfr xCP5iuxVo |F;%d^`\0LFl#kh,|xEڍin9W_f9.N:~ǸbVد AF٭g&^D?9ulKWQi9zSsXn-gcuKv%B$mIAORX֜6 _ETkEIe1& (dic"v?Xn3g5D~c.Fuw9S60SB KXDMU__,SH(KQپ t UvtF<&o\EA0W{ov_k=r/袂^ &Յiyh⒣*y/i{ޏd J_S>cnW+ƈPǏ;b X/" s@ٸIՆ٢4+=b~*pƶ7^ ` P )7 1+MGT28R]o8unCabPqֳ02XқxBapS ٠>])UC$z:]![7$|9hg(oIH]^:P hVWcv {!݂lxq(1 &i:<:Á0>zlkbIAn'.Fy9,29W6FDZ"|l lڻM=Yt1G(Fz4LO\-֒P|2TtQ!H9`2A5|}{Or{W1ҭ v]D;,R#J*$=uGH uϞ=}](; )nHON6A2 "!cy0/JPjCh9S̽[J}qK:5K(T{N.R=۱!V7!F{1_^~y~Td/sk(3$0>#xK9w?c$t׽uFX2'v/\T\JFfm[k@ÙtAw o3:[T̚#|GL_ Z9yXk[S̩0|$Y&Y?QBQ߅vapͩ(>kp"xbF*Uv08*"%0;exq˴GeM;%\%F+n+^0<* -%cxd-z- B$*Tye6=f.( "U` NW"9wo3:5fXAvuux&y 8teQdQV# zƟ:'._.P=:Q ;YV)th[Tsh*_oJAw]Cys@9ZYH"y)Ie@sh|)a RĻC9I;e [7Hr5AO>Cӆr&^"[l4M]F] iBv HV~C6ܗX_bmE"&%Xà21#Hܐ3Ufv³"nS%X"ˬ|6,] /i&,-!n&]-tR6p<ou)#؍}=4[wH[]#6kO$(HyN )A Zm>+Ƚho-unTĸiE)ً #Y}>iU7Vpr^N>@zӸA!y*_[蓕yWO6i7Ӭos,g}8xL.,09kI@]l}GM‹R`Eݬq2+=NUFװieOjq!9⫖Nb{2N77B4B`"XЩr'4=./g-X`,}8t++, W :uɝi oʟX[uS%K*,M=͈(>h`|oYiI3yoXŁˬG_f4 :g҉1]y3IQu.L.a %Tת,l +2ULONFي9!^Gq:q %:1X7Io.uՋjÑ3[P l*t魞gISoUg\Ba""lZ1kzOܥ2!]r&OuQMj#t︝K[0UQw@xxͩ-,SrwM E'#:fF+tOAU ƣSy1NWǵY T|^1(_%_:@^fu{?]WWR`sܥL$`i znk0^Vz8L,wo mV+oCRԮ{&Zr牛)NNlďui\/W^e y ).SrI:HfDiAc6.CqPVڧmͼr \'A,dK-/fɵ tĐ {.frV׋H֎u m1vqZw$]IkgL[עJC^,GTg r38.݃{;|.oi,DgNAr,޷sr.H34Xp+}v`PdSإy16KYR 鄿еŬp<{LB(RZeuP^LVfɈ3}YWm bZ\±ƣ\rث/^${S`J%ˊ^d4Š5B ~Z@P'/j[q؆7NfrƨuO\(UOL< %EQ1P*4o2upK@4ӅD/`UF ξ5$8zWQZQNNH;#bZ`rQ M/DbԒy5u) l[~37b^Adp<-~]k咚&}W߮`^fe׋cr4O)[oih]z4" # ֮L񂈜үE4 tq[a-3* 93Ox`-R).MZ*GX{1ƋG!!$Qp_In 2mz{ƥYrUH"u{\<-@mQp\V`EY}x:VƞX_nl_YS_yRJ옗}`Zc NB"EHp*'ktqRhOɂS{A=z Wg{sdGxJ#JG=qxS4Y-jilJva]l;4ő瞷4Up @* rBFNf [ʤ;p=ъwhx&Pct\ԚdPg-M|FB=wk&B8;PnwkJqһdxYŷcoz<9@0* Ӧ" L^G>dZ >rbÇ߭ANG$ɱ(l2wvݕ% ыK/CŴN1wU=˻ 5iJ.HuCEP%zYĜ#ӗӜqO5kfNI :ECķ(e mnԧiբ:6`nO_Tq KrZ/F+WLpbֵ<3FG ) ߄G6y 7OmQKUI56k'ZS>L ["w%e~C${-B.WB5fT}nV:ͧ(lƓlRuU׀W6 lxl^2{`9jwptpT# yP湆@TAY)u"DE1.LP R t8lhzq\ғ}Qvؽx$&tpݜK-!w'(V  \#= . ' >-x ]F)QW-'IĀgO9h ѓ.6w꩚@k 1gqUgڴ&l&7Zj;n*:ќdOgȇ$d"b ]macRKBmsז>Z,6 Z,1s LU`޻#{ qXZ}'ht̋v8рԦOw{iA _5@06Ka\nzܠ(C@ML # -dK("g]ݫ*x8:ZUp2.2!լy:#/B8%dSK%@LszrlY\ѥVhMz"/J4B4,Nq6JֽQ8 wL:L 7"Im_R] SToZ4/gFМ_Zd@  Ē !^vG3~|ΰn.iZjI {"h_xY۹1!J|1燀GB-tj3fA=3-쉄z,^SG l6@S3'EQ tGXf<~'+EҲr@H/W!.3N}l[mP#ۮQ[CjOy\S'LH(zF;DЬ 1pYȅpͥ?g=@rvzOCm*5=-|t@bAR>.u&mh7k@DMϖ⭀GxeGRS#>);Im -0mƀ`\KKy&[O {6Û=5'E~HCrw#Vrz ;VYJeML ' Krԥuw:NAA&aϗa_a1sR߉{IsɃa/pz Xt "N! {MSǣECzZ+2!tvBxyLh@tC4tD-pcV|ݯ!ƐkUZ0=iI`YqB۫*xxe(]: ̀ J9>w4fؑTlgn zhz;8&+t@@uF.f-,68iio$pE&dXω" O0ūӦ=%jJu>ii]ȼ{ijpnjKkYA,1E obbGH%'_?Z7|I)K|d& ׹q/NJhGR^\S(_?4$yuns)dQKWv`'%Trya $۴D.9] Fi j[XXZL[=fyA=b|' 9`u,Hq->~tӗM9y'0lAvk4z"}D*}HeO[iippH%֍35WF^(a= )tڶёhd8omUr5Cxҹπ`BB >-b擊v -]fGh[ث=.~1$xr/ -:v8E6bc gbFjX zvM U.ބ 319-ƈ{^Sz)ۣjl,DD͚<HAWc*w*F@G8/ Y[_ūHQJǸ'a7gS@YBuJJ8M[6z>`-[s a3]4xwgWUFomVh,RDž"=x]dp8!juUQ3OAaE {(pȴ-9("x嶒ڪ_HO4ɛ%*\9ج$ ƍ5fU۸۷qKM [zpf%V:+Y@c^j^0U9pɏS^8r%s={-\Ҽt~\w& O{F%jrԵ33,vYbOLPPJ}W|,W/67HD;K2zUѡGJz9BͨޖCP=wq+ ;K:Z/fi`gssRusC+|hl<ڨ7^?ukeH$WxBy6_I֡=/+)z ̤q!5'.Lw*2#'9On^*O@ Pʡʛ* ES>vA||Sc)3Z08M(r)yWT5hnxS}p:3U rbm-ltx3ҷFV@@%'yٍ}R OΘ4)%c_:C)Gf:^A9gt Ci1p`#Q0lgv P$Mg7U^m"Erw[*mp7wZZܞ]֭Bo}yw6=lUy\PK-\(0/DGx/&Q ^k%NA>fYبTSV&#.;IGt82yϯ0 *NJ'mwMkl.gMk$"T#+cM̦}U}g16G9lneE^1rg`㉡]AO5f A˫Gn1Mw2qF =%acSRֻ1r/.({E҂KLkxF"9 prN m <{o|)&# $,9F5bg=W#veR7SwؖhAʀ 0vp&%rF†CzP*7 ֵC&vpvAf^1Gc}v|q[&D*)Us: :bX1QDBmsͪTO/ =Tٹ7 ^&Xe&W4HY9 ݊wt$Ea;D5E:|2揵 ɦQB,×g_=8HN{Q.ئ>rJdOQ8A6) X 3hzHrbnw[^Sc!#1 /hh$;`!aMJHy@ܼZmwU 'p$O"K*ZWV{0̪^ k=lyVhh$u_v4;9>u{H)mϪǐ*Ŗ"F8H6wY7;@<;|r@gQG7MF$5HD%=$% [=d dN׵WVR Y5u{W0>Eu.vxK9uV g#sP$Y9GOjǑ 9uZ75.T4e?pf& @,h =t[3Pp£v$wgC+ģN8.hEB 2ꤓdI9Ofۃ:x#VLhMXI_Ab&-}I{)WÄiZԁrKLƲyHcͳlC[ ڦ 5>wda{~U7OA3ji!#k_;,}m<= !˓JJqqY3@[ӈW rJޫPsUz¯hxjspolhspg4%jw!ϳGw4$Bx5kK:9V}}DI,<*E`nrR^CtOE ̄>z(" 3| ͻ IͺJj ʊzk.ksY~$pRZ+/p(I+5mX{AJ[MD,vz[OIe4/ӂ:}1qUo Wz˹f>a[\o|hDt$2[eyMsO3SH1K5Gj2U'>_׊5-gDZLXA 4=7޸8:qoA3ˡ0|m/:ac1vOĚIMgWg{iݾ '[crkHcyO@yvJzi($r{](dTh`{yc:B +ww{b 7.x/djE?piۋڝ'ܛ>%8jpxonڳ-XWnKnnT/[ī^\uxӖk]pχM]dq0 :1Q#+2/ȔCWqS{ hlR`ܯ x"愕yfZ)~ FP k)=5:`2;#7rCI{T$4WM8)(_ϒg{sq*}"D7jyֶ\06@ZP1l ^MXt{2Diaఓ@-]KC+WS x6Ri.sMh݂\V)O?U/Ր#P==-$j N8%кWAM (z1fn<tZ{=S+9:y[=|t%J&D'U!+=5e(qYtd;xגˮ*eNhZάBވiq"x#m]&'p3)E>Zɹy% ^bȝu>2ܼLR1d0a=gXl~jYgҷ-eߞgytZ !Fѓ`r0ΓI^t7;cWf` fiC7nx4h/b .&MA&F -Is$uhs25= H;Jhc"7NcRDmksTǭ,+2\#݆"Rۣ&]aW9:Ka-M"}02ɣU(u}xwڱڣjW;giPF : 9Y+A4A{5n}u"mAб_G{X!Fmn_. OsVDV&PPGT6v4wm$:m)<~`;k"ܰ) @*OO)H22iA<! '=QZ ȥ h< FClfTD&.ᩑ΍_Im`D?\3E|^Eb4q\j<~ gGH Bsa`ƥs\TQ51Hk)3p#W֒~XrlF++xavM]lmO7$"sG"DWwO)>+ !i!tIRN \ -I@'KŌ"OӐVz M|Q,uxq{1Ʒ a]# ևU3,S72_y!2CAKG;&O NM)[Ps{]!tt6Y"5Vq6w_}{I-jզ\!(ҩqe䪰ʊ0u) _%O9X-IDfp^.D K10K`Z'y@0,rs0HaZg<x>=ve“]kp;n0lmT="&e(}V,Y +"h!}Nit1S.A:lEKD502@jG_I2Mg,8")˖܏ɏAb=n~gv˪RpHoFLfsОȻjiI'OѰ,z\?'zºV?ͯm\i.G ϯ7[>YV>|f'ZwVbWUo%H|%IuBkXPuu^eAd"2?FYt0&oiC7&: ζ'd66>R<&t jSskkЬzm u`)5 ls'k|p;o|^s@6}ިJ` b$^MNسxOlMHWDFMț(g6ؙuC[c֩BN#ާ{ Y3oR/|-:q{-,!(!|p٥9:-_g1yhߓ"v"BE}㫼ʲX|sSʥ4 ۻ9}ɃF=}Ѽ\լVJ -"%p^#dƶ|GОaCHׅQVM#qױO%e)D30qdUVgxL}o kK!h}:[Zwt+㲠ep0^3HqR2 mUËHK,e^HN(dk;yI=[ b 㖔ͤAtoui@ò2ht\Og 6fI+E- 3 F*6([;THh.4_[YCf p`\~⫒vIM^Wk0Bˋ:} ZTօC^J@pPXJ ]x5*wpzH#\ރz8l۴)jD{nYt!X\X)AiʄrVTg<S%Ty3ˏ7`{jO=Ԅ%9$k4)(/| SfCcFt.ҡ3$4 :Ri,kp˗42t()WR09tl3Ɠ؍AX 6bUa x1󺽄ssjXzb,ekDwГgZ*8<2qr\;vyd}!KQqPnm;1boqQO ]Ff 7̭v jVe7T^c 0=+z#OPN: MRY2 S#|Մc}55`WЁS"} UeTuM/5e-*{=ϋORݢ7g˵De^I0fm[Ѕ1xŏ޴wk$:bg),t5ZPU],>\(R p^E.@VjӑР hA'c7kn:6(oq'$cq̛VpЇAV@$޽h["36fґ&X#2nXkɽ^bJw:$egԆe$5_f]{HzX)YRዧڹz,/T b!!¶82LD*(4 iBQ g"!)D%J0(~%\wEϟ&\Nj1I~͵Puxt z^kXATXv^nAumXۗv.w{19/)ú8^Φ*>!ku3?_7C{^B>2$Ӓ]4ĜZDB3.qfή^j2Lgwʦo8k {B0DjZָNcm$qai'6^XBo;>F(eXYynRƱ .TnٛMf$њx N`Z %[2JiGN]0S!8 e!ھ]_jZt7ssc]_y@g9j!zyf . D-=t89,kK޶W*j*TTFt☄Kɀ|U3R!eT6C*oH[&Y Yꭴ{ӻVpx7&;3<GN..{kvOZZWœr.~3 D3EKAy9[li:goufe , jPYqBFmyҪ^bg;>/y^]:A=L.drA`BMK*-ga3FZ&` Etӊhur@=ԟ`C d^#9~|9Ӯ v./mc4d.A<cf#΋sۼA&L@ @cr RiIrvk2mޱ5N_L{wfgXR:ಔ=K8RG_ҹ <6ʧ%8 -qK4NGH@s6M 6d⠏w {a[I^]gM_1Sc 2Nej5HtCYy]$P:o_ub<Vwx̠JYZdq^n6{s0`F|C_E\=Iӳ(ݫֈ(>YnB^WxC2Vk a\9i|%XYa*=-9yF w!!> nQ,}0 Z^f K  4+а㓳SF;N"d{oA҃5 9r%x{|L؁oΠ+Ô$>-r" *W"xG iܷNR$c*x={yKռ#sp9)$WZ7Lte~dhshk$4D&%(n޻MԡLrz]x)Iw{<,VmxǙF$O@\b#-:rT_%b)=ײ@[㚽A;n" m:j&ސ듽wVsKIp\=$ #hC~KՐuƢc^S:hĜґK(l\+=a"hvnyvt x/cvLEe#y嘉s/}R+_/)rW4dlwQ>H|EPξ`bry2)l=m9nj(X }ا5tIGJߕjTGKn/\t&RXM?w^r(F,޳L(BX tb %^ͼ$3 c⺩wyP 5@ئ*ȹ0nVZ`VsCpS0Jg ޻I0ζtK}Qg U`ԗuҘ4Y2"8=w0Z:!faʽ#{oHjɆP2) j|Hcyyf^rY x qѾ쇞:A%ss\p(vk,,'d I X yLu+J̀iGc@`H$+viRT9΋g&bѾFBͪRspLrԪiTVaew^+vEdŒUKҝLJ^B –\,D<{EV}b) V_X=> }7+\F[=:^ttV0̆k&S; %_òқQ,~1Vuئg<{ 0Aҫrro A@Ӄ.QT <[nCB6ˈig.:"MB1D/0L`x+r بSBUwFO^=mn3͚ȓ@'uPԎeAbK9NBi9)bmAz] N:drky"HE!`H\ybP@Zઐ-y9*ℽvK;/Qν26T]ptKlmwԘ2ne ]d V^ElAe ߹%$l;ԊW 5o̱u=ޝs@垱la 7H ,Z̔cK"q"Gs,;Bl]\Rn9,ێWO-pFuq{hhb+î ր$Ʀ8 w6|,\o,\r悌v&q(kr:-I[`Vy0"-㢕=DnD7ӛ:$ )ųcs˦!V)%'ϔ%Q_DӉzLP%MC7Fdk᡾*/V -XQi?{ؼ=Lg2 !Zdys?ua 6+rRo|%ƚVxmsݾ. ww-`xlZ!Ҿv|󻿋pۥ+s;sh&yM_S:{,Ւ5ó\@oGkD"[:?҇I݇1]'.0VvXO!INYGtgݬ{dOlwXl`N$"u瑷HN ,\j@H:RZJ/^Ai7gOZ[<~yx&ޫd`ГBamQQ."ɭ\c<'}ފijutMLo#UPO[PL4hҥ[nxIa[h{ $zFDG+FJjL'cq?*i"~|)dxeM}hq{1AXn>^nM$ ~״QM^s"3猹:u 5$(*/ը+ Q9wj%X6ZI Z}ok0s;mrKɓM>m# zi!%b +q9`xT`k&Eߠ84R+ɾK#XdiBmt|C+ܹlou*OS+۝ƕc X}zmWD$27L |T-^ڐɬ;͖guUIVZreIL7[- Юn=\){/`IyMh„ipBR"5[>|X%7%×xxwܭ\&!Fn+ Y QwC&E+ DK'm:=^m}j>K&b xчM+x񈧌P_Nk>Toy*W47]8(.PƸõQ ED86Tiਘjͪ\PGI}VBXNԐ70dJhsUf^Rnq–~R/\Җ):ޅy@< 3\k ٘/( l,'pq@wbl̶ƑaE]f:]T0U`CJ||Jm*PTz*(?SHFqvir1 lt.~>?շ}H${ >Ê:YLo!зN'd01ϗz_ꕏ(>^4~<>D lr'Tڵ[ =|1kZGWdv߫&;C?=uWpUzt' r2yS˒#A)O0!,XXژ%ZD>9GU. <ĵ!eū=F3[|VfIZNF]i Mi.[=~ ק.JtL$$| J1" [zt"@ь; f&86088R{X߸;!ڔ=ٛ)&Б{xAPX2Mݹt+əsTׄڰ\xvUc~簆]`#6OF9[%书MQ!9ј<|(˼7bCm!0{` {"M#ʗ\4-rݲՑVI@"a^sWL!bSV7N-6/y5Wըz!a賾%NFx+g?H,@Gx ouTe|Uγ-"wF wijU1B>,L):$kfVO]b7{8|YIg;ԛ[hA76ힸiB?,?*ad'>k(|Sݏ*^[vJ87eyoH'ΠBv4-zӾM|)|;5DI#ּwGb7yٔt7=ްDH$Ck?5]gY\:Nn0Mt J;)˖+(q@TjJEKv*icGs'U*p.' ]W)wko_<]8DA7?54dPئ枧ȧyW{ȶ$*AXU13隘47f級¬rΝBt )Gh{f\uZN89+&XiP'<ts3nyӐSꍶz/G[a2Xr\ g.Mfz@gx ЭDyQ6SKENq;*Zk@JpMz/f5ƪNԯ LRu5wEYv<4ڛ>dzQB)pg!&IBȥ!(5r! >K>4eђ&QUp5|h/x'r$pov_KncGh3I.GR:* xc?[2֞= |OoZP#w: t{/"7ɬ z'^%y19H^Դk2V_?3{^?TPyū.$,E) QL"VZHhB6 |N4Cs|#"+}nAЮ %AZE}ܚ6$ ̑zSA}فNOON^ړ.G+@SDfRp»`#2;/˥H3:25<"Z܅D8)fsjV6 )sTz,CڅK):$"9&~ƃ%!`22BEyRDSaܥa;~U˔'Nc:uF{.ޛ &*˞v9w|j늣¯5EV=MPqդg aziS KL]]Rޤ%C\!lzq$ܦk@|yRzC}n;Y>SJC^^i>' U';9jMRdTu`: eVݥc-ɬ| ok-'Rl 3&yn8N>/j4W6t rc+ /H,ۂ]D@+eSJz}B o*"=q:Z^NHZ )*b &pxA5/[TJm>M9ۭ& 4t!}썴BkСwF:03$"Lta<!ωTF۬8 tK wJHׂ3}hOZUH5m3SY`T]{|+>F⦶ ݅0ZnY!uv;睖Zm :%/~F@a/Q*p!^D5KsU.uЬY}!ݠF=ogJ<Ԯ=S,LftOd*GH7U=Lmz ͼxJd;YsFsϦ;|OucEGjHJ=TZFA6b zƴ8ËֳF GX!%#}QEh,i_H#j0h3Cj@}pENO5.tNB=<:;f7)v6E!tN,}Q7*`O7o'_`Ѷ $qcrf*r V#80nwGyൿA Z,Lmȯ:NgJ.YnBkCmt~Ғ^XɽPa:Yby9~7uAl=Y_Z''2chqTEL*¢Ukn;GJvT oH -EwH)VT>5Y>Fg6@ECN/ʆzl6:g˜s|Y%1c68ezr=U|{W8n:.e}yoG8,}\a 5)5U+I9*uHt !R.C[~  D%X ʗd )j\aঝpcAkxFMO %[(#{CWR'D8吱:shf_٪se *GL{'FZ"b %יnahR#񞞕QtrG+YpNJzG:FlUw4uj__YcyJZx/(Lǣ}glHfRTUZq[PWINWӨS ;m {o,.3RA9ZC.y|(a`o8܂ԼXz2qh|nvT߀.v7*J`11;Jx8!>{+}sLzh^oꊿy Mi !9S_s:7#Jp6#@w{J'ȅR<_qDq++܊ щA3u6Tzo:Bϩpu>>D1&FA2B~V硱xv|CpHS. -m<"]e4`\aL(;ጧ`gѐ)q_/c D|/zO8_c RX6UCΈ։F~Ptvx3c:-Pn5>j`EԤ}X3}JU<@15XV^&;Jni٘`:^+0Zu/rПkI.RT{It-)paĉDwf=r"z#0-TLO4rF pxX' )a z<󺌩K.iRj,8iIҌyѕ8W#xX>=JLLFGaS6VQR|Pgˡ5(9cZ2uaFQ(nD^hhiZެ!)͍(:N&BjjH,?$0\nw-[dh0,/dU9v+p+A«l4ǃSh;GG@圃sz "Z[NJs0Qw{Ň>:x ]_/ ZLצ@Á/ >5<lZރ~1o7FrUfr]R %4 9 Gi9ӥD4 /H;a[2`3C7J D%yd_1ujxt7C.w+4`-VѧsE\C0UL?Ҍ R-}*SU{vh/` Ag# |&MQ{bW#>2yҳxD;ʨ&D * [3Jja$C5Հu֐zhV S~݄n .&LܗQ!4{K&^1 Ĺr ?kC}/^փtJeWȼob^9Y6LRzZoE M@S Sd~$ gb3@^m +'g]=c;ԷpR%a(`f*;\CSUz:kA@߼v',ę c'*AQ[d"8 G6 p{m7yu[BU% Yϳ`2GJ|y@Π; 7j}IM-4+^sPv]=;MII"خ$7s!#[@45FU).gOdHcZY^6qE!4A+uV 2I,ClǠ7xO؏NEV=C+i+Go0T'ϳ]ܭ^:Uc+,g\śh}1YFOk b[[qڨV~8l*Uj9w]ӴD&0`׈{\!_YQN9C zlL+/65Xo 28^=[)kpY{[oD_@9^;KR\8YR &mMmlf}e"Z)_LиR>7T_t8q>iW^^niu*!sԪ}~m Tw p;J\6<7='tR+$vdV@o(LVV݅(4^G>eN&8x:YO@mf"О9?eixPb[@y3E{ '֨F\#mBÂK2FWAwx퐃"%J-kdMmW xlDE,tud9y}Hf TH'0j) ?2+=?Hw1TK4 cQ"p`y9:ZAmgn ]}vHEy[-FИh|^-1UFG ἅdTKTS .`d۱s/ܩ97@MǕnpsäJXK>ƱW2[ZQq'2T+ûY+Mn۞(mw&| $)=ߝ1iG,OcƐ;c(*?Ó0@jiG>vx7%ڰ{ é2˙Q#I=XL5,ʁJW c8Z~nI0⽲̺="6npc!=a$/}Oa+,"L ϔ{o#߉v=8xʗN)B*mU/B8]S2N=A ] *pK$g I/\$[/u\#PWgcC5OrPz?H8CIzbrrDJ&‌vע ._"ӥt= \vYYP;HC!,"]µwh\ (_ ;'I9 8G* 1~BBh) cw`xz )_hʢ]m<ɫM̋٠LReYd( HiY uWz'~ojztM( {"x3]#S6$dbA{@*7|oWY= cSs~J6XwYzza2OUY!M os70Si=uA`< =Z^8(?\sB zs(&cCMDh2oqdmH?VFoH<땮ETi kmh-m=,5<vtɨ &cWzp8[t^&Ź3I173Y ecm#%<{FŞaG=:>h G|3:u*K[Ul巬f4 p,dËJwOVLdE}\9qS)Tp?/˜tjV e|^b(9w?']R%D6Ҍ/`vM$)9a6kw* J!zWJ=;y^6֡0lg/2KlS*(3!r$x@^`(oomMmdØ>mۛo[cĤ&` nF~o&qDK-ozI uljyS=u[(NՄԒ:"' MAYǍ W0C ZsK$`rSOx)i\,tge!}_:M\PQAqBc;~_pyz8$cM/ k 4]{126I7&橸pW:'U^G/eI9@}lTK\^<[wzzױ!.fH{c!.>%GyE&˼D;+|D( tJV5$MirJEΚn=’_V[?)Ga4eBI8uzW} y;,׵=S2SѨf{#YRJ32⍽gX|5Vcc R*h2upeAR&pͶjIEZGelpGcZ;2z-yq]>uZ[1ݣ1 v}y$E#ZmnI{՚#&0Gd,{b oF ;)?bl1kK,(k&pbd4+Oܑ9H;c־Ƿlz띎 oZ>oNL+byHEx@R b 3}\B*N-1~b_,(!P+Y#z-k^^=TCgfX)!9Q KU @bok\\2WlbsLAFFx+o\M(l`v)h6#=`K!k個}m?||ՉF`]s X`oVi(6Ȧ(NG;無^.!r&LK43䜨g}XX)`VVsXy fXS2Z>fX*zO-ḯ\SgdCn/c.LFXL~u, .A.}Oov!&ĠZ ﲑySjY1kjˆhAHJPI2Rhрqy8{MVxFW8QQlMOيr]Srd3SSB6ܰFB:7xXK^R(}1r7\b8 Lg)3:eK6s`>Wr[h0lWw.~B;(ycO a}E΢@M 3ߣsQ;%hqO d׮M/288꽼pkOٍz"[M?'H/!M|ݦ={SP^k+U{,luRDSBP ]/tI* ystf-\G4SD Ip'q?]GW{gYބxHbOhpsqct-`~& 59{D J|\ej*HwG(`]#7@<+Ȏ^}D Tۂ[B_<؋זby;.'wQ|DjލZ2ZU%Բbh׸߫Ex=8ݍ Z$]% g#Q{Lb~ Se$fŀ`v=XsjSOKg?i-њ8Ϯ`XXҖz[ML)݄,>,#;[J1lf'䆢BTsk$D<ÒaZSّgPEdUڮR9]iWBjiohNb WGbY,Tl)BV`UH.]'e$[BS;;Ỵ'"<`'9cS3Ռjj*ZNbz?5y!۫`q5|ů9 N,rl,pBVǺiF_J.q1<}P;0ee鷌5X^nm(K>v"݇4X!H!&z4` (ިM=G  'Q/}/AFX|}PĞ߃i:khWq;i 5ݡka5+^b輣7Eۥj.J)֘t(c#+8X!9{ ?eܖLT]9<2.4oTRɔaOzCN<7ߙҼd/cUS'eM axW|}PJTŠ2^!yƵ6ƛb,[xvta:P-RZ8uir)r?V F{q+r8\]q/^}VB1r "OADӜ>[#$US*D0$YXY@F7ľ~*om H|Z;oM' wܼ)&5 ^*w 8 Z:c0.RTbK6ucaq]g@r9dT/'i-cK(}Mlngn9oC~mQE.ÝFM| inwER#cкb^ IG%~N9d/˽ "efCx) ./βˇg4 8a{-RN_*6)fjl85I>dfڞi] [:'q4PPSF2=|#4F"$΂7TrAdYU:Z޵퉆I3ݭ ޳3n3eJI hvyxr"9 <<:I=W1TL"r>< ~yIgWyaKeOvNbp&!3AP's]M.j5i\49.mMy 3hP|ų7 Z0{`~#&,bR*!?2V'C\b.,-Tx{w1D|vesOٌx0Y]L' BuFԔi2IьVw"@5tF#./|+-Z55ܓSE"n!O6']Em2PZC)y6 2xiY䤩 YÐ/)G^>DN.FǢ*`' |aUtc T{=W"LjJ~ݏqfN@#׬eIT3z_;&(PPkh >MjI%EE C);/ﵡyMƒaT3RͧrHqV$(@5O{Er7M?:D,ؘlYͪ!\ZmM( zBXU!Wz7f+݌Չ!`,[TVI&Cp+<v=HGb$F4 ;m^oJ 0M4E}W3sRO ._r>׏ѪZk ({Tڻ0 M׾}]&t//qsӆ2)B+>$tfdYC^L ϠL CT7%ZF*a ;0!˺h]M^vf 4'bdBNЍ \1pݢ:Zt= @2,1~c4REU+_<:{2F3O . mdݼwč*UMYM=N%}48W*`ٞ(Gʝ6e$q)iya5`Vf}!ySMX3F#!n8r ^;RXlQ*x83g&.C.]82*7JZX ^Oq22~ ъj͑4((Jcg֋`7w Q.I¤"dIS$!+*!J$E,7 w`'zLz"HӨ72H ]Vecq'Bo[#U3A]=ks)0l{ Ŧ񂝦2>~C rĉ0NzD7-嬢 F_FϺ],4L625.ߍT3YVĻWk% dcwMTg`{cH|.t5WbOrq0hк[UmW;h#Al VρO塺;49OͼVN앶uoUy`q "yD {tzF}hėH_V#eŨ++Q/ B V+(X>ڄc*ϋ5Ls3=E"7AFFhCJRîn Ai<`;:z0*?//iwS㝸鹫T岥xn5S,6@'KLBN(ˆ;U|o7-=[miZJa9}JT 8uMi?G (S 6pI/1or4ȦPFZ GS ,ETQ"Q:Zwfґx ] 9SnocukI4P}}ڴs]:þH~zDЭK} 6a@(JC}DICq)&*)7! kLJuasEBێ#8m8cB%=y-" >K4QnxcS5ўeRlx ޓ}/6G >9[uhr|ꆞKlCU6'jTGm2] q^Jw l e\ZW:=GSoMZUWcۍңW0-(J͍' Ҕ 3p.<~91* 9^'=}cCXtW0&* h & |%d!NC0Aˉ6CQr!&SMryYtsoJY]R07.>m8J`C}D<IBD3 #+&Bņ< +S)v=~H;Ki\q瓐MaI;Ï@vbT3HjUUQ]jsI|!,^R-j/&ShqyWsO ]:+䮱IxM3ySbӑ6}t@֯MpAҕeG uGZMKw0]1W7mcZ-1L(.rߌOl2LH:܅@Hgp'sa:i6H@?[@zpJvHLa/E*K ٘?2b~Syݏ3 (^(PVvWvsx5Jt;Š$B&yׇ6sC,XG=q~f6tp^"Zsx=+`^,A8DYAR]q%h2Q-՚I!p%G7{RC t0\,x' B] bp*_oO WB(r]@M :dNUMIc][&sz.K+W&[?E3(T'~x8cRlӂʤ J>)s 7jOQԭÛZHDQQ/'wL¤Xٞ*8sk4p{wPݝbJԈt*)iwRM Cȯp\cW;y1ٛͼcvaBOCjcr>kgЍ_YTCbII_ {/|V4EHեyn4q'7mPW"_N* n_ NA׾0&Ii;ć{Ru+ 4usz5dv˘{i kuq\y#~5 I9/EfU0rvMH {l Ry%< =gECyF<Xt뀹ٜY =QޘwDd{dĸQ|2H3݉-@(3t/IC0:IJ#b-Y'K) ˜:yhGIT)RHm6%^"k 3:'fΛS`Ӫf(U ==$rS󅎫eօ"'m<+Iu !\)LOF6Uÿnx#ZD Pt#=:@ߺUm@X37>l/9M%ٗd_6V|~r!NoD4bׂ=wC=JX3jV. `Ewq7*rRﵐys󩮫αeg/X Tezk[N=~Z=Za ?aW8C3dv,X20Ux+$yh;3Hϣ\g%9#8\ A୎Zb7ؖq HDf$$(ܔZ,Y <~+`͞vO+X7aQuIchlLjS@,:yO4A QÕqZ$-^y!.ܺ bTGW;P3fo벲[׽Έ \iu;L̻xA*Dc̣tw&VM/V^%)0IW6zwXa5lW.$܊ib^a}Z`65(#dsumpKZVP_3ծtM}&5E:L85iUO>=%%2[h6?)1;_z:FIZP!vt!d8Ca5&As0ٗS%̯V{03Qςb=x~@ ۞&U2"A W{4`ET:Vf}ƹ*OݸavkAyH^$=r}u^5pvR`h/dUB6ĵ {cE\t96j=C[!ǐs;Ƹԣw2;\m~5%Y%+xd33n3E=n"ʺ,OrLS5'ЦHiCU32+8}SJ.t[1)U j@6`bS\+]lK[})Z^ 9")MFB~㉪e۞).$AMe(OŒX`6h|NiL^Q|WÊOUWP}^Y~^㺎̐[:lU-r5c}Z5^fC);36oҴM Q l/ڕ.U4Sd 퓖u~cOH`R"7t"w!ʖ&1 A vޙw W>6w͜ڝT},Jzptdtn87[.)=AJ6:BـJ4DFɜ}zyT@h&Dt.tz r1W*^sA8uZGe.`PCaT+{ >X4 EP x;+OS6Mtĺkܒv=c0Aq!sa={(; mÅq#,K&D,#Poe cGfk[n@{!Π{H5E U[dc|DVl_mjfMF$.Yf6⷏xN┌тB$C?G Vk50ZX"Sk'BsLVnciJ\]4$Ξ=bj_%\;Ե<{0HAh,"^=;~$o$bnlQBe(tA\ ..YXm&y M xMEN4dDӮ4^%nșpba:՝@lPK2ɠT4)(˾^-a*%[ GBJ(ST.bֺ,{= :+da4HZ*{;svNz^ш zFQ׫x Y= nT̔'GfF;3}Nj k ,T7`1_3>by$/.r3^\byaAz+B YՀGYE.=eK,*W:\B^f /4Rsz>Nz Tϓt<N[ѡJ$];}PѬ̮9 ;G5/ n 6u'߳(]KH1+z}MpcL zM̽:d0P$탄ªzB{" }uc1+(eCjˬR?C,wi wz6(4tl<ٻ/YR @,hUZ5|8.X)[إ/0roq~EUq؎Zv&|[N橍XЏj+4 d<ET1qAg15CQ&18eǜS3g| 02JBJDl|QbKVv c,ɽnck@V)r+ =H+NvaQ4 z1BT>DPMZъ 6ɥ9Ėjt*#Űk_?ix|9톜&D|Zf3]>M i#{bOgt«g4ɲ~. !"XP~BJ)NY︪lm8P3iMNFǣFF1WA..>T8(2ȳtS^@F N K&;:5g%cyŊ5 s `+l!]xE76*Ei)Ao&?[t5tї0 >[¨󙿎U+'dNü}7'xu(C< Q}IW!8 0 5d0^XcVSpn  %V2G B:yJhuZS88bi{iOw,/0`̬XeQStPY$F#z,Hp1v{lC=x#"h _ d GDdͶO2^@uOgT7A7C\9jFZ]AM!tɽs}TQnkZ< e { ?zB@FcFAzLb+\J&=C`#Ui¸$Ѻ'Y bχi:⥔\4vqu^e6ykn9؎ڬ{#0uMdkU٬6X%|zlK/RSxE teMo8D -X<@GP%ISRISQY Jղ#jRl XI$CϫzT=#%!:%qPMzrЂ"M'GMȴIk@]{dʑ&{ZGܬo[YTF{,uGbnXq/x`֊P(I%B29o=HW|B'fR1Sd:G w\O^z`[,BQD"x0,>@Hą>aXSldK5e灼]JS(lO2|c;Sw8` TӊXT4fWﶗ'Tmu!cx6uj}ϓ=mTXj1OW5 *9%{h- Mt"LcZm=~IlLWhuu7 {p {}J\QC4<{wc}'2bhTX@\rvE @ F ykn`P{v5bmR9<.Wqg]0=NIZQ9(qx'$u!+Ch 1mޣv%!*9 {,,\a#=Z;7|ƝԗNu5_ItSHϐ< Il^qn\|b]' _{<V OyOZ t- vdVBˋujv Ap+'Ҕ:0-rŠ1۶]j9%7B󬸎I\X8QBv)AcõkƧ@YÅp=6Ϛ|㖊ZA" )N= ߛJĝ{I"\W f4oȡ{-3lَ/'&n8 P4e1q94xiD`&E Sx'#&$`;JVw4$lՅݻ W7ʎ6r)jW{q~VdY7t}Cܷ`lkޣ!j&'ܭ}*1OؘrR<Y" 23cnW5cr`<MrF0/ AZm蛣zQNN$b:I:Ws'{z/p9U1s5*/9G@NTMjLj t:u'+1Jo<7gjLy[ܖ g x(nfƯjÞ/ܭC;2ڥiPt%ǹ,}^ feyDr|: 4-j%Anڟ`\6oD*JvNDɜ\5V3k.zNCg\ga5L&k9Q񌕇z~At%gyGM#I]?79Q8%¼<cFmf':xen+s€>eu Ӟe=+ } o0}1Y) \Kߜ#!F'+{E3_wߵCAy#{'¨ib4U;}i 9}$y0O`,e*Zl-ڧN;0T]%zspyAKr袼#'j=|ؤ5R N_KDM;twX\2H%x\U䎨^>wGL''-[ß#[V OO)̹B##llBڭ56ǽv:";ĚuT]-K%рIBv:Ɣԝzsm؀NU}Rf]_iڕ2< ::7Q'_`,`mG`qK*y|eC|@0B G7p{ДSOڀb:U(op1M {ɪ^?~/ ^D2VB6XCSTqgZhRoӘO~EF"-): U7̃`G;D=&\l$yfCOZ`K v-ykDC"A'Bй,愿|-f&ҡx߳c@+=zL4R#ʴE^=4l1Gp |n>!RXp9|b\@.[zupcjcpx}X ^I}uh:6i4gT/R%r Jex#N$W>O9J\iP'|uo7`g9/≜Vk;ilaqP)&m#393 BKr$9#үVl33te^G&vb^9PxqOJpp62 ]Z>S–d'WNAi{dzQܶT A"/eǍ # gf9 ]{ǧ0^nmO BRQ5Blׁ+QH=% /Ģy8C?ꑋ<<HAWeF}]jSJ<_)m_<)Y,c߱a vhT"E7h0u ZdN`zŪ)Q,?Ws( ikqڠ&0t 7'_0Iy>} [[^ BdB8~59xo j+P結tgxl3Ioz 9%dVGjT]tnOS=^NmC!k+ܬ\E5<9>6{,ϐ$skڄn<c˧dDGD|σ@$SUJ<B R-hs'.3҇L)䏬Kph Yubpd03ޠ(1tJڃu@G:CڳGu/« cKH5P 3\wda8TTYȦ^޸GQF#PkC*x4B!vY+dLMOp+M Vm![WT$H镺̕y7iԺh>|f \¯S5I5^SLVFk:{Nl 9#N9fB%z 2o/`=[pfYɹi[JTAMłϑ)'Ř۫.ogFC2M8U;KR+u7z-GYlwgJƶj5\{5=Bԑ߲'L#In GLR=gLGvM&VĢڝ17[JS%߈ELzr0bhF W_p^rK<)ݜ]4,fq['!m0Q@&#؝eȔll(Sr7Qq34;v6Z3ڂ7Tn*I9'@5C̆0_ÉAX:^^.G$~o&",Ex* jzv}W)Z;CF#eDLlNzl1Q] 0@VфTd;x##F92aO2uCtʊH ǧD%1Ҽ3|DTS(V ،,&HWnd'^[Ը|CEE@v)ս:~N:OsIX{F*AL<]sEt&-'Ǘ$\ T]np=G+ Gژ[[QFrM.y>I;J PaմF zBk㉒A լ:8xxv4&@孊B,r' ʱVCX>;v1Z Br  W~E;8\Oq87Bs9> >C2XxPfB+İa'I=M#1@iӺL #ggJ 3qzt 3( Ik)Ĺ@fDjq'uU +5Pݬ4;ć^)4ʱe)N~[J-[y UTYAgVF jPײ'\k_bRZf-V&^+ &_%LǎUNG]kg]vZw8]X8$<\}&} u0g@AC5͗$tyڑ#vG*5l'W|[b02{Cb;p9[ҏy%<:嬔t$+@E26:ywOu-CB Q))6=9g&[2qBG҂Q}\- _l(&HhSKt^(~i|Alλ{PK k 0 Y')t׀i%Z1<1QVN)[7@o4uͮy%RA+bY K@sӝ`"~{ܠ %D AfJGx`xߜz,slKIU$"pd-GMQ|kE$2f7x D)>{$ĺ`(̞.&$8玚.ؙ٥fkHSx+~J]u/Woz]E15Ǧo{H62Ta q *䥛%+3yz)s*PxMjlah˘(qfW~dF%%m~Q6eզC2t.WEW:HYÅC ڹ{klݱ<{Y$KQ]-^twA_ 7JT ӷ\ H(M cyYwAƧ3P؝֜ ;h* ǯKdJ05dceaR5?IP\x7 c(J 6zm&TWw>%68u^-oԓqJ{vH6 ["N;jK︍eb˟"(SQ6[t`fED= XˢKMz ϐ:)#׻;~DɦN{#}PEjzC?2é3 aIfC rlq J't(4Mek2NK "K \K|{zk{m{Z=bdL [T3G_ PfZ{W+GG༲JT'= ;J'uf*AF>~h5N;Yu)yT n\jIrVR ոUp}+n(Nj5^!%+űe`J^@;?7dz7D&=>c78 mAZX%CcOC} i {OKăزȑ>f4޽d^pp8Bgo).]?Tp}psb!SǔO/fC$zh7p&<.%ͪdѮmmSZVG>\hHP#Pp9My% &OɻAYRŎxl(Sv&7*1]& ,2Z&!`bsHY嫅slyqQ2)2p(KG' OfdX][\^ɢquϘ^ <ݲ^ÎW}{OJ!;ĚiM]ph@U컥ލVk)ׇppktMt\wħ!\ H=>syAkG=>PdG%ܒ "$4p!E(sufJ!QM_^M~0i>^aZ#{ ȏ|\lz`lY\(gjPv(7exPUuzD8(B܇`d@MU0#\Z^Kd' 1Q2:H_߱9Eyܛ82gyz3ar<:%`$P8[E)`Qfd/ #ڍiftr9CdGUMbl)udzǣ6Ln8kz#P 2{$4zgD.:v^;V[y\BPCb{ ݛjR^`Yp^{Ab1tJ[ F4nS(Yq , 3X$lk\0/6)m:n`?!,Xzd=}KztgcJM̦r4@j^ $$rN <+H!BA|r, ]!fot@s?>/˼{I)[fK^w!#_HPxvJN~twϐʜMu܏)H.T5H38RD ӢC?KQdv: #{1xr㊃2b̈́%5yRkQ6Y=iX&To*z3n U0/.$qm ZpBA0:0'H?*PE'F&KX9[1}/t4 =V|'0yI~Sn;AV¨{|;o٤ B6^;+tVN͋01 6}TŻQ-Uƺ$H:/\z`˴-\&oB ( ߴ[H+ujG)\ m6WnB GY=j>9H]My x +WiyBg;c"Y|,4Q]( Pq)-Q+. ms&{w{"6D8cرJ J5B"pz<|[NYW,s]4ےlt]d&'3z߳/ X$z)sS6mVh̃uv! kV-wQ!VBo1=z6 ьgӑDNEvRwy^h%q-!;j "H5γ1.\pÆK|{B/7w4)1 o1=䩸q=`7/|+bc=BNx~Mא*3 D&K#uEMNjAQQ-,c `A*gюjsD^ϛ3{OIf3GI*DbHAFX\ǵ$fZbdH%Vࠉ1UR60J#wTuKiyKWr5e^8_)&bm?E`9$ly*.A@O.ϫ%2G>w ĭ_T׋>|'gAHl!K*Pl•CYgOHh@+X;MFw* M`nax<xٱ@im=pfI k n+{A7£fUzL*^ru4\ེB?"tSGE;v|%!TꥫC=~< Rr!\˒vo3Q?;.8XAzOEpzt-UGar"w=9{YV}cp,ЇP8Gӊ!Q #F\6< r6;?ډ,굔U˥}ލR3]UZk;xWEonU^.F _dmkLKmHi+;cNvX2Vzp-#?-6Ba/_o^F +WݤfF|/Ɇ>1|ZËEC›LzX ݢ< bl&ֶ?i&c`wb8j !8=xtO $frHڢZQ 'C2 M8QY81*#h'h ]B<0>c"uE[óWV`X9`ls$FȪ'6YŊq/_y9zu0nj@y)Y?qr*T)#CD݅rC&>X)Kt-''zT3TJ|JvBj@8W B띻ʁwXD8r qy֬䥂 >$t^eֆ2tBeJ|, 2B!€ -ڈ'O'p^7_;HFQZovyԗtFCet[8 U5 sso p+4ؾ:4< {A|OeԴ^W,v߄gdNV"EC5Ԯ-R Z8`#=,{&G}JoX8n:_my^{(/;- Beq>V31|n6׀A%g9f"4}dKg\D )@PW R4ZpølV{ 7k?xX-Й"v "̫G3fy fUGL룤)8lROp2+ae;=my]םDgO7 GZto5R2l'SN}bROՉOTH"4 9D{B칓8^#Z`]o5`DMLkejӃ+[ViMu\jIW]kliTpgv2&τP㶝v ģg;ةJDn1Vo$hN6Px%%]/$ V؄PE $6ވ{֘dY--)6U—2(䏡h \A D aSԎ6W½I  %y{e~$i /-X^(CחTҢ JSܔi-Ta"amvْqiL=W͕6'khghY9lZˡ94bm؇gR3:I']R$R[^^pQ6iHiÌχ1nzCRE,mI# "~v[XEo$޵rfK Uf8%~VtcOswI6ߍ#G)C wTR[3~|P]= ,\}OY֬ :EԲ[]3lTFf=E>HW!GfC" A̴-BIZYx)0:[ 6 WW*H›~q>C~Ԗ:ݷ4><0Z(5TT7#R(ҚFҰHF0T)<~cOS=U;կ%!{ΞJī$yu-jKjWA`9Tk8;;H;>Q^^WL į/Sc]c]&fN{SQ(=ۛF DXsɌ1 <=7O9U\`H Լ.[q *[[T_]! X4O%W  C>R1Ht|<%/v/_z66 T1\yuK(Rpmk6oPlU'w;H.8;śѥOCuMõ8- @]fksX} ["D". T Ϛ4a42E6/{Ln(Ȓ&ר:W춓/M?%6{6ɹ<-er#Ҟc"]fGL"R0FAʑTsbxVQsVC Zz4=QЊ|Я'3HJ*7#9{IuvPTpEBY%*5,B3R)/eۦ.^T {C էI^dYx. a+ͪe39YͤEHpXeTDtgJDz``zG@>H>"ʥTMR6OFC`q(ў dM7U{vC7: t[|Z% w Exڤ ?-WyC`:0Ef^r#+R\u]qze _&˶375:ej=Ƒ/|˦zn2VblMtzDklP Лl;р#D*K֙өc7RzPޣTnv@Ⓑjv|wai]n ;2CLU08w:C#D|+Z=lxQ0䦬ՙBZiy $q{׶ujT;_(דbKU=)׃+:Rct;}NFw7q05ƄZ\Ō?:{sT˰IR'íF^i1c$ zQ}sj- 04fv;|)%Y@<=*P&Cr.39p@؆]}"wCv}{My\O{jɫW2C6`{whz[V55`r㡓&p3#ב̰:RyF1u: ru>2|O"&މ(&=j'\5Cp%CSI-~Ng=!nr D i^o'=P!~oGqnMOPdF υjpfreXMbWn|eJDi%@dL| *ՐWт#ˤS$퍔5`%U{44䪨9 m2L5!C^7\ 2K܊UCg=-y1Nw]-`Ήޒ.3aٲgqQOϷL6C|mYݚ@x96xc: i1cfܹ4g+^R`cL?Vwy-\7/B&*aӜUj64vDAT B>KA;mJ-a7ˁju<@ЛZ"ԅCWtܧ_ΪEra}KL`OE;\\-5L5= ^ꤗ"<EׇX{ @F|T;^Xt՛ LQ'#i22b@]%H69%Yi6U_*>޵#͂=YYZw6{!08\;^zP>}Ui W:#XnbTZ[xX;%3PF TWɑMBt؞_/YaJi#P[8E b!|8 8젰y5K;Zצ4l/MJm|֪G:dY(ĸK4Ҧ{UJVoΣdc`" f$XNy$!hhj"lO.aWր2-S Slg+XK'mKTs빼ډ٨ gW/F$}\ckg GQR&q .bV^B,+ <=3iEԚzuײr<_7G.N\eYLK}և8Md²dS@Ψ JQsqřԈ1AdJCDD\=⧺GTL/%}(\^*CNxMR ϻz:Qs+ IyZƌ܎d0sKijs~eO)3Aaţ‰QSتb/`WPuݥ"mbW fbP^;g1x.,zye \ӪsyʻPXٌj[Ye&LD`wx[B$|WۡЫw+4ɀXeʛ$XfIg7IxvOGhEALFCJ{O7Geݸf?.csoN`t!W(8Qˈi`)%~Y «ZoD1:蘩YR+ô:{4 ֯R-J/`/ϴ\՘HFyARY{Ea_ia<3cC̉w]6V{!yH=ef: qs>&QevcBޕ+5gܚuAADwOBa.Xc+_ sbv_ [iP8vSF"ǃb6N72OjQȧ(QNs.!W؎HNQKP ]k/fѐa yD)*L E!I.˕&o(o!l{RռAjӅ6r^Sy7Y" 6:oMR9J%#BYk - JX.8W 6|˒إnuqmui1׬^4XQA'W.m3ҽr~^ܳx952.2% 5лlKd0·v92&kxYIM/}x4;+Ku=;)OjyW[Glm쾃ʞ×sSGU%d|[ViY}J CL;iE (#(^?dXw*2#I1F/rteA.KF&\)#̨ x8ڊAWϛ(څظ+g4=Pu\wm9A'F_ w4< (^l"i>S_WJǰ!&{/,IYktpg9ewNGEvfy~!/'؛b׏fͱ]H\$C ̫[-!BTp_yc* Pq) @3k$/uڻ.ndG}ˆ1sb–_6A8b/)fm֛Dîpz2F8-tt@+B_n m<q5v4 B^9K^ce&vcVAD`*Ӝ#AJxD $]ؓb웦{ ݳeωhsw `MD[ꌧ7^p.{K w(DsLĮLqmEMޛhO<~s:㝚pi*҅buD^ȑ:dSͳCۮ7̖yYPEzF0+(Ҩ<,BaxYaE1X/J{fW; _"e>ÇO:MC5lnQzE^/Fe3gTx'O\vqUQMuN? ']*gV@bqGͫdjqyBNgK &lH xO<-3j3aIF,q(mw,|c7 #q. #7c}֪M5۷rBKZ\q9lOLoP_5b+S|,/jxn,Uv/8gjGN5-Җ[LhZv =צuV!琇p#v+2sJAiM7 ؽzYK#)*U Gя5w^SVGApsfق3*m$ENhyqḘ]>VJH UgTATw𵌽1nU| nPH]oG `]$[u2CF s%Az\d=tE& CX߹w4i;3QEȅ 8V|weomyH, \ yZiB r(F`b(BAVb5N?9RuwyQy\*d]"̮Z AGZҡߥc^h10T7{N Y/x4y\DJEײwث!6?2/{ik|MWP-y2Vƾ̲.`5 RAq\-xǬ S뱨=? |}5zgg7(qb"Pe7v5nM*Z>ƹ3[K 8"lOhFQj%\t)ȡ$7zYJΨ#-)L3 86w{-o=4+OYl>MXdgjhA}=j WF ){6FEsIHt3$B3I2ue<}a5͸Q)LBOB0GP8~_o媅]54~c$)P:6O*U8Qjb8918Yfi+)s&#8}6٧"iT%0|y*ψ5ϥf񌣕 N p!ve,}MQ7casM٢4ƭ{IYԄ 7': M_{=a2QdL&]<$G/]]{«;xӣ`P܂Ӌ&1E4kN$O3 .%ˊ*:Q梦B-6.*.<[.]wbbtXU vBejZGk= B%d zv[wT4jcLO_ Qy= m;{t2{(039#7@-P̵)mJZd!PcɼL}(H> [3;VXetՇg}8{OA>ef}Õ%^-W1"^7c B y-Qm4՛FH SmB4$LxBjGz+[Ay4:IalFf۰"WM1@Ś y쬼dY HOě%kjHgy"rJddլw4я۸UTsX1\ThzYp@ #}:TBZ;#mRxSUVm5 ʖ{䭃2le:=B XgݼHfy{,/41x?2Qj|I^=mP%S\^bpkxn0 רʟ _۴f/=i#T;ȐH=IoFIz o+蘚T% ߚ K~>{eUO+mԪfʅ18DФJxpNE}YI9潃q G@!e4:ٸT~,lݑ<bIvDʆL KXPY98|[ xgJ@:0'g$WpM\Tq?L`Cn)C(S9O HsQ*{[ʢFt]GvKE'^`Xx4 sRcdZ*""x>ڙQ) ,nLJI|4h bYnP]SuI`9Àm8?-$b[FZX{btKDǛX^ϾOθБIPȺy)FM"]'y[%J)>Ύ$Ė0G\a0urSQegXpT+Bl8c NsTW/[su͞j6kHaT۬Uw{xޢ (`xA dŒpO͸5aԛ<|MMײ\LCi2`4"P)$[RD{&#yp{f4_H˲c( 49J F~çfN4D2$B0BVe9hMvlVۉτTM2"/1&m*)ڄ39 !]i*yRţk05D7~jXɡܒq=iR!$[|`//Is{x{i8 A(ʔ Z0ɢH˔=iL:^s#5X|`waluжzFXm!IEntvB bՆ@ 5oa?!]ʼڀwɸ-p##O-H,A%Sت]Ь}^Xi7X$c/e *8-s[Ee.D5R1uV  mpy[j8rj^)$yj/d+~qBWֶ_Di6ag DIU TD.Uݦrya֩˰#ם$(O$be/rA˞0Q7/żgk5Մy7P|~FM͵ >&[4 bjҖ,8g˕ӈ8e뱉_0sa?P؆f0R[n3wo󕄾3D,+V%(tޱG"!{ÄG8T'gj\Z&F{0Yђ#ˆK7 v?ղXW|w[e@ L3%Yj/;jXi(#N,&gR|bpVIA!ثٳ\tA·:M^{1ǩ0(6zMgp#$TMlEZgq\1/\I{ɾCExQx <=LiYs'n-v!hAD!d_76 t2Dn!:^X3gtq\lY[FES>{^{G^wa,A?d9GQ-+d'-uݸ~Ko ͇-3-n'=4׭V%R(Ŝ\= lMWE슽(AganRt s[~ 3iٛ-Swo2TQ31ڛ' `5&%|  <` %r LwpWzq@A#'$jw!ȏkn'.^@c ^70Sj1 lݳϙ\)QmI1e<9HufJ.jXB5ze&ͬ]q!sD|&u?Wq6Wl< F3T kF;䓒l, <;oA\7dc}Џ0L)MtjHM^lHi noK 5x0J7+LeJΊK%2gR[uˈKI#^8yv MkNZrgmNpҍTYwzvQ`p ̍b1C!s*e(+-! K7+%zh04{wf0bV;u#tEl7)sh퍧 a)!Z .gfct^2BucZq`xm>܏I/.5L'&K`M9@ig*8>q9+鐤k1R}n de&wQ@ P$/«zn%9;e]<y"C=U̘c]lNk^DS*k|cG8E̤Öl+?i^ܖi}\sn33UA-gO j#~OAYOE`'H:O,H)cl?f7$$^iTݸ`W ъ RյW^>Pzw69CtISM`š@(!SbaRMSJCNra Zgac .KӗḶ!{X.;6bp{̜N;̤xo05=+U${&V{ܓ-#ueV@'f}o=Eϙrm7OjB4d< 0Y`*E~.gg2dg7q碧.J%Wމl,B\5t(v uqjWF |A÷$M88Dg¢?]dl@33Aؐd]{5qG^Ҭ)c":j;e1[NRlei4s%78X>bM9L0LsBp' e'1O9֋o$1`>BA6.W*+MXc3KF]}bEIc#N]m,lc !_yRǸZUHF48 N[ &kuzg4XIז́Q.mze$%)./S-;&V,`A00ϊ|< U {04Xw+4yB1ΚFLj;1]*|Lm$/m1yϬ 1s\(SM%>yvt.&%"Tk'I{I+]t 5-(y=s F\%K%WSۖjF&{y_+HK5J>G~Yxs#Z "v׬*c@я98sD,sf6iPﱶ+dl"nxToz4 0lܽ;nBŶs4M~ύ̦ǜ1ߓ$Jͦ,LmHO6qm"Vwmz&q;؉De j%RBEj$)SJ+AZ8#/ڻr8r'̚ơxzƐP؟=q2$g;}%r .Z̈́# _TMsճn+tba,^OߍN45`f Yr=l8)(×S'nRiٝӷ=E ߡs +a'ĸr KBi; ӉP f`r{j%D5ʸ'ɋݱ5rm$?I~f(rա.A*X.$❳%>2zG3Nf1ؠgYl3P\ M-g%&(PKFI櫍WIՔΕ #O^C$N44;|\Du7ռ}Zڃ)C 8&8S\MJ;dn= XנmӰQkz`Z"20 ?}s$0=b,w`9tI[5umwN;H+5kH6O1 ;0ڶ3NM 5SxBȣQM2mH2[-5 κ3v*I{BM ⵨s߅au<&& ~ýᩯm)ZM؜c"hJ{Z֤1 s AUf=/Đw_,9Pl㎮F^w8uK­tBYf}eHQ3gYUAc@@!~e djEZe̻[iK(ɡsfv Ǥ!JKqlH+}pVI?tuE{'QQ󪽽'Yo&nx=hr t7zMy<*q܃b+`s$"̎+4UzH/'C_Pd,+k>jζw@鲊be6k~+ zyX9hQOJ@b͹:%\Ј,Jr,mAu~XoxԵe$ɳUAPp{#9Ctj`LRftpPĆ|0R/])DŽ^{ )(Eu+ɶ -XW)##H.'"Qt0\;﫳$p}7oD ^;t22XMˣEH8HO G'ئJ5@}o UAEm[nQVZ5oSM(h vy IwUawWd+ڐcLr#C紺ɰCq͛Po`"V'拮uue6ϣ8{EYGΎ C%M骥=s*H]s:|oug!Id;.+!fH_bx 3 kAt-yg#]Vei[Id<]Xz씵{pii?Jޠ&QҴ;|}60 2kV:Mj^";~Fg5%2;4S3p"{aֹv4 i%iVl*Xiym>UPi,'Sf{l6+I1{U.BZ /[Ʊ煌kQZ_G5\u( ÒgM]+0*6 4"i_s8'A.`˭ Dr{xsGm{mᎱ",ʓY-]>Uyt:ϻkKC(_45[}xzGKP؉GkS7y<>&xTY,{EӞRwRgW+YiG0׫376h `LZi,64.^ '^R%0[7džꠐ1ݟ@*yn8gFBbI=Lj'~Y]{s%a5x6S9]H@[ΧVoؑg5 Gq v5{ŘzI2Ģ.4oSՍ@D-V *d+cztOYg;er\S;9FJUx "#6;ԯ ze%ѡٻ\1yLU8 kD~] v ֹ& LKiqwyohy-qBLKSU 'xR\늴~}"`}H2 הҥ]l{w~<{ eIK%;xoW<6rM 6= ..aKd$yݚucsVIBݗ;ccI)_ijYk©4;jɗ`s6sxT wHy]Xgz(eM/=OewZOeTۂlW[(rX\45O}qҶGOq2\zŦW/aI12M˞@+?þ9 '5 8yzWH2gי ) iȭK5dN;tl_6S^_[7[;Fz0A'f)f2A;;]'T3f4Q-(OmU1Gѡ2 n2]yW1![+̡a|i=rB[JE7OJ57إLy$Xgmp^Ӿw"_XF]9<; [^lQGtjJ_>Cmfz2ۋ4Nx[R{HML*,`LYYT6B5~P49KC:ieSd7'8Fad(}@l3MWbӂ/bʣe"2vFu.tpe-|M &<=~B/z'39:0yU$ 6/ e.Qv]`zl$H8 ̕Gx^ٓӾu#7+'&V{KL[D5~\S`x6 #SO J8'WHhHm X0HI&nz?Dyxb ˳azl^0c\弼 ybf-4)$?ztz&G ],AJme6P n\afc}?'@1zT@( PUKKNK)&-6uR[')<6uJS9A$|c^Jj`h[:y<"+T+ ^OJ".uC8',o-1<+16[-Ei%Z#uL0#+V@Aj1$d;7wȽ;v/ N,DTAN^%~V/E sY:bELbL$;x]O$5}\[w"@t`(e>r]X)5.El_C;Ƈא4v>Iԫđ|үD|6 [lJ4ckýh*iaY䈩+a{ Eg>&QyO AO&_󼼮\Zl_5{ʴ#g"58ӓl[=df"(vKq 9gKe ~b(3fkdޘnH%0%{%9='z+ kp~.O9^˖wGѪ`ЉMz(ͻ< 'Lk2jRAk&^T*L#1J6= n}b:A%ëDa/b<{tm#Am҅{ܕR#Wg{ꑫ J' Ǿ Do*Jaimю.$FRUzTauӺxn,T|^!G<@-PdwF7[G,8z[6B2{y{ޠA{1?NS}Ȏ/c_")-'/'DJ+M`v76!wJEhVh=j$Eҽ7S[',(ǽ4&^½[ߗ@HiO.C%E&A&h>FTv^bx1xt7dzEA ۾Gvy<(rc1X Z(Lxf E̪ʗDAt;Ńߨڻ Q43ǚxᵳکdh^\[kiP}鞨iû>A[ dRXEJ-p -0x:Ίn >l8`[d@] T,zT ^4`fb(BCjV*Q,=KҖxC4gm/ߢy;Wu]+G;L7\ hN}%G44P1=jxC`r*++-6Q UOWTN>W4 qd2 p_i xFx{Uu`m)cdj{p A,p-@ 'ٖMHk4j Q#ݒz E6f^$xHqӻ4`ԃDD Q2i0RoZ$; \gs.Μ)+'*b @ r4gWwD'-Fxa{u(ED=4).DH<eZWEB!Oy=C╽l>LT=䔢$U,TBl" XVBc^:.bvJF {9ŃWwo:KvɶwHC; W,P Wxfbȸ!xPf j,SdX:%iEeEҌ3? 4Ԩ]ȇd;y 1>CZ*8n={[l +0 Gz|ZsWb)XaE!هI5[8fޏ|Ãz-:AT剗/,d XNs0JsyYH*!JeFnSyk^i& x Soyϻ,c${4u +sKDyڑv5S;Oj='#oYjrȤ'JFŝK#* ~x-,{.*)%wu[ɮRb 刦ŭb%zqvq뤱ڽa/^]8;[|IVX(57ZU~pAw9;7l6ĠDP.q%>m7ЃwI%_|aJ'l\C;^pv!B` m_-Eg  |K^&+׍xiɜL(ʍԟskRƗ`ҍѓhKEwNxMvWHX ѧ=i;pՋk!JE%8}i)SQ..IUeQ.t L MwVY >ɗ=/L<}OG 'XqH`WQnp|oyl t=VX5qԣr/hd ayY,ixk*$ޚX”)R0Mocēj=[(4& H(whB;UU3y/Nje) 1:"=2<<ĤW9pRoI<[7|EI19\{%]U- C\mR0&GTG\e ''pP0KX#PȥP#84AgS9{#N"wE $z">i='q{ʗu uAv$zp UC2`ҝ޳uI~HuBxuടGƍT!I Qiq4l ,KF:ٔ[)@ n5Fe;lM{ZbH7OmP /yf{޾nxJ֕(2%vЬmյgm OJH7aYaCj(V=P1MTEX榡$#&.TL^Wv{.ҍA%-NDɳdq]G̹]Ci΋kD`R*qVdcGŔt n  3颣м2SRVK|U1ɤ~Lo[#R皖ʍiQJ6h޳ |Bִa(W4-\! DY4*َ`r}$w 8AW"(cuHHzP/Y`Ev ̟A,3^:|ot]`.h %VObT b9ջz 2@ɍ[pZc8{A;'?wJ%N6xnAͮp;`آJ1HZQp^]G6(o 0|"N8Xeƽn;#*:W0 yRBa1Ra9dГB&|MsMzo;sxdFhV-_9a /4wzjכ>q.hp9.jHIbLEaAB9'.U WG,=rTf\ XI1+mKvp(=p"Uo`(GOMC>D]&GύI 9+Y .!dn}ȸ%JEGUU_r`$(>=POt~dw& ׀j;}kL'wЙ9iM];8tٷxc4No9vWDި#Kg߅ k {GRE5`A+m|vԡ\DVAd<"ո6B e() qKat G|g>4sY'1Xg;/=ި[?ކrl2(}sM50ϱ1ύOscvϦWNlYc|tA%yԖYBwm{pk=_B9gqEmPA=}V*٦D/zhR5mXAJ#3]y$ R8U(ӝ~X{Z ECZ"|y6%,#r̕ jѰ홉oqq jB9ǏzF\ae:Ӣ#Y():-띮rN='- /O ~ O6d2 ޖjaE !ooYSo-8цh*W@ޜHŢ`2jq#2 OG: U-#zhH^7VifBb@ GʌMTB5{,^F㨑f_za UtFq)݃Zִ'xӵDR+/E[!7=F$]m\g^Z}PK~/ii,;l5|DPݻDlk3Td(u6e:[-J،"!D^tc1= K]Ć0Eƅnc~Y-(Hxjɝ;CM4ۖR ֽC Y-B|u@Rt j)"k"S'g(uO1P !HǼXS%g\P(S^tWS/ΤWnO죍 MdV0)Q\9 V34Fז!EV`Ro98=*] sSi? 6ŧ9o !hV(;VyjLZ){zyb \D; IrΧ?=$Җ+s8SC ^ftS@B5W'|9dZrk;L7Q7r~(TzԾ#@wzp^*ڍWbujA 'WTཙ!E]Hen/#T<+3(DwRʧZNםTgWk>N]nyL"?iιkcW r rgIJEؼe; s˴VwU_ed]#I%}}0A$Z16aOӸ PkOVw=)~&xS^M3= 5> '@loW*]p_Bs/l=;Fyɩ`8I@ Aop5dI0j%{/L\k"po5\yRv V5F:wMjUɬ̂qbBõ%2Zə(Dz=<$YpG>̊ۃN\]}gJ*]蓛xXjtϗcJk N/i~ @JSRR(xө[+gjtٝ*GO‚KϰiLp!\pHCjŮ:\[-ty~jpˋŴI\REDvŗM N1e fb"Y8hғGrѢV1%f n<79ƴ~ <]x 4qǹeqT_۔g6@.+~E4*<Jƻ h(-[=%q<2 \M{1˭In<ݾ|޳vMjd R f 8FD'Cf+ً1HI^:<|ыi] PPz5]sx} c7 5lj#>,g-kKh$|Du]3s3ܔŊFY6Ew ԥ Da&gާ3 [r8$SK;$R)m"q'67'Vmg XC+>Ayآŧ%mf0xx/&BI^9c\$j gNM Q$>&V{W<2TE@[SMuO̅0ڜi=fnu9P rnbw٣0Vy3=l}`hX&hjJk ^ŵJ0LAЃl!,V뮌H*@ޅ~|Ptk=vK{"-- u!V։@dɾ^7[ :>jV oD};j2x-1K$>KZDr2R_B[e ; zkJYiH= (p@؆}xΪ5UQJ [mb0M-My2ǡz5]{ODŠ*chؔb5AX0h 2-)CSJ~C{zaHfjL]L{Hbp]a^|.=c%U-*'ݜEq&Jp^&S XHU){ݹA—Mc^03'^EF!p[Dӣ\8Q v]K6&u 9~x;/؍E7ӱﺸy,jt*OUrCVuV2a knϛ"dڽpȟ'DM (]Wə|:&˒,.I[/Gh/Kw30F=}}&x5]L)kVPj[YͯAOWhaXB}R/^jYC+"Lj2`m&쪚s_=X6 gDF}VoਞH]#˷Y;+k+/VӋ( 6_=SsG#um1MwLE)gsfVԹ9DǸFCv4u~WlFu6(XqVTS X! P\r֟gT7|| (J=AjpЁO*݄nT ˀ, _9@eKt T&W!2pu^Ӂ7tSmc[CxH"\aT27.X[;:_͢{q<*c,' ;C"g_[VfPڷ|*J ۊ&i 3z\l*̈́AK; 9h8Z HncggPPMMeVCt*b{KvJ(:(EK& xV|1si8b@Z'iDm߲c%dMUaS@KF#uy(StEثYJ-ɑ*QU]ޙ1\&z^Z+C6mYYh{S+y\ ,q](CuЃՕfd7"}I=n4tePibiH&$ ~/_q^X},u\P #&a"{|±+KDR窉\"ҬXR_v]E%UfDLyIc*"=~ySf !2^w≘)P^{iy穫 ^k4zTLfl;Qt3zO]jN~c@a A_-MlXE)@ U/,R哖x 训F0 HQϓ$8dJ6&0źf+ {r1n$.ݲc; RTyo9xќ'Y$xfyHg?J"):oFM2ٞKVmКC>ѧ߃Esk% `Eo> g<iBv YAX_/>6r{I Üf&b{ 7!_8p]:},h=o*q\cDbz{LH5^ 13ؽbŲ;="P5~J)Ƕ ̵Hھ+e ϛM ˻ JWJ* F_[Sp[rmu $}iW`I; |`h$S$Qnf{ ه+pu!|XJz'O'[|Q/((k2l2;@zsCR4 0p̝Ν~?˓xT趴 G6@r@jbWڢɽE(SSqw _}A 63Θs7EG[ ؊6@/9lQ1:@`W8 e s?-ۖ<0/W+ a_5uz<=@^g^e1l&Z"eiiIۺx4/j(]VV(ױٔ -]_*K55C2"Y}[pA;[Zk;_wQo8&]3c6|#($]xZ=3z(OɎH6S "n_k?{ilÄOޣx+mȗW Bgk,8LܵЅ(c9l%lUZYp ppBUC8g$`[.q`T< VfD~6CAZea<-l1^VF,zr׳/D"Y:wBe²&=Ycto {Mq/ ԰&r.HUjBCdW >aHhEC/,|i=U&q`9Dp$\afr3J̾[+Ŏ='ǒ"ή@5=&O$mn־v|W|p8qxs5$׹sÝcNx"ﱦϸ`EL喳=d~CvQᒧCe ~l{Z:/rΖ4mʹ2:4byE1XL =兌֯H ;heL ݅u yq|'6 '6E;w 8^Ҋ0 x o HM= '&_$⠲M٪bU<&'RCHN0USCR\KJ>ėEH(n p\0FVYHjl /vN $`Ԭ-{O6̩E\= JDX:s7gzbD}a:]OXE88rZ:KSnZ]k@v^v:/7/g;A9"CsIݠzmRۤv{dwszٮ/-ĉTv]@ ( tiZ4g%,\=U$ ߚ"*vӵ}f}kԓ$3vt(ģSuvR47AFh"A1l_+ _2_VryN\Wd߫#*iPY [QȾFIi iZRrǽr}"2|ê3/b 1cPy:R 1 +p4cPi:uGt]O P犕VGuƈf:"Yb~ z$t;ZEdreh1Pq5\0 q;q#x頚,Ͻ $V8%Ltddl9 7!S1+Ph!,2X1JҲy~tKbiiqG2w.X=C.,@#BXY  Q_?ó,QD1h$^JMDoIQ,,qACWA:C뺯e70k xۋNlh :Y<9qnsc8]QNiwUܩqE3" p:; ϨQEbPݖ6ほc}Y{\MCA0L^ʸJc% =uen.{>$e)Pm4"8.ZtUuc,W9*[yt0}2}x Ms !CL@rDKr44Ҳp]d=;yױP3 eFY&&ϦdYe&?qG½_cqPbpBa0.yT#/yķl!tDWwwF̉n=o#aXXD&E4ah\o->L[*9t}erqI8eTIϢhsɐ$x;X 7 Ӥ'Q,8 =&I,z䤽XQZS D,'6ϔσ8dw/_%+{"I$p29b12ѡ˞Ƃw)PKk:KT% 2ӎ{CGc7G=m|e#9f-cY;Si65W{H ]J&wMډldgIM``}*(l7mo`Hb߽0Cp.)q ӎׁRMIsBѳ|`x:+=YMhZ>2ߎsתw8;aP^tq {cNq//wgГ -ZeD[4<38DрlE\m+hz7=3AO6&eIT=ma,U{c,L N\mޖ"FcϺeѪ8z+58;gF/W1ë @~IЪ$=c^ ZwQpV"=m-JD;ZG. h\X˴/9 RT!i>Oމx`h,H z Bb46͎̞p] HNhy8Tke"(u2{!NAvs(B F&t*#l<1tkdAE!*0}Af1t5*F/WЩ)f٨9b'Ey9n'ჾHM8Jf~)sb;T2 ^d=%f u*ub'G)|aeUߕwXL? %%xS{]i<txml"ށgke5[Y^ D%TlBV1y&]ûMA/L#++|y>Ma>8]w0Mvg|ݩ]Sޣ:xbKoU|'VN6Նʈ y*xUt7JRLbpjXLj!%bBCPo^H< )䱻sMf3_砍qMDNCT#ćjs-MǖxSgH_&5_EҳP'̹_J%=Ԅ}'D!D|˽^\%TyDΛ~ڞެΆo?$$ď. zpNeskm$BT6/At j<޶"Y5ͪ ƃޘ,i\dxœx?C4hK16޻l C\PC/&=.rĝJ޾ 7V &(,w>aʳr`ְAx/wo.yR n@4l)92:j~;)m]#C 6.n&eF/Kݨf+D$dŊDID!3+E_$_Օ{/R{d~ 1֮f@'ALiEr=hfI=:jMt2A*Wh!gzίTh K*HV;%+ P}Bb$νLp ^{5@h ^Q&6zj~4!3~5e )[Kη% ZDX9XJj3+EW-#_Gq>-n/v7k3GK,PDŅ=Xb aBN%N/1˻%&YdEfwp똞 SIx ݲQeelLj׬8$F1+(iq%[m.WONƪG"oqkCPt2mWh[=E (5t֫d3Ѿdj"]koy{+>*M2 c{`0 ֒@gF+j{.Lнg^tg2-;uAux1ˍ\ɲWM:ZC '~y-/t@Zj۪(q{}` -U#SaλE:f8^>I8J-#7"w%$^(ec6\h w&0VDr.#zs['N' ۯMȺN&Dq_7cEA$$%KF|97N̳+SvB!s%!TuFLbc.V^ۆRVl'dWJhyYVPKmuA2-)E@2jnn^uוtagx;VnPAĽ 925lvc z9ډ{M]'V,VH *϶y-6"|~mV/)&|Md֨+ÆjvMX +My#;9ll<R1tn2g+hȊ7 ~я2բb]8ޮQ{ћdxh[c!#Li/z[[IHve 4v6O)z0<$UZc#D֮W'!%bɬJsa[Ua5|BmX<ofg7U6h5C@#/OEꢱཋ |!n> uVgz9gV28zs(,?<&ˆKg~60<*7Ww1 younٽxeMۊab)d9h҇ZY ss\kljÙB iUȐ'flݫjD[3m G=9CS*6EO3yJ:-tkznezRe&io˞(tL8BGgA-nAIFn2EhUs!6\ 2[8Qk m:W6ڞ[gp<",)@{NwYA~ˍhNmW?l20+[5MjZPT[=X} 4Z<>`G}"uI[XT{Pg3.Lz.zVBt%>^QEʱȈ|/l$Y>,yRїY-yqV\ n3( x4w幗XyKG7n,Z2zi=*V{ Ejvru2oT[<|4ױfзH<[ >o͸ T$JSWzB}[c: G"oqN* ZR(g)LhM:c9x@[ =(4yBҝ|z Sqa\slWA@2э0͡b-PѸ&:qz_fW6qP{y~^Q ۫y靍$axk`L'ߛRb;%c >e(Mz봃mo"w'J(݁V,}c_O⥶.+W(1XτhDfd{ȫ%h5_.f<\LOEnkoLIߎ\ڑ)aj^{]QW<E-@H'WQ!1Z>>J4|V>;$ZJ7Uo8Mm+ptXzT-3,+M^a[g؉Orf[|$[1vourd Tr*C/w8Ɓ KSm.Y1S(α(`#A4 ͜a5KFȦgץu6GN../3İ(yjjʋ#kH;pp{2Aܡ\ANrBU~Ro5 [2'Z)Rs/S{ qjg\dW?1 {pS:2ŨnZ2k{*Z:/i)zk  gtpo̮]^9 tk[lLL?w)RߢD="-=ըc45aJ:<<}7(jQi13#c<'བྷfռuy-ZF8~HOer < =Vy{j+7ԍO&x <Fyg"DyM >dّr0JhQV/#'h=9wSDLUux~kZO">1DB-~6^ lUPv5xZDg{]K*{c3%%\?tv:G'h#Or5YF!Sg ^qGM&Bv^Vc^Khh^g@񽨃0ק om L0u= z݈}Bk5 ]VT7 UꑈUdS|RgsDT Yǥ) 50a^kѸ{Z)e-bk1'РxqU>is<T5OM~ x<7 3hDy؀4'9aې0gLbԗj'v >tI-yXv(d$%B9D+hN ),jA/ȲIMF I\fW"9ZAN.rۊ+d`:3Wהwn-uP?ިY苘"2GX/g$HFtMnjgkP{!5WR.tø)AxKPH:֐ 01#{o(.b^LG7oj ?-U.l&i[ j=jc+5*wN4:.GHv_#J~ٓPOXqͫ_j1q1Ohȹ!D 5nTQ~Ej5&b0wѢۋ*\!إT4dQ BO:lbZRj e32 KyL3zfC?GE"OZl. Lny8PP'qC aT}+߰dY{(p)v5h." :bz z%ѼR!f(O#k&^oZ pf57%i1 1y.Ś㼨jj=m \m|Y,,OHphքh^f*ިoڨll~l7qI/,YDwK]N@'C(a xJzZ3\ea@0 s3 TT#Z HnUXGs튄Z-0L="+p+h#Z#{mz)^Bj/$y1C*C؈Bn"ciSܺrZjk\"Ez/-C '8'd)Nm*UQٙѬt]bT<}=w#yan[\FoVSvv#@{bvTB%>^wD=iƧ!y@ /ISwyޫ5&ʲ (FUE$ PNdy¦f)P>`m&^c 1@}kcB@r%qObY +vc{9Thj[G{#/ |~.ovf&x*c:1l )Ou4lP+1=(]ԓNG]u&&Bvgܯ!j50TEq+}W iE:8<6D{uM(d-FNBwxw<,JX) XaIҏdt ӤnDH2lVyŸGWu-:l/B3xn縈Bޖ#<~\Ba,q—oW7³1}xGkR19ǎ:spҏWwIb ~:Tzou 1pV6, ,g꘤OM Mm4K S{{]C䜹dG:Lؔ$PTFqEJq Yz9ZvK0)xi8R/#ħR^tjRv$#+"vhYC)mDZs|դz(^={5QxihBC+O(`8"[c{vYJmWc<,w[k(T'U%i~X_1vÑz)eY [@90$rVhk-NYq_;}{FZd<#]8AaZ,X{kQÑaHOY+ƸH3zE'7-8D9Jq m>mJVwhݳJ=;7Oh&%8`=+A&=0D$-%jL K{O(s(ɺ5kk򥞉t^HK_93[eEy~Ͱ>`, wR˩ ՀYoJݤ^;.KǾ&NdB5L,E+|i ْ5'ONj| a!K^|yϏ͵0[0065(ѣmvGsD{X2ɝBkLDs$Jٳg Qzs奄u|86qh8޾nD$޻=9]Eiu{=s:ؽ72Jh2˄,iʹIƀZF1?'L5leRܑ<{{ [|Cudiq!Sx9nx{ܡQt X}_ͳ4xs}q s@Uzcqo)? ~^O,Ju=ն{@;R=GN!Ut4xƟBX^C]aBRLwsw9AbB{l ꙾eMrWQ4V/aR}o-T7^vPxj!MP7d[e"X`* sQ|% >g/b 5ʱ_gԼ*_ j Az+kvqc8Ν}#Jr2,NH1=LDv*i|%3ʰ-I6 7 ^CBV-n |Ev5LDx.27%Mn<үnm@DUc@*jaԒ,@ńĦE?|>h*#Zp8S6s5;Q3S zLU*uC*/g=(x6:S c UU!Y;}Oް3ʔ tx!F/{/&cz-ےl4YA!8N х)AoG{x@)>Fc#{e3Z{QIA@G\&}]e`' _j(^^j3eyGTJ&Gpvm/zwoG:KhӃkʋWR݆GZ{SDV|AHjz a%e:=sS]9—;L .\Pݦ' GHzaSx>M$r 1(WjU ۸r§6%o!f_] GJ碱#߀;wʣ;dL&r1:Y3ǡezuן?ƙhţ [>xD*O_)fnxqZI9B@V AC5C 1`ɚUfLa=A:} EBS zZtr /=e"T/뤜דCM}Y: f蠰L`^#MXv'@8^9_A52Ǣ\!m\|ۖ M0+O \DiNͺfewǼD7ZZVr3!.CU\/ @\mhlA#PEQw:gbhA27_&~Ul#D~u05qPRqJp'ql֫8p3|'T-o'_bL]g6<%j=׏MwBId}-#c 2A!O`U"l_CB x'MƳm< @Mʨzy Ե/:H;9j8Z(Jo21̣dڎ_r}a ڼz~L8+:pۗAGwt"ΰn"raQ{.{',Þsr*GtRKue3DjF[j X[q_hTcyotѶIf-;aQdv6Juz;mv3BQUʺqXϲz1̠tX3>Fxπ LĒ'V@pI!H1ʶWe/ ˓l0\x4`Q0@9\[W-&@J\;̓7=|yZEpdJAU2<v޶oDNkFv0&a!lBJ\NA犖妁|k,z&D6@Dt乼ֻF}Ip oYނK5Ssz/Ls!ť(T+"F|!]IuYɡBB`AS |0*. ܓ< 0xǢ!/nΨ.n+{A_5 xE|/xN׽?Y.)ҳ J#F'GFR1IV4n,1=ŝSzObx5F; "ؙ8vʾ{F^3a2e^ {,'@I38'>{dF>QM-a; ri[jb8cNAѮbh܉3z8mw]LuV ݋S^ս/^NT!8 f˰drs5XmNExϲQf£& .b4e@P0mem?`.&Ź`XI뚨@ Zx^ h\W,1[ʇ^JS Ƣ {J,y"9 Mȗ!V]~ 5"dXD{xM >xOcbΓ%F ~OBS9S.6)L<z-qIxy `TƝX!B Q:Ծ|M6TnIkn)Ext=2۰}F\}'O7yZ!ͣ]$:3sz% 1-7UU5Rޮ㪠yfWG/lsdTPI!ُ lCnn.;rVI=#r7ycrs6 J6D'[ģ{%Z {h \-؅-w`ƭӇy>>;hxZ`VPe lX+ϴeKa;A@?7 Ol^;bx XmZӅʊUޫF)N,Y,^]\@w@<)\F-Q*1.`;1kƂQדB,cO1UERW9dMu f'2RAF\OΎu ;8 %HV" d']f7uL\$0$ڃ4 &b,a,ڛ&zQ$I&^8)`)8Zeo1B=a|޼vHK%]uBm좎h2 E )]ym *4U L M J5Cfb[`ͳQߋBE4?Uz0o[ WO/cWQ -%׫hMӡdJ!¼Nl}0͕BTmzrOxLu Sb3y to +˲JjpdbMHma)҆ (5N:+K49r9 t|pY{E8sw(Z[䞹ok K315{y ^?=(qc6p`(O4M?mЄ6iaA·Yyh*ce\(=.y #B)ihɕnץXg%luDMaeGMond-MYAGB]ąUẌ#X_.ct hgP/gݐrY--D=& Xd`@pHCd#ߦDn߳^8^{[c J"!ܦ5ӎa/Vl7#;Q#Tgx`^̾,nC.k3ChSS{noxQ7*=V˷A8=C/ev׋~Q$4D},Z{YJ&:,Uc5+}[%ͺ`:F!Z'ީ: yG?4'<&mq"g̠S{:nKq <(Tqn6NN 'lςR즓ȁUXWW|M$,PM=OZ%jIbWqN=ٵ:LHbn;=XDl]dPJϞٞsPR Jń|yuW'({}^`qhQ'$WJ <=ߖV=g/7 8Rk:ZPm[Fi|Ed%rhq+PvUJW=e&k*Y6%bH}BjC[&g!2Oegg{=;d^6| _p,YXX~%+KmsX OrTrNr8X{y7.iϵ8:l5)U2M'h^&:-iy*x&Xҋ߻:CZF뮀pr! cœ%1B}q'T;>ԃ@32:5P -ệՈ%PwbʎT!dǔ\@HqrAR߽z3܅%wؑlʩp݆A| iL&3ѸmQ61EAvoayR) nEC@z=IgktOF=ɻM}|+a[?ֳFarB̈́Q գujˤGo߬ޮE'ֱSɎ#tIc<.dM(j9swg!hsNA#7b$w4>[ra| /6#kڸ/H]am]պ2+#ж4xqo^J!\x@u*e)l pe9>\segkp&m]zdOҍ_49)/LtZn&v([$qלW:mܘ;?qxWTkK'\ҴNx6f*),|`xupWߊ? D(wB}ϵEp(DJ`Cw$5{%7N&L]B,g.Naz;rF0UaX Lt]DdVw%ggӪMp&blz.ƍA룣6H jl" lUbcUݩ--0nP<|tu)F*Pa~T>^p&iߕs13m.t}wtU>J8RݤB,(WMn`F0qء&3 k V-QyJ,<5rA<{hO.ګk2V1 nͲݗJw3h|ň+2B)w;еlӅ6{͙n Ҝ8i=~e!b*8U1 tO)>m!ka3Y4,IeSnn#).g)"$"Khs"ykKz1J.UI枢HCG&ߍbt03Yx rD{@uOQLZiF?- Ay`".SV)qQ2U@E:8 PǨAJܚ@i5y#" a֘{Ru*ϠtV o=:TZ(V&]$5}xfr-#wpYnd<*XT'4Hh`!Wq4lt~n -Cޔ;MviD#aq*?-LyHṼ.l{{D;{<2ElQC~|~/bfJaW==~RWl'Il6Ժ=չ;uw7Hg&4zyIOò&]01;!ڀD喛+ahnX'=,Z C(iZոK2T*FgN|&H2.z8LQ"Ьxo$FɑӣD8ry.๣yͳ dL7˺Se#*/|C~omb@!Z AF\׽3UT2jI!Bu4h_ KsZ  W}F!'l%F<@Gj5TkjUש{eCƧd-ڑ4.bxyv%O 3&EӚF1Wmp3%?J*7(hO $p"rjs94{ %AR2®]aN,k&]|(hD=>f/\5 nu!0]!utSadF J=rXo ,*Σ\hJ+l^>~Gk= ;]]5}_wǽ(=M}ׄޡ;{IB^ڽeB6ާvs [Y`P|n8.[ƾx(1~t[O:@;gー2qAKQ.gn)>Q'j#lf1ӓ٘'^P@MkBI.MTQZtp>P >ȀFs:U>" \nS XPZbzfyzte45]Ȥ6ҎS؆.09|iݝqyPBl:m0zƐ "iCJx>eT/4 bX^'ejQz+b.諤 !ս r#d-};'ko;r3>ϧP IEa?J'!n@U ¿ZB>->|)E3|Uu/p$DH/'%XADˎNVҥz&7y^몈<2 eɄTAvަD] y4+xISORa,wv_XygO 7A|Ż@Y: -}oVR)C ;R3{dg,q(W 'ld#CaWZ<}h2Q W7XaBH:seبmdl;I*\ĔoM0<\*w23x k k{to(c z l)sJ'/irVpWocz L.qeI-O^IgvyKO4Ȕxi9|y]_ŚpA]n;ع3K{\ży(X(e҉u4ݻ2^ 2#L͙0(G5oY'RP0E%` D0k"ٸwuUC69l sܤVqa84>tХ&46B MW ܟ&e頼00vۮf2:!Pg\q7/{->o MfeaUS6w|j㹨*>v Q )1K~m kl4H8 jeϷYp\ G7شcd q;3!9k` bt\rR?Q Q*'d ⯦E汿KΌ&w6Vʮ*AxLqkS޳v1mB*q:=!/yJ!fmG6HREʧڔNcF=GbW*/ә0iW B"T1*eu9т=C֋b3[tM1:םN x$v JgᮈiZ̓Y/G-ɯr.#&$N jҼih,X0)yYG"*e$X"pƹyav\͋ٺTs.[n{2Rϼ>էoVnIH-*4R~/8浵#nРPYn8#ZT6qSdU\(quŢў_>/m j%B'PO=9x\eyC|<57{1Aú.<N5uRk|X#5l ##C 繨5ɑu^H7FMdYͭ "tJ!!Kèf#/3.Z[N-Tm <#z+w;^^{&Rp#|^2$oxƘI͚4Tp1*\܈ijlC$W'ʁ^SxV7?wFM#zK w=:Tke;H.DMu'vL/2h,^_l!:Ys@kLjmw=΢IxdfF;Ntѵ*fF:H|ά5d1A2+@[8ܚ:{[h &L±zkR= _;U̅IRs>ϕm(J f &6oRY,)%-ѫy"OY=uyĠjvoh /Q+NZ2.8+?UH~f(VA b(9g+@Xvg47smcg57pkEzzޡ$~"OXo7x\y6I@C+Q!ڦG~N>"^h8hNrEl.$d]Yd1Ղ3\ծ}Z輦 .OҒyy ["o Յ<0K9K'w1j$et.~tDˣG>FEA9 ܴKy9_}6Ͻ/4YUG<)`(ػL2 E-\\7f@5 Й0YesE^ԡg̋Ap۬d*jZ&bƣy- &:ti9+9>%*tIЦc K9Zƒݱ^=7i4$o:GPiQ]TiHvirA 0GR-\04FIaq9K_yb@˗N]_>7$:>` :]h&}]^6R%iߔ/y5$\Fp"UYrpXܼy^MA҅iuvF69g^a ق3q/YK_KB1`6Ĉ{0V3 /Ø90{`Ax6oYT|WO"(O'z9!p}/oN_b+k(&[M!&bLw c;;AbsS&1 -ޖ#*=–^̶zR:5JN H9ϫ7SDpDIYtdtZ 1g@F ڈtܥjAAc#yljP덷B^Er9_A8_cKL8Z(]aRȻFSʟHڵ;J5Us)I ϡ|U$%'9:1Ax2B/,€-{)L{9/u)5ɗ3b6—}͂ř!I܀`uNaP`i0P^;Ȣ}{4YITn2blxFWl0_zRTXU4Ap#:P:@ M|:sno[_ |\C=1]rЗ=iF ⎘ !>zb|;dGa2rx#cn P"JCFMIjA c*y*TwnK=G2 QWVi虻85>7< ,_) VQ`+}Ϝ,[K]d5 ?W|&0Ǵ(Uqg6& kzA27=q4o xrݖ֛'vp;(a˖,}zlqgօ` eŘ85E{=Cռ^du䰨TPe |Ixl9RˏY|N<9^VZl.1$՛w)/xe =^UֶrSxPT tM.#sTn(s@&e/콢bgZXtK~^ C2@mMʥ Ŗ6!rЭF䄒B9̞qT#J8Q|v(Ӵq|d3u;zx1/9Xb>* @ET=bMi+Bp a<#Uԣ7Ԧikb̴Rzcjk%.;e)0MXKU"UTaFXbbln]X$dQFbiƎt3m38go&}Jg_uw\5 P[D|wzY/%m~M8rܞ.ALEj#N_kg^?uՍٶ3{/ 1v c ©_Q42r;Vb亮J&݃smUO`uՃ}d+jxN/HW?+K\+ohS/!}@CO`%$hg֞G%;4ݐh,2X+4kе݋W@`gg'`2cqp<à#jx+zquU"=%NFU,w-f2NOƋe1NX}b ՒRڪx0iCփ4r|1'q>ޔ\txK%w;>\لk XG\R;=TeHo ݺܫhˑݪTbsw^/ ]琗+Mrz,&T_f` Fk/5ArChx1<IV)e䍆:o89*n2qʰ񼽠 tBqΤ80lo1zha`ծ KxYyTb2(K*0+Wxd=q{i({ ,)yCkO^ϩjռjhCӚ1Ͱ<(t7by|W|ٯ5B*S|X9ذm39QkK NhM4'+)W@cY.}yO Q!:X:Cɋycc+=Hc>ɧvdYzCSA"J5뎱#|>)Z RbষZtav&5B-ʺʩzlhvH+ᐈwVl(uE?#C\6dv/2BƥŽG7(;Ј ,ֿ4F*,XfBA[ͱ Y%b߃Duhy SX Àת[6SY r>RoV=-^>6#kEC1gO| ed6_S`W%7\PH%0He: 3yhó~nJO|\Vj, Հt-#eWNҬ -602J}/j-K.AS{ ѭ f|ӝ\Zmu6gmug nDh~8fI|~hbdfvgO&%t^$!ԣ+TA׆49Ҟ"ۋ|4 4rje8S![ƾ &MqGb!5ذr5<#p9ޕg'aַn5JYQq`m fm8`;59DFs7cK$uO+,*E7Oqȩ\fj[2WzW 4T1Qy7A wy;Gf\w\!5b (A0 !+UGכQU6/n.q3= ]o|li1G'C"$-_yC#f h(,ZIΞX.ۢ=XY[KՈdahc IZVQ߀ &EnڣGM/p߆Ӯi!?@MigNOgM{LCوb[q {hb=o p9W[콫`ՐW *T:gJUM0qy@pUZ>RGv/J*o&F!0͊  ){Kr1Y"F>Av=Z~d”떆H*lu'.y߫ \r8+d~n2 2^%x>Egt%%C6`Wo_]H$X*<#ꢪ=ɮ$R ''ve/z9!?@)I8SO\.*y8ljC0A\6lxoKfh({Ӣ fRda*(/RB䞤DC= |Ho V_ -@P>p/0%^7wǠ+m?ؚ$\ђ[x䛁2^a]8!FbN ax ^u\U3Zz&'#T/'CgbCyF<~wL^JcWh} ^H^]Su%.0z39mug[Zi#ށtns j!̂VNC 4g8BRߥ5̫ }dUx)%` Xlxit,@PmqrV(>n^(\hI蓇CA8byWAV[4vT4ԏ7JBx,&[VV4: U4ȫێ(Rjs@TY=r-LyǏ=EZ2ZN CO$QEn|xΘiN-Oq' 5T[,Hō VJxr`b[Y*ƧD&" EP='Kϛ6rph"O^aлY%G>O^W(](5e/O⠣! e_BRƚJym?ĝI'Cnvp BpR =qvMoyCcwM-~ٌ Ů;k|7a}ƽe0m&j_h p,H'QX:%mU=+k~2 ytKjȥNCZ~71`\{U}ng6.v@qԖ>6ˮᨭ|Gz`WÞHXCK-:hRR 7Py5ol^\H)\!%u ^+A,]l" V- ?y#h:o߃OxIr+Eh羔i{A9HFdߚ!kKy CtR4(dG΀85J!n-AÍ.XopvSCAdF5d:w;TS؝N@42q246~['B|icjvVn[x Oyj7hv (m'E,Ժ0 w_m;BG1okM$lm:@lpgNCt3ܤ8!`St^LP/@9=\-X%*.z&xɣSV!ʕ4'e47Eƥ}![φqYm>rjK@qi5V}ήRKGg|EtvN +S%NH^쬇A-{HXaJSl#zx]<_ΥWنzyu%B肢SIVףqJ,t5K1~.T J;BN8"Ujp=Ӻ֩=*MH0R8 k  ۔g&PUS &TJ-<+ 1ʟ)S68<GQVש=@?#ȥRdj&W|v#<K1d] mU6*duEY7#ܵ/q;l$ !Ľ{h l X^\Ky䢛 XF Y|ޚPA>.=z.6P`?NU)۵f^+ 9L&m>^EÁFkŹo1 qJR:i `0@ C>ܴtW32^!=}khGYK #m gqa ͘ ڬ'O1N? Eixm!Me4sbAs!xjm8^uV!thE:B1=kLȁ}]u}zyXFzw B5~$O5XQv4vybȯo.(xIW056FT}I[bni| Yz: k1N*xv{㲇f{>(5EP:D3PsAn Z\̲EB{!CfzMa})Ɠn +EZd88iM3+i={rF4)pPHP}!(t;޶9}Aחuw%q(D 15M ?rCSyn(qr(X+$\y-\L-bhß܆iR2$b,3w"WjlKH ԣx\b-!?DAb}lw]=5ϖ"O[y/PqG;{!e\L Y(2>}L<j`n ayk yWgl%:=>򇇖QmuxD$=ruEMHdt-L+=A+'j%f+9"36lܰyk>M]%/Fxx+ ƫxs): qZMB9*/M=&qbYVE캠^|jMJx|zM_ہ_#efZlDhKNNUE}pTZaAS'7oU6ċ,N4?U1qӻcDr92 (enx&p63BM8(3@hՅ;|BngIIalzGq,Fa Q =ghUE)zОD$Z")KjN;^ eg޻iҹ߻g=JZb,  #2LAj%ӥD/L0lB!s/eQEGp,ߩ&.eFus =d/q7kA(s[{|[?¶GU+'6;mR2j$(^jh59B~*M5T'YM&)v(WVCv xy$ʶZ0<^Z{%qTx]8cqќ7F/3Wwasgh 9\"\T*ZK^Kqƞ'ȐE;+^4;b wׁq`4h1t9'Z!D.Pqp+b$ 6HvuqP5wof15+eaI>G M0A-;nRyz3V)<QCX_hUbyx5& j1+*-vtg}P3n 1ku9kW6Z_gH(3;l%9ZkYdf?6smʢ%sRondk2 M`57qڴz+mҊ2l `b:=/t]2j򈘕SGwLc<$;,\ّW G=&+kJ`7I! *lf.pK&rQ>IޑU d+{c- d'kӇIN]̄ r_k@p~IJR.G._y  ,Kq({Hna: ډ6d!ƁzcGdVkPJAE41o-Тa0 ֨ {{)y6 LKX3'|5\0A$rB^s!-jÏ{ݑ>=ED"Ó>%s ̴J<?dWᯫM;"4g1Nrs zW(1FO>?anrqۖ;Ŏ!T0C?lxy"h0@ǚ)YE*}]ݢґCfaB_j9Hk5|b˼ʝZRNڇt^?1}z2F(ƥ!O=FPk3z GÑ~bG 1cɶ!kq JJj* DQӑ9ŹdV.?8[P,Bx7@Z8Cn*uXbs+;Dnьi`nY:9yך 19`{{L 1gE+ #I*Cyin l^heU6K̀9`z)&&~$`^+WX[v >qMX\YɓhxoXZqxh*3 1e"@tPŨ!MEIO`ޓ 狪~qLP"T3Ow1a``M nMbC>X[G3ײEx:lj]*hs=NR9{.[Hhukh/!z,f|!K'R~!;jJ%vu9D?K~ :/^CeHaj"^ou%,`UyO'aٽT1!,圗τvb|4^jl& =Y]m&bsdMbr; $Ҵ{Pk 1=LRRi%VDZo; iǂ6omNY͔t7CniYtt6 xݫWc⥿|CxD[<EFgڒCw 0B+vR Y#6׶}8a.T47Ɲ >hM₁2ߤ6#&q%{DJo^*+2~J͢72I>=;7͍ڧ.E~@F'U`.nHɒ>yn&B//v:me,s= #Xfy^u}y=l,yuLJZQT>ĿCNɕ6ԕp ]#w<e,鎅$mS]~dBcR#OPD!^<+U0{m3^zfG3٢=ỳ6[,/|e&;T{5scyS#9LRJS)jM r.@qA- FSDnsҦ|n62U8y"fЏ<|wt؛{Eμ˽eZJI;#.B_PI+l1'>*u[Wӊ-J{j}-.rdW䏰hp-1@GB48#2x ;/! h;{ؒ_3McaI |ϸ#ϑQ$#׺g[6巶fM(@&,9򘆉v)OIKMU@VS^w4y׊zaAf9:To/5KZ1c4;k&쥘< LcެU#f>虾܊l9u 7%Eѷz0(HrtVG?ד:tNԬAMDmtNtr'8ha[< nQTjĈ<^-sGvBl=6wlBKO b}d[ 2vwm4Bu}@ ׻>Zָ4&yA[wUuu<<\jrVB8K `?G9{(_3t?>WqHD3,-IK:9Iήԣ1Ŭ(qLRpα^>Q9^kSm%*hP]wQXk{[Nb!=X|sM)yJخA.\`gH]UPe푔@Λ;!R2-bidҟu ]_ k&iQYU:b;'yʦ$LZ*$lk ~&WF맼Dgȯpmxw4_)p۵mYKyhZa13mΆ`s8Hǡת-"3֔Գ|DɺvKPuh(0 :p@p}~Fr+}"- 9k>HpZn]V\i1!U%(X1H[)>Íƍz (w0WU8>{c wU}%7UP8K5/2 |h-D|dJ'NP׫ϸ`Ψ_ciW>p}|afIr8v7^,zأכ}ʯ06{T(^>qi~eg52&W_ZqD0׀4W ;w'}x/P!m{<^smV]z/_ kP)?8 >  ≉HM .{I타H{rL6qNāF,1yѽI\sCX#^mJdC3y+jf ꞋQeaxp"CT~{a1rE~i3g"pd?I/H&^&tb:y3-IGNYH =WHۻJʙO)^LS ]Cq2[/&I vG]=8#7"D5ˌm!e1e=ỉkZ.ܻ 8=3`wWnEz j4B"F'l%{=,Lj/d1}74Dlϛ)z^.9ؚ=j3\ܒ9Z >KxIwWA}D4KJVBηU`ϵ! Cz5񐦺qIkl t[Iv}f-OAf{7H)[z2Հw$@_ E~q9Yܠ;J:bhHj ZTȕiཱིي헖q85Ă֎KCPAZxPdC+=ĕ#%9#V< ґӖWXq$v*ý$ [qOCE@O=,89i4z?e7W6x_i{0,j˹8ڻ}ݶ)j-,PDN#2"^XG+q㹑|\|;7K9|u|Ȃ/l<ѽډR-zL湖Ssk|=szOP Q/TMH :6j|rs.} 9hyCcUgbU&T%{)iB℞bm$qCdt H9@bMh?}1}$5/8v^fi+h\Uqk)tR⌖gqJw:=3-[pA}@wu3iR=M*XΠʭۋo8_$O25֊*t|^2~EGhS˩LYwĔnLyf 0F$ -ؕ6^Ys-2n^ 1 궝b}`D}Y9Wf{&zWd&ZaѥQq%DR B+W۬4J֠bT“ׯMF 9E6WY{X]†ON:3!,.8p*px\8~}^+آMWap"Lg'/T1y;k.Wvmv{@"%; _cLԩپ|j<-[9 Rj1-YnޔG/mSdM,{ڼ{:~PO`;:S#BPS1#W3QlGO Şɡ␥u{挊ϗYM݆k W T5P>(y,m3 y>hZu+yqCF2.M{:HE̎(NS{܊)2L< 73C\ċ5X `H+$12qZ=c:6I@07w¹* ^ѹ4f#yLuHp"8YM<dkV *>,S$@* Gf ۖ#}@V4e.䍧諈~uXX@.a߼]<*UЂkSjW*hp+l˘5bIXT wQn{9sLngI#`LOn$\;W`8Ix7Pyr9ހ<3@$IR#g>O:SER J9gnL !#צi&䢚{Ŝ)'I1:4@֛90,P4C:Iv|VZ3R󌉁11IYf`;b(UOUs'5yE]ڞzZSU̕u3) dfB@e,حlča 4juBs?PlCez |nD)2 wp،lOEG$hڑ:vy8/#ae$7_+YUG[?GhfqA͇Ǭ/01^{#\~|r"X$gM} gz26C3)Vb!2mϻ (,8ЊhX/6$&eƎ VĢݡVp;$Md3Dhk#U Y$~dݚi+|+/i539 WchAЂTf9phnH&X̨ܒš(-b{m.l؎LҶhYrs_Gl={sRe═2!iCk5KR0cPQxVN仉7F8fo$0LZ:/N=v{"I.㑾 \M;Nhze{f&v(/\<DS~R7 op]S{ upw‰^USW9.6rFLv7,gś0:đrjޘЙC! !`, ~*ڍ/]WBdqtG;nI,xK_̱6p(xܻ`cORmb'F2ku2SԅBN;Ue}lEIS/H۳zd>Jx2oQҗ+ 50ƚQzE#v8%T 9y1;F`V˵J*CŨǖ<`C&f)% м[1ΐHkw%Zi2Qΰ.:^L| 2%:8)B&ዶ }!l^Vw,lj+ XsVO6Ѫ!^vv>< BYiW\2g}/XcVy0B=EE*IIYEX&2{CU̅…![^5(jO֝ =C0 n2Yz٬@(Vvw@Tc]l=:GQ q' 1nBWꐊvo$-UEɲ"? GLTJ-_ղ2I QZDHcܮb$? D)!e6uKAV՘8ִ5@|o.sa|2 `_{'z!VNI g-C4XbCeUy "È`}zLy`Sl:-[utXi|V+4/ꢆMɢ`Æ)0eTV[zw_t?3FT&IBOۈN_|2^?>@H3&mgoy2A$@Kv7hkSG(2^"@sHXL\2=…N:  ?Ƞ&qeQ-W"&:PWnDa [)mxy5 pO3]C%jgS ;%Tˣjʭ~5>B A>ɬ=2Y_&GNSUyMﻓ" }گeeplO^yl\0O92VۆX Y^#L6{a^VΨ{o}v#1o60)_A+cG҈!yu=|k$XKMX"C= Ψ<~N:Ϧ93݋G jyoS T~|d@B,P+"ʾy%.awf pme+$kcE6}';32N~6v/TuO~ɷ&hsZ9޵ZJdl(fjL' E<]S =~q"`S|p{WpH[pS_\ -?hdXK"SuC`iZ#H1VJW3\ (2)=!?`i[A6zܝI01{"ow}JA(Xjss &M6{)/L7j{6I\T׃̌oC!ʀ$vS,ӔLAyBG,%0{c]|DQ8Er u ;T< -t4zkS8 xAx ehy[HF3GLv97E{-5D{\ڪ3ᥦ#GabffxR A.?'-kwhT6ں[Em"/''oRiNckDy#VX# v$! +t]};H@,jZYkX ϑq'zݐi_\Z!3Nl2'n }\Y}&X72 1^eGdNX 9KTRޫg`k%J"KgWz--x8p8xkoвt(IŃܜ5Autf:-*{K;Ok|,foJY;1D43ŽR똵: &sK=mMuz:83=%ԳHCk 3n̨.SWyW@jzBǐ.Oվ=ٲ&2y6"Zt$bMT;ͥ[ 47HK2,0`Jʳ"51oī(ʪy.\`jI({ه$WTB\KbkIj‘|<0DDmd oӯNK[*WϻSZ(&Dt~T*M t?`1f1D3)tsAk ~?ϚzfU@$enAu5qzޣ<px2iRg}/ [S2&PWK- # _ ԃ"0 |TBxͬgXQ=G ('K#X:pIi Qx-1&\6Ņ9-tJ%:)̌%JJOWH=X_Y ykFh.h$NGcZܬk o+yY Fn ުXؖrFܘ}/aޖjEqh.1OiT\r]W븈&WxF%xjxXoa}KM,;KfyJlѳ Uw9V3 {e9c0l;|W-N-an1_HWM^D>O7!OJa(;&+yB(Od+ڱ6E+=yrf4{vDlp)o@'8Ot+[NGbZlPKEpWd|ـv Ro8׍H|eXoAt;ܸ <_daKu@O8#ތkcfgbWz(43\-ﲾvxb~yB4\y /,S[sz"j0>EOt { D`J51$_ amtp#}+.&QwEvL$GL , ԳbG7,"8>GPlDOxyز(,kY U˥n9@Zd5J4Sɸ ̺z𙽗fa8l3 PqY| T3/Ћ< ZY,&7^~^Q c[+q\ZQxOM9/m֌6 3X.̵ްuL޻u( -`1=c2 uHU yTO"8Xo.pF{TU"5i5=A7𝘯 X\pe퍳֑+YbG qk=4S-y|3AΖbS݀\Ix*~$:B(Z[H~RӅ4ܴO.᭱Σk XRLGkZy$oFgvJϜy5f?xV+vn{Wfё= u!0*2k, ]D[ zʣ+ f?`%{Y^}ŋ# [ߡy}:=ZYC[-63D ̝@LS4{.)pD1܆slҔB@c#m0r`o4 1C4ԪæV4 3)ԸDDt'Wp+ׇ$)MOwDnϔm/u)Qͨ\ѫ3c;z̵@*tFN&7gRFQ/x/6q!oP-K8t9:13]3r ^4V`wy$ $Γ@Ygok%oDg t{lBs8&95ݠ(N_xe3w 9 ad5mI(<jr{I-QH%6y9풬"'RrqDUÒ|5ntg(DP 977G ʭ=|6ɌΕK2xj)Ů{Vo4b#)!}0b J81 Y1I7CYy3zo1 LwSٻYz.MgMR[kB+ ;f}W M;:O &f-Jb\-j 6zh`rE^AIkɺfXx!iO=GfzD({Ce'0VFPo<ى &%Wz*}Bnz],;* On{1MydJNyOն/B8;UNsָHW-g Dh^ȍ3P*xa'X9_Ҹ@l SI*uǃ#=t eKUrE/nYe,a+gO1xjrODm ))WÇqB[%z ~(]t;KA>4^-Ӓܰ౨7s3(8|hD|\#1bQLA4D{h40+a.{_=B3zb⶯a4ʸZI'#aDЪY,,oI-##$L8܇뺓ճ=iv|e|lwl((JGɔ-͏% %DajfӃb,}y=“nγ DP^:l.0!|f ˕i]5Oޝe^aM7ÍDntzdD0|u +̦%/iL 9zQ :eI.H|f0oQ8 u@֌lpނ,@fYɁeU\z6M'Sv^x3z1`R)kLl(SȠ Id^<}OėB{ݚpt|I"r/&8 ]չF6+=D=8ձ]c!%Z ,U*CpЫ. wl24i\*>;3X}%Ih*tx0[0yy3>,Z0M5O5Y_- v#,=-N &&ug#X.W:ݒ{g|ovKk^Έ<>ImzC(nCp m*b`v+fYgEVFá{8Ae DűG\.}%ZlR]\3·%]O7J7j asv/m][xyLnデ7u*Œ;CX heaV ҞY%NQE|tmH(rh^Bjy CM&I5VG!ZONdž__qϴ2洁 &M-fBvqaYJaGvF*QTk\_ $dJ$f86u{G(F2 o*/9q[Cd8 :f{PYkE*[}W !jpO=IUa!cOE2T%G cGG^h#=u6%@u[V؈x `]@:Xm)ᨙy@mX)$ʻƨҁCxxh<ͥfwxg">Yp0y|֪evIRCK]PPnn4wt&ow)^FPz xl4b0b)7Y<3oBs/^[^zV/}{OaWV >!$`J{=XѺg.q=fD;#lBcp$*[1(2m~6+ :y(3+ ̛+K|::}&ͻc﹆"8>x|Xo(B<:fF$hCF4&@{L/fe !e O.y3"6 BSV=J0*%mPI1~z>6 ==wV_+4SչQ#3l"2$EmC6PGpz>( Īh](F mŋz3譃Sz!G$ Rn3o ``e D[&!:@Gb]G c@ sNrV`0Aqzn:0ɛN~DZ#JT3ޗ9_戁ˍ-2f!C+z\G_ꜻ%K+g%$\{gYPǦ +Oh!q`R iRU#)lyb.I)~̯qs"9M t' 2['V}$ކbs^ԕ܃tlro&LYҹ2<-:W a) |ޓ[ ,w̟kd{e}3o %y(xiE4mU0Xh a>G(/f`{s^Q*Ou[CeͶW5+-h;y1ސkC{{PӅOBTtC IOQiY x > t_@FJ4%]ܘ:6J]Qr 1n <慨1 lU#اro!-ucgUprīOB.Y܄pAn< |&:b1ax|ia:#M/ Tǔ$=zČ6JM Dݪʾc-GGbZ+{Os tg $ }m =Jݥֿ`[)[`z$ZeKb5:Tmxc -_CT89mզ:1 n f=y-d5R9Mp3PFl{IJLPFmi{'4(Q-C(8*SR+Vsx(̀pnË|L$vhoVm*@u [Ir{'DcX[?.i(Mm+āA:tu#wʧQb '='mNuAVeȻ.(\9JMP!ss޽7K3H8X.T41$J[5]{4'*9ު7O =*~3) o5[9=GqyeZdj+ Y.!I_<0ؗ!&ܱM˄t? ߊWdx'Gޖ~^{"c0"fv ɶ{Bxy"nU6Fr]i#%p͇<)Oty "O}\ޔ{_+Rg uWqt* cwFn0嬽4[ij`M)6 `Cl$7d YOV\օDZ2x#oRA94r9zݦ )c(Vzkxpv{=<.qr=m}^ai;Z.!T~ 0qiTkbAx!5`'`ⵏ]K6'VjnY9?~ujclGSmG{KHةx 7CagɉG o: L:LMjt$X6xnS[j.:y".SQ`[pvɝyNZ/-([w:&2% c*`c=f̀EĖ4s*QK-H XWQw/<>ҧ"!fjp33=tǿjgW;ظRvvIaBbR;#TF3=^ _!(GF")u9 m*B8LՖ_*B:ΑBn (OV m/E_<X9Nhp"#޻,áE. %{&H]91[tKʡ(M,zIF4t y5yFy2ZlU1D.>}&J"y4*Lea]`f63UaՙB*SsJhv*Ve8R{Lkfg̲qXOtVlT,zϻonGs" [ :3W†wYMv02Zs%B\i^hUkc8 ]PJ{ (nw:qyd|`@,t+cv$IH dqϒu:X5d>*՘aq>}-C*z/EV.Wb*<`ƽ2[71QIZFd5G[G<6%}N>_\f'd @O6ǏlD_<J#v/cZeešCRMvuY >n7g Ҵ05ŰmAWtC(P n<\eYNS!+dϪ瓒8vKԁTa]e/<(\Y+?bn?y.;@Nζi%Cҫ #  _5V c^M΀] PxD/(4ߌ 5h<v3ZMA:y/O˗{׉)05oıBo]-w|qf&jCE`:_]<ŗw29aJ`ֹI [ي#:E3BN4ᙻfo(T"mE[^͗؞$^QH}>nǂڏ5qVY޽Nj9f=Z,~(v5$\+ KqW3K0 H0n|5ROl牅[{;,ed+ o!/k+D37땵E!7%Wφ7%n >~zedn2Mglw"ѧȘEd`z|T0~fT'.틑ڌ]O-žDS3=yfZ"D_Dff_X YWƆBҼF\K͡gn|P'Gz6^[yJ"b o&c"U e8qI0ü p%>n7~ *t'Om1ɂoݡBM- xEQ&:Q0*^CAq #:$d$j6V*'.-?O{R 4Ӏ@ǥ$Ap#)D+yҒO\xw}N#=,(rpJu;|yom8ź$`|SZn 3֥L)VydLneQ$;&/dfeA SKtu/n995AkQkD6_ ՛ǕC#\*꙲djX,+ AW%zDπP6h76 +ѪeFG`hhUNab>enL75[Zz uStcE0|sRnd6ڮ@t}_f/>mDL FЍCepo'nֹ|dsF0<J׋we?Luӎ絙j]vy\)SwaPgD$:8 _nU"Y؜-r$YN1.V(\҉Fձ1H6>u_'݋z'=ٽr0*hJkNP>nGx$)b&$D0v55ySp`wO2Ɋw7#ToO=PHe:f!V'%}@B: |ET9IINw:m *9{/vH&$:6wf쬅(y:m.h΋oK!+-]2@t~@~(t,y {h ARj*owuvaclWwJ-Jf`{1o\@Ԃ!N Yh@-r!<#>z] dM9ϣ\]Py3};Z1} mL}:{^<2MƵ ;ˣ=^mFq;w1=DƖ飳VmdMGs|o^?3My7g` $3"rg$PC9wʃ HsQGM3 :C9L?ɮ8Y(3@!PΆ޹v5F(d_{\+A:;wRanj^x#M)ׅsV37W|[ɴ]MHci%e4ھT10q@.DAң_zeXҲ@&B65{ڥhuȎW=0L?ԣ5v0 V\X ȍVH*n!/躭f!`zl7ѯid6.leJq|m2t*Ő7E"O x,pY.`6aYGZok31DuV3SqUɤI,B V(<z XϱL4%r"6Z+EmP7-!]?xD .i΍ KW q4|\wizl}"^@N–Ji^Z1WM5b~05#Cӳ-8̮c.*^pus3lN4PӰդy/ƥXhClAc61p-xpC:K" Cg@!ZdoS\YX"bFqԴmC<58b#4dΙZZ7? rRIg `-BPFi{"!et{GqKQ()u*3m0l>X/<*wdpE)7Dc8\&@;::!SRXzD_a2`aׯ|%-̙,$_G$<ל87t="B3.űmW2y{.H#2NSk*HTeoFf4 ވ(.` fʶYtJ.807!^DE ZO/'98;ԧi~O{3vЈUgs,ף |]c\Q_23ߪ.mވւ8!Ly ~ /Ki<QB{atLYB:2^+_y69)UƈE'nC-o4DPYdvv!Jc[3|t@mdyeV3JYuF#a;jM*R\!t`iT|W cCк3DǸEA-X;kܳTc}FܝJmWm4;k {)iڴ:7I*&jq0_x 8`Bތ)M*M'Mza@Bz_}Yt(Ml-`AE1mhJ|NiI9yѼB.~snG_#_K1؜wĥBAhHVD#$@oP.6 sWtKp3+/ݼ&c)KR}SOV_J>F yǭWg0eV0ZպDK( 5\ضhKc*4e\_b{6zvR0aF¥üb[eADVi$-MͶ ayZG6|Q{Fo@aTt˻ Q;5v…G)1| Yn4಼4^\|nZL20Ɣ: iXn`豔w.'D OTxMe͋dp7&&u*~֏=v2=Eh51R9aՙYǷ=~< Mw c^棳%:L{o^/ƔsE}׫~˧8n)| z×FEӷqTzm lʶ"RzvI3_䕺ˣgd^[KC*XxCG.G1b^>JoQ6LQk-A(%~ǧ߼M6W$Uڗ$tutk Ŷ,S #wD_+9j7"PYk|UO+¸D>s84+ h jd=_7iXPD1ۺ+݀,ިCƩ-#y Iv2^utT ݱK!99(p4Z,?ZW`i (zU(X,֞|TrHQ.qSBּ=u7̜WTͥ52l[2RLb́,<{vd©z#LD!Ai8kֶ^ ʲ0ךUs-p'QԀh5U澰Nd!#C89gF٭uyva՝챥'J^.?١&Sw0mZ}6znj2kAݻxhomfi`eyz/s6B"n% HETXųK~N3Kj$Y 2\SCa8fy l{&qΔl{lAcΏM 5:3,#Ć~JJ.*RWWbC()Lu9#Dy1,=7j@+DBng8Ui83 Y=xw9Yˆs UW).Z’>旮hѼ+)؋z U=W/J)bfYSNq K:ƚo6?4}W9E ñÍ5Lg78֕T|NVZBk!AVH'@a ]C#,h4qպK*ZM"n(g^]s!<s.I047޼n"sO`0,>GIa/BDԡU.e׺ R&|GIy3^ icU:5z #Ypgfk|}x ɵxCVն)BEm-e_[7#5{$DKaʠB;}ͻ2`^9ǃ:Cμ)RzPN9Nn#1Y=!p$X <{Š=dߣ[t)2x.ݨ1 a{$Əb 6˖|d4)VU&2[t}ʥR$FZpLN]4h6k:X;0 WOi 0ρ Nh{SmD*t_&j:uyF})hȃM`{ӻJ]bC.q=rw8: [c(bk.+̚3 kd/.UX}*;ŁGUQ$ϕs}}ċr_iC(]U1d(ucZyXB>`x,Χޱ6d_>86@OwӼ-S3rk5B*ܔZR"j"5Kg{ oiu>|HA [ 3e"E C'i[>ƪ~<ߖJ[R.R W6gfGr3/* vu䑢~RxunZgJډ{#,=Ҕ:SA+7m6aˌL$iZ"QD:fWX2җJ[=<9";a4&LjH;}&ƽNI&|:]Z<<ńY/ٔm̃ OѤ3J[oX31.pMf%&2<ϩn\EJbUe}|Dؓ w1њ;wp:f}nVo*Z^ {mҋ"9,MbOF3  %޹]hk^-o8CI8^>/+ӬGm5Fǽ\4mÆp s7 #01,=$ X䱔PUqNI8Z#)U(2}kAn,k^t Vކj^pǖɚtbHQ̸OvIRI* Be^k:b6~NDLlSL :;wX2Đ.kpAls½9px5oMBVw^zkyc9年G{uqԡF%ehQ5 ?TtD0%̧a"fZamu;niӓ_.|dYH۔xrJ%|Ug{|tsG^_ f-yd60pSrW}+ z WgzM/KK{׎-YU#Ypy 1K 3M 8 hsDnH6\K!ZhlR8}hBB#eH I!֎HcnŭGbYztH vK>J!NMg~]3~cb>(I|#eռE-n.uVPvfݪJw-͉y$V{XiŽO-vCd>&0}]~@[۠t4ޣnWpnߨ3u',}ƣ췜~oVNM}3|cAq[]wPX& lֺ ؖMw-2Cf>}(wHL= hok2&Q. B)U wPdIa4-ڈ\h7)=Ծ[/epaB/.E8|` co48 Am1 6=QB+з2L>djQ?)+_os 8VWVMej/3L9J;:G@vUe%I5nӅ=^C$M''~@dϴerBP=BD2o5ywpMe}AO)G@Qh0rM ~PN"2yc4 P#ᣄCiBDO8e<0Āk uP,𾧳ltOoy^9n gmi&[tƇu7d}bs[ UWx* ڛkU*]ۨ8#ܻ.]5K=Sr5JxuY`tyD\&iIlɼeN+Tf{/9Oq̼yNq?7LTDf>bQć-9Xs w~={ݔ5u7UOBw3! m\Td=nծ%}kLp54PF{fԽ-sP$G=š^/~n6 lG![-хЅ 0ȠqnNSkty"1N3kۛDk~?cdcӺaS;=mlS0E 1/Cקf`nL:BFӼ268R4Qz3K@ҵR3h4Ԙ7#Ħ}`fʯҳ山ޱBPPprG |#p)U1mM%+=Pg^2+i{!ytRX-mAy$8HPrhps^`Q `q8}/Y#>kXHL{^`KnǾy+kr|5fd8Xy\V=,{ (42u2XpM Xi>YSr5XQ"ScREF)~SCKxKN`Noå7=lWPIh)"6/n]>+0|- { oSZn]R3B& |[t P:3oܴB,YgOn-^ӪTㄨab~oAtq5-]ox]Omdn\1.PGh[:B^?! kY{StU%@2W)0jp=8;b"xl2KݳElM,V đ1dA Q+GɜTgU%:>8DKrSH2E+5{e=X#=9hD]R3&dD4zYٛKV|S  )AL1THw\h/UV*>z.$ЧAb&c<|tHo|I=H.۸rY ׁdV? |'m_L|F a/ģ';A6@Us0 8dE`qpSփ:BH{[Uݷ{:8<}v(x8wRGFBb j,rLPgDUܒQ47lB}Jz{dݭ9 #,sRvBW]i> >(ObFu$ @@;k3՗cV=}ܙ3>DTRw֤]`!ƠkBE,k/ R= \\R$ &(4dy/ ̖O+psV#IٷT^$"[de$$*Vnߨ]pm>XbcLn1Qp& Lȉ.߫a :"W!9'1'!omSe1_߉|9V.أ7wf<ǜȹg`3D>G ~ ˇBh)D4N̠RY{Tw)hž+f"i";JƆeL."!ktŌK]Y2AgG{T; Qx<!RF|zʗ :DLK, ŢS/&'{olu]wDžu9X5hDNƒͺ\uJd ^d7>x-MJQJ)͠6tb npH7>)wDO'+.o)H,'!їA\j0c4Yz$z.ģb&bcԇH|{м9 o,{"%F }}=Yn-zGŠaGa[`#HyjtZ^d|$jys/{RF Ao';`DIN ,meytŤ' 3V~Kc(9KsRO4G4P_B,ɈK\ K^;#!ճz̢@e4qgcUp?zF2B3v:"(؆ |\.z"D43,?9>xQO0)KtVr{k,n %JmkQr%t>񃬧b[0oqP( N, =4] ` 3{6G%H`ԑXXZ%ZC2-@GX[\K}Vh /LBf$8dK飞]tϙ p؃s6ҧ\QEU9u5?ʓF'."JQr#565J #`s^Lhg4ԅ&ss'6%1c}o,n O9fcfʸv7 AH_)xˡdJ7ݕ-Fj؄ p')508 δPVXKhVϴ M?-D9!|:i z(eg=x.}1kUѨKGZZr&ZNJ34dTjBHAh@z9i8n (.GVE"xaz,HAv)2WS'4s|j=(@ud/n1嵋sHpVᥙ#V͘j)rF0v*s s16_̫}1G݂bSz@#ի (cǴ]cSNn feAXȬ3?+=.&b-j1XVQX5UPKR*9鹦J`N=WvG>$V ޗl_;]؛y(0&>$ ԛTl͕E#_}Гl`5U1U(CƝ >&0PgK+a0ny GR-N斾w{]^3 {0c4Kx OL#QH(6fVEޅ z[/ i<rd}kS<9VuIv͗z9mH,S.a̖j~j_ZEF-?W#怲#hu+3͊{~ol(J+D*خNWIÓ*sj`b]=4kwE{ Nݝ^>_ Hqs3IWʃo6%snxUIa~GҎRr gC<# ks\F~rSE@'c x' 3?WL)O'8P"ݍQ^˗.főwb5^[P\bK ԗUa|OΟby'֛r cU{jPZZ[Q8Ín,A+PE8"+ysS7\ ˫x50&{[D9![WՏamԇy &Q#0ʿj DSo}nZuu ޴:5{#,cB7qu|J ,0U9єpX5:!nU3 JZ",B,7z.*eDqcX۫lݳ._)L>Rѻqs|{/)+QJeXQ䊯hO*[<4`\iA1VɀB9j 2Ph@<2x(d(tewtu1)G<'&lzN&ZBH^ rUhG✰FeGkÈhTs y"k.5)rWA42n6xpC*a5zf嵼nZV ;zVS63#lgٞTI7' ۛwՕ 9XHl0RVL"=c\(1 _ՖP8:GbZ!/ȘjzWj=" 4A>0~,2"ҕ >;v/P5Eۈ§tJE%X$uj 5BeR'eM L2cvbRk\+@ @ rk6p(Y-j`udXwc'uGJҕtV8}tE]ݓ?TK/19sv v@$v]gu"Y`v*pGBM2D!ht%Pޣ2eU˕n6J광SWLEV4Y.)ͦ\QKى9/+5( jQd[g6FHP(Ҿ!;fh@{3Zމ{-?׈8du= Ezw4T̼4ڎ'bdiEF&N7&8(w_b-%&]@Mx}^ ; Kps;c L.HAR _}M&LL|}K_^/$R}Ú#L[~+MU@2lD}vڔO9CH>E}]ofEe k? Dh1{ &*{/KޛR7œ~6tA]4=DG1)q{vR `oKۢ2˰d6Ze@.*RjiTxjߕ[v.it*O8p s uG(ȼR+AGEe\)3ttg܅}*2Ut;[w ʽ`ۥw[-괪 Nκ3;.#9i!jL8zVg\r-B%>0(AQ xt 7 >ZL=%Jd#8Tɱ~29"k bVD'&iz=pOY$Ih}h \P1#c(glexqg3XK,>x;o={1xuWXDl<ڈO(@:oK8e!5DxdEAq=0 /gTaR`^x_3c]2z:"/EyLn6Zkk jBv-[F`q"$o\J?ח$jpb{}\_r1jIOm<˺F6t}1 I8lrI[>+oWJKqK=E&v20eƫC,"&4C {׭IMzYD>YťsHD)f[j1H5V_m[XWf'<:XEti a#-6ptyM6A4semj xе9~uvm\ )Wn.tY)Tf&Hf \l¥`dRd^1t\:{w-B Sh`1N9̹; m =B31=faڃk8Bϔ _K9ע]ryh!I'LI[+ z]תϔ\[Y6:Iȟ<}Nxַ9\k$50\i9i| ڻqxRz2F>|;`oj رpFjg7<,rdJxZкᯟM =wgړRMkz^v,C',8ZJgIbUN95nخͅ"@o[ z&kKF8͇Wh(xÐ!Rؐ=z6<\>rw/wP$ƭ}\\ sdz k(dq0n V_"v|!V'̆v_!u=𩅗ї^j TiczN/wkҔ>]􇊠:MKh9!³9cG؝/9+k yMz.+nʾ䍉2ӳ@& \s, JlW@d)Cݨt}kaXeDcSKXhoU-/n^-AC~B0bz TϣFn0:5QPVn{SM=pcA57 !a Mw  [}_R)tχg4bp,L(2SS$ua% '{B-O2@} #tQ?zIyȮt[ 4t.}dQ>(o]x0!VoU ;BjY?mAJ |c ݮVm;*a@X}".oy֓קloTHO!GG4clPZ63QOA{k'1z缗,\ .2,>"=C@đ ql4;,{gogq񾔉jUp]22Gjh¤G؜ 1XUA6I#,sc!&l(ӭl-[5P3XE.';LܰJ%ý;EANYb hi6]IQyWnF+ 鷝OhLWBM` %2orC zR bX K--b"=f75? ѭ1mIFڝxOGX?eZg+|[3 :fʶzL'bTvEB$myU10:?'rojWߎf#dLOTdGļDy5Z L z2g9a͙㻍mPNyRyVkwaY !H66y}=иE=}5MKGSC8h_ 'gmaN^T<7|2϶Ƽ/CeJAi骝-D,=eMKv2jyˑz z\ k'HV'۝,HT.ޅ8,2qf#, |@A eO QV:{ 4ֺ֋tDc;Xvgq,1w-@2(SDGE^͞FRyC4̓..kZh$^^}E O?=m —\bНD潩(ΐ>zQ2/g`Ϲ1Z^ajȃ)ȗbgMl>CZ9,p;JF1=ʹ6-}"揃b^]<,ч,&NX/-P HjYmM-D <[5e\_BV:j6ת\U{lSל4?׈&EZ`Y#Q>= ˚K72c/Nck4EQEvwJ0z]b-;Fr:0K@s,P$f6$Iּwf®vN!l}O*rU<j(0!Ƅ-V;c:E}ڨg'"]ned. %zCйWlhOԐThl"TE-f>Vd&`}[cM:m7 !\R}U2=d4.ЫhM%ӂyYhe̔P?Jky1/6r VMuSZ< 5{m+syR27-*՞jIcp#YdNum,8#pt N+V/oɇ~ЪB &8_!> í+G]~Ѐ"82gR$f)d7B&ًڊ/"4_=HN4,\<\RXzoE^ץY$uih|QOY_i.2:%N 2`l;ʋʠEҗWir7`o"2 %uup2W{]IL\Or %] vsF&y&%=t&St%b߀խ͹{ti62'-j1li5K2/֋/7@fÎ#vcqZ2e +ngy \R$^ޑcLx>OsUIW Oއ\yHB+2څԪ7$;.wFofl̉a>.R"xɂUd4m6pܰQ4cYWE vxF|l"j =Ё'& #G&TTF$FBFƧeXN t80/C8&Rt RN]iT]* GSX7 HyiE<)hb~;J"3w'{P2JQi 4зH EUB0JH8Qt^x-F-kW܀GoE'OqrNFFvYQ8o<[q{9i'1YF@/Hڻ /*`]ыE4)jq#\H ryBlRꎒ/>-e nkDlhU>8M)K ۏߝyÖ">K>߬n|a%(OA^?ճ}{l:Lsְ'(!LT4*|I&`&m}iU5>”w뷓݁hqw$q½,TȈ5␊+"1xjͱ jt4e(q ;鈦=&$CYN[=յB&ل珟yôQV{"AҥoX敯(o> Rveľd4 AX17aAR.! 1hdyI?VTUŨyY$»w6*K7^na㌇-ϠS9kM$^&d?mW3exd&'   DbMg;B}qѤI/&|0`FlpA0Y[ #:;jχ*|MBoJn-8ɜ&C)l1pURu8ɠxON`އ[ϖ){fBΊ^)O33 {~{vҙ]p3RUL`׌H!xK݄h8j1I3CĖW`Z-&#KV)U~EA;Ni({w8m֯_vHu8ݛM&5=.GwIvNwp'Uܻ y2|!1y oT&C&q-:2ɑgѢ-^+ GDKEY35by25w@Q_C^ zdB^;N$Bu~ 12sb8h"ks2LSB׾Nz/qd+(_E=0ִV\gyLr)S=s;\V $%֩&l%X-q> .M/7LUetKrlľrbu{@.JcqʏMStJ8{%\lD_m k ),SO(њB{@Wu\q!l={x x۴_)}ohw.vxk9uVd;0$ϕY9]h6xjX)uij\S'Seڔ͊xSgZr=4o.WjP JU=Y@j$$Ыp K(<|܍KBП#;d2֠u)C6"xw*ɫwQ c8RN"ٗTM-^$.S7=Q}ZGZiE:Vpo=*'0[:AJ6v ϯ7D\Fq/KZ1&$ x Ygֻ1[j#1#'ͦ #BF| vv]:,u7P%(y|{$qHGf5raY d&Y\3uTb@\ԫu+,+B#@{:'$[i!:}1UmKB{;l Lv+D2Aȫ, b|$i\ BCb?2xeO0`Xkd8N zrcseBF7\JOU&۰KV%ZK>}dd RGj\UcB$Mʻ}L`2X6Q vG ԯgJThBxrݻ>^t2Y4GhM}7z %nJ;L 3œ'g6 1A$c>.rkW^j  &u:r-Mb钎2~W:@SFBpH OtwkӔƀH*Qx,i%۳%*᫈ݬgj&J"+QiΉDς $CVtxDž[[Uiܣ0s䟪j5g;Tv wٻjϧGt _`5$X5WcS1xa>^G ~= NKgj6,$_׮P(x^=r-Q7{ՊvlCʒ鳂ɋt0qobFRf)ALք'W#II;@} &Zɹ]`- 8π)k͂O]4\GULkqv;F@ӌzܬ<&~"P/gI@W7hxZDE8fl3 ;יW¸z K*_ö#[e=d0Q,PbT7:kVHNNLf۪}eET/@G yr5{&[1S\@3t*%ii)G٦"^y xjCH !*|^ s ٪g9q k>]۝J|M۪ {ombJϤ{IӅWliy Fn>T?fⷧ9^OZgܨӛLJ":!;L i%%T-LtJ@^ $ ߑʉ0kIZ?tBlV.IlIG:&2[:K,G1`t "=ޝXwA}PYA `KȔ[qKz>å{Qw)owQ:ic',QI' ,7O7=o) ,z}IOtdf\.En Ѡ&5x \ƪ0ųb?M{mi?X~5ρD34ֱlc1J2S~W.c\t J<Z\`,LHM!BO]ל"E[TIś茳]ݓWE"2m&)qҎÞ2]B* o%x0y` VB)$E>&|%\ q(nRp+,Ѐ=WDREx;$ V1@o|2qDpG~{3#]Cxc#u 9`s* D\0&f*An]/gr78ᘷrSLcOS>C3#87%5wV/7{9҈]dP)hO#ueS&chƮEO WY^.BvЖcN zѲ1l'ϽԌ'/Oe2VqHǙK {9Oʾl ,[1ڛr`13(5U2sؚr2jI ^qhp-Du]Р= w=$)mj5qldbםQcy"fbRD{,~0.;6EI'ʅ$O]cbxYI,q#wWuWec]@ŀP\e@XYMLi40 hl&•Qj{~T|nnũ7NC +7o|4|e'lL=̪QLM'X]3Uoplם2becv7 <~~fD#"I;[ iޖ[5$1(?wAJ<կOD";N498d? Qe2.Zpu{&rllqOdB!DHtE%cl#"l[ХV{:N"_[6(yݧvɑIFD0rr^@yq?$yFѾ .~5I\^#;tH{[˝C%}Djm*ޭ38 Doa35m^$n/c^u'?Lȝ +6J^gB1)ҙDH 'ӫ+j)H;axq*(-oqe#fN~Tu1 [~_f-ϫ0eVdӃ맍3rQ>{#[RzB_^?M)s,Gƀ7 q4t+_'T+tgEg+ׯt$z{.`1:IyZd(>鵂t}Jh-"Q)1f]ev}1p|]OQ2IS)B"6a %ش_nJ1XJX,tjC//7Q+lQi\)-Kbi!jDeA`g&uX8$8r.!vyo6U%KbFi& LH;: 7c"S8 ֲf0x襉>P_ȩvUvXm @aY&yCgi`giFș^f4_<*~{a<;r=L fތQ-.ErLݮJ*GB:灷 g!e+gR$ѾX^͡/cw쑪_ؽ{L<ƼXGHK(fCWS 04Ha$RADb4~"an妃1"_44r41I^`)#cvw47n/<YGq! BlP[JQxq 3lR+Qr55[G3KY})P#!lP/^N[HK $}`H'7=h% 4cUP Z 9vaQuo1y]ywqӘ7Xa<+]wҏV g2ZJ4ڥK9/&84;lM`Лncʌƙ){1 &]K# w1 LuR^i5)Z=ݩ=8U2оԃ'X],RᏫwc':nJkhZ0gAvoGu{&7o`sӛ$O{A[һk7 )ܯJڃu" "M bkC|9̰_X2HH2^Fқ>Cu20YJqlaMpZk}?c-@(43>L}n:di3dX! 4@F:[(֔DhZgT=P^삣Ք`g[ytBV1vTg\ޥP{ICmjd kIon.[^sn[XL` 4!C7[] Gn>pywVH/L9'X!;Xk$By0⹑p{^A*uݱC"*6,n'˩/lll%) (4z Ȝ]Dl|,CqK D|Gp19aywvLt `D5ʄ&zFZ6nïFg2<󚔎V;8Ho킌E$m*.U3Bʠ0ak+K}}}Y x .p\{}o`[y*90},vԣ<ɗvG ރ~OEVl.bI?[pg90xJaxz^vB:H"h}ϮpdzE-xj ߬> SF8;Ž^5e]!8 $bG؉4]8}@d>,0b;6v$HAYzfv1 ;u1Q9pPE!ؙg+qh1Tok^A@վ>᧣0STy!!bފF/(iKg10eSx2ee논N|uh>Ӓ0=PװrtɇP5}RFl,P@\=3 "BϺL֥dǷa|lyk׫oBF=jÙxԴm&UAךhȠs}y;)w:͡[lO>,y&:7IT'#oU8U.jHCK Hm-PiOju,{!7?esڜX3k<KI`h xJCB$G;8mQ_r$1CUWbebQ/5$U“HTR|FrD)"oꙿ L}\.!ceǙ|h`hޠ k%qg)f"SֺE%65q$%}3H(b_?(~o9Tra7BBMА,5m JXh('8Y4U;h0MBZ࢟!R RO;}#()v /QPo 3veJDu"#TPM\6dvD2>!P SgEP4>9\$Q{!|ia60Ta*a?z @Gf+1GHMAOs,EHR?~Kǧݏ#^_b0`k×xbxwmROC[MjЎ&\'x2SCzn~2gPoZaHxȊV&O?xK$&e^} \jD@zӤ$1')>i2lYU -#87&<2uW VHҚs As^*U\q,tzٵƮ%]sĆ! (3_"%<PWmRq%~G1/ph !4IL?D*weNErá&%GPsPu>Aߧ*8J:5J3ݽq-^h yz RP> s9 %肈sgMϓRadF V5h0(X眇KX%Cj&}*|.V|w+KZXeRG=X\2ԴcoMĐ 6VNUG7A'o|\-fC'dҲ| t<6'|gs^3P[W3'pWxY\(;~w@N[;~Mk7r S߫Ʈ"`q<.CC4?_~k afyNQA)[NFFh8n{Ut8@}i:y#>gFy[UT"z /䴈s_z[l OYD!(ssyX;Λ(8ץi 7GHb1-2/T=OX~ַbԋ|xj3^ؗz&BeT:Ox`I߫6[c҉;5ZW$zé*eFvЍgrtբ۵[\M(qU٩q^+.$y˚]{MgQZviۄޢU7YiI.[ ӚcX }Y@)0 en?du{> q%,vB% !Й8]gێe,h'c8-vplK룱äP7P 5R[@bYxcrln,H@e<ic]|^,%i8rT ǘ$V_I= wԳ҅֠v S6{ ڜ!U箱+W|CI^9v9)[WhA"{V \dlDTR'5ms4cp8ތeVqV9gj^HIn<.lPQ:^,Qٞ/)xX9d$ ,d%9eL5B"ӑkDc mizYVw٬8̰fX3X^ EiMD,1xr Z]&Q*3ݘ Bij8w'X ?{DեTR|'h8"h /dLh, UWłe6E[]Yl6M Xdt EYz>TpuT0yN'U}Q/:H&+ZX/-ye+:Y}TɬFނw .֊k QlYϘgbhK+r/@t z).HF`dlVBnnc=HY ,]lF]CRaWWzKk۠un,9;^Wfە2΢cyBs6R1zXo"àLJP6H{UɀWk^w tfXމ s1-ތ7TO5=fF 7b8.͍S}DPu/Wջ-~U;=G}~`Pĉ4k]IT{V2g m+vbGpӞǺfo}IO]*@{I{+ ʃv8o\C-ATtg:STwGCr3_ )l~M95^`SV箹ƅ&֖vA/b[UR֕0GVbrW&(^J*%4`CWWqS1[|/c&UO{15\4bk*F[x<5J$/h;![EcPdHB8鹾3^j"ٍxOU>-4H5=gxUY{%C<*;ɡR$/ zo(n[cP >cg'O Vwc%<UFTh_G@g ^F9Bk3+: eL_' O{HmxX\E/T$N.bS.E}<bDGԀ+ qע]kn]`YQƒi`zxgJ=Qٻf3,L:)W}T7.g)bȬڛU8M5$d*vDV މ2w@\{4kPhl@!8Wpux'ZQGUCJL*0ΙAۖ/&r=:M }afX i؈_Ap[G LN֗%8D5Vɳ{w @U `lF8O"1 W)эjګGNOxZCM0MISx M7k!M ֞ b:G$dp8.3Wvŀ-rc,®z r!ĵa˾GlZL>UJLߢ0kP-n[M ~ ^F־ Q]fsgpKZ+җX &lr^kwJt?)bT^h s ^p%ȗvB-L=%GY9q%t3݀#1Y&gpg+ q7 oT]-jNkڒ"[֫My~tdhA*GF:.$F6i2ZJv]+RM~GJ o 9l)LI9 ``Ku v8Ꚏ0cuʭ,o(VGT2ANHp(b_`[lE<4Q m¡l!oʕ+?Vn䝆h`'A^Ko6dg $u)pV vYk3Gf#.I]ЇN:ImAf M޽luN.  xUn:h%dW_na&@IpZ$CHx|60>BA"r6&aub1TXlx/I%C>7 [4PY߂9^q%ϼ@‡&& 0rU./6[aN*}pT9&U8RMO[TYk`Ɍ1|d́nW̫44 v>zh󖅭]e[}rcc羲=oGJoJd{wV(RH˒Wt[[FX,U=9&J8G}|ؾOdMWI8F_>Zpe,823'S&Qe#n& 4Up!p ͠DPsi:7 R=UgVP7+;QzQ{>{E+)\(sDcmn*Ijl[#}4+vt["CG-U<j>~V0-C?UʣJHY^heqf{70H}F#Rr RZ_H w\ DBn}P9/БxÓb=b\5s{S=fܽTz&wdV腬x?{N;,R:E~AdDz/ͤjoݘdn154RԗP`e(qLt>s`,%m8m Pt`@s]ܗ` EyE{`DJ0AAWw=!/`Tn`:)bl*hmhREU$Ts}pk0fǠ_sx6)C)Y}|[ZY͹z$LdDL2$_m,͍lA Ȫe# M(Ҥ=CQ\Vս8gUE^{x }z/FcN ;驋#&ۛg^M:#"nȗbȬȅGQ=!^y09-MADhE #PJf[K_XOy yg9f8t`=*gag71X 0vhk-(Íjy{i; fi^ތl~70eb.AJwv^.><~4|&W =%:[j&xp űl0>/-.*M5hpJWi*+A0؀^ЮL&h+('"(ӉVTxz~Դ/J:rqU^ Ēws-rHF:p^A?4$@؉3:QS/m^B*rی iM47X#v{8PY'Xd z>!(#yO`Q¹vfulaxܩ:朚B-{GA H =i.gS`F5zN1_Hv}+/ maM=צⲘ;DV|ǠZs "T544}u1zd(!pG,Oe|xVop0P߫jWpzU0zo$; =O0[o^ECPYVJ";8vE7 /+u}#\ϦV!`Ce]{Y Bl M1Q,Is)yjr S\z`+)v 3B)uZ}đHPkj'ղ16{M>syt\.1E,''_09fK2a>&PcZGHTxTݓQ#bmucy%/ !YSs hΧS.t5rz0mmHF篠M: >-(](ED,&udGZB'I:T1?̫`՛U!' K7=mU*;R7Dk pcx=,RKmkeCzJb| 67C hJx士(P;e8ߊPLMY\&{1y0~Svb#*xj IQ_V!X306f} '˶Z ҿg2.7Mc h;IK49Գ0.m #\ԞHw`UUa)o1hJ8TLCǺ)٩wtMlfOcfxG#~<$D={څ$qLλc(1@3`xL<*SCZ{*7l8!5]cp:Q9O,Uy`藅.[xۊD5>&׃%5:M璱Joإ仈z aJ+lR@Vx*Z T(ø =KTTXn> 6!frYR59# ROC@Ʃl'N:%NyO)wFOnE )>(|$&0SJExSu"/'A -|DvDaK $s6KNZss*/ )69 |!mC֍.67Qcu)d 4n->@#imA:5r"]փ R(G4l2Wi5Sz{PqXM`6Դv;Ŧ5Z==wQd*`$E(L2D Iּ+-&XCt, J5*APϨS55c|XZ!g' EqrNt+N,b<+t%G{ )=TEr=X97i5ۧK`ZכIS"@ jsk4T2!iu^l3Ks}“;f~*^̜jәBmu{FP`>aЧ{]'S P{$wc(@ TUNkjSBÀ?'%e`rBo5eKl`8GzIy=XW!9PC+<͛YC/B֍{y\Fftdad>fmThMMGc0&rA{:*- B8V!:<  +N aLqu\[.w JץvV v=(5\̆5m1|Eya +\" I]>2Y:kQ7.g葎)pÚ$`x rkݱqB߫лgQ`T8p)) "g5 /N/a̛;X*fKr T="D{y.ŷ=rwV) B)b#1#/yix4"EZ6ldnSGr%<8ct\W\D i4,2Q\I!<x<߽ Ks9Yl1Cq{\R'Q⠕ zA]ʄ5ˀs:yyP76T\Yz,@y9X9x_ s+#4y28<]aPJ B?!pB)lv\#Tԍ;D2EDhS5S]JI GG^>l'FD|1\lJzqe* ?ynϨy"Km)Hxݨe%6o<}EkH_9i->XJ(]<c]('G:_k'<*㸲eՙf=~NzĩEMKe`ZSK7&hŽkeV1-vO8;kIqFd7գ |̕Ud<gPj_ulW%bㅶi@Vf~/Әd$^FI'.^KByIr|f֐!D2ez_lc3 [tS1ZBޛwVz*D31^3 .: ^e^oZIGǤBľȂjwϩkZ""\H҄yBQ++6 6z)=R 5wؙQ cobЈlUxf=mEHAd9!u&Z/qt4bmp@a$=i2dT/ѾLW&s84q?4_t8q9\5\F5:+yGV݁F( ΐaBLtd7nGѦgrM ю2j};}#*#.!ڍ73nQ}sQҗs37\cZC Xε^j܏,qH$9Cd'1i\zscY'm'M-#5/tn37+h-0_]|$ߖv'gdG#"B`p=e-\]'at]YN\NhQ,5Ec| XŒ=,mļOQ.+3UCw#-[`'0Y(b|${dh0ҌyG_.6"4׆:;o /qj !y2YؐrMنaWjh(ae*8y]ޚtn%"xfФ5 &-#;qe^<^₆铍&4G:c*p2sNpBdl]]AK7GWm<Ľ͗$_*rǣVnI#xGsQ*fnL[ޔS A5\ƫ(Jb'sOP%*Dl bzU#B_?HpWaXuz֩>:Y9 L/*Fp$ vi A#ź/Tz\vxuZ^^|"ĎI ^R ^{QBH; {l4 އx}%yԎr=V6qAH, q*]5>@b T㻙~ِb^Bdِ 3H-h$}GG6 ʚYU}V]cP{\;ڌC~xOJ"m[/jqnѹ1m*;>2Oų=sr!`{ToZ8pc܎2th[@CKX.NFfnȓξH+=s`W5VZ/eGْ֢;DV9)EfGpR,CpΪw%ٞtܝŷQeM8A{3] T` g2a0CGmk`EO0N"Hh1S!qkibq3X։( #×L_..s؊#̔91ﱽ%wkzF,=F%2)STagV[Z^;T+ c^JWQ3sgٝT - $. 2-%pH O%G'?*59AmAhԴN@Ł噶3 -af%)lUk0ݣ=z̾ilw1JCOJ[\>d&xPvx. ^;a IId;:L) } ·3dby.yͪqGlMBIUe(L?0%Xt߄BȲlp*lO~9bcы oE+8~/w19;G%~~$±O%͏.~PN^3dHNҭW}n wYo i ne i/g`޶Z&mȞnJA!R" q>^ɩ84_g٪WLMҫ'4w;>mPC1 ׏#BJhr={'މȜ̣W<.g'PL"uo@u8HȎ=lX+.bd]'ܓ"h e%&@ء x6U #/"xs4'!/AٞƠ: Bf)dɪTJ&"~$h9e^)f1 ? 76дӲup%h{~cP<):Q}9x5Uiqe3 BIځe;"M5 ǠKC-K8/CֱKaS5ʞ$~s6>3E ,f+Klpf7C NW,0]4_5j/72w΍ag)pF$F㵚4*E_ Y5C|R\o^8Y]Z8;ˢF < i,5Z0@ȒE>W iLH [I#cPcQHiD<Z*g ֍WJ &%,# ؼ7"{h8:O5ɢ$$X](M Q֞ZcuBwFOdDIz;:H=|$З3ŇؘTdqp*wLu (7nf] •٘6E]&4O D-lW'V& a_pK>n;ΫGEl^`^&̵r<ѸW^[ƨ*]<.0I]c֩gx\lKĦVr'ŭP,|/|c'M@dwN+ _J־.Enm({()€W67$a5T~AU޴#^ 6w8w%#wKP?dWR57@R6C!9 Fgc~_`x₊ZMD#IȻcy'\@~! ôvfv4)X  y#;M^MGatyup2=ݜ̖wωO!/-qbG(١V'Fr[k8 /6!=5 |k%x׸HasLUEAFRgEo%8P#_ cO{V֤ u4O4rRs`APGU Y%XL1j&5p.9mS`9-1Ǩ*YP )=z/^yأN" Y6/6bpt‚bGʥm&\ET9-36j78 ϭڃy)̓ AJhd,/(Ľv,LSq AVFP+aIUdr>1Xvך7Qa8Lv efꋇyqՑr(G;ځ7.;dzY-dqHObրy%͝~/fłFmcP;Ǡc܁Fcܶh-X @8O"=brK5 t}O@3%UHnM}@4r6,1={Di Xs:=݈M'v,Y)]NJݴ |bVQ7|'KP8} Kȧɷ׾Ո=Q ~<6=C7:ÞQ=@_zvh[Q`)ҽWxʴ\z4g /Ywewub|W,Q&#^E?'//Nvp!$TYt@z֦0%(bzdoS7dR4uM,9< x=4 5h@2T:C,lJ ikh_=EZvXeT+ÑKU])q*pd69qT{$ߔ3'v`5Lbݯ#=tpGD)q˩;kVDѲOCBm9R` yL-[w}"V#{cJ\q0oa(-2_ȞB5mQ=SO(ܟCVgy9CMhǼv=%#2hgG ʉH4jc_B!Z)d[g|r𦁱+o D8ldn΃mFtÛx]$T;Io J|wD%^XSSf3CBta'vWvyMw+m3b[6%SR SSIxn{x/ st2R^BS= q1 B7w{5 3L"<{S\Fpڱv-^qM%Ri@ovp WeyKW$.4yU3h*ynpwoɏsD^^ږ}m"{lEjTs0Mdb$ } jJ^H!C(iZx"Mp¤X&YSHi RAOq rѡyƋ K$X)!>8;VZ6-L-͠ݐ[/J`.rLSyF|LKKBɇ5/uwZJjXJlWkv ZaBRT嶇晙-^rӕˆAh!FYr*r ?MA}P=DN=v"%Dw rЅa*C6q<+sż %ȉ8 ӷ~38{*<>-m K6E6?"E,^^"}ƶ%IBWN[рo,Y]ҽˣMBĻJP^S:<_M Ap tS"~OA9ChrR}*om Hd+K<&"D&ujuNZ6J 0Idꉂ+w M/87ن9Uq'=6=QӴef-s{+gKJ\V[ & +zg `'!sB{MQ"F<^d#1 WʜDno]e[%BGjӗa_NeD{.@vԋ/gW+>AlȭAԜB;bnCBl2OXcYwuNnM|YzTp/1erɇ&*Ao"C CzBx[3HqYq݇ {؅T +޳`{4֯tNkKFIViOU \d gAV[\@wrЖ$Ќ)Q6j_yV0tg\6HJfg3~2&~K]y]<^ib`;씌ooaP=h喠h%6V{$C\94vjt֞́JF@FVq ,^?h3.Ax[DޙU5sArWŐqp<𚦁h=+Bܤ["xcT`ckۈ`ב:(Xʦ^{/lB C"YB:5Rvs1fyb8mu6w·@<@cɘ ִ^'jh3DNWKsׂԵ̝:^mef\"6=ᇏ՛zalIGdX˭/x Ձp炭oi4i dU8ʈU6ͼewxkWxYJy-޳yreSSoR,#i^5?s Eȉ'zPh|ve^cg-F<71KϴH`"e8HR@mCNAAc;jqL3sX{BWOm/S@dByb#ڑńjN.VP 7&%>ML83ڮfEYlJ^hQmYK4^(|\(=Ħ\"I ĥ; L 45;?5yuDX7B(KפϸH[[ r޳NYy'PWkyb􉼣ׂ RnzzOPMWַqxEP'rZL0Rt_ZzwBG,l .%JdV$ *hdҒsTmͅmsiA㣠:vZ!ʈ~8%y(3wRn82x0N0`1-EF^]c"h%PT>\[u{㚪>{޸j ;:-ȡ9% ^%b˗'n@GV]XzKQ14SzN-{ɜ`pu,&!jkkʲI}s0g(ln)[!UˆΖ2 {@HPqьqݢ+Oi] /)sX>RIͭ9lm 6R[ɦ^\yEuJZTC5u3|~) -P_E9=~a=d}(hz25+#z|QavN$)\w))A޾Ӛ=~~x→ CGaa-h5r%q^lg+.Y9\߾ɜ맶5>*GY/U3n~6Kvbi=Duu8s[eq™ּ:qeSEe8=_YT;XtoX 1iaY_>ǖg%O0 n!1zg,o)Pާ%nZɎiUy-+-8 |I ](eڝdލ+%}z3cMK)=ga4`>lP@҆JN P fldWP" l"˜%#N1:e{!O![K@dHS>ڎ$8J‰=iA~z wj6N1uǘλ`6 _}hd14j Q;bMqB?t< :a^wޏ{my2HDq)! H:XniFݗMe"'ޚSyqQT#!hi/Ha@:eJ;c T xe^}woĞ"sDM+WJboM!sJ~8O\a0ĬWX 7`Gpqi#@ݵT}QDQKD? ; R=2Uy

㩀wqf4~?2PoKByS BOȕ\",aeѽTիGP&V_*{H cl{Q<4'Jؕ,i<4,0\ؗ~ÀrFD*jO=z0=X>4)07u1VzG{ .7i[^V4ye:2Wm)FD̨rBTytyFDuuU@4uƚm3]C' &bj `Uhz [vZC=]rlؽ$&W IޛԤe? KT9܇o-/]I߾;ÈwXxe m8+#̖Rveus_b`Q).y$f MM*"q#\YC?`* c+n, &ez)iETx .Cۂ7jp(o{M r)v-Zp":ľ)YAg \iM)ʢUGj5G_KP gɞY&G)Na}kB-Jb)rW.U=4Aledߠjӷ^(CBq9hEˍG6ޤ?RwyFL:`P:(9[` v/3Eڈs]XIrq%E a41l91zHjvhL^"hB1yGuެ9D%IEa4nJY5^}>5Fta;*ҤeJO=6̽(tlc\reh0j7{T!G@\jk֮^'> PQ}7AO,&둅A~UDX$) ~E0ꋡ葨Y9w΢89w޹ܕ"1|u \^?y0P Hbc:9 2%4VÏ̀r̖N6c].;q}8'=tNY~If} P#`c4kGل`z`8A 'doe 1+SR{]m"kQP]ѪZabF }o:_x b7 8tl/x44g3a ͽ':L0t:=^bi`ɄI)ɘ{T ig,uxo=ڑE3}cmr츰\jԥ!yƳ:U, '\#kypGJوj0gxͫkdoG_KcaTj ymZoiڽ:V6&wªzU#"(` ,VԱ{kz*c!{%^>+P?U{ovHlӧNoG[$9sNowIٗޜ{ZFt< T.T=a4YrXb- LJ7 x&:dbFyD) KNjMn=RvR+@SӍtumkos &NnK¢EYA~srny/Vw.rzU $mM޸\jBoNq6(~,Iݼhv|$&@>0G20i-r&F Z%]],jJ }ot }[d,:xZ7_=KY#jVdR(:yfE8&tF" ;y']mNo-SJf 7W})idgibajGͳEϣh!\8 DڸK[&Z^rd|f@5ޜl\wB$_8фFPVSwgۮH)y6`p\y$:4gA[:c}ˈ8Mt8e4㼈 =qc>ъrvTz|1I_M, IQ7]Gj0r~ gE&tWB \t~pj!D6SPFkN c>x;nfa`%9hu; V.g1} H87\5g'['FS,_qXo0%/ShjuH]]G(!FXQɕKŌ5.te0p9p¬Cb&ڗMļt)*: (z*#>#Czo R cxYs>p:@,lMA`gkJ:1bm>c$owwba>_>TLrmhO dK-Al{N Go_sॆ[I}󔤕 *o~GB;1F5F: 7^\"{uDj9O7nt²S 8d#/{r5^W@<0/ȟ*PStIf9 h5MbYMt?z=D+*ŭ->-~CЏ^p9^{]'nYNDzD m$a4ϧ4lp'ơ{8=*A}ih1v٘eR-&R,h c :^Aa=G $} d-vV] 6nb+l=;yCX_,Z>t}(|ou$;('V9HǹȆ{M)ZimV, vS-s$.W&iS-n#"&n WVjl=NtQ)}e/4o-,hPOpS:Wb*F ^ *FMZrluΠ깦da/w\> Izӑm0'!T1'4eGJo^xO6y8ER?KOGm؈89U*½oUѽ73}4ĪWQK4#|ȵMO\&0,eƂ5a& t 8C.'c`jQ(©dE*9\T@Ǜ0ikņ+x!=\c NEhx~eN“cEU Wm:qF!sREz nov=%i)}]e|:Ȑ =E1)fF4[Ml!$ E9b#pЀպC~уer|(o2hn*Qk`/6qݍ+Xx<P~MEX#]>/9zBE:ݶb'% yul ,W$Vjn@K=PMy.:tm$%Gu]&Q4hF$.}%kWG ܼMӔ܃Z9=|L(Ϡ/?/o `l:pv'a6zIV@SԠ~cagO9T{nvDGWU簕QM8SfM{أ xNϩ=s`0{![i(G' #(|JEaD|_A墼;\q,ݐM0VB之ľ{fǔYN A=rsWj,i*=x9ۍm䩌xn*;x=R/OQh=lJ$zڂrVLveGxRn>zDԶp4qk.$zK4`d1MjeZ ys; nù s og:LT⑬ijn)̔"p`0h| h7]"rK[tҏ F,zJv.}gvK37n= LJQ;gBFgqLI?rѷrb(XH*7']96}`_^i5ˢ6AkQwjBKWE>SJkQI8yX. Ƀ" NU'@lw>E"4M4< KcΏhmׯ yE˥ 81d3[EII{T\Rѕ:pKJ'me#8@NcpQc+g\z0vќ+҈=5gDEE fRT0sN]-ѻKJj\t@ƍqܻI_ū/ݱngrp/AWAo?Ky^]O'{þU'm!גyY/!ĜO7, %YVNpv)V[9?~i>ױܽqn0G.cٳʦ.+{ph/0 ]Jz7|t0.y2TDĭAex5;:oQ!V;YCt~R2oM=`{3nB.;LDG, 4J8ғ L0 #zQ`;;ѩ372tS> lja%;v#$؎#ȇS*uz? Osh4ZZ"Xq>:b1@,2*cԉ'ox9pm7M^ =>uݭu|e1>.z,zJy|dWO;}t%l|=>؍Od<4db&w"i61PK $-CBTMaUfWOm,ferQ6>Yj~,oV$9e]7\,ly6U#{S)f@?H*[5 0nnt/e}T`ω\ H)IKL Mf܎ѳoG8=#I3 #W(O3(.9l&:#B?*DYY*9o|k#!)i䮜tv}WVf )tKRC-R8!tK{0[|o&ۋ߉ lgxnj3l芽O#wwdv0ڄm w8 xB^@6b5E):3Ȥ}zY\h[䮛 jP!TLF&!=.ZYһFCjhse/q|8ꠤR/Jrk-)ЗrR;!U0ip;2Rr{dfI@ZQ; 6l iq=0!,rށ1֛U 9ⵙpvzĀ\.uGÂ>x'B[KƊDرv༚'PRZh,Nd:8RWqd4?k^70do^ @8W m%Њ%S0B0e,raCPDHx5*-ބ9\/nlw Ӷqb? ɝMَ8&Ɔk]~.PcoS`mKHM^?%K89S-DA{†SØ2a]n6d FOη!zh'dp;_q=@ v%R%xqؘxIY{k^ǯeg:<#0[ԍ(y:YX D&Pg.M [0JUFs]\d?`2L4 0>}\fNr=*9TLC`9l K_==fm--}0t`Czu2KuTEn-*:YA{B=3D+;.|i|cM=\v),ynn=,=eU9(91WDU2֘}_tīI7Lc3YӻV9[om>ͬVujq]ŀH[r>Ah/_$>k-9=%"WR'dBnc%/QBv3.-kA6XkTnP?Bt秃7IJytj8u )=ȆA;^{s2(ygt=#%XU1fʧ"в޽tWlPiѮjJ%VjQfީWOktr`;%;PM1f:dp&KOgѺsZ :PkԨvʻm/ZhGus\yU=d1P" |rKܑ2ɋG#\r ,_j-wΊq,o6NxT U *< yh:9iA;ܳ e2d~rC` |6wv!&MIRae44վǀo5@!o^ucK:>rrh9; ;DnN{{VK{3ഀOuGX  {ZOjpVf2V˽ڙS'FV$o w}gpVI&F&j4҄^B>{f0n .qJ't4*baJ"%&)cLxx[QXvҐ9J&DNWIu4fnN|#89(jqWtWmIgzBt#U]^%{ WU ÄØ\r}>9XYjpӷv8+ n*ID=GȃqFTE uHtWᏵ'dHߡ?%X@wD=Z__q(ÇdPjֆ' S3\4ϋ xWY dq)aIEd4?4wlh uvhna ) ԫ'B'>_'LH]?\og$>8O3U>Uc.HG}I(YiP`7f@N(^#>a T*Mo >:=ԕF+<\v޳qT uk(W' ׅRx!H/sc2Jۚ`&KkV  ;"4R5L=SXl4a@(vw>G7() @90ST&CfJ檣HY)'߻3Le)DH-E C<bSZ&^W6"&n+h!Ha&4t|¨@$!E02-'f{*=iCDf7eU\s7 cFt  )Ac!^S _u=|Vݞ$٘"v!ϽX}fNv{H-N^g  ^Ƃf*c% /=,Vy dB@̃aJq"YѪ lwQ\f -`+. 1Zaz؍wu q`ە?"{/;cSW!SUų}ݜt''>Hguۀ'Eu]\l#U,k/tcLz{`yƻF\lóaZB1<˫G~n>B]8,b^ )pzˑX\ ^ԋpxftA=޲FZ{%)j=`_Ar.y+#@z>ш x(|p`שz&sB=̻?V Bu<͸lNɈ43 Q}x P,]iˎW\6"`@3Q%pjqj|fbJ^d}!B[ wt3Nҏ@wD8tUJ~e3v0u+x@\VM9Y.ʫ p1I}5V95{EA)^:\J/ f_T Iس{F36XE/),-(Fy^#<ǜR{*zjL Ed5CKJ2Ge`^ ?Lա1)})(ى[IYrUa9t_< {'I18o[^p`l'5eߘiiAXC6$K= #F8 K,'s¥ &d(lܷo^R%OĝCkc{B]Ɣ%bC '`Œ7#ğr84FՉۛ寽i?{v ъ"C^ՃI~f˺ 'w .kr7Rĝ΢5_]XxL3mPqL~wшV\jH,F. }d)ӖҪD 0ܤA쮋oӅA-CuZ5j"jA>~)BSԏF^o Oxcy];qc*6un@&f+fhaWK>1[zluELn8^;̜2bJsO~c6sQ#Yux6iF<оz 0L^kR?Znv7rPzױ, vͬlahB}$IhG2.R aŻz . =sr.u.aL;WBJ\PLNZ+w7$DOu{+5ߨ3qEǬڛjv49|.ְ/ZAa)K ؁"e퓕I*;׵XOw 0WbCu^&WRi˱u)ksf֖We/d MLKDEfVO~/)b:%QgԊR{olѤ?nח4`yR/_:U1w⃳"3;4?er}fQMՑ<Ր *XnHLj| aPIWYaYz65&9N1|K 1/gϠg~ҁ16B\E4s,ipE/\7*geB0= X䩗Cxq-Ф*{ {nZ@{l Ϫ^0=G7֑*->0fzxַDY\r䁕A4͓^[<.{DZƓ+Ĵ~~zbΒ9sq[\W!Ž*)Tx"b2ӽTW遲%h!PLrt-%Fd ǁ0@>s]@c;}SQ4'lM.z0S!b'^X>Dm=LlX2;[ <;\.a_Q|,dPАF:/w=:ds֝b[* 6žQ-omj.Ґ5"45->'z6vuD=՚Eqk Y$h~I<5 C${ԍ/'^Ùfs>[~ Vc4xyHHz8ɴ`l0$ ndCaޖl)+S[Z$%pSi{9դjh2_Qhh\{\26Ȣ ZT\Œga{D \ ,$P`[xE.h kxv1 `.12O^x!43K"GHejڎʐ8=w+ݔ1A(ŏHu P` 9ǦV0^ؓ-]@\޽.6[BY<RBJTh+s+2}*ZמP/RKlƓcCZgؗ`Rᯝb+3"[ P5l[('Q#DLd[JL*6Fxyx Iا~SĂO8._bFo 0-&[w\P3i]C}4Sj5ZGweЀ,G; TJȲ*D1%Lr2 ;x≓h@*6 1m#}&$-bŦN'4l~كC$+ȝ߽724 AOʒXx j_3%4:S&?]g≪{`V=qo2?%6$Ka/w^l=qJ,l>]J5[yS l-N;d)!PQ/:_{mE!,O,+}wPu^`HM-` "qBvu#VoI""b<j o\]&3=y›71Cd ȖU; hOq;L/'8XAT{OhwcJsj!kt[T(e%{cRMP AUcHYdzEé5euY,tu+ЫxlBq9(IΞp*o2k=1E$xx=a]P9j\HNgz7 VC fr6 =>ePsP#X)~ucMRUb2A୶ 6SNmYhZXyKF@]ɳandqX4m].&9RG&q +A`.ت}Jzg[Eb rEΑWurm gm} |᮶zU} =M-X=av*(P X&c 06Jm52Thjy[5,vH4A:.'Mal1ΚaԮb0ٺ, M2 c ]!4}"JKِ(gtv)'2 ޲v =s7JXa(^Լ>|Q({)Xz[PYxR4<ynj$OEPS,sbƯ@<ŲSKxpy%0sgpQds_CzsKuN7?P9Z crWcHLaf~Rf>;K}0mJ;'T)A;rsxcK|GK9z 8v_bdHj .&\#v r€Pр+0\~-U9r/y~Ma*1:v3%ޣy5.o]ދ24ymL)A}huA]q3H'p,M6DEDdZImRa4Q[ֺ+r=q d |iwr1hJn.=5W5Aɱ_/4ӎĢ'"_n szqPv[@=WN,jkfOȮ{{OKe ;j; n%̬ Yjz#fw)H> * MT|Kkm|o޸q¹ IN`>PLfsyA;V %swI ƯCvB@'eу0$3;7'Gh;}4AgDO:N)g'LJ],M! Y钥^KSi /kT d@%YR{g0pX1\XIF#z.^W94 bᶽ^(Ȇ+8\)3kBtt,B?91ʂxIJ4[7sc"rC.Ժ/q^ wxʯkf8mMWP;خД-(Eͽve+қ#\0fX CxTȁ>{/cKA pN[K5V Z7ZoED=y6θꙏ H7 $ ^,):+ {qz|pG  V8j#z+rO*(*fRwȔd/0|^Fi+*b3J"vws 9sy7n%JቋU@-@9F}9*P-LM?EG4muw̩Ew01.l}'{C $5͂L[ $S:\A<*v|)"D-KS0NhɡX0֒=@[F@/)r+|'Ҁyj]'RύtWUaxWa% y΄^,YvOE]:08 -Ἰw@(FdE)a9=iT_:%Wɷ!o)lA ;p;qoC/'_:[ʳ3[|\~jP=~ʄSglSYأLW.RhPmQ '<_@V\ock<kCc>y9H!^S5GEb%2UJƩ~0O HؚomE>;|$di^>.cX?hcQ|5;~"7 MV=7lY>>2Hهg b~P,DUvk}YG(P].$Jϋ׷PbF^G{x _ʻ4DV7g/NnQ&+SVO cE9N3wjo$@?JGRӊFeJvR%pNAҪl|<^>vз8: Z39:n8ϩ0-Kr"UBJK<]F{#6((xL()0e<@'3D0%e] ^'* r^,RUm֊Ar!v `Tѽp4As[3b@4mMUeL1!c ol \R)_dE?x-x:wN p LH W}ذʽ;5`(*q@d'Tm?yA &\C/ѶM Uw3p,|e8877Fg17S"P5ԕ8 uY-B(K`ٲ#;ɮҸ nƻz*`XA (~lxi0, 8fÂ&k=Ut1%0\jvغwzwk1cN\A(~*zmjO}f1,efl>0d;~ $UcO(vz'"6]Hv\Z{w3*`Z7zNDYK%FnksBL啧<Ĉj1(>b<6*Fd,G6oےy 3J /SiMRv=C+V9 |NFA]BWyٙURnma9r`,fd"1Э3GVE"6"\F^QҬ.1W D[Y[\5 <~zgܹ8׀޾GF(B !t*=uL4?v8:BT=ƪy\ 9f s(1X-_Å`/ʐ #UaCn}#uInx⮳f|Cߡy 71UcPYژ09`:_۷9De^ xdRza:GmYfV<,KZ٥C71$DUJ7 H UL5=o=כc1Д 6f;(V|a,043lG勵4w ݻ9G@ "\-س-Qͮ;]A}Œ$x,,uSfNށ X:^+|}642` {Arl:+j;oJxv S뤢ȩt0KG{/Q}duį2M> )91~ym*H0yA >!ԗs2S/p{E=W3 d {#՞Oo۷e+7m@>M̡L%G N׌ȋ[~hũz_0e˲q*J-Su\,~#q`Ur;Ң?eM0εZy"O-ӬbYudx;] KCVQsi#yキWq&H[Ƕry)'tm'+V5ql̼$[35JX:/Cc 9iec1$lǕeYr2Ӳsۄ3{/M!{3_O< ׷cj{EBdW]qKظ|($$=Gr`̏+u=,( Mw #-HCOAģ`ݹa܏L\En)ZbaEO-k 3Wu]FL4ϟrqIAI61eH[Sy3Am+}O;^g7cpIaMSi\!rR~M vwo'$_ZKAǫpokL^$v:+c.yqsrz66)K<\얺%ԶC-l~C}k6AGu@%/xƖbβ&wMõ{[(IhX@- -7HoTt{|0jX߽`04X(5 5ꘋhq {J BX3JcBBSkF7[m-&̘֐)ex%w:9jh sRBОWv 1k{zL<oI Fv\b4v}7DD{iVJڳ2݁7b$c.ߋh=+'A9pXB.B%5Q3y!.5N?07Ly`7ȷZI%NG6?g^'ۤ"Ui%*@b*S=fe |DR4{?lhb-[6. ,״[|;Nc"wD\Ɔ2WEYEre<~^ >MokPٍ~izޭdQM%15:VJjT?&$%T=EJqO&cȵ=sa4Cw( `'n:V5s8l<Xڥzpõx_/|M륻-ݷJ7 䩍UM9nnFQzQֻZyxIs=ưQ +B~bөO HX űlm8;;LmA\y+}bik/ b,=IIXl6F!N#lPXxl`\UwhmMùK8PLyc3 j5 l3 GaUeGu1Xo'tʑ#dMWR]^9!j:(jUg*lPCEXz?8k 41/DnC, OTȎ17tvN-}R`J[:h)qs gAç`Z `Àh4gy=K퓜;h<R1F嗕*0-a[C u^cjyۘ4y]:f-VTv3.ȡ7*XH!C9b^$!mO8Ub0%a^eGIn回$Ȍt $ Xv|: EΓؕ܍LAɨS F>(bI蠺"NlǮKuӢK9`\9$y81h="s3֡fcy2ݳ/c9xɛ+%nPIe}/{)^S~Jѕ9=/$\ZA腉[-ч 'M7MıĢ\{F=u,b|2hw4T$31דlEÅtE\ =і1ƊUa̩ 8j92[ dt1PPfPZDbvk)Sz sQMt:s\ [@kOllg Ck=<'/woK o7 i {-c,ѫx}l8449>sq{O.a_Bїb_`{?Hdž*a2m|k鴱ذYn+NFmEgn˸zȑo^Q<ڙc6UdE`}/iӦ[II.&3([z:^b{p;.~8nrkUFNbAϠYDR~|J ʚ+؆*gJhij [RzI@"_ #ZMT6 |\dbZgJߛI0WJ'1bh~.| izݍ, ͑x@QM`fb,_kMhXXe6aGlj\1c5ŹF foA>BwQE@jo ܩy[BgjϼN `Mk~O5Ի`LOɕ.V.:rü~)ejH}D̉2÷tpfo)cIR ,k0 ;$75vq4/ (>.uK)Pnsx>z5)C8,X).TuN^?-~Uw(0U׋-7y0Bl fmD9$%IOMg:mOtL6!իw퀆 =gMð|χNLBdN=}juhzkF"vdoQgnIyρIWsHhRQO0;!]e#_WXPm@@^\,uH?']ɭ"فz1#Ǚ c0-`h]hWxf<8|1+FaZ.Fz)-@ݡNѪ}ۍU@5 0 yxԴq^x 6KK쎥Q/0A]uU_vW$5w>lO9XxkC1@^z ∍~`X2.#SޢAfy,UD5HM>8P¼#HUV|&\ʍNVZDP YnSԠ[ђ$s bEjcnCzC֚o|7BXU4w1g@I>C>O~g&F D}#S Z8%tݧLϟc ‘ajKmu#iC[+%B4p_yhA eh:,ۚ-::X?PLCxlvogT!5ߴWpI#s4wF;~Lű\k y,}5O_۬ 8=^C99AyAÉj겻AE/Ri1P|j L6V_л9<5r~4w9u0|= ٩a6agND":}bjwRJvxq ϽMra +:lbn;7nhT򬅜ˮkuAKOJ薢FՙaqAȫ@"~bmYP=^ƻyi7'܂[- I{ lsQ$K)roFyMŕZo(j@aOF[8̼z(W13vmU? {.;|B}Ӕ1c[񜸌~M x"x3؈L68$WJS`aB-'陞g(o՞2O*'0B윃x%, 6\˵\CtX[-US=ZZ ww(z۵#[V [gN +Nj^cvQ$(т=>*F|nhR3-Z(sk4ZJ3ڽi]ݍ cý%}Wޱ:)xZ _zQ&*sl֫ў>ǓtT0BXdūeoAK˝XzKA5x{B]M0;) Ҟ3K>h@5Z+@K=F+lz`_zL)c&тϮ UNQ<#z;e("N~n v^旛Th3%>zڨLáYmctfKA9{QҐ$}P;0R|eiW1kc Jg 0-#xT&ª"#ΦczH,a%dֆ1j¸/t0lBS<#JeXr#vp}hApY$,n51rM hIm* .n1ט7W_>rW<6|^5b=zKGnq qti5p+lhK sͨ TK}h6'y2Bs//]ܛHۍhOCA$s{i-be.;ۗdVpa t*6A,kb-h.F{9Lb`^pp EjoBy퍿ޒjL h~Y 1DF\o\zs?]Fb(/jJr ($wq tlu4HKFZ,ːx:!9u&ث}}zZrnb&wir{#&[lW9|FnU#E{˒$yQhhp)lBA|=dp=c f=DSOi<К ,r5 FnDһhJHKmV EWƶy[zeR8?}a. mb8|NF9ٗPs!̢%]vA"ɾ6'^&IjE+@SF}!ZFVèCe!$׏bk?ZyJˏWUnR iY=<7m 4kNyArZi*fErI|բ a=UcN]A7׌C>[eo<:$uπ#YTKJ7,cL5ϥeɌ+K7/_`P4E̋a;$[IҤԚYr5jvh$4m'!&%ĥמnx=qhg+d6KքtH~~_(1>"n1xWV5 7  BsӼ6S$Oc=UU- lqDVצb2HB}Z(Qzv=oa ôVHk;"PJV=#74z[HD͙ IF"ދ\c]w9}k m2s o҅tsY7@zAI.f|5;}>AF܏mCPtF: VRLZ [-R^z$ BVh)c]l@(r4 x]V&'9sck0gbח]9bH*rfv(G5W:xÄůA% &8*EzRyr`?YZ6hS t_5*ήܨ3GY]phz⡡XR  2*mz@+5LUMmbYoeB|/gogx˜p9#CU74N8n0ڈ*Ssۇ?i4M=YRJJEz/q W#v gpXӘώf5NUq%Soo ,"gmCv|Cs m *`l&L:3x/uP%Ib#o᫊!KCJsV {uyzd'bpOy9Ԙ`@q-<W"G}3#B7[21`ˮ4 Uրdg\mʹ{!K1lZa|o`=QOs='@eoxiVB 4t]ST\< M<0!imHx\7zNݻrÏ Z{ 6h}T!h)F܊!m0,=ߎ/)%J18T < M|-(*h`9O,\zFB<5$ âVn* %zHL˘ULBd.FN=Vi>@3NsK =\,9x`w|Ae1ݦ'Vn& AR $AU?ZAJuLv)Z]kRp1[FG^ͽ]N>xkjwA 0E SƱwU*n,8@c@#&+pPxlH_rzCpxlW'Fy١g<6/;70G+@GnEO 1 ]zUEo`Vk˵S [lX-;xKWJ v 2KgMg{O.o+1PLeLhD?kXN0'}A`"xa{Kƈ,mT^=,zp9-/6,*ƞ481eyk< (?372Gi!W U2Lde8}[AlGm0#SK3tES~jR^`u:m' ʙO#@@/-31S<ꖥාeܸ&GI0!={({7צBoiYx02Җά=p+R+Qp|/N;G tI,HE+5jsV $'\J˓(ǪNEsN_߉cQKg?bdz#!hJC{m1TǓ gXҹ0W\8VC,N4U1 ^Ne ɣI6z3c3|8xw5#ڟ>c6֞T ';}Jg.$Ttۨm+C쬃i˘=nfx ;%4:]S{4c˘Mxf-<|-\@A<Z[ގ뀗"+/B{X'oB [2Ud~,&Q.%KLU^}-' &2O0Q|fG"dNE :Sn] ۢJ18~Hb݅\h8toN4uoh~}AgdVn=$֪$'VnQ;`!OgG B>x8Kh;XŞ)w[_r+%SuBRmC.w-ʀO-zM7/&f| _&-pʼn=6#XEJ˔U]OXj#Zyy$pު])$ц#\?Q/Dž@ gZ}|(@Ur~l:.rG]LxX%tsT0n,\4rP; {ȸgLFY5^'1,gşZw L638}NiLzμ XLM`_l->P|#r#3˽وQTKD˅x' V6Ogye%":w&0|Rv-aPSxQ'JwXbä@C+TR\~.w)f 0gaCv-raLF/'tTpe ĩ2of[xlU'Q5X#q<ڀ-ws~JPί49Ӥk1c&|IGֹ>- ,`b)cDLœ]$z7B,5hyt`2rpu? xXca@yn@0/m?=֝œL[HR$ijmX(~`Cke"/3Oyj:Vݷ;!ZYB=w&Ms@}-xHtG#071嫊i (I"{}ܘ^5@)fY!aݎHuDW4='pm;f`:0dY,u;Ҫ8 ɫ~,6Yon0a.=GlؕFVRt⅁<_p4 Dz]XFJO8y`b-ITB]xG^#Yt5S@ef_p!(ꪑUg֓{2bKH۲i\=ex\祿j# K0LiUv5 |Yo[P]4$e(gp~tQNq G6|n0)ľ<)A!|,ƒːfٲn˵(J X,;&C˜ P~regc<nUc)LW2$T ,,3^+yNJM;fsHZ1GV#JFK{a$"']6mC .ʟe0B[쥣lXJ4י..`t;ĥyex$jZ'|ZǙWf(cyr; 2B%ν_?a|%1 p usºR@vՎ'5L 5mz k$΃H $8G^i[$=hi]h}Cצف {$SJx yF @@zinHăFo읬Dp:ʄu j}] -,0 ̍幽o5Gb>K. Da&7! oHyr6fĉM^3|UR;j}z1**Ch~`Nn9%m&JVȾMju%oA*bA"\H ă+R$>*rzCn!eL8#|MJ-`0CE6;pwS{NM<#a@TqVV%k -^0RύZ0@I#yZ*O 5Fc>y+O \wʆӉtrܒbzK6oPՊRWjsgKz^8]a6H>WdoM8\OOW5E^DGaاW3-CMЅ)C\VPe(KAcr.C8NV:=NG&"M)g½ؤ7ka38+}R7F>7=V짢jfN*voDvIL˪n=`zAD$d%:6:n9_]ĩ1t}we<$0*FJ9J 'c[1gn۸(UܠvdtC@ { 5Wz- KG )Yy- +ݪjA=+̛ŢKj<ʞ{F,b7ʦ.84ˬ!͇X0%lKufwVnjp<(r܅U>&I{ڳVkBJgxSkz8W|a}J?yFs{h1 爹hSq'uJ(p&|r;h'U_"(Z{>)Y '^2%xo cyhF۝ 5Uʁ,n$gFCcIM&X_V\i{=[Ck7;mQ&08hܫ2he/'gLs1**\-1~]r4kdLN"=o ;2ɜ4͞*!Z޾iN4 "Ȳq0x'j4EScrR$$Fi3~, Tr 2Em˫cmm2̃k/c8(>w\< *dsc6aþ9 HփC~$ezWI3g^ )AS6A*4X4'z@!j $Uaeo^./ZLw<.ky̨K>~=W3x[([P1VÓ$ ?3rXh,QvY&1Q*wt:;!'Đ7XsnDa G"{Z-na8=1}!͘Ēl"⬒!J!g=z\.TOg콘]gFeal{6^m؍`K E UvFt!ދ{%+-pm,4ʢx -{!/˄y_}-F|1r8/ް`-[i7 GSҙ(d:VfK(V*ȶSe$P#E%@:WsdVb^B<eC )nm I4ZxH/b7S26vUYMD` {Eot>wqvTBt W,)*b:ruv((R7=qY^Oe^W5#nAm]tWQN|(;Q>$[&M)$)(!y=K'+`cϞ-Ț7o"W`zb&ΉΖ:k{q{p֓yi1DJOF-` iE,+!Zi%8A @`o 0$ۓog{P/#F5V=rVV(gNo`_LqvQ T}JͯJeci{z#|MDLz2zޱ:qRiL"{0z]v:A!v"y]٪24YGd"&z̎rr\"}65) OZ^+xi6tM RK3S%k>ʶ "$=Ӥxs$ 9k_Fٽz5AcO&]N^ECS|x{`S8ۺr1ؤ2L,vCږ {FŒ <ӷ_h6sԵGSZ ܙ-U>ֺcvZ4hpP`{`#^I {2z]Iz(=$cT xVNj7>p-Fv&Q^U8Jlj2xK\|nMWZj,?ӣyI`0ee׼]XnOwzIa4%T|"a Ipsk>.{it#J`u! -Ce̶0I;4G=ZMS岺fvԘc`Tfȵ8/8<4|O&@]&<K8^{c 6e; ]Id8OzE)LN7#ᾄLO8Gt)' *{txmh% %5 A>y|Nj+ Ώ5L+!Dy1Gţ5+Mxe-2B&Ktuwu&^>`^{R+'QŇ@!f;ݘ7׳c-&Emf|BO4s a{5?#ZxYϷY(At~d[];t^J=J(r{iaJ6 rՊ/]9-Lm<, ̵Gܐ:ݛV~VIX^g(KM-vm:9 iH>^\gx`ra\Y{o m elm ^=5@e*ˡd3.iXK$n2t)$(Cʷ=wC:q#/lT"7 1(s=[Pt9ˌyJ .ϟ+y,pLRp bR,~$}G:B8y̻~^AЏ!Y!S^_sfM>S$Zd%1e Xz K{/dzĴB,% UuI!$Ml+p*κZ'fb+GeBidъ&5snǏOILpbG@Cf*ag.[Z|HT'-swQ(jde;Z8 jpJ|3` F*-1Y?Y;b178:R0Fvj#R`ITx)Q"-3ZuHȢt,]{i"Uj8W3O88oEROabq{E . a R﹧Cj=8ҭV޳yx#9^fQUU+K֖Y׽\0⑿U#I {0=\()SI@g7 }//]lQ햛``Ҳ f+KjB`{ 4^(a= rQޗ,By/ïaN@`G;bm^6# x.4w Xc c Pɣ2֭y%n3gHF sF8J%:̮%"V|$|O wj`[_.=|qNGz <;t11%c4ⷜdy p)[FDnxLSlhΘ ,n[NdP!ۦ8 >[+NU7H^:嵐)-2F5 @JZo3Sۙ=y=ʥ#9ywI;bR59'45q;&* fkQ7ύ=ײrJJM'"sumzWRb tl$m׾xr.}9[dnv3ڀՅd! O4.۪87Dj5ݙ{c:NےTB=PՇ o+1z.rwz uQCy`*$6C9Sa%L "Cg -|M/ <ճ_ޑqVqDIQ9mC#_`ʥc'MEloqx}w9\{K"#h/+ i0L9"Ys]'#gSm<\U`«{-SЮMlFp"wt;(ݵ{wXYݯܚA ˷*\ PeEf+]x o^#q@6$&P>.{_4IJ\5xfn,Vh˵wۅsc;z-2qnTBfI%B 2:=]ik >o~pK1 `}%9ϙFhn܄MB)k=ϢjȪ1BCHuPNϲaȧF8a[,W)[fOt3:lh{Ox,(B!%dE,LD*?Ґu CMB¾I6PFNq5lQU0ҺLrrc#eؗ5\7ƒ2r_΃sh[~ Eݚj x`6|{J|N\A bO&]Ū};u59ۈ\ C Y|tnӁ`e\ ,r+(߭՘nkxoxپĺn>QڠU_ z얻׍2eDLݎ͊ )kGq#Y1,dUPtgSyNQE,>坁xӔ&Ҳc$EOis\>NIP-2]_EmVtHZ-fw7rin6V=n"J1y#}!ޒm\7scne}88Kf#o\[ؑ=5xK6!a`h/7&pĠ&&kt<ߪNxbLp^-eV,k臉 sd} _ylldSR*aq6ddT,S-InU棇R+]-*5&ۇgI x[P#)B4_m;D%~|!]W:.&A#OcXڎDHm`#Nόfc,ע2ދ!"g@<GM-o곋<) 3AR}baB;~r/VyΜ j<)<粈tˍg+s[N:^wԖzJi5Ֆl^, S&` '_ Ge賍wNGTu\2i)i Ra9> BڦɌOsZ2s^zasɇDД##sp UC %OGEx ٱ˻3㥫RYbr4ʛ7hrw^ZM9*3wq2^Y? ́/ A[~cA@ުrFt8}V0tioм<}f*aef#L)0F=V^4fu\({mgv>BG+YZO-RHe@y7K+! mgR5 Kb,A7$1͚@UQ NJ 'whu:GhBa"f|T륷Wl8[ņW<ڇ|s^j d FF @izNDB[.#t&A@EJ(&u=GQ> $?U;5|̍ šWA+^IrH=̇ Q!Rs3DEK3y/I 8y  rRr;I[B[׹1:2=U~Q~dUn{AWj=%翉=k¹)Mɕ+^bgO u=+{$Amλz^k rC]]˅ijus7X|QБ#`.ʶzkA}^垓'òf08݄pZ+„:Iಽ[ Nփ&-ILJ)h%aL9/v"?4~iwێiUwcX~P8\qaJhﱨ8j$Y?i;q>$LA~HhaN^{z Ц=V}l<{4 qQZK=B1|)8,1ڸ1za¥t& !wأcBÉܟ#Z6wƻ :xT˥` YKjUe5_e л\p>87V&8Ds0`6ާh Op ZYb%Μf04);&M]9cǓ ],/鲖Jej$Pd[dd{/Fexz͂-Ծ]Kѕ[aF5zzQ:p.z=i7H}~^Az$kfk~FXcuud"NE'U`~YK<\<230'Bkid:pӵ9I#N$t=s^PY/;j|s,m8K,Jm@9ԛVWJz}9 ; )Dm Iʚ< cAj@`Vt>!g=4T wd6Lf_Ѭ5%=@ Z\q3B.w #Xj\}S̮&Dm^}/Kp7^? 7L0WJ6ec.% v,3d"oc b z2'=qބ,@ފޡ->suy :_<(dr[1,z[n xN;5,X٠o&/ձZ5Wp#אZ3FlOIBe# R̺w^U>J1KV3v_&%h[)MsoennOQ U#-s-7'{ kIh܃]ΩRuOكmr["Px؝p깲R&Q!;Rǀ}yrt 7; Ya 94yoe8Q%RGAWsq̓MYe&*`\Z}`!Ӹ::|Tiv,N^5oPEA8HstyA9EF6~]ٞRyBAj`4\yH{*`J{»_t3nQ+iWV2!t"/2{/^Kgًz,[6e=Z(Զ P{ۄOUyPs/6瀲pdνEUZqlʣ?}y{CPxªp)4AϬ<+k.* R{ VBȮ4{ CyuW$Bc6-ɢbnYO}G,+b{j`VK {$?QշۉW!#2r'Aж.k n#猭%nNԉZ*d;K0RS)&Q3?~Ƅ1Q Ih vѹ]~$$!ZDTY5+8vF3cp@C̶sǢ\D{jn:YdNj>#᪴C33D!Ȯte3&xqX-#@Io11.4GeA=$'K_[YV8oǯ<_(i6TF3lǙV,<ގ3dh{1uO5A&+vp ?|Y; "j[3&D|^ZաʧIjlN'|,@ Qa(Qދ!i2Ya ##ޗF-fWPiw OBjא둅կHvs~%`N:p.uX&h+ېs{U 01-H8q̈A'D@nuc@0W"b^u'<沘)6O 83=H hKn,#,zzx0m*ьEB=D|ы-~H}a#.1Oeȑg P BWhJ*{;YO#U]cj䨓=OѶ>n T7XJ*LaoORT?0w#j$S| 0@![l62iJ{x$\}WoӉdayprXsVv+Nw TٖIsWD$3r [ۼ\9|'%tyrK~i LǭC h Cxoxֹd41a^*&RY8 O 2#[Nah}܃3݄slR9yb,Oػ,Dwc0R8%J Ǔ!ef#Ivg4wUu!DY*-vA)BN)uU{H%* Y4; eA78}4'Mq )pÖ$}Lʺr*((pʤxI;J,(1t/J9vuʭ%)-٧6 +=yLho/8h+^&RΤkImB/g,RHz .ީ?8~ʵU7K 񵩠* Rʸ=2}iȐQ+%86&aGj>>iƦg٩n*DUY̪ByN.R Ss9i%Yg/]aΙ C˃|wde)xY>DF0Jh3B9N_u[>KV+_F|sTr4 7ѐxX2: zUy˞O-;mNhpql1 "*j0~3޲]bi˃aC{LH޲揤eU ٫Wթ Gm y.uՎ3 TS#d , vW]3 F^FJ/Oo:i#xLb:XkV$O#xa[j<~XBpD^nzUP)&-PFЕ {uR$xA+s uzϛ}fD ͫ5Gc%hYkZ̈́):$8^n'&Y Ѩ5BF͛D-K*Oփ>YV[8s duYM4>#-GyFefyXJ2D60jP'|`ݗ `jt}-El=Cqp&7&d~0I⴬v~tɢAT&=/=zӮԜz k-^3=(z,2- wҜc6E2 jo0(ED8vf;Cmv$YfDAa RW!ցUO3qMqbzs =\ڍ+}YQgsnM.d.)0ĶWc=H( -gl% Ul7 -,լL@=:i'9]ۺ`ɗ5G]5(N!co5BY.dҵO5isK.ThAd¾P + KD"+%]K{rN/{,nUJ#!r_ |+r`n.pu-*f] .xf [:8/u()rotY(]&qu,3xwoP[a"xԋi u1T!Kr.\bM<>Mܚk +,z#"y\4&H)ʮH!pe{?9qdgf|VUz Gh"]܈"Bz=e &n0!*2J&[!*lt|٘IM=Oy_|J_*V<7UOnd>] 2S%4 eigA=\XߙxE,Nڏ)qF<9Tw~.W&`aޚzI9̶rrAH]vsM> t@g~c]qf+FFk^!OGɝq6t?6Ն= 3OFLN  ֲf}Elz|/LvmfQi3v!z,0-?Qs]yTGQ.R'G=]bpI(Z@S \SߴjuC)z4B)ӗ~x-7)pc\ymoVʕAu눊βebx9+Q]f.#f}ggR:˱Uu Gf<8b`k.R0㎴81Dh"4I\w {L/^nt$C+1ZmSaQy(=]~0/:+٠͎~jY#fk.=[ˇR0Qtg][,7Q(%cA70D[lƟ*M>̀MU|bk>"7gE,$60fvׅ izPDX0әܙyaUj7ϳgI{P;#TӺA"NU3z֜=±U`bz}` dT%@rgR q/ -!Obߺ9:F[s(*}h H2|RƊޛB1xωk|"equS3A{e[=ơTjU+ \$fEb U^'& 8'-׵7otLQͥ%vd{9Ûܽ­}Y*5%䅝v@wW䀝׃1D48*{.GV\3T>(#D{FmWOhRuÔ/KX#x"5r-0gk `ih1ś3CS)Wy./d^;G͠ۄN)/7|L(MΈ>1"RnOQ); Jŀ**^0akЙ%:sf ̙%T[ڍ|!SY/h}J,Ӄ@k-91`x%PvdkvLm+*vI؂f8G\h =hw&"4/OG#7) &4Y%L9ge 4׳BGBb)7A<.=ihY, #޴*@,4U@ ڌSG93 JOLH7hs\acӸzЅ\c#̨ o!"eK \tBOQ^U:"rP..";(=~P9_A R˾KNf[b6>L߲|IcS!;TE Xʁ"^"9ďGlX]J^B#֠Ґ.皇oc|Bl kx{O:b@iA22-Yb/V T">z5]:p ̕쭉%{ QeI\ϖFuXʒM<&Oػ˖M'oop?@mĻU((u~)Vt]ܶ&˭&I-À۶-_[ k!J+ +6uT#{˔"©%svufcfw,im7L22'q‹fBc4ʪ+ @wo# x1濾}C)&nT#H\ [0lmJ:zv?7y? IET=@1F/`F%Pl /|.F)Ѐ|+$H'h׻ձȬv9IѼݱ\ ;C+)5Ľ0I9ڝWR-oڲ&ud(VCxDThok4{-pdV,GEogԫ}FL钛\}TcD!w2 UCE1 4>ZkjuۛEqNʫo{`uঙLDPmDN K=* "f0P:Ĉi1X\e m>Zs5w{.9R9P'$d5pgƏyqD) 8dAwEg6Zt%>~C|kfė|F Q]ɖIf,M.=ܗ}{H뽮~Ź3P}'Dfuox/wo.e܀=zg W#pSSpxNv:2Biҥ蓄XtH˦\ +1Vɻ2Ez Gj " 1[ӣk~p Yv-K$ f(PC6+ TV,:bԀ:jQK}eLp`mqoByfO=&eBʢԏs= ųMkC F8 |/Y6OyHxu_!cJ~8H& m"UμvqW$# {aTN qgx~ BWʭv'&|"A,Sn-ޣ`n\;60(Dx SHA4HL sHpr9J1!e!|7(CIHaAޓ,w]vmE+תּđn;h!'R4@2GZT=(~̣\MJ9csH:pxdp޳" h=c۹=;P%ҖJbsM7:bq!tI==E∀fFqoL٣A20Nf:BU(d".b!8MXe+ʃ7K&;+ޤυ^WGTEuH//MfJ"AUǫF4KeM{=Py0xLoyvAۦjJu`ylsk_lXu3?E }o)}4c=c@s#j{Ր._A^u+y?/-*Jq<֪ъ)&D~÷H8Q'B'ۧ [)ȟg5li)gÓtlg ʇFx-A5wŮ 9JzSZ4¨ܓQ\MY-C\iYŲ`YU*nzm[ȤY9 A {1PhL[»K@0v <{ Yư[J'k^i"Is㛨V[{KlZ/g,anhkR+]_"&crG1OMN2H]!6keW \XlIu41$Jz-"\N3!搰f̈oվy|HrO߶҆_ZdO@Ϭf<q0xD. bikØ.fgG j*w,csdWOfY԰<1;dFn%7} lϥI3R[U͎aENͪ U{:Gl^|fǃm!yᬶL$aew!zVؙ-6N˫S351>ϙX1#ٹa?U?D QA0), ߑ8樱m]2r9aƳNi]Rۺm%(IY̾>?z\5Nvli/>.|Zː.(p-[>/?[=lPKK&};mVETxt*W**;Te>y$&`qBzZ9>\u7@/l,:56:'`qŝ( <=C9;ϙl$x.Q1u  i4>7(CՐg紗!#-, |Mg6rU:i%³c'=]QԇÌI莻lg-t ]f[ RnTh.֢>R5;3'Iʖ|¼[HE=~٨N+>>aN!AIJ/!-{@Ygsc!.iޢ|qRʞs*XWKrmw#hI zwy y6dչt9\ >t}&!WsI8qf l ξǧx.sl54V%"R[[c^BR|~pA)L]ryop턩+νO_FjqPdF&h+(S1@ha}n=kM9]rX&Mアy =Opw{ 1A~F ,j%&^OQ>md=wNϊ9n [3%K1XP}l%PίyvH0Fb6F)Gpy?13̨d |2Ez5lcu@1Eo+<: 8>}}/ޒGԣdJ:N)-y%"BQ]9NC;ԝ)A'l& |@ni >Ul8{; {׮\9V퓎lRb~ G-YYY.yF1ЖCjy45uxxlP>BEۦ3=̜UbSֽ~ϛk$$X 1۫*3S"RC"\#_;P'b1H|t.v*F ~B)h{HNh|v^nѥݸZPeujD,2]z8#1L5GjfqS GA 6eQ)sEvc#\~w0< ԌYb=c Q$FE6a_ಽ! g$kOF(vod009l 9ϑ\?[W8z"=;]Q3XF7V<R ^0쬩w$XUO4R]  0`qN%=ՈTb%ze5j܉@87vk^7]Y; *~řh=}|ٯr5HufsE(4 |K3]+quX#StKi@hx`R-OP2ڎ 4Ɖ` ǒi x@RMCSs})\]P#K.\-2>2|(^ {M]LQqEC*WOd`1p&@kHd9 2aMm{FUWTYʣF ^Jr(zTAg*]n%\w6@GQ;BӇz.ZI9^(ݕe_%YFH'|ݮP;bMjM>F FH@SԾV2\5%U'3FYO^A%YuϪ%ng4ĭ切\=Nl^"5ԗfhjqW"`p%MEa"BA^ z[/i ) uaOt1J4B"ࠚ$TSs7޿EKf\yCc,q-@Uŀ]7½$=F/U¢K!{8f8VFY'E?.N,q0 hF]0gy󠧖rߕ^UuՃUE*m, k)zJ׌l" Wwh5ʴ mU l5 ;NQcʏh,RfMI¶,zx nӄsKzB_=0{;"{jMЈZL)7\ UξDx}Û!NfXbHq6V6Gly'Vmb/jnN[}qtKCOW紮^z<꫋:=et+7!ƻc¹!jK7;%r[(.gO3l]\('K>,{WV98dbr=0)F}{Il3MnÌՄýʘN=xzo )RXJAH4~tQ:Uw1օhv2IsC,ZP7a؋3MTh'\ƘW"hST-wLYգ"ƒ}B 2}Q_$ޚڝ̠bk#,TI,ϒҎSni͑XϾ734cG%/PK_e"Kz"jK"*#B3O|dߢ+h3D/፲ ",voф0;D]/ y))Hôգ^ ^La3ȶeiN1 F8Գݮpz`K  ;!cc!*}9i9M\CF!hw1J6tp$YEo O26٫-9{eȷei>?e~]vꕇÑye{$(zŠ_hoIU}Gϧ;ڵsYa,1]ƀczU=T¸BC4}B h SZv=k_>;8syoh+`R ו\Lr$ܒuFֹ[ Q`@'C+[^k;[3]"aYݱ.Y?ObAp ;{X퐒0y#ur.]ٓ멬z SSW,\)nDm@|F%elSKИ+;|z=O3 N΃ f Ku='_!G$Ft} 1h\l٬8029E[ytxE,'Cfځ/Ct; z)pĆ+#MOkjb]w;"![4gixCCfx+#<|Z5A_J:ӷ{gv wJi欓fQ+^dH"f\͓yROcc%殑 wNg D@zvnXiR%8=ǯ7CD2zSMRX".9Y16 .Qu]߻אnm%vܷrw908x[T {oQ@rTAxE{ʚ [}ϟ1>sHN^0OsyO'"E{BOQgF6m9i=ܪʳRts|b_E6sWAflC8۔+=9.g(ݑY?2i=M2Vtk07N.µ/uF6t]jjd ̰Q;WH4A?~La8L=}r5eku '@hG>tftt #X)^H(֐q8[=Y pv{GWfI@h PrEmxus4#Ij;~y-^FŽu$YE^$`!Г(Bt5p )Ǡ{$_E&6fzqK6 :*>+}`4-Oh])s@lƞC_d(2lLoOK8V[')44<}Ge$% q_[AqzJm¸?5L=t]m@૽PfBs F cD!Ϲ"c.r{b6fyiq-͡j;>ݞjYU8J4ߑ Jd]JG=XV"t:QW 2sЋigm)y<|/6`y)wl4m.?ޕ"d蚮LF0rk FS,,+Yk齘_ ]37Kd>^*Y$%kW0 smFBoo( +$w)0'gT7:h 5cP׾r2T9-wz=h(nlU/3W}Y{@^.YEh&U X¡xj G;[ FnߡEν/:+)|| ]NsF(bvr^t2VzC[#"܀Ge _3w9צ-1!hrC*w:sEm2FA,ϸ;{Y Pեn!<.t| O޻شq KFxIsdOFe$+#z& uR5yךOr+FS؎wJFa _._XMQ%R$HAx̜ mO_7ئK*7@ؗv6)ƫ$Pؓɕzb!W,Pwȴ/7 @cyI.%8<3`3B{щw_LA6ZAyВw'Vϰ $rCnQfe0OQXN;dz;gI斥E#4 L'.]܈yp EyE`Q :3mzYe.4IzEk<اt$; VXЯk*?>EK|\/#|dgo@JQ8w4n,#WΝ `gj4vRʑ=0IjnLan* Pt:Sq=g|ǣm Q@8KDZVRW9i{z~ϕNLpyY ࣪#r cI?PφeqD"txɡ90MYx?hH857wIWбr.*HzAܔW' jR 1^=6r:sԣP"X4< !jQ:dW4WrjQda ]5աD\վ\N%wزr1Ρ 0T]gg_c %S$e2ENde`͜=WBHQ;*_=²~5莜aVΊ,Oz"-~CN6#3T[a+`:8 eHW{t[`ZECn ¸uyɼN$(\ 꼌!1[)V l:l ;1(4P;bx P*1CSk+ʇG(R͢z I2o>bV]BĬi'Q {]$ XO=@ՌP}a/[Uf$R Af^,X \ e(>$Wt ,z5njFvs"e =|.\oŶR`ZLiߣG~T4@!qƸ`Vl+v!_\krF-ywKc؛ϫsL\[' yD(5pNΤ"SQqPhs6N #[BkUt06 +{1ģ̨E[|4qn8{û`=x jxf%18ZuEa6!Ϭ'UPQ1j-xch~n1!1POq{6iOj:Q7.3?|9yQ4R_x:%{CNgK&jQuc~ꠦȔ, s]A|jYa$8 1>{霯oE])MMdlM?!`8ܕa'|K/ySAǽ5Lgt'sU:!Tm/q4W; *#1a~jJS W΀VH#}8x21tR[h a*Ey?Mλa}s:>R,{^yHe3Wٰq&P4=)w.^iRV=&O EoC\4XzTM=*\O4 IiScJ,+ţEӅAR"κެ3<+b`MF)M'Ʀ1B&^Tl:T-\`2BE|9ncG*{9bZp`nŤw!uFY CW}= %l)~)_" t"r{lUVQcbfn^A(5q^\:Y>$lI3uSωjoRlPz^  $qJh0N*iGMpV}:Zp07NJLuG]pq:.̛{1/T/{_uG*Ĭ,0>$vB];Nh*=쀇JeF8V>^qN&ȥK]Hmȷ*d}2"} ͳ)i":QCl{#>JfxP,=3 b=rw.ϸ{oYLt,Uc5+}[%f]P0TNQtnyG: *٤M"NBzc{\R'O Y87';څe6x )YxevQr`{U_',O7V`B$]|UIL3qS ]Ä|x[ht["`b2Kvr2r?$g=WԜ_^5SSS͞!̟bXfZ x5z>)1^A|Kq;tV}qjF a=clk9t\}APYOoFPd4of@'SDkнE@v7=$ =kjÁ// pۥP9L^:UiC 9!-YuI{7|2bS9 2QC._q"H0TC·M` ◜B,1;Py:;>Vx vrhħ#^d?#[Qn(zˣ R/sS3E0p>0'rMt6+$%xoXFZ7t7GP@io"?¤@蹲<كx5m,[E-lw\MvTuHA5njߠ }O*m('4kS8+'6j_&ś6|3]S }CY]IpGt9 >0[C̈́Q {,ҳ Y#"8ڵ:i%I-:x4Jѯ*9څXҦ,4 s G՞[h^MA,KrMؑ~0I8Mrf vAc73s&دYn.O8W/a|jO{xN<6W-`f]k+:xr!9nS/5}.CHPmcYUrP~;r-RbY7Ρ .wEr\pPF`;hsW*gA_}vǧt(`V {8) ]H+BW>$Q WHhW`NEI8)dt4l{q%Oh2^"yqQ0xOVn$ <!T\T@(8d^ Yi.Y:b4P5H1SU FF/8|*b;<[p@Rqwt,bW*4zԫwÓFas0"8p4L![]B{hZŃ5*ʧIYKO ʹ!D=$nS'ZtZ:S,卛3+–=yx\c֔ fÓBMҮ},@w)sB˗+$#ÆY5pS5aX< jw.`jRfy]3m3+::Mrl8|i81F~Q+"vf8^Z{LS#AQR>{T;~$$ӓ &6|C2ZW'NzsS_Om w2F?[}.QrC{$93Y1Z.j3%TC>ի~%RK*(nlHv%}dI`)id֩7 7fk!;x]v[,S^>$67qMsoT#(Ԕjy?dBgF4ᱩdi $S˚o|0컨:o*t2ANqR5"VXg?"gP˒uqŧP6H[g.(o\LS'M9}Gl鰘9 ػ,3~T*`GIO XEeNsI>o$4<n*ƨə \35sy|%x z(1'Ǝm}VQQdnjHKԊX"]Vhgߌkie5UxfqЭOګ uVBjsͭ ލ-oðۢ/wyNurme`1=yO!C21Zzb1P@M)-7˜_.H Ƶiǹl2f#=,ܩRe@D" A`nb<}*/j'vVis"f|C5 ,{CX?)/I_ "Uhj/mPN=І'ɰm^IT6> )*ӠJ(,Fnnc㫇Pc@3_xvAy{5JEfr zKJ!PG]Ā=j":apE\1zYv:?lH~{,MDګslݹt=83ц"i8ʡ|aY.ޝrZ[n8z}`sI |w-w C^&iqV.ɨS91 xWTͤKdj H 79=!=N\Eu^ w4T!n0HN^֝,Q!cB&Zw=hJyX~\%Q<>Xjb!jI$m8!gDq'vh;/a?l>=O[س~: T {IYC zadM:k8ɚ"] Cki]hғ{R:^D=R|mO؀^JіDFPͱsP6d]RC{RX&]OBt{}NhʥUt{!(eh5լM0Fn>vyb\lV{[oQ˒^m'ާ@7gawh_xOk\KX^Cyk3{D׋]+A߅LaCA2ϓw=w%Ħ{y a6p1OiCJxT/4 ObyYEMΊꭈ>-N< @XQ|4xhy%9Y񶃐8.ױ'Xc. .hǞ&,9? Jg`a5.LowzYYe|BܐP,\7N0pyRb/뺢㉷o i2 n)^ͣ$NiEʾDGy=9 #ls#mC GBQk1|&,VsdMKĴ슠^1p6MMOD zt$>(lxsC︹;*?@*ܤ1BzI =MCwͽ 7&,T JIet r2 |h@zӎzUpZR',W˨Ň zo6kQf\"hsGT Z rQU$v QxRlwcLm kM6O8 jeϷz8.Ջ#l1FB`Aif<\KN8 $"! \\友9oK֪`0. Kb{. *//첏u^%7=Ұa-o@F@\yn% cPlK>5py+d5]Ndm{ Dz2l6#؉7rwx7)Eg-^ܐ6]%rB !aLvb$7~n%^̗@~ɼhV2zȘd|BW[V%d;zçH/` ;>zh@o=6ٍ+R IףB=Uq5 6VS)(] i*OSToܡQ[q@6Zuߦtv1f'UOT wVY|(Wn\3IAbq+ /(Ðͯ({PۖOO4y$T 7ˇuRj>6%s'4xTteXT9= DPOllݘW& 832 WKg ;407K:D `bc+s3,T=°BLu {Ӊ9pȦa|`Zz7(0|0f`YxmŻkVXKK:na7QGd2>p{)|q߉JCEK"ػ2kWZsa!g"2 fkkUNq-9y@۳*zoմQ@}y3q.g^qUxz!XK5a3=S}-YL]r㖔7YNSq,s00A/[sX|{FTS6Mѕ3=f{Ўm˗_[AI?3*VlTm+ pyS.V(AӞN ݥ4mpˢ_^=GV?h WRTET#ly7KҊ]DcuDkԊݣ<3ʀ{Ѷ9Ϊ4+8}U>RQET;+g>&CC5U vڬ# ){tW:A}T1#r<'C` ]qߌfՑGtf ?~j@UD4J9P2[C ]T +)xXbyaxݹ$o;_TﴖًMTwF0\=NIeD^o3QD}:@u;fvՊ@.[s9!_x OP;uRA WCyRY@Vc@Ol֤҅W9FLmHTccMRrxmԯ G!"qyV7lt+D̓SAbL:oYՒC2Pl pC{WmѤ.+ Y8kI6)~DhuleHu{߫A7ŵnxӬ(fr].$涎$mv۰@F4ʥM;"zJHKlO Ok#TON3~UOa>=Ն"~1FU{c_SfDp}]*kɡe {0%7ܼGE:%{U+͋ON3C!#yǣ.[M;7J`swޒD<${Wsl؎Y 2@^ $Pz3X9Ҁy#T|o(=k#|h+;vHtxt\撹||W8F3sq/S1GRhNSe_#^C Q!~znjwL4d%XX99Rގ f=&cqݣOe@=O4(Qwoy @̫epecueW8`6 +f{Ct U/DK41 K^ []\P޼qE ˘K`dyJ43/b&:͗O.Q\݋F|yu~qP2:%(w1 lodP:360҃v,Jk}{"n'z>x{NiS ir ܝx_J{>3kH%L.r=x~&430ʙYW%P8Yh>Q.zl.eKNW>BVl lpP z]A'"ɟ hJܓ%e27!LȇmƳP=::O&׳b^<ė 'hJЄ4'zIthؼ^]/D/ŵNP)Wpϋ j$uv{A"aN>Tz1yhVز2׉Ѧn6EdzBnF3{SXuo_KxVihWȦ:h5$Ue"FaG mCqg apGGC5OpnK4QH` I2en8ó*E jLeJ(^U-&NvyHت`!zr2{̘Bzbngbgӝ DXVzCyVJ'S> yȢz][)DO1'TpeIs0C@lwe }!y-ʦEa1|PɝvcsS~b `/{[{ًF'N֩Dg@@:xiރȔx p^w@cVz2=7=kR7ROn`FL.U 8/(j8f;wd~ zV*/"/Sowf)46w%ˍB<+Ǹd嚀KV/2˹~8,&qhuq-s1zdkb¤چeNt$٫NxMf0:l.E4$ 4! *}BVKQEhyt˒SL(n轺Ge%3Lu$' ={t}@!w\)] Q³1Sؼކx^ɀF)ЊZ&<5+'g)xМH}VW"2K{k΄xgU-HCC9f,0tNlDW1(&K).Y]"^'QW!ZeJF޴w8RzGE@& <:FrMneʪGy8CRBSiL NAd`Dr>O{*a=46ZDU |XBxr-N 7S;b=IʝKVsEc.^=rRBl?5/COLWe;EBH3w <|HOxg١ǽ H8)(jJCFM餩ZU+wnz5Wx.D_];ydXx8J4N,i/ǔVĽV*>2g*46Ң 9>x#w C;]q;w'o ٹC̜wɕ-Z.ۭm*7J[]XQG d75"Hʉu>{UWǘNbǝB98I{0G|iw$P֑^ao8$+02wAjzЃztOw ߡ@t?FVAn N ǜ6o\!=$ 24 eD*7kFIأpP Ȑ!g;k Ke[xͅt-QQ`HƚzS>7c-5Wn;8۬7@"^sҫbdm& z<甡4/ )^OH2ƅjbb7@q{|΅۸r˟RX11oag޳yqp8s(«e0Ͻr/T4ҟ$X.A<]仧I528Оu` =iK PLZ#[ LP( >7k&c39xho+.ދeU> ~φ1)5Nr#*5㡗.c,Gһmx_G -ʝbK;)a!OCyh)X$L/|Jnp^S҈.%1RD҄/3}(Jj*y7Ѽm8H4d硃 dk|8-y~uXBϼϙW^^S?nqloߜV:?v E`;)>zvgc|CN\MHe3A`3}#">4N/-l.8϶8\@:q\6悩}jStNEF.8{ȠI]Ҝ(pI{^C*[l^\) \|\x-1Q/|j= 2^R<21; ܲNeEBmMdJ(&~yVXYAhᨸCѸ|IK{(>/Ln@:ZĦ<(M0\[i A Q?v[`Ag1mdq3nNscL%҃I;-$ܺ=dȣ%}e V= ΖIVZF9<oy,cؽ&s|/Hffj[x1=X"qRȭUp@A^d 0ɭ0u$y!Mk:/WˁdV Ȳ[}iu."(dM{3tzЯޠ\=|ni.,nĀPOS5gxXF $>%5,.([vLc}~}rTі#U Pvko\^I7J(7!+rz,&T)W3E0N(0-xRs$$BFf 5:U xFC[zp@mK8eXfxh/H>(<1d1v?gZꡍd"]%=qBAYTfI/85H$ L8jӋ'ܩO:E{PƐN!3oB^c6#b➠sL3zotSsx* 9y1ֈ(Yޕ`H*|'Ve '瞄&upzT!4yӖ4ԬjSM,tqelJJJqNwؤ)uۉVz>}*{)DLв>=מt; vHT0.;om;ٜ%6c]p#&n $XzRw23;g-#L&%t^$S* yʋ<\dtj+~ZLgm 뚓<{W^'H 49Hb3iۉAI_Q4V3uݑgcOеSԸ{b!5ذr7T0tF=jEyRnnjOgѵ<^5{ )Ð=]r(Y ݓrȕpB%pp VkкSAfhu|}BJqAsx+8(sB~oNtǮ,=TpkRr7f;yJovpī$1mQ Z"{LPM<8"27vkbD 픅 ܀ťY$3Q7C[nzcj訯vv8ra>밠-{;= ҴT( A"P}2':@Q bg oqppyv,sFMW2^ p #-+Mks%+zK'S^2>p~})ȹE"$j(ib^ [+a8R~طhDrb&lHXMIPgVR-XSK;tM%D>;R ^OC }}k^G$q1XpZDF' pO d0` 2՞Q%x3Oye;"w CQzJ+*Z'> duKȈ##ٕ Մ(ɉ7{]be^?D;@Usr B# ƞ"yEp,C/xYdcW."f z@JᎉbNd㤁bEcɬL Fyr1T 5v _V>n#D{~Zn Yo'ZԠ]oIgS0[b=\L5{"Qf^6DJ6/eDvpD15_ZcW#y.RkէS`_ug ,sFposȗ  Г7kȮ~L^)/%~n F(lQN*eДRxB8DPД$껥N!ד~ikXnn20鷱Ddi{0$%#cD[*cTkI y4k|CAVd4W`f? ZJzVjB|92ٻ'!+m0q@\#y2>ĶѽzjK2MϟFٞ]hÛT2Cm5ޠJ@s\MUDZO1l)o-LVl*\&W2<^BAуB ?}GJnSU10h%.iH:c7VG_;FŧVw˫hW9!#QQKfQQVꉖka;=l+ArJ`z7`퓤猩a4DR^Abda76Xq+łqneD`l Q&MDf;ӣ',ّ6.|h=*l,DH0EC Ee=/H( %6,1O`,:yMl]x] DA5AfsΖyT5 @^Yڊ%^>jjTh62idMkX("ַƋPW$ln bt  ^=Qu]Zo<@\q.egCh>z3,/9+KU F~,V:]6խ+i!d/!w(T~ CYFf:, #rN;2{w :0(C2;"bZؖL f^uB!Jl b$Jw'-@9>(mV/*pr'ڞseη578'ypY=]ώ#gE[Waf9Yd*H%mNz#Bū{{#b4#:gGa"]wP+}Fx&ÞFMy2E.e_l^=xQցY1,LJi(^𠡒,CJ3UpqPfLUV0yK8fT}d6I{w]eX}&7Mm)I _vGm%ݣf]hD^ #;:8hS[tKOCH}+eKX(3)Q\H)\ ({O_\V~p.cX@DGB+?>K| c`@%pfDiD\=.sa^%|WIjGiʓO 2EE?Gm``$Z<{-^DJD)O۬{H7fa@#5aGeӈEL;їjn|7J `R镼əbܶҢj-gţ iY?G2"'9xW"SAcbLd6X`8Wa#yrř`b ՙya*I*JS^2#wyֺY2ӓ!`UsDg干faA esHj{˱wu>(S2* i24Y"}C` ɨ7b&ap^ $]2&D"NK0f)S84~VX0oMO؝MR}aT.FZ5C\6R-1z1UBN:olĎ\LA#1xzzX]= .bC~TCSN/=X X `c;;uyypQB!Lq\<|wJŴEwh9g={k٢v%mk#C|xϣ\Vx^ǫ\IS'/ͭM >BV#&ZkR]."Zޫilw 7ut ˆWC '{_@"ӗኌ1=2aFŝ&-k CN>$R=_uI+ֵ]ʤZ ;77]3 Dڢ)r6˥e`.+KH9(I/MyϠ5l>kкgFJJ.~O_ͪb.(|S:jn6 'G㞴{glXN'*~sY/Pyљ+'K8d;z퇈 ƥ\;CD{WZl*± Q2Y ( ,eyn.G ʬոu+O-XcG0 {꥛S/ߎ`%K#Q ZaL"̙-# U fag~SÛF(Zo]әM9≆&u5L6S^ 5T,^j5"Oէٛ}J|WqّCN=D%vy+GcW aOd穙x+DR];k)@AU".1,]Kȫ n 61+"OD=SD@Χ-Bq7f={ѓ>=łYLY_M8v^[ !PPOŠhXލ~.jdѪBA{v*y MxV,er8wʠd޻iOҹlVKBrzP!y4stsJ.D.}%:KT` {_ ;287u(wZ'=>H/Kͱ&b0085Z5b?&¶V,"kOm:#:<(F R؜X?uWI w04}G#Ka|-ܒqB{(4={:TıtL^#()G}PqPoS;\E'Ĥː6{r. _.Ť&j `Yӓ= bCe"0b!$zDL =SmusV8Y_{Z!f\#[v,lAUGpy;kǙFA+p4:29`nx*j[goݱjCGc*9hH<^]y9yw !^nڵC_]5gǘQT-"f2 Ϙ'8(TuQ ǕL06hLdؐe΄|G+_۫~,wdԆ0ϑ4 hUySвSh8w"@!_Lą,}5dpW#+KX츉[+"dxvrbZ^:HhUѡܑqZIl G\V?q|unƒvO=R#IRw 1#mA{4cݧu䍤V%֨e7VR> FI%@t͙{gsSԤxsޞ?]MFWAaMk[ q:'&RXVBJK-2yG2T zM"bo;\9GN¡rSluF)ej'h+I{2U\vh!*U&%D${w{7LuNRԃU,_? yl>,yui5}@_!'JJkp<y4{9]y)g L0>K{;O6|4z)( Z( ?u'¡/P@8]fQzfGC2z{B̀lX)|e&;Tiqsbn>WLOقҗzS<51+pԲj`4Et6y/ɍn)_ @^A18C .{h0CTϩ080HϺZׅYoTv[ TT"sIYfzg'MȲOteǭyEYƲ= Uݡ[*z;Љϓ]F9^RSrhy4x8 *HzxhzݜJ >%@yY)B^Y#ly s_Ie(D{#NP6O@&_&IƼ;be`z%R֬MHb"jI(W(olߣ> >7/E E)ɃAm})NjZָ4!hRqG~td]8Ãͥ&g%TpCJ԰ nM69 o1̖[g&>WqHD3,|["d;;JSz+ 7gҖʅsEIXs%N;F\=z/Tߨ)8VZ^@@?N,> ~)SyJخA]};e J/z9捠t|#bn*ѝINwyVznMi[ 02(C: Vf.yS2n|b|d!ckɧ{=Qy% {>k3hR"+1E׋iJĒ[2Yd=7J`J5.f=v!CW"rY^qD&5ӂm8V{Tep5|+qH͠*kZ_:Rɦ;=sqx#{Vח:'D_hcnIy U[T{ѯ]^{"VVJn Xx"ZNJ)8-0S|w'Hi' "5<礲<ͤpT./SM+y +;L 8V+&*ZsdӤ*6?I}4o-ɱk͡'Ț↼zg80~o A"恚F"*#R[.ߤ_=jq T1A.Te Vph:}1v8=πe6\ȻfюI>H<(qO20OՔ 6xŭܧb٠F(Q/c3&VjBi3@kMQ">W^0/m\0^mؗZiYfБ72W':3Dݰo/&s,B(l1 #,XNk|B! )cH(LYgSLn2xiIx"#W?|1t{W)aj>zˌ+PW\Vw":Edx;HKe%=,kʋbG=`a70.^p'ºL<4|V;BER0")x^FC.vitl[$LYJ0x!uattP>܎Kּʩ%$?r{TC0q^^?(!^-Lu7sm=nLJڄwxӎZv'""'jHsĩ6"8YM,poCўP u)ş:1}o,zV! RֳFDRdµ}ԥZL\K`_sPNյpER9?"MLBG~&F#|bf6IrNܥ!i[y̡S汪glXb Uc)sZ8'6>qCdt H9ǚ𫇓RL$DJ?G;z-MWиOT ѮbxL[TĞ餔5oق [z` o\|,iJVrޭ?golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/xor_generic.go000066400000000000000000000012731365325520100264410ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build !amd64,!386,!ppc64le package shake import "encoding/binary" // xorInGeneric xors the bytes in buf into the state; it // makes no non-portable assumptions about memory layout // or alignment. func xorIn(d *state, buf []byte) { n := len(buf) / 8 for i := 0; i < n; i++ { a := binary.LittleEndian.Uint64(buf) d.a[i] ^= a buf = buf[8:] } } // copyOutGeneric copies ulint64s to a byte buffer. func copyOut(d *state, b []byte) { for i := 0; len(b) >= 8; i++ { binary.LittleEndian.PutUint64(b, d.a[i]) b = b[8:] } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/shake/xor_unaligned.go000066400000000000000000000016621365325520100267750ustar00rootroot00000000000000// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build amd64 386 ppc64le // +build !appengine package shake import "unsafe" func xorIn(d *state, buf []byte) { bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) n := len(buf) if n >= 72 { d.a[0] ^= bw[0] d.a[1] ^= bw[1] d.a[2] ^= bw[2] d.a[3] ^= bw[3] d.a[4] ^= bw[4] d.a[5] ^= bw[5] d.a[6] ^= bw[6] d.a[7] ^= bw[7] d.a[8] ^= bw[8] } if n >= 104 { d.a[9] ^= bw[9] d.a[10] ^= bw[10] d.a[11] ^= bw[11] d.a[12] ^= bw[12] } if n >= 136 { d.a[13] ^= bw[13] d.a[14] ^= bw[14] d.a[15] ^= bw[15] d.a[16] ^= bw[16] } if n >= 144 { d.a[17] ^= bw[17] } if n >= 168 { d.a[18] ^= bw[18] d.a[19] ^= bw[19] d.a[20] ^= bw[20] } } func copyOut(d *state, buf []byte) { ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) copy(buf, ab[:]) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sm3/000077500000000000000000000000001365325520100232125ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sm3/compress.go000066400000000000000000000205361365325520100254020ustar00rootroot00000000000000package sm3 func rotl32(count uint32, val uint32) uint32 { return (val << count) | (val >> (32 - count)) } // compression func p0(X uint32) uint32 { return X ^ rotl32(9, X) ^ rotl32(17, X) } // expansion func p1(X uint32) uint32 { return X ^ rotl32(15, X) ^ rotl32(23, X) } func ff1(X uint32, Y uint32, Z uint32) uint32 { return (X & Y) | ((X | Y) & Z) } func gg1(X uint32, Y uint32, Z uint32) uint32 { return (X & Y) ^ ((^X) & Z) // Can be also (Z ^ (X & (Y ^ Z))) } func r1( A uint32, B *uint32, C uint32, D *uint32, E uint32, F *uint32, G uint32, H *uint32, TJ uint32, Wi uint32, Wj uint32) { A12 := rotl32(12, A) SS1 := rotl32(7, A12+E+TJ) TT1 := (A ^ *B ^ C) + *D + (SS1 ^ A12) + Wj TT2 := (E ^ *F ^ G) + *H + SS1 + Wi *B = rotl32(9, *B) *D = TT1 *F = rotl32(19, *F) *H = p0(TT2) } func r2( A uint32, B *uint32, C uint32, D *uint32, E uint32, F *uint32, G uint32, H *uint32, TJ uint32, Wi uint32, Wj uint32) { A12 := rotl32(12, A) SS1 := rotl32(7, A12+E+TJ) TT1 := ff1(A, *B, C) + *D + (SS1 ^ A12) + Wj TT2 := gg1(E, *F, G) + *H + SS1 + Wi *B = rotl32(9, *B) *D = TT1 *F = rotl32(19, *F) *H = p0(TT2) } func sm3e(W0 uint32, W7 uint32, W13 uint32, W3 uint32, W10 uint32) uint32 { return p1(W0^W7^rotl32(15, W13)) ^ rotl32(7, W3) ^ W10 } func loadBe32(x []byte) uint32 { return uint32(x[3]) | (uint32(x[2]) << 8) | (uint32(x[1]) << 16) | (uint32(x[0]) << 24) } func store64Be(val []byte, x uint64) { val[0] = byte(x >> 56) val[1] = byte(x >> 48) val[2] = byte(x >> 40) val[3] = byte(x >> 32) val[4] = byte(x >> 24) val[5] = byte(x >> 16) val[6] = byte(x >> 8) val[7] = byte(x >> 0) } func store32Be(val []byte, x uint32) { val[0] = byte(x >> 24) val[1] = byte(x >> 16) val[2] = byte(x >> 8) val[3] = byte(x >> 0) } func (d *digest) compress(input []byte, blocks int) { A := d.h[0] B := d.h[1] C := d.h[2] D := d.h[3] E := d.h[4] F := d.h[5] G := d.h[6] H := d.h[7] for i := 0; i < blocks; i++ { next64Block := input[i*64:] W00 := loadBe32(next64Block[0:]) W01 := loadBe32(next64Block[4:]) W02 := loadBe32(next64Block[8:]) W03 := loadBe32(next64Block[12:]) W04 := loadBe32(next64Block[16:]) W05 := loadBe32(next64Block[20:]) W06 := loadBe32(next64Block[24:]) W07 := loadBe32(next64Block[28:]) W08 := loadBe32(next64Block[32:]) W09 := loadBe32(next64Block[36:]) W10 := loadBe32(next64Block[40:]) W11 := loadBe32(next64Block[44:]) W12 := loadBe32(next64Block[48:]) W13 := loadBe32(next64Block[52:]) W14 := loadBe32(next64Block[56:]) W15 := loadBe32(next64Block[60:]) r1(A, &B, C, &D, E, &F, G, &H, 0x79CC4519, W00, W00^W04) W00 = sm3e(W00, W07, W13, W03, W10) r1(D, &A, B, &C, H, &E, F, &G, 0xF3988A32, W01, W01^W05) W01 = sm3e(W01, W08, W14, W04, W11) r1(C, &D, A, &B, G, &H, E, &F, 0xE7311465, W02, W02^W06) W02 = sm3e(W02, W09, W15, W05, W12) r1(B, &C, D, &A, F, &G, H, &E, 0xCE6228CB, W03, W03^W07) W03 = sm3e(W03, W10, W00, W06, W13) r1(A, &B, C, &D, E, &F, G, &H, 0x9CC45197, W04, W04^W08) W04 = sm3e(W04, W11, W01, W07, W14) r1(D, &A, B, &C, H, &E, F, &G, 0x3988A32F, W05, W05^W09) W05 = sm3e(W05, W12, W02, W08, W15) r1(C, &D, A, &B, G, &H, E, &F, 0x7311465E, W06, W06^W10) W06 = sm3e(W06, W13, W03, W09, W00) r1(B, &C, D, &A, F, &G, H, &E, 0xE6228CBC, W07, W07^W11) W07 = sm3e(W07, W14, W04, W10, W01) r1(A, &B, C, &D, E, &F, G, &H, 0xCC451979, W08, W08^W12) W08 = sm3e(W08, W15, W05, W11, W02) r1(D, &A, B, &C, H, &E, F, &G, 0x988A32F3, W09, W09^W13) W09 = sm3e(W09, W00, W06, W12, W03) r1(C, &D, A, &B, G, &H, E, &F, 0x311465E7, W10, W10^W14) W10 = sm3e(W10, W01, W07, W13, W04) r1(B, &C, D, &A, F, &G, H, &E, 0x6228CBCE, W11, W11^W15) W11 = sm3e(W11, W02, W08, W14, W05) r1(A, &B, C, &D, E, &F, G, &H, 0xC451979C, W12, W12^W00) W12 = sm3e(W12, W03, W09, W15, W06) r1(D, &A, B, &C, H, &E, F, &G, 0x88A32F39, W13, W13^W01) W13 = sm3e(W13, W04, W10, W00, W07) r1(C, &D, A, &B, G, &H, E, &F, 0x11465E73, W14, W14^W02) W14 = sm3e(W14, W05, W11, W01, W08) r1(B, &C, D, &A, F, &G, H, &E, 0x228CBCE6, W15, W15^W03) W15 = sm3e(W15, W06, W12, W02, W09) r2(A, &B, C, &D, E, &F, G, &H, 0x9D8A7A87, W00, W00^W04) W00 = sm3e(W00, W07, W13, W03, W10) r2(D, &A, B, &C, H, &E, F, &G, 0x3B14F50F, W01, W01^W05) W01 = sm3e(W01, W08, W14, W04, W11) r2(C, &D, A, &B, G, &H, E, &F, 0x7629EA1E, W02, W02^W06) W02 = sm3e(W02, W09, W15, W05, W12) r2(B, &C, D, &A, F, &G, H, &E, 0xEC53D43C, W03, W03^W07) W03 = sm3e(W03, W10, W00, W06, W13) r2(A, &B, C, &D, E, &F, G, &H, 0xD8A7A879, W04, W04^W08) W04 = sm3e(W04, W11, W01, W07, W14) r2(D, &A, B, &C, H, &E, F, &G, 0xB14F50F3, W05, W05^W09) W05 = sm3e(W05, W12, W02, W08, W15) r2(C, &D, A, &B, G, &H, E, &F, 0x629EA1E7, W06, W06^W10) W06 = sm3e(W06, W13, W03, W09, W00) r2(B, &C, D, &A, F, &G, H, &E, 0xC53D43CE, W07, W07^W11) W07 = sm3e(W07, W14, W04, W10, W01) r2(A, &B, C, &D, E, &F, G, &H, 0x8A7A879D, W08, W08^W12) W08 = sm3e(W08, W15, W05, W11, W02) r2(D, &A, B, &C, H, &E, F, &G, 0x14F50F3B, W09, W09^W13) W09 = sm3e(W09, W00, W06, W12, W03) r2(C, &D, A, &B, G, &H, E, &F, 0x29EA1E76, W10, W10^W14) W10 = sm3e(W10, W01, W07, W13, W04) r2(B, &C, D, &A, F, &G, H, &E, 0x53D43CEC, W11, W11^W15) W11 = sm3e(W11, W02, W08, W14, W05) r2(A, &B, C, &D, E, &F, G, &H, 0xA7A879D8, W12, W12^W00) W12 = sm3e(W12, W03, W09, W15, W06) r2(D, &A, B, &C, H, &E, F, &G, 0x4F50F3B1, W13, W13^W01) W13 = sm3e(W13, W04, W10, W00, W07) r2(C, &D, A, &B, G, &H, E, &F, 0x9EA1E762, W14, W14^W02) W14 = sm3e(W14, W05, W11, W01, W08) r2(B, &C, D, &A, F, &G, H, &E, 0x3D43CEC5, W15, W15^W03) W15 = sm3e(W15, W06, W12, W02, W09) r2(A, &B, C, &D, E, &F, G, &H, 0x7A879D8A, W00, W00^W04) W00 = sm3e(W00, W07, W13, W03, W10) r2(D, &A, B, &C, H, &E, F, &G, 0xF50F3B14, W01, W01^W05) W01 = sm3e(W01, W08, W14, W04, W11) r2(C, &D, A, &B, G, &H, E, &F, 0xEA1E7629, W02, W02^W06) W02 = sm3e(W02, W09, W15, W05, W12) r2(B, &C, D, &A, F, &G, H, &E, 0xD43CEC53, W03, W03^W07) W03 = sm3e(W03, W10, W00, W06, W13) r2(A, &B, C, &D, E, &F, G, &H, 0xA879D8A7, W04, W04^W08) W04 = sm3e(W04, W11, W01, W07, W14) r2(D, &A, B, &C, H, &E, F, &G, 0x50F3B14F, W05, W05^W09) W05 = sm3e(W05, W12, W02, W08, W15) r2(C, &D, A, &B, G, &H, E, &F, 0xA1E7629E, W06, W06^W10) W06 = sm3e(W06, W13, W03, W09, W00) r2(B, &C, D, &A, F, &G, H, &E, 0x43CEC53D, W07, W07^W11) W07 = sm3e(W07, W14, W04, W10, W01) r2(A, &B, C, &D, E, &F, G, &H, 0x879D8A7A, W08, W08^W12) W08 = sm3e(W08, W15, W05, W11, W02) r2(D, &A, B, &C, H, &E, F, &G, 0x0F3B14F5, W09, W09^W13) W09 = sm3e(W09, W00, W06, W12, W03) r2(C, &D, A, &B, G, &H, E, &F, 0x1E7629EA, W10, W10^W14) W10 = sm3e(W10, W01, W07, W13, W04) r2(B, &C, D, &A, F, &G, H, &E, 0x3CEC53D4, W11, W11^W15) W11 = sm3e(W11, W02, W08, W14, W05) r2(A, &B, C, &D, E, &F, G, &H, 0x79D8A7A8, W12, W12^W00) W12 = sm3e(W12, W03, W09, W15, W06) r2(D, &A, B, &C, H, &E, F, &G, 0xF3B14F50, W13, W13^W01) W13 = sm3e(W13, W04, W10, W00, W07) r2(C, &D, A, &B, G, &H, E, &F, 0xE7629EA1, W14, W14^W02) W14 = sm3e(W14, W05, W11, W01, W08) r2(B, &C, D, &A, F, &G, H, &E, 0xCEC53D43, W15, W15^W03) W15 = sm3e(W15, W06, W12, W02, W09) r2(A, &B, C, &D, E, &F, G, &H, 0x9D8A7A87, W00, W00^W04) W00 = sm3e(W00, W07, W13, W03, W10) r2(D, &A, B, &C, H, &E, F, &G, 0x3B14F50F, W01, W01^W05) W01 = sm3e(W01, W08, W14, W04, W11) r2(C, &D, A, &B, G, &H, E, &F, 0x7629EA1E, W02, W02^W06) W02 = sm3e(W02, W09, W15, W05, W12) r2(B, &C, D, &A, F, &G, H, &E, 0xEC53D43C, W03, W03^W07) W03 = sm3e(W03, W10, W00, W06, W13) r2(A, &B, C, &D, E, &F, G, &H, 0xD8A7A879, W04, W04^W08) r2(D, &A, B, &C, H, &E, F, &G, 0xB14F50F3, W05, W05^W09) r2(C, &D, A, &B, G, &H, E, &F, 0x629EA1E7, W06, W06^W10) r2(B, &C, D, &A, F, &G, H, &E, 0xC53D43CE, W07, W07^W11) r2(A, &B, C, &D, E, &F, G, &H, 0x8A7A879D, W08, W08^W12) r2(D, &A, B, &C, H, &E, F, &G, 0x14F50F3B, W09, W09^W13) r2(C, &D, A, &B, G, &H, E, &F, 0x29EA1E76, W10, W10^W14) r2(B, &C, D, &A, F, &G, H, &E, 0x53D43CEC, W11, W11^W15) r2(A, &B, C, &D, E, &F, G, &H, 0xA7A879D8, W12, W12^W00) r2(D, &A, B, &C, H, &E, F, &G, 0x4F50F3B1, W13, W13^W01) r2(C, &D, A, &B, G, &H, E, &F, 0x9EA1E762, W14, W14^W02) r2(B, &C, D, &A, F, &G, H, &E, 0x3D43CEC5, W15, W15^W03) d.h[0] ^= A d.h[1] ^= B d.h[2] ^= C d.h[3] ^= D d.h[4] ^= E d.h[5] ^= F d.h[6] ^= G d.h[7] ^= H A = d.h[0] B = d.h[1] C = d.h[2] D = d.h[3] E = d.h[4] F = d.h[5] G = d.h[6] H = d.h[7] } } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sm3/sm3.go000066400000000000000000000037051365325520100242500ustar00rootroot00000000000000// Package sm3 implements the SM-3 hash algorithm as defined in "SM3 Hash // function draft-shen-sm3-hash-01" draft // package sm3 import ( "hash" ) const ( init0 = 0x7380166F init1 = 0x4914B2B9 init2 = 0x172442D7 init3 = 0xDA8A0600 init4 = 0xA96F30BC init5 = 0x163138AA init6 = 0xE38DEE4D init7 = 0xB0FB0E4E ) // The size of a SM-3 checksum in bytes. const Size = 32 // The blocksize of SM-3 in bytes. const BlockSize int = 64 // digest represents the partial evaluation of a checksum. type digest struct { h [8]uint32 len uint64 b [BlockSize]byte } func New() hash.Hash { d := new(digest) d.Reset() return d } func (d *digest) BlockSize() int { return BlockSize } func (d *digest) Size() int { return Size } func (d *digest) Init() { d.Reset() } func (d *digest) Reset() { d.h[0] = init0 d.h[1] = init1 d.h[2] = init2 d.h[3] = init3 d.h[4] = init4 d.h[5] = init5 d.h[6] = init6 d.h[7] = init7 d.len = 0 } func (d *digest) Write(input []byte) (nn int, err error) { // current possition in the buffer idx := int(d.len & uint64((d.BlockSize() - 1))) d.len += uint64(len(input)) if len(input)+idx < d.BlockSize() { copy(d.b[idx:], input) return } c := d.BlockSize() - idx copy(d.b[idx:], input[:c]) d.compress(d.b[:], 1) input = input[c:] nblocks := int(len(input) / d.BlockSize()) d.compress(input[:], nblocks) // this eventually could be done in d.compress copy(d.b[:], input[nblocks*d.BlockSize():]) return } func (d *digest) Sum(in []byte) []byte { var output [32]byte // Copy context so that caller can keep updating dc := *d dc.Write(in) idx := int(dc.len & uint64(dc.BlockSize()-1)) for i := idx + 1; i < len(dc.b); i++ { dc.b[i] = 0 } dc.b[idx] = 0x80 if idx >= 56 { dc.compress(dc.b[:], 1) for i := range dc.b { dc.b[i] = 0 } } // add total bits store64Be(dc.b[56:], dc.len*8) dc.compress(dc.b[:], 1) for i := 0; i < Size/4; i++ { store32Be(output[4*i:], dc.h[i]) } return output[:] } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/hash/sm3/sm3_test.go000066400000000000000000001062311365325520100253050ustar00rootroot00000000000000package sm3 import ( "encoding/hex" "testing" ) /* -------------------- Unit tests -----------------------*/ func do_hash(t *testing.T, idx int, input []byte, expected_output [32]byte) { var d digest var output [32]byte d.Init() d.Write(input[:]) copy(output[:], d.Sum(nil)) if output != expected_output { exp := make([]byte, hex.EncodedLen(32)) hex.Encode(exp, expected_output[:]) got := make([]byte, hex.EncodedLen(len(output))) hex.Encode(got, output[:]) t.Errorf("[%d]: %s != %s", idx, exp, got) } } func TestSM3OfficialVectors(t *testing.T) { var vectors = []struct { in []byte out [32]byte }{ // draft-shen-sm3-hash-01: Example 1 { []byte("abc"), [32]byte{ 0x66, 0xC7, 0xF0, 0xF4, 0x62, 0xEE, 0xED, 0xD9, 0xD1, 0xF2, 0xD4, 0x6B, 0xDC, 0x10, 0xE4, 0xE2, 0x41, 0x67, 0xC4, 0x87, 0x5C, 0xF2, 0xF7, 0xA2, 0x29, 0x7D, 0xA0, 0x2B, 0x8F, 0x4B, 0xA8, 0xE0, }, }, // draft-shen-sm3-hash-01: Example 2 { []byte{ 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64}, [32]byte{ 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1, 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d, 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65, 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32}, }, // B.1. GB/T 32918.2-2016 A.2 Example 1 { []byte{ 0x00, 0x90, 0x41, 0x4C, 0x49, 0x43, 0x45, 0x31, 0x32, 0x33, 0x40, 0x59, 0x41, 0x48, 0x4F, 0x4F, 0x2E, 0x43, 0x4F, 0x4D, 0x78, 0x79, 0x68, 0xB4, 0xFA, 0x32, 0xC3, 0xFD, 0x24, 0x17, 0x84, 0x2E, 0x73, 0xBB, 0xFE, 0xFF, 0x2F, 0x3C, 0x84, 0x8B, 0x68, 0x31, 0xD7, 0xE0, 0xEC, 0x65, 0x22, 0x8B, 0x39, 0x37, 0xE4, 0x98, 0x63, 0xE4, 0xC6, 0xD3, 0xB2, 0x3B, 0x0C, 0x84, 0x9C, 0xF8, 0x42, 0x41, 0x48, 0x4B, 0xFE, 0x48, 0xF6, 0x1D, 0x59, 0xA5, 0xB1, 0x6B, 0xA0, 0x6E, 0x6E, 0x12, 0xD1, 0xDA, 0x27, 0xC5, 0x24, 0x9A, 0x42, 0x1D, 0xEB, 0xD6, 0x1B, 0x62, 0xEA, 0xB6, 0x74, 0x64, 0x34, 0xEB, 0xC3, 0xCC, 0x31, 0x5E, 0x32, 0x22, 0x0B, 0x3B, 0xAD, 0xD5, 0x0B, 0xDC, 0x4C, 0x4E, 0x6C, 0x14, 0x7F, 0xED, 0xD4, 0x3D, 0x06, 0x80, 0x51, 0x2B, 0xCB, 0xB4, 0x2C, 0x07, 0xD4, 0x73, 0x49, 0xD2, 0x15, 0x3B, 0x70, 0xC4, 0xE5, 0xD7, 0xFD, 0xFC, 0xBF, 0xA3, 0x6E, 0xA1, 0xA8, 0x58, 0x41, 0xB9, 0xE4, 0x6E, 0x09, 0xA2, 0x0A, 0xE4, 0xC7, 0x79, 0x8A, 0xA0, 0xF1, 0x19, 0x47, 0x1B, 0xEE, 0x11, 0x82, 0x5B, 0xE4, 0x62, 0x02, 0xBB, 0x79, 0xE2, 0xA5, 0x84, 0x44, 0x95, 0xE9, 0x7C, 0x04, 0xFF, 0x4D, 0xF2, 0x54, 0x8A, 0x7C, 0x02, 0x40, 0xF8, 0x8F, 0x1C, 0xD4, 0xE1, 0x63, 0x52, 0xA7, 0x3C, 0x17, 0xB7, 0xF1, 0x6F, 0x07, 0x35, 0x3E, 0x53, 0xA1, 0x76, 0xD6, 0x84, 0xA9, 0xFE, 0x0C, 0x6B, 0xB7, 0x98, 0xE8, 0x57, }, [32]byte{ 0xF4, 0xA3, 0x84, 0x89, 0xE3, 0x2B, 0x45, 0xB6, 0xF8, 0x76, 0xE3, 0xAC, 0x21, 0x68, 0xCA, 0x39, 0x23, 0x62, 0xDC, 0x8F, 0x23, 0x45, 0x9C, 0x1D, 0x11, 0x46, 0xFC, 0x3D, 0xBF, 0xB7, 0xBC, 0x9A, }, }, // B.2. GB/T 32918.2-2016 A.2 Example 2 { []byte{ 0xF4, 0xA3, 0x84, 0x89, 0xE3, 0x2B, 0x45, 0xB6, 0xF8, 0x76, 0xE3, 0xAC, 0x21, 0x68, 0xCA, 0x39, 0x23, 0x62, 0xDC, 0x8F, 0x23, 0x45, 0x9C, 0x1D, 0x11, 0x46, 0xFC, 0x3D, 0xBF, 0xB7, 0xBC, 0x9A, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, }, [32]byte{ 0xB5, 0x24, 0xF5, 0x52, 0xCD, 0x82, 0xB8, 0xB0, 0x28, 0x47, 0x6E, 0x00, 0x5C, 0x37, 0x7F, 0xB1, 0x9A, 0x87, 0xE6, 0xFC, 0x68, 0x2D, 0x48, 0xBB, 0x5D, 0x42, 0xE3, 0xD9, 0xB9, 0xEF, 0xFE, 0x76, }, }, // B.3. GB/T 32918.2-2016 A.3 Example 1 { []byte{ 0x00, 0x90, 0x41, 0x4C, 0x49, 0x43, 0x45, 0x31, 0x32, 0x33, 0x40, 0x59, 0x41, 0x48, 0x4F, 0x4F, 0x2E, 0x43, 0x4F, 0x4D, 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, 0xE7, 0x8B, 0xCD, 0x09, 0x74, 0x6C, 0x20, 0x23, 0x78, 0xA7, 0xE7, 0x2B, 0x12, 0xBC, 0xE0, 0x02, 0x66, 0xB9, 0x62, 0x7E, 0xCB, 0x0B, 0x5A, 0x25, 0x36, 0x7A, 0xD1, 0xAD, 0x4C, 0xC6, 0x24, 0x2B, 0x00, 0xCD, 0xB9, 0xCA, 0x7F, 0x1E, 0x6B, 0x04, 0x41, 0xF6, 0x58, 0x34, 0x3F, 0x4B, 0x10, 0x29, 0x7C, 0x0E, 0xF9, 0xB6, 0x49, 0x10, 0x82, 0x40, 0x0A, 0x62, 0xE7, 0xA7, 0x48, 0x57, 0x35, 0xFA, 0xDD, 0x01, 0x3D, 0xE7, 0x4D, 0xA6, 0x59, 0x51, 0xC4, 0xD7, 0x6D, 0xC8, 0x92, 0x20, 0xD5, 0xF7, 0x77, 0x7A, 0x61, 0x1B, 0x1C, 0x38, 0xBA, 0xE2, 0x60, 0xB1, 0x75, 0x95, 0x1D, 0xC8, 0x06, 0x0C, 0x2B, 0x3E, 0x01, 0x65, 0x96, 0x16, 0x45, 0x28, 0x1A, 0x86, 0x26, 0x60, 0x7B, 0x91, 0x7F, 0x65, 0x7D, 0x7E, 0x93, 0x82, 0xF1, 0xEA, 0x5C, 0xD9, 0x31, 0xF4, 0x0F, 0x66, 0x27, 0xF3, 0x57, 0x54, 0x26, 0x53, 0xB2, 0x01, 0x68, 0x65, 0x22, 0x13, 0x0D, 0x59, 0x0F, 0xB8, 0xDE, 0x63, 0x5D, 0x8F, 0xCA, 0x71, 0x5C, 0xC6, 0xBF, 0x3D, 0x05, 0xBE, 0xF3, 0xF7, 0x5D, 0xA5, 0xD5, 0x43, 0x45, 0x44, 0x48, 0x16, 0x66, 0x12, }, [32]byte{ 0x26, 0x35, 0x2A, 0xF8, 0x2E, 0xC1, 0x9F, 0x20, 0x7B, 0xBC, 0x6F, 0x94, 0x74, 0xE1, 0x1E, 0x90, 0xCE, 0x0F, 0x7D, 0xDA, 0xCE, 0x03, 0xB2, 0x7F, 0x80, 0x18, 0x17, 0xE8, 0x97, 0xA8, 0x1F, 0xD5, }, }, // B.4. GB/T 32918.2-2016 A.3 Example 2 { []byte{ 0x26, 0x35, 0x2A, 0xF8, 0x2E, 0xC1, 0x9F, 0x20, 0x7B, 0xBC, 0x6F, 0x94, 0x74, 0xE1, 0x1E, 0x90, 0xCE, 0x0F, 0x7D, 0xDA, 0xCE, 0x03, 0xB2, 0x7F, 0x80, 0x18, 0x17, 0xE8, 0x97, 0xA8, 0x1F, 0xD5, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74}, [32]byte{ 0xAD, 0x67, 0x3C, 0xBD, 0xA3, 0x11, 0x41, 0x71, 0x29, 0xA9, 0xEA, 0xA5, 0xF9, 0xAB, 0x1A, 0xA1, 0x63, 0x3A, 0xD4, 0x77, 0x18, 0xA8, 0x4D, 0xFD, 0x46, 0xC1, 0x7C, 0x6F, 0xA0, 0xAA, 0x3B, 0x12, }, }, // B.5. GB/T 32918.3-2016 A.2 Example 1 { []byte{ 0x00, 0x90, 0x41, 0x4C, 0x49, 0x43, 0x45, 0x31, 0x32, 0x33, 0x40, 0x59, 0x41, 0x48, 0x4F, 0x4F, 0x2E, 0x43, 0x4F, 0x4D, 0x78, 0x79, 0x68, 0xB4, 0xFA, 0x32, 0xC3, 0xFD, 0x24, 0x17, 0x84, 0x2E, 0x73, 0xBB, 0xFE, 0xFF, 0x2F, 0x3C, 0x84, 0x8B, 0x68, 0x31, 0xD7, 0xE0, 0xEC, 0x65, 0x22, 0x8B, 0x39, 0x37, 0xE4, 0x98, 0x63, 0xE4, 0xC6, 0xD3, 0xB2, 0x3B, 0x0C, 0x84, 0x9C, 0xF8, 0x42, 0x41, 0x48, 0x4B, 0xFE, 0x48, 0xF6, 0x1D, 0x59, 0xA5, 0xB1, 0x6B, 0xA0, 0x6E, 0x6E, 0x12, 0xD1, 0xDA, 0x27, 0xC5, 0x24, 0x9A, 0x42, 0x1D, 0xEB, 0xD6, 0x1B, 0x62, 0xEA, 0xB6, 0x74, 0x64, 0x34, 0xEB, 0xC3, 0xCC, 0x31, 0x5E, 0x32, 0x22, 0x0B, 0x3B, 0xAD, 0xD5, 0x0B, 0xDC, 0x4C, 0x4E, 0x6C, 0x14, 0x7F, 0xED, 0xD4, 0x3D, 0x06, 0x80, 0x51, 0x2B, 0xCB, 0xB4, 0x2C, 0x07, 0xD4, 0x73, 0x49, 0xD2, 0x15, 0x3B, 0x70, 0xC4, 0xE5, 0xD7, 0xFD, 0xFC, 0xBF, 0xA3, 0x6E, 0xA1, 0xA8, 0x58, 0x41, 0xB9, 0xE4, 0x6E, 0x09, 0xA2, 0x30, 0x99, 0x09, 0x3B, 0xF3, 0xC1, 0x37, 0xD8, 0xFC, 0xBB, 0xCD, 0xF4, 0xA2, 0xAE, 0x50, 0xF3, 0xB0, 0xF2, 0x16, 0xC3, 0x12, 0x2D, 0x79, 0x42, 0x5F, 0xE0, 0x3A, 0x45, 0xDB, 0xFE, 0x16, 0x55, 0x3D, 0xF7, 0x9E, 0x8D, 0xAC, 0x1C, 0xF0, 0xEC, 0xBA, 0xA2, 0xF2, 0xB4, 0x9D, 0x51, 0xA4, 0xB3, 0x87, 0xF2, 0xEF, 0xAF, 0x48, 0x23, 0x39, 0x08, 0x6A, 0x27, 0xA8, 0xE0, 0x5B, 0xAE, 0xD9, 0x8B, }, [32]byte{ 0xE4, 0xD1, 0xD0, 0xC3, 0xCA, 0x4C, 0x7F, 0x11, 0xBC, 0x8F, 0xF8, 0xCB, 0x3F, 0x4C, 0x02, 0xA7, 0x8F, 0x10, 0x8F, 0xA0, 0x98, 0xE5, 0x1A, 0x66, 0x84, 0x87, 0x24, 0x0F, 0x75, 0xE2, 0x0F, 0x31, }, }, // B.6. GB/T 32918.3-2016 A.2 Example 2 { []byte{ 0x00, 0x88, 0x42, 0x49, 0x4C, 0x4C, 0x34, 0x35, 0x36, 0x40, 0x59, 0x41, 0x48, 0x4F, 0x4F, 0x2E, 0x43, 0x4F, 0x4D, 0x78, 0x79, 0x68, 0xB4, 0xFA, 0x32, 0xC3, 0xFD, 0x24, 0x17, 0x84, 0x2E, 0x73, 0xBB, 0xFE, 0xFF, 0x2F, 0x3C, 0x84, 0x8B, 0x68, 0x31, 0xD7, 0xE0, 0xEC, 0x65, 0x22, 0x8B, 0x39, 0x37, 0xE4, 0x98, 0x63, 0xE4, 0xC6, 0xD3, 0xB2, 0x3B, 0x0C, 0x84, 0x9C, 0xF8, 0x42, 0x41, 0x48, 0x4B, 0xFE, 0x48, 0xF6, 0x1D, 0x59, 0xA5, 0xB1, 0x6B, 0xA0, 0x6E, 0x6E, 0x12, 0xD1, 0xDA, 0x27, 0xC5, 0x24, 0x9A, 0x42, 0x1D, 0xEB, 0xD6, 0x1B, 0x62, 0xEA, 0xB6, 0x74, 0x64, 0x34, 0xEB, 0xC3, 0xCC, 0x31, 0x5E, 0x32, 0x22, 0x0B, 0x3B, 0xAD, 0xD5, 0x0B, 0xDC, 0x4C, 0x4E, 0x6C, 0x14, 0x7F, 0xED, 0xD4, 0x3D, 0x06, 0x80, 0x51, 0x2B, 0xCB, 0xB4, 0x2C, 0x07, 0xD4, 0x73, 0x49, 0xD2, 0x15, 0x3B, 0x70, 0xC4, 0xE5, 0xD7, 0xFD, 0xFC, 0xBF, 0xA3, 0x6E, 0xA1, 0xA8, 0x58, 0x41, 0xB9, 0xE4, 0x6E, 0x09, 0xA2, 0x24, 0x54, 0x93, 0xD4, 0x46, 0xC3, 0x8D, 0x8C, 0xC0, 0xF1, 0x18, 0x37, 0x46, 0x90, 0xE7, 0xDF, 0x63, 0x3A, 0x8A, 0x4B, 0xFB, 0x33, 0x29, 0xB5, 0xEC, 0xE6, 0x04, 0xB2, 0xB4, 0xF3, 0x7F, 0x43, 0x53, 0xC0, 0x86, 0x9F, 0x4B, 0x9E, 0x17, 0x77, 0x3D, 0xE6, 0x8F, 0xEC, 0x45, 0xE1, 0x49, 0x04, 0xE0, 0xDE, 0xA4, 0x5B, 0xF6, 0xCE, 0xCF, 0x99, 0x18, 0xC8, 0x5E, 0xA0, 0x47, 0xC6, 0x0A, 0x4C, }, [32]byte{ 0x6B, 0x4B, 0x6D, 0x0E, 0x27, 0x66, 0x91, 0xBD, 0x4A, 0x11, 0xBF, 0x72, 0xF4, 0xFB, 0x50, 0x1A, 0xE3, 0x09, 0xFD, 0xAC, 0xB7, 0x2F, 0xA6, 0xCC, 0x33, 0x6E, 0x66, 0x56, 0x11, 0x9A, 0xBD, 0x67, }, }, // B.7. GB/T 32918.3-2016 A.2 Example 3 { []byte{ 0x47, 0xC8, 0x26, 0x53, 0x4D, 0xC2, 0xF6, 0xF1, 0xFB, 0xF2, 0x87, 0x28, 0xDD, 0x65, 0x8F, 0x21, 0xE1, 0x74, 0xF4, 0x81, 0x79, 0xAC, 0xEF, 0x29, 0x00, 0xF8, 0xB7, 0xF5, 0x66, 0xE4, 0x09, 0x05, 0xE4, 0xD1, 0xD0, 0xC3, 0xCA, 0x4C, 0x7F, 0x11, 0xBC, 0x8F, 0xF8, 0xCB, 0x3F, 0x4C, 0x02, 0xA7, 0x8F, 0x10, 0x8F, 0xA0, 0x98, 0xE5, 0x1A, 0x66, 0x84, 0x87, 0x24, 0x0F, 0x75, 0xE2, 0x0F, 0x31, 0x6B, 0x4B, 0x6D, 0x0E, 0x27, 0x66, 0x91, 0xBD, 0x4A, 0x11, 0xBF, 0x72, 0xF4, 0xFB, 0x50, 0x1A, 0xE3, 0x09, 0xFD, 0xAC, 0xB7, 0x2F, 0xA6, 0xCC, 0x33, 0x6E, 0x66, 0x56, 0x11, 0x9A, 0xBD, 0x67, 0x6C, 0xB5, 0x63, 0x38, 0x16, 0xF4, 0xDD, 0x56, 0x0B, 0x1D, 0xEC, 0x45, 0x83, 0x10, 0xCB, 0xCC, 0x68, 0x56, 0xC0, 0x95, 0x05, 0x32, 0x4A, 0x6D, 0x23, 0x15, 0x0C, 0x40, 0x8F, 0x16, 0x2B, 0xF0, 0x0D, 0x6F, 0xCF, 0x62, 0xF1, 0x03, 0x6C, 0x0A, 0x1B, 0x6D, 0xAC, 0xCF, 0x57, 0x39, 0x92, 0x23, 0xA6, 0x5F, 0x7D, 0x7B, 0xF2, 0xD9, 0x63, 0x7E, 0x5B, 0xBB, 0xEB, 0x85, 0x79, 0x61, 0xBF, 0x1A, 0x17, 0x99, 0xB2, 0xA2, 0xC7, 0x78, 0x29, 0x53, 0x00, 0xD9, 0xA2, 0x32, 0x5C, 0x68, 0x61, 0x29, 0xB8, 0xF2, 0xB5, 0x33, 0x7B, 0x3D, 0xCF, 0x45, 0x14, 0xE8, 0xBB, 0xC1, 0x9D, 0x90, 0x0E, 0xE5, 0x54, 0xC9, 0x28, 0x8C, 0x82, 0x73, 0x3E, 0xFD, 0xF7, 0x80, 0x8A, 0xE7, 0xF2, 0x7D, 0x0E, 0x73, 0x2F, 0x7C, 0x73, 0xA7, 0xD9, 0xAC, 0x98, 0xB7, 0xD8, 0x74, 0x0A, 0x91, 0xD0, 0xDB, 0x3C, 0xF4, }, [32]byte{ 0xFF, 0x49, 0xD9, 0x5B, 0xD4, 0x5F, 0xCE, 0x99, 0xED, 0x54, 0xA8, 0xAD, 0x7A, 0x70, 0x91, 0x10, 0x9F, 0x51, 0x39, 0x44, 0x42, 0x91, 0x6B, 0xD1, 0x54, 0xD1, 0xDE, 0x43, 0x79, 0xD9, 0x76, 0x47, }, }, // B.8. GB/T 32918.3-2016 A.2 Example 4 { []byte{ 0x02, 0x2A, 0xF8, 0x6E, 0xFE, 0x73, 0x2C, 0xF1, 0x2A, 0xD0, 0xE0, 0x9A, 0x1F, 0x25, 0x56, 0xCC, 0x65, 0x0D, 0x9C, 0xCC, 0xE3, 0xE2, 0x49, 0x86, 0x6B, 0xBB, 0x5C, 0x68, 0x46, 0xA4, 0xC4, 0xA2, 0x95, 0xFF, 0x49, 0xD9, 0x5B, 0xD4, 0x5F, 0xCE, 0x99, 0xED, 0x54, 0xA8, 0xAD, 0x7A, 0x70, 0x91, 0x10, 0x9F, 0x51, 0x39, 0x44, 0x42, 0x91, 0x6B, 0xD1, 0x54, 0xD1, 0xDE, 0x43, 0x79, 0xD9, 0x76, 0x47, }, [32]byte{ 0x28, 0x4C, 0x8F, 0x19, 0x8F, 0x14, 0x1B, 0x50, 0x2E, 0x81, 0x25, 0x0F, 0x15, 0x81, 0xC7, 0xE9, 0xEE, 0xB4, 0xCA, 0x69, 0x90, 0xF9, 0xE0, 0x2D, 0xF3, 0x88, 0xB4, 0x54, 0x71, 0xF5, 0xBC, 0x5C, }, }, // B.9. GB/T 32918.3-2016 A.2 Example 5 { []byte{ 0x03, 0x2A, 0xF8, 0x6E, 0xFE, 0x73, 0x2C, 0xF1, 0x2A, 0xD0, 0xE0, 0x9A, 0x1F, 0x25, 0x56, 0xCC, 0x65, 0x0D, 0x9C, 0xCC, 0xE3, 0xE2, 0x49, 0x86, 0x6B, 0xBB, 0x5C, 0x68, 0x46, 0xA4, 0xC4, 0xA2, 0x95, 0xFF, 0x49, 0xD9, 0x5B, 0xD4, 0x5F, 0xCE, 0x99, 0xED, 0x54, 0xA8, 0xAD, 0x7A, 0x70, 0x91, 0x10, 0x9F, 0x51, 0x39, 0x44, 0x42, 0x91, 0x6B, 0xD1, 0x54, 0xD1, 0xDE, 0x43, 0x79, 0xD9, 0x76, 0x47, }, [32]byte{ 0x23, 0x44, 0x4D, 0xAF, 0x8E, 0xD7, 0x53, 0x43, 0x66, 0xCB, 0x90, 0x1C, 0x84, 0xB3, 0xBD, 0xBB, 0x63, 0x50, 0x4F, 0x40, 0x65, 0xC1, 0x11, 0x6C, 0x91, 0xA4, 0xC0, 0x06, 0x97, 0xE6, 0xCF, 0x7A, }, }, // B.11. GB/T 32918.3-2016 A.3 Example 2 { []byte{ 0x00, 0x88, 0x42, 0x49, 0x4C, 0x4C, 0x34, 0x35, 0x36, 0x40, 0x59, 0x41, 0x48, 0x4F, 0x4F, 0x2E, 0x43, 0x4F, 0x4D, 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, 0xE7, 0x8B, 0xCD, 0x09, 0x74, 0x6C, 0x20, 0x23, 0x78, 0xA7, 0xE7, 0x2B, 0x12, 0xBC, 0xE0, 0x02, 0x66, 0xB9, 0x62, 0x7E, 0xCB, 0x0B, 0x5A, 0x25, 0x36, 0x7A, 0xD1, 0xAD, 0x4C, 0xC6, 0x24, 0x2B, 0x00, 0xCD, 0xB9, 0xCA, 0x7F, 0x1E, 0x6B, 0x04, 0x41, 0xF6, 0x58, 0x34, 0x3F, 0x4B, 0x10, 0x29, 0x7C, 0x0E, 0xF9, 0xB6, 0x49, 0x10, 0x82, 0x40, 0x0A, 0x62, 0xE7, 0xA7, 0x48, 0x57, 0x35, 0xFA, 0xDD, 0x01, 0x3D, 0xE7, 0x4D, 0xA6, 0x59, 0x51, 0xC4, 0xD7, 0x6D, 0xC8, 0x92, 0x20, 0xD5, 0xF7, 0x77, 0x7A, 0x61, 0x1B, 0x1C, 0x38, 0xBA, 0xE2, 0x60, 0xB1, 0x75, 0x95, 0x1D, 0xC8, 0x06, 0x0C, 0x2B, 0x3E, 0x00, 0x34, 0x29, 0x7D, 0xD8, 0x3A, 0xB1, 0x4D, 0x5B, 0x39, 0x3B, 0x67, 0x12, 0xF3, 0x2B, 0x2F, 0x2E, 0x93, 0x8D, 0x46, 0x90, 0xB0, 0x95, 0x42, 0x4B, 0x89, 0xDA, 0x88, 0x0C, 0x52, 0xD4, 0xA7, 0xD9, 0x01, 0x99, 0xBB, 0xF1, 0x1A, 0xC9, 0x5A, 0x0E, 0xA3, 0x4B, 0xBD, 0x00, 0xCA, 0x50, 0xB9, 0x3E, 0xC2, 0x4A, 0xCB, 0x68, 0x33, 0x5D, 0x20, 0xBA, 0x5D, 0xCF, 0xE3, 0xB3, 0x3B, 0xDB, 0xD2, 0xB6, 0x2D, }, [32]byte{ 0x55, 0x7B, 0xAD, 0x30, 0xE1, 0x83, 0x55, 0x9A, 0xEE, 0xC3, 0xB2, 0x25, 0x6E, 0x1C, 0x7C, 0x11, 0xF8, 0x70, 0xD2, 0x2B, 0x16, 0x5D, 0x01, 0x5A, 0xCF, 0x94, 0x65, 0xB0, 0x9B, 0x87, 0xB5, 0x27, }, }, // B.12. GB/T 32918.3-2016 A.3 Example 3 { []byte{ 0x00, 0xDA, 0xDD, 0x08, 0x74, 0x06, 0x22, 0x1D, 0x65, 0x7B, 0xC3, 0xFA, 0x79, 0xFF, 0x32, 0x9B, 0xB0, 0x22, 0xE9, 0xCB, 0x7D, 0xDF, 0xCF, 0xCC, 0xFE, 0x27, 0x7B, 0xE8, 0xCD, 0x4A, 0xE9, 0xB9, 0x54, 0xEC, 0xF0, 0x08, 0x02, 0x15, 0x97, 0x7B, 0x2E, 0x5D, 0x6D, 0x61, 0xB9, 0x8A, 0x99, 0x44, 0x2F, 0x03, 0xE8, 0x80, 0x3D, 0xC3, 0x9E, 0x34, 0x9F, 0x8D, 0xCA, 0x56, 0x21, 0xA9, 0xAC, 0xDF, 0x2B, 0x55, 0x7B, 0xAD, 0x30, 0xE1, 0x83, 0x55, 0x9A, 0xEE, 0xC3, 0xB2, 0x25, 0x6E, 0x1C, 0x7C, 0x11, 0xF8, 0x70, 0xD2, 0x2B, 0x16, 0x5D, 0x01, 0x5A, 0xCF, 0x94, 0x65, 0xB0, 0x9B, 0x87, 0xB5, 0x27, 0x01, 0x81, 0x07, 0x65, 0x43, 0xED, 0x19, 0x05, 0x8C, 0x38, 0xB3, 0x13, 0xD7, 0x39, 0x92, 0x1D, 0x46, 0xB8, 0x00, 0x94, 0xD9, 0x61, 0xA1, 0x36, 0x73, 0xD4, 0xA5, 0xCF, 0x8C, 0x71, 0x59, 0xE3, 0x04, 0x01, 0xD8, 0xCF, 0xFF, 0x7C, 0xA2, 0x7A, 0x01, 0xA2, 0xE8, 0x8C, 0x18, 0x67, 0x37, 0x48, 0xFD, 0xE9, 0xA7, 0x4C, 0x1F, 0x9B, 0x45, 0x64, 0x6E, 0xCA, 0x09, 0x97, 0x29, 0x3C, 0x15, 0xC3, 0x4D, 0xD8, 0x00, 0x2A, 0x48, 0x32, 0xB4, 0xDC, 0xD3, 0x99, 0xBA, 0xAB, 0x3F, 0xFF, 0xE7, 0xDD, 0x6C, 0xE6, 0xED, 0x68, 0xCC, 0x43, 0xFF, 0xA5, 0xF2, 0x62, 0x3B, 0x9B, 0xD0, 0x4E, 0x46, 0x8D, 0x32, 0x2A, 0x2A, 0x00, 0x16, 0x59, 0x9B, 0xB5, 0x2E, 0xD9, 0xEA, 0xFA, 0xD0, 0x1C, 0xFA, 0x45, 0x3C, 0xF3, 0x05, 0x2E, 0xD6, 0x01, 0x84, 0xD2, 0xEE, 0xCF, 0xD4, 0x2B, 0x52, 0xDB, 0x74, 0x11, 0x0B, 0x98, 0x4C, 0x23, }, [32]byte{ 0xE0, 0x5F, 0xE2, 0x87, 0xB7, 0x3B, 0x0C, 0xE6, 0x63, 0x95, 0x24, 0xCD, 0x86, 0x69, 0x43, 0x11, 0x56, 0x29, 0x14, 0xF4, 0xF6, 0xA3, 0x42, 0x41, 0x01, 0xD8, 0x85, 0xF8, 0x8B, 0x05, 0x36, 0x9C, }, }, // B.13. GB/T 32918.3-2016 A.3 Example 4 { []byte{ 0x02, 0x01, 0xF0, 0x46, 0x4B, 0x1E, 0x81, 0x68, 0x4E, 0x5E, 0xD6, 0xEF, 0x28, 0x1B, 0x55, 0x62, 0x4E, 0xF4, 0x6C, 0xAA, 0x3B, 0x2D, 0x37, 0x48, 0x43, 0x72, 0xD9, 0x16, 0x10, 0xB6, 0x98, 0x25, 0x2C, 0xC9, 0xE0, 0x5F, 0xE2, 0x87, 0xB7, 0x3B, 0x0C, 0xE6, 0x63, 0x95, 0x24, 0xCD, 0x86, 0x69, 0x43, 0x11, 0x56, 0x29, 0x14, 0xF4, 0xF6, 0xA3, 0x42, 0x41, 0x01, 0xD8, 0x85, 0xF8, 0x8B, 0x05, 0x36, 0x9C, }, [32]byte{ 0x4E, 0xB4, 0x7D, 0x28, 0xAD, 0x39, 0x06, 0xD6, 0x24, 0x4D, 0x01, 0xE0, 0xF6, 0xAE, 0xC7, 0x3B, 0x0B, 0x51, 0xDE, 0x15, 0x74, 0xC1, 0x37, 0x98, 0x18, 0x4E, 0x48, 0x33, 0xDB, 0xAE, 0x29, 0x5A, }, }, // B.14. GB/T 32918.3-2016 A.3 Example 5 { []byte{ 0x03, 0x01, 0xF0, 0x46, 0x4B, 0x1E, 0x81, 0x68, 0x4E, 0x5E, 0xD6, 0xEF, 0x28, 0x1B, 0x55, 0x62, 0x4E, 0xF4, 0x6C, 0xAA, 0x3B, 0x2D, 0x37, 0x48, 0x43, 0x72, 0xD9, 0x16, 0x10, 0xB6, 0x98, 0x25, 0x2C, 0xC9, 0xE0, 0x5F, 0xE2, 0x87, 0xB7, 0x3B, 0x0C, 0xE6, 0x63, 0x95, 0x24, 0xCD, 0x86, 0x69, 0x43, 0x11, 0x56, 0x29, 0x14, 0xF4, 0xF6, 0xA3, 0x42, 0x41, 0x01, 0xD8, 0x85, 0xF8, 0x8B, 0x05, 0x36, 0x9C, }, [32]byte{ 0x58, 0x8A, 0xA6, 0x70, 0x64, 0xF2, 0x4D, 0xC2, 0x7C, 0xCA, 0xA1, 0xFA, 0xB7, 0xE2, 0x7D, 0xFF, 0x81, 0x1D, 0x50, 0x0A, 0xD7, 0xEF, 0x2F, 0xB8, 0xF6, 0x9D, 0xDF, 0x48, 0xCC, 0x0F, 0xEC, 0xB7, }, }, // B.15. GB/T 32918.4-2016 A.2 Example 1 { []byte{ 0x57, 0xE7, 0xB6, 0x36, 0x23, 0xFA, 0xE5, 0xF0, 0x8C, 0xDA, 0x46, 0x8E, 0x87, 0x2A, 0x20, 0xAF, 0xA0, 0x3D, 0xED, 0x41, 0xBF, 0x14, 0x03, 0x77, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x0E, 0x04, 0x0D, 0xC8, 0x3A, 0xF3, 0x1A, 0x67, 0x99, 0x1F, 0x2B, 0x01, 0xEB, 0xF9, 0xEF, 0xD8, 0x88, 0x1F, 0x0A, 0x04, 0x93, 0x00, 0x06, 0x03, }, [32]byte{ 0x6A, 0xFB, 0x3B, 0xCE, 0xBD, 0x76, 0xF8, 0x2B, 0x25, 0x2C, 0xE5, 0xEB, 0x25, 0xB5, 0x79, 0x96, 0x86, 0x90, 0x2B, 0x8C, 0xF2, 0xFD, 0x87, 0x53, 0x6E, 0x55, 0xEF, 0x76, 0x03, 0xB0, 0x9E, 0x7C, }, }, // B.16. GB/T 32918.4-2016 A.2 Example 2 { []byte{ 0x64, 0xD2, 0x0D, 0x27, 0xD0, 0x63, 0x29, 0x57, 0xF8, 0x02, 0x8C, 0x1E, 0x02, 0x4F, 0x6B, 0x02, 0xED, 0xF2, 0x31, 0x02, 0xA5, 0x66, 0xC9, 0x32, 0xAE, 0x8B, 0xD6, 0x13, 0xA8, 0xE8, 0x65, 0xFE, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x58, 0xD2, 0x25, 0xEC, 0xA7, 0x84, 0xAE, 0x30, 0x0A, 0x81, 0xA2, 0xD4, 0x82, 0x81, 0xA8, 0x28, 0xE1, 0xCE, 0xDF, 0x11, 0xC4, 0x21, 0x90, 0x99, 0x84, 0x02, 0x65, 0x37, 0x50, 0x77, 0xBF, 0x78, }, [32]byte{ 0x9C, 0x3D, 0x73, 0x60, 0xC3, 0x01, 0x56, 0xFA, 0xB7, 0xC8, 0x0A, 0x02, 0x76, 0x71, 0x2D, 0xA9, 0xD8, 0x09, 0x4A, 0x63, 0x4B, 0x76, 0x6D, 0x3A, 0x28, 0x5E, 0x07, 0x48, 0x06, 0x53, 0x42, 0x6D, }, }, // B.17. GB/T 32918.4-2016 A.3 Example 1 { []byte{ 0x64, 0xD2, 0x0D, 0x27, 0xD0, 0x63, 0x29, 0x57, 0xF8, 0x02, 0x8C, 0x1E, 0x02, 0x4F, 0x6B, 0x02, 0xED, 0xF2, 0x31, 0x02, 0xA5, 0x66, 0xC9, 0x32, 0xAE, 0x8B, 0xD6, 0x13, 0xA8, 0xE8, 0x65, 0xFE, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x58, 0xD2, 0x25, 0xEC, 0xA7, 0x84, 0xAE, 0x30, 0x0A, 0x81, 0xA2, 0xD4, 0x82, 0x81, 0xA8, 0x28, 0xE1, 0xCE, 0xDF, 0x11, 0xC4, 0x21, 0x90, 0x99, 0x84, 0x02, 0x65, 0x37, 0x50, 0x77, 0xBF, 0x78, }, [32]byte{ 0x9C, 0x3D, 0x73, 0x60, 0xC3, 0x01, 0x56, 0xFA, 0xB7, 0xC8, 0x0A, 0x02, 0x76, 0x71, 0x2D, 0xA9, 0xD8, 0x09, 0x4A, 0x63, 0x4B, 0x76, 0x6D, 0x3A, 0x28, 0x5E, 0x07, 0x48, 0x06, 0x53, 0x42, 0x6D, }, }, // B.18. GB/T 32918.4-2016 A.3 Example 2 { []byte{ 0x00, 0x83, 0xE6, 0x28, 0xCF, 0x70, 0x1E, 0xE3, 0x14, 0x1E, 0x88, 0x73, 0xFE, 0x55, 0x93, 0x6A, 0xDF, 0x24, 0x96, 0x3F, 0x5D, 0xC9, 0xC6, 0x48, 0x05, 0x66, 0xC8, 0x0F, 0x8A, 0x1D, 0x8C, 0xC5, 0x1B, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x01, 0x52, 0x4C, 0x64, 0x7F, 0x0C, 0x04, 0x12, 0xDE, 0xFD, 0x46, 0x8B, 0xDA, 0x3A, 0xE0, 0xE5, 0xA8, 0x0F, 0xCC, 0x8F, 0x5C, 0x99, 0x0F, 0xEE, 0x11, 0x60, 0x29, 0x29, 0x23, 0x2D, 0xCD, 0x9F, 0x36, }, [32]byte{ 0x73, 0xA4, 0x86, 0x25, 0xD3, 0x75, 0x8F, 0xA3, 0x7B, 0x3E, 0xAB, 0x80, 0xE9, 0xCF, 0xCA, 0xBA, 0x66, 0x5E, 0x31, 0x99, 0xEA, 0x15, 0xA1, 0xFA, 0x81, 0x89, 0xD9, 0x6F, 0x57, 0x91, 0x25, 0xE4, }, }, } for i := range vectors { do_hash(t, i, vectors[i].in[:], vectors[i].out) } } func TestSM3Sizes(t *testing.T) { /* * Tests KATs for input of all zeros and length from 0 to 63 * DISCLAIMER: * Those vectors come from "SM3 tiny" (https://github.com/odzhan/sm3.git) * and they do depend on correctness of "SM3 tiny" implementation */ kat := [][32]byte{ {0x1a, 0xb2, 0x1d, 0x83, 0x55, 0xcf, 0xa1, 0x7f, 0x8e, 0x61, 0x19, 0x48, 0x31, 0xe8, 0x1a, 0x8f, 0x22, 0xbe, 0xc8, 0xc7, 0x28, 0xfe, 0xfb, 0x74, 0x7e, 0xd0, 0x35, 0xeb, 0x50, 0x82, 0xaa, 0x2b}, {0x2d, 0xae, 0xf6, 0x0e, 0x7a, 0x0b, 0x8f, 0x5e, 0x02, 0x4c, 0x81, 0xcd, 0x2a, 0xb3, 0x10, 0x9f, 0x2b, 0x4f, 0x15, 0x5c, 0xf8, 0x3a, 0xde, 0xb2, 0xae, 0x55, 0x32, 0xf7, 0x4a, 0x15, 0x7f, 0xdf}, {0xaf, 0x83, 0xa9, 0x66, 0x22, 0x20, 0x57, 0xac, 0x76, 0x12, 0x46, 0xa7, 0x54, 0x3c, 0x58, 0x0d, 0x91, 0x11, 0x01, 0x4f, 0x4e, 0x5e, 0x3c, 0xb1, 0x28, 0x1d, 0xb3, 0x31, 0x51, 0x16, 0x03, 0x35}, {0x18, 0x39, 0x20, 0xf0, 0x0e, 0x15, 0xa0, 0x43, 0x3e, 0xe3, 0xa8, 0xfc, 0x90, 0xdd, 0x9a, 0xc1, 0x64, 0xc4, 0x14, 0x2c, 0xcf, 0x63, 0xca, 0x18, 0x9a, 0x8f, 0x64, 0x5e, 0xc9, 0x6f, 0xf8, 0xde}, {0xaf, 0xcc, 0x87, 0x0f, 0xa2, 0x0c, 0x50, 0x79, 0x95, 0x49, 0x97, 0x94, 0x37, 0x1e, 0x8c, 0x25, 0xe3, 0xa7, 0x31, 0x0f, 0xa7, 0x22, 0x00, 0xc1, 0x09, 0x37, 0x99, 0x73, 0xae, 0x23, 0x68, 0x45}, {0x04, 0x71, 0x33, 0x17, 0xea, 0x89, 0x4e, 0x89, 0x0d, 0x27, 0xfb, 0x1c, 0xf0, 0x80, 0x0e, 0xad, 0x81, 0x83, 0xf6, 0x47, 0xfd, 0x2f, 0xd3, 0x11, 0x2d, 0x15, 0x1f, 0x8a, 0xc2, 0x69, 0x61, 0x7c}, {0x40, 0x7b, 0x8b, 0x70, 0x20, 0x99, 0x35, 0x66, 0xd8, 0x15, 0x36, 0x31, 0xa6, 0x7c, 0xe5, 0x83, 0x66, 0x47, 0xe6, 0xce, 0xce, 0x0d, 0x61, 0x8c, 0x7b, 0x86, 0x7d, 0x41, 0x6a, 0x52, 0x95, 0xc5}, {0xfa, 0x35, 0x64, 0xff, 0x6f, 0x77, 0x6a, 0x9c, 0xfc, 0x53, 0xa1, 0xf9, 0xb8, 0x6b, 0xd0, 0xdc, 0x74, 0x7a, 0x47, 0x31, 0xa4, 0x49, 0x11, 0x6e, 0x45, 0xc0, 0xad, 0x0d, 0x05, 0xf5, 0x64, 0xb7}, {0xb7, 0x86, 0x91, 0x08, 0xf1, 0x51, 0xba, 0x70, 0x67, 0x2e, 0x10, 0x15, 0x3c, 0xc9, 0x0f, 0xc2, 0xb5, 0xd4, 0x50, 0x6a, 0x96, 0x3f, 0x03, 0xb6, 0xc5, 0xb4, 0xaa, 0x3b, 0xce, 0xa0, 0x9d, 0x83}, {0xe5, 0xef, 0xbb, 0x13, 0x32, 0x53, 0xd8, 0x86, 0x99, 0x1e, 0xa6, 0x0b, 0x55, 0xc1, 0x3f, 0xb2, 0x60, 0x4e, 0xfc, 0x76, 0x3e, 0x72, 0x99, 0xfc, 0x58, 0xb4, 0x41, 0xb0, 0x07, 0xaf, 0xdf, 0xa2}, {0xf0, 0xd0, 0x1a, 0x14, 0xea, 0xf1, 0x40, 0xce, 0xc6, 0xe3, 0xc9, 0x0e, 0x71, 0x46, 0x98, 0xc9, 0xce, 0xb0, 0x3c, 0xbb, 0x93, 0x33, 0x0c, 0x70, 0xc2, 0xa3, 0x2f, 0x58, 0x7b, 0x4c, 0x8f, 0x11}, {0x5e, 0x02, 0xae, 0x6a, 0x90, 0x61, 0x13, 0x84, 0x0d, 0x79, 0xea, 0x81, 0x6b, 0xf8, 0xac, 0x73, 0x2b, 0xbe, 0xe9, 0x98, 0x01, 0x7a, 0xfd, 0x3e, 0x34, 0xa4, 0xf0, 0xd0, 0x33, 0x6e, 0xf2, 0x0a}, {0xf2, 0x4b, 0xa4, 0xfa, 0x51, 0x5b, 0xc2, 0xce, 0x76, 0x91, 0xf2, 0x47, 0x91, 0x05, 0xe5, 0x7e, 0xa2, 0x22, 0xf9, 0x36, 0xd2, 0xdc, 0x07, 0x22, 0xf3, 0xf4, 0x4a, 0x98, 0x45, 0xbb, 0xf6, 0x69}, {0xa3, 0x69, 0x3b, 0x02, 0xb1, 0x87, 0xb4, 0xa0, 0xa0, 0x34, 0x9a, 0x1b, 0x91, 0x13, 0x2f, 0x5e, 0x24, 0x68, 0xba, 0xdb, 0xad, 0x0f, 0x37, 0x4e, 0x85, 0x99, 0xe4, 0x0e, 0x49, 0xcf, 0x58, 0x56}, {0x34, 0x4f, 0x85, 0x14, 0x71, 0x10, 0x5f, 0x50, 0x9b, 0x6b, 0x24, 0xc1, 0x8b, 0x92, 0x61, 0xfb, 0x7f, 0x8c, 0xe6, 0xb1, 0x70, 0x74, 0x12, 0xf3, 0xe6, 0x35, 0xab, 0x26, 0x4a, 0xfb, 0xef, 0x15}, {0x41, 0xc8, 0xe1, 0xb9, 0x5b, 0xdb, 0xb5, 0xb0, 0x55, 0x1d, 0xfc, 0x44, 0x42, 0x37, 0xd9, 0x06, 0x59, 0xc8, 0x93, 0x06, 0x93, 0x8b, 0x87, 0xb5, 0xc9, 0x85, 0xca, 0x75, 0xf5, 0xf4, 0x75, 0x5c}, {0x10, 0x6e, 0x34, 0xa2, 0xb8, 0xc7, 0xbb, 0x13, 0x15, 0x6c, 0xfd, 0xd0, 0xd9, 0x13, 0x79, 0xdc, 0xc4, 0x75, 0x43, 0xdc, 0xf9, 0x78, 0x7c, 0x68, 0xae, 0x5e, 0xb5, 0x82, 0x62, 0x0a, 0xe6, 0xe8}, {0xbf, 0xc0, 0xa0, 0x7b, 0xd1, 0xa6, 0xf9, 0x50, 0xba, 0x90, 0x0b, 0x93, 0xce, 0x4d, 0xbd, 0x5b, 0x3a, 0x79, 0x05, 0x49, 0x80, 0xc4, 0xe6, 0x5b, 0x80, 0xb0, 0x1b, 0x7c, 0x18, 0xff, 0xbb, 0x7f}, {0x34, 0x28, 0xc2, 0xa2, 0x6d, 0x9d, 0xf6, 0x5d, 0x91, 0xe6, 0xbe, 0x9c, 0xe6, 0x0b, 0x19, 0x33, 0x79, 0x03, 0x8b, 0x13, 0x16, 0xc1, 0x1e, 0xfc, 0x83, 0x8c, 0x47, 0xc4, 0xb1, 0xc2, 0x7f, 0x01}, {0x12, 0x3b, 0x5b, 0x7e, 0xb8, 0x60, 0x04, 0x27, 0x6c, 0x4e, 0xa6, 0x4f, 0x15, 0xa8, 0x0b, 0x23, 0x4f, 0xdb, 0xa4, 0xcc, 0x4b, 0x25, 0x6a, 0x8c, 0xbc, 0xba, 0x21, 0x4b, 0xd5, 0x2e, 0x7f, 0x52}, {0x18, 0x85, 0x08, 0x04, 0xc9, 0x2e, 0x97, 0xe1, 0x0d, 0xae, 0xac, 0xd8, 0xdd, 0xa0, 0x02, 0x0b, 0xbd, 0x69, 0x6a, 0xf1, 0xf1, 0x9e, 0x1e, 0xe6, 0xdc, 0x19, 0xfa, 0x2c, 0xfc, 0x9b, 0x34, 0xd6}, {0x7a, 0x5e, 0xc2, 0x30, 0x95, 0x16, 0x83, 0x2b, 0x8b, 0x42, 0x87, 0x86, 0x15, 0x11, 0xb8, 0x39, 0x29, 0x20, 0xe2, 0x47, 0x00, 0xcc, 0x5f, 0x17, 0xe2, 0x2b, 0x4f, 0x51, 0x3d, 0x72, 0xdb, 0x15}, {0x00, 0x54, 0x01, 0xf5, 0x8f, 0x96, 0xd3, 0xdd, 0x7a, 0xde, 0x6a, 0xf5, 0x56, 0x5f, 0xa0, 0x4b, 0xc8, 0x8b, 0xc4, 0x65, 0xe7, 0x5c, 0x83, 0xb7, 0x74, 0xd4, 0xad, 0x3a, 0x1c, 0xb5, 0xdf, 0xf3}, {0x37, 0x4b, 0x03, 0xae, 0x83, 0xdf, 0x35, 0x37, 0x53, 0x12, 0x8d, 0x72, 0x37, 0xcc, 0x68, 0xf9, 0xc0, 0x36, 0xf4, 0x2d, 0x91, 0xcf, 0x02, 0xa1, 0x0b, 0x4f, 0x3d, 0x5a, 0x7e, 0xa6, 0x11, 0x94}, {0xfb, 0x0f, 0x7c, 0xaf, 0xbe, 0x9a, 0x6c, 0x0e, 0x2c, 0x6c, 0xb8, 0xcf, 0x75, 0xe3, 0x4f, 0x6d, 0x44, 0x4d, 0x85, 0xee, 0x7d, 0x9e, 0x46, 0x07, 0xea, 0x8b, 0xb0, 0x2d, 0x2d, 0xa6, 0xaa, 0x8f}, {0x90, 0x92, 0x84, 0xa6, 0x98, 0x30, 0xfa, 0x75, 0xc2, 0x51, 0x16, 0x3a, 0xd0, 0x98, 0xc6, 0x39, 0xf5, 0x16, 0x42, 0x52, 0x43, 0x92, 0x11, 0x1e, 0x76, 0xfb, 0x4f, 0x09, 0xb6, 0xd8, 0x31, 0xcc}, {0x30, 0x0c, 0xf9, 0x66, 0xaf, 0x7e, 0x14, 0x1a, 0xa2, 0x83, 0xa8, 0x97, 0xc9, 0x18, 0xe5, 0xcd, 0x7b, 0x88, 0x0b, 0x6c, 0x9f, 0xe5, 0x8f, 0xab, 0x94, 0xde, 0x0b, 0x44, 0x9a, 0x70, 0x9a, 0x83}, {0x8f, 0xd0, 0x5c, 0x6b, 0x9c, 0x2a, 0xab, 0x73, 0xf5, 0xc3, 0xde, 0x11, 0xd0, 0xfb, 0x79, 0x28, 0x50, 0xcd, 0x81, 0xa9, 0xd9, 0x3a, 0xdc, 0xdb, 0x7b, 0x8c, 0x86, 0x0a, 0x75, 0x65, 0x0e, 0xac}, {0x33, 0x6d, 0x8b, 0x57, 0x9a, 0x20, 0x80, 0x57, 0x33, 0xfc, 0x48, 0x4a, 0x65, 0xaa, 0x9e, 0xca, 0x6d, 0x51, 0x2f, 0xd8, 0x9d, 0x38, 0x1f, 0xfc, 0xaf, 0xd7, 0x21, 0x07, 0x3b, 0xae, 0x34, 0xbd}, {0x88, 0xc1, 0xf6, 0xf2, 0x8f, 0xe2, 0xa3, 0xa9, 0xf9, 0x47, 0x9d, 0x2e, 0xd8, 0xff, 0x2c, 0xeb, 0x3b, 0x26, 0x0b, 0x1d, 0x91, 0xa4, 0x7f, 0xc3, 0xaf, 0x00, 0x10, 0x9a, 0xca, 0x4e, 0xdb, 0x52}, {0x46, 0xcc, 0x01, 0xc6, 0xef, 0xc0, 0x31, 0xe0, 0x4c, 0x9b, 0x49, 0x0a, 0x3f, 0xb6, 0x0c, 0x2b, 0x7d, 0x27, 0x3a, 0x35, 0xb0, 0x03, 0xfd, 0x1f, 0x3e, 0x22, 0x7b, 0xc5, 0x8e, 0x88, 0x6c, 0x54}, {0x12, 0x19, 0x18, 0x39, 0xe9, 0x91, 0x63, 0xc2, 0x11, 0xa0, 0xfc, 0x05, 0x14, 0x85, 0xe3, 0xa3, 0x44, 0x43, 0x75, 0x85, 0x29, 0xd3, 0x8e, 0x93, 0xc6, 0xb7, 0x92, 0x6b, 0x82, 0xf2, 0x6d, 0x89}, {0xe0, 0xba, 0xb8, 0xf4, 0xd8, 0x17, 0x2b, 0xa2, 0x45, 0x19, 0x0d, 0x13, 0xc9, 0x41, 0x17, 0xe9, 0x3b, 0x82, 0x16, 0x6c, 0x25, 0xb2, 0xb6, 0x98, 0x83, 0x35, 0x0c, 0x19, 0x2c, 0x90, 0x51, 0x40}, {0x8f, 0xa0, 0xdd, 0x2c, 0x79, 0x8c, 0x5b, 0xba, 0xda, 0x41, 0x5e, 0x5d, 0x11, 0x67, 0xa3, 0x70, 0x72, 0xee, 0x65, 0x55, 0x8a, 0x2c, 0xea, 0x40, 0x8b, 0xc5, 0x21, 0x4c, 0x9f, 0xd2, 0x8f, 0x3c}, {0x49, 0xcb, 0x1d, 0xa7, 0x13, 0xc9, 0x6d, 0xbc, 0xc6, 0xae, 0x4e, 0xb3, 0x42, 0x2a, 0x8c, 0x5d, 0xc8, 0xf1, 0x89, 0x76, 0x78, 0x2f, 0xcd, 0x6c, 0xbc, 0xfc, 0x03, 0x0c, 0x83, 0x54, 0x9e, 0x57}, {0x78, 0x54, 0x9d, 0xab, 0xeb, 0xaa, 0x14, 0xde, 0xe4, 0x9e, 0x98, 0xf0, 0xeb, 0x01, 0xdc, 0xb6, 0xda, 0x5f, 0xb0, 0x61, 0xdd, 0x6d, 0xb1, 0xf2, 0x1f, 0x8f, 0xe4, 0xfb, 0xd7, 0x5b, 0x10, 0x29}, {0xee, 0x9d, 0x28, 0xda, 0xd8, 0x81, 0xd7, 0xf5, 0x91, 0x89, 0x9b, 0x4d, 0x10, 0x5e, 0x38, 0x5b, 0x19, 0x90, 0x11, 0x1f, 0x62, 0x46, 0x34, 0xd3, 0xe1, 0xd5, 0x81, 0x17, 0x7c, 0x2f, 0x04, 0xb0}, {0xc3, 0x8a, 0xd8, 0x54, 0x46, 0x46, 0x7c, 0x23, 0x67, 0x07, 0xb2, 0x37, 0xf3, 0xc4, 0x93, 0x34, 0x17, 0x68, 0x84, 0xe5, 0x91, 0x34, 0xce, 0x52, 0x30, 0xd5, 0xbe, 0xb8, 0x4c, 0xf6, 0x59, 0x29}, {0xc2, 0x85, 0x37, 0xce, 0x34, 0xb0, 0xa1, 0xc9, 0x39, 0xf1, 0xfe, 0xba, 0xcb, 0x14, 0x96, 0xc7, 0xfe, 0xeb, 0xa7, 0x58, 0xfc, 0x86, 0x77, 0x31, 0x3b, 0x98, 0x66, 0xbd, 0xab, 0x42, 0xd2, 0x28}, {0x70, 0x75, 0x94, 0x1a, 0xe1, 0x78, 0x0f, 0x31, 0xb0, 0xf8, 0xf2, 0x30, 0x82, 0x46, 0x81, 0xa8, 0xc7, 0x1a, 0x91, 0x67, 0xb1, 0x29, 0x67, 0xc0, 0xd3, 0xbf, 0x64, 0xff, 0x1e, 0xa6, 0x37, 0xed}, {0x79, 0xf6, 0x22, 0x22, 0xb7, 0xf9, 0xd0, 0xeb, 0x5c, 0xbd, 0x44, 0x59, 0xfc, 0xd4, 0x7f, 0x6d, 0x24, 0x40, 0x03, 0xd4, 0x16, 0x42, 0x7b, 0x06, 0x96, 0x56, 0x07, 0x72, 0xb0, 0x5a, 0x73, 0x59}, {0x2a, 0xea, 0x4b, 0x1d, 0x0c, 0x2b, 0x92, 0x15, 0xbf, 0x36, 0xed, 0x1c, 0x6f, 0xc8, 0x40, 0x5c, 0x86, 0x4a, 0x51, 0x5e, 0x40, 0x55, 0x93, 0x56, 0xa9, 0x84, 0x2a, 0xb6, 0x8c, 0xcd, 0x7e, 0x13}, {0xaf, 0x4d, 0xcd, 0xfe, 0x7a, 0x01, 0x09, 0x42, 0xe3, 0xc5, 0xc6, 0x2d, 0xc1, 0xef, 0x7e, 0x90, 0x5a, 0x2e, 0x71, 0x92, 0x21, 0xf8, 0xb8, 0x3d, 0xe6, 0x57, 0x40, 0x5a, 0xd2, 0x91, 0x65, 0xdf}, {0x2e, 0x57, 0x50, 0xf4, 0xf3, 0xd2, 0x9d, 0x6f, 0xa7, 0x05, 0xbc, 0x0b, 0x0b, 0x89, 0xea, 0xa6, 0xd6, 0x8c, 0x20, 0x21, 0x8c, 0x8e, 0x7f, 0x19, 0x03, 0xca, 0xa3, 0x4c, 0xdf, 0xd4, 0x77, 0x7d}, {0xc5, 0xc4, 0xc0, 0xe2, 0x0c, 0xf3, 0x3c, 0xca, 0xbf, 0x74, 0x12, 0x6a, 0x05, 0x04, 0xc0, 0x62, 0xed, 0xec, 0x23, 0x08, 0xef, 0xfd, 0xda, 0x5d, 0xb8, 0xec, 0x45, 0x9a, 0x4a, 0x88, 0xcf, 0xe7}, {0x3c, 0x8a, 0xf5, 0x98, 0x0a, 0x30, 0xce, 0xde, 0x0a, 0x4a, 0x78, 0x62, 0x57, 0xa4, 0xb2, 0x49, 0x5c, 0x36, 0x05, 0xed, 0xca, 0xc5, 0x85, 0x65, 0x83, 0x90, 0x71, 0xe2, 0xc7, 0x18, 0xd3, 0xdf}, {0x41, 0x56, 0xd9, 0xdc, 0xe7, 0xc7, 0xeb, 0x9b, 0xc1, 0xdf, 0x68, 0x0b, 0x84, 0x72, 0xfd, 0xfc, 0x35, 0xd9, 0xde, 0xb9, 0x33, 0xa2, 0xb7, 0x10, 0xe8, 0x72, 0x10, 0xdf, 0x62, 0xdd, 0x9d, 0xba}, {0x3c, 0x27, 0x7a, 0xb9, 0x06, 0x80, 0x2e, 0x93, 0x66, 0xe0, 0x50, 0x9d, 0x0f, 0x70, 0xed, 0xa2, 0xf1, 0xd1, 0xaa, 0x37, 0x90, 0xc0, 0x10, 0x03, 0xdb, 0xf5, 0xc1, 0x7e, 0x3e, 0x8c, 0x8c, 0x8e}, {0xc4, 0xce, 0x52, 0x70, 0xca, 0x07, 0x17, 0x01, 0xed, 0xc9, 0x01, 0x0d, 0x24, 0xdc, 0x09, 0x9d, 0xaf, 0xc1, 0x71, 0x45, 0xb6, 0xb7, 0x0d, 0xc8, 0x3c, 0x46, 0x18, 0xaf, 0xe0, 0xe2, 0xa0, 0x89}, {0x28, 0x7e, 0xf4, 0x4c, 0x88, 0xc4, 0xce, 0x55, 0xd1, 0x3f, 0x3a, 0xc6, 0x2a, 0xe4, 0xcd, 0x6a, 0x6b, 0xb3, 0xe3, 0x97, 0x57, 0x3f, 0x83, 0x1e, 0xaa, 0x10, 0x58, 0xd9, 0x03, 0x75, 0xbf, 0x41}, {0xeb, 0x63, 0xcd, 0xae, 0xea, 0xce, 0x36, 0xd7, 0x19, 0xac, 0xf4, 0x05, 0x08, 0x25, 0x87, 0x90, 0x04, 0x00, 0x3c, 0xfa, 0x1b, 0xf2, 0x5c, 0x65, 0x2e, 0xc6, 0x43, 0xce, 0xce, 0x1e, 0x2e, 0x08}, {0x3d, 0x62, 0xaa, 0x1a, 0xef, 0xd4, 0x31, 0x3c, 0x81, 0xbc, 0xef, 0x6b, 0x20, 0x80, 0x07, 0x63, 0xdf, 0x5f, 0xb1, 0x1d, 0xac, 0x95, 0xbf, 0x72, 0x33, 0xa0, 0xd6, 0x7f, 0x73, 0xad, 0x56, 0xd0}, {0xcb, 0x66, 0x46, 0xad, 0x84, 0x9f, 0x88, 0x90, 0xbe, 0x64, 0xcb, 0xde, 0x4f, 0xad, 0x68, 0xa2, 0x27, 0x08, 0x82, 0x1e, 0x60, 0x70, 0x43, 0x2f, 0x5f, 0x42, 0xdd, 0x73, 0x34, 0x46, 0xc0, 0x81}, {0xa2, 0xbd, 0x7a, 0x24, 0xc6, 0x9d, 0x2b, 0x25, 0x76, 0xd8, 0xfb, 0x42, 0x71, 0xfc, 0x51, 0x70, 0x5d, 0xbb, 0x16, 0x5d, 0x79, 0xfb, 0x57, 0xff, 0x24, 0x27, 0x75, 0x15, 0xcd, 0x7f, 0x49, 0xd1}, {0xee, 0x84, 0x99, 0xc4, 0x4e, 0xb5, 0xb7, 0x08, 0xc3, 0xb7, 0x99, 0xc1, 0xbd, 0xb3, 0xb2, 0x1f, 0xd6, 0xdb, 0x97, 0x2c, 0x08, 0x1c, 0x52, 0xcc, 0x1c, 0x6e, 0x3d, 0xd6, 0x4d, 0xb4, 0x84, 0xe4}, {0x2c, 0xdc, 0xe3, 0xd6, 0x97, 0xaf, 0x37, 0x16, 0xa9, 0xb3, 0xcd, 0xf0, 0x68, 0xb4, 0x3e, 0x51, 0x38, 0x46, 0xe1, 0x7c, 0xc9, 0xfd, 0x42, 0x79, 0x29, 0xaa, 0xd7, 0x01, 0x65, 0xf2, 0x1d, 0xda}, {0x87, 0xb8, 0x1a, 0xf2, 0xb2, 0xb2, 0x2c, 0xbd, 0xf2, 0x68, 0xe2, 0x11, 0xd0, 0x12, 0xd6, 0x04, 0x89, 0x2d, 0x3c, 0x94, 0x8f, 0xf2, 0x98, 0xd6, 0x1d, 0x6c, 0x94, 0x2e, 0xee, 0x84, 0x7f, 0x86}, {0xed, 0x7e, 0x64, 0xaf, 0xf8, 0x7f, 0xb6, 0x36, 0x98, 0x43, 0xe9, 0x30, 0x5b, 0xe1, 0x3d, 0x0d, 0xaf, 0x34, 0x59, 0xda, 0x4e, 0x1d, 0x25, 0x75, 0xaa, 0x8e, 0x08, 0x80, 0x4e, 0xc0, 0x2d, 0x22}, {0xd2, 0x80, 0x95, 0xd6, 0xc6, 0x20, 0x35, 0xa5, 0x84, 0xc2, 0x9b, 0x0e, 0x36, 0x17, 0xe0, 0xea, 0xe3, 0x45, 0x4b, 0x86, 0xfa, 0xe6, 0xcf, 0xfb, 0xf8, 0x88, 0x43, 0x1a, 0x4c, 0x9d, 0xd7, 0x6a}, {0xc9, 0x47, 0x9e, 0x0e, 0xad, 0xe8, 0xd7, 0x88, 0x7f, 0x0d, 0x03, 0x03, 0x44, 0x6c, 0x07, 0x9b, 0xbe, 0x4e, 0x54, 0xc1, 0x5d, 0x5b, 0xfb, 0xde, 0x84, 0x38, 0x8a, 0x33, 0xe0, 0xc3, 0x54, 0x8e}, {0xc9, 0x42, 0xff, 0xfc, 0x60, 0x82, 0x68, 0xbb, 0xd8, 0xf7, 0xaf, 0xb2, 0x3d, 0x9a, 0x4f, 0xde, 0x41, 0x7d, 0xb6, 0xaa, 0x69, 0xd4, 0x75, 0x25, 0x0a, 0xf8, 0x9c, 0x87, 0xeb, 0x95, 0x58, 0x60}, {0x98, 0x58, 0xf7, 0x10, 0x59, 0xb2, 0xbc, 0xc1, 0x17, 0xdf, 0x33, 0x3d, 0x2b, 0x37, 0xac, 0x19, 0x4b, 0xee, 0x70, 0x73, 0x7d, 0x07, 0x58, 0x97, 0x30, 0x50, 0x32, 0xb3, 0x12, 0x85, 0x93, 0x13}, {0x0e, 0x03, 0xd5, 0xe8, 0xe9, 0x8b, 0x69, 0x15, 0x01, 0xb2, 0x5b, 0xd6, 0x2a, 0xdc, 0x7c, 0x47, 0x83, 0xd8, 0x14, 0xd1, 0x29, 0x70, 0xc3, 0xe3, 0xff, 0x8a, 0x8b, 0xeb, 0x11, 0x19, 0x59, 0xc2}, {0x52, 0x41, 0xdc, 0x10, 0xcb, 0x3c, 0x70, 0x0e, 0x46, 0x44, 0x69, 0x43, 0xd2, 0x7b, 0x97, 0x1f, 0xef, 0xa7, 0xe8, 0x81, 0x15, 0xf8, 0x66, 0xd6, 0xf8, 0x3d, 0x50, 0x2f, 0xf1, 0xbc, 0x06, 0xc2}, } for i := range kat { in := make([]byte, i) do_hash(t, i, in[:], kat[i]) } } func TestReset(t *testing.T) { var d digest var out [32]byte in := []byte("abc") exp := [32]byte{ 0x66, 0xC7, 0xF0, 0xF4, 0x62, 0xEE, 0xED, 0xD9, 0xD1, 0xF2, 0xD4, 0x6B, 0xDC, 0x10, 0xE4, 0xE2, 0x41, 0x67, 0xC4, 0x87, 0x5C, 0xF2, 0xF7, 0xA2, 0x29, 0x7D, 0xA0, 0x2B, 0x8F, 0x4B, 0xA8, 0xE0, } d.Init() d.Write(in[:1]) d.Reset() d.Write(in[:]) copy(out[:], d.Sum(nil)) if out != exp { t.Error("Wrong result") } } func TestSplit(t *testing.T) { var d digest var out [32]byte in := []byte{ 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, } exp := [32]byte{ 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1, 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d, 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65, 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32, } d.Init() d.Write(in[:8]) d.Write(in[8:16]) copy(out[:], d.Sum(in[16:])) if out != exp { t.Error("Wrong result") } } func TestCallSumMultipleTimes(t *testing.T) { var out [32]byte in := []byte{ 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, } exp := [32]byte{ 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1, 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d, 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65, 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32, } d := New() d.Write(in[:10]) d.Sum(nil) // That's done on purpose copy(out[:], d.Sum(in[10:])) if out != exp { t.Error("Wrong result") } } /* ------------------ Benchmarks ------------------- */ var bench = New() var buf = make([]byte, 8192) func benchmarkSize(b *testing.B, size int) { b.SetBytes(int64(size)) for i := 0; i < b.N; i++ { bench.Reset() bench.Write(buf[:size]) bench.Sum(nil) } } func BenchmarkHash8Bytes(b *testing.B) { benchmarkSize(b, 8) } func BenchmarkHash1K(b *testing.B) { benchmarkSize(b, 1024) } func BenchmarkHash8K(b *testing.B) { benchmarkSize(b, 8192) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/kem/000077500000000000000000000000001365325520100223415ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/kem/sike/000077500000000000000000000000001365325520100232745ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/kem/sike/sike.go000066400000000000000000000141341365325520100245610ustar00rootroot00000000000000// [SIKE] http://www.sike.org/files/SIDH-spec.pdf // [REF] https://github.com/Microsoft/PQCrypto-SIDH package sike import ( "crypto/subtle" "errors" "io" // TODO: Use implementation from xcrypto, once PR below merged // https://go-review.googlesource.com/c/crypto/+/111281/ . "github.com/henrydcase/nobs/dh/sidh" cshake "github.com/henrydcase/nobs/hash/sha3" ) // Constants used for cSHAKE customization // Those values are different than in [SIKE] - they are encoded on 16bits. This is // done in order for implementation to be compatible with [REF] and test vectors. var G = []byte{0x00, 0x00} var H = []byte{0x01, 0x00} var F = []byte{0x02, 0x00} // Generates cShake-256 sum func cshakeSum(out, in, S []byte) { h := cshake.NewCShake256(nil, S) h.Write(in) h.Read(out) } func encrypt(skA *PrivateKey, pkA, pkB *PublicKey, ptext []byte) ([]byte, error) { var n [40]byte // n can is max 320-bit (see 1.4 of [SIKE]) var ptextLen = len(ptext) if pkB.Variant() != KeyVariant_SIKE { return nil, errors.New("wrong key type") } j, err := DeriveSecret(skA, pkB) if err != nil { return nil, err } cshakeSum(n[:ptextLen], j, F) for i, _ := range ptext { n[i] ^= ptext[i] } ret := make([]byte, pkA.Size()+ptextLen) copy(ret, pkA.Export()) copy(ret[pkA.Size():], n[:ptextLen]) return ret, nil } // ----------------------------------------------------------------------------- // PKE interface // // Uses SIKE public key to encrypt plaintext. Requires cryptographically secure PRNG // Returns ciphertext in case encryption succeeds. Returns error in case PRNG fails // or wrongly formated input was provided. func Encrypt(rng io.Reader, pub *PublicKey, ptext []byte) ([]byte, error) { var params = pub.Params() var ptextLen = uint(len(ptext)) // c1 must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) if ptextLen != (params.KemSize + 8) { return nil, errors.New("Unsupported message length") } skA := NewPrivateKey(params.Id, KeyVariant_SIDH_A) err := skA.Generate(rng) if err != nil { return nil, err } pkA := skA.GeneratePublicKey() return encrypt(skA, pkA, pub, ptext) } // Uses SIKE private key to decrypt ciphertext. Returns plaintext in case // decryption succeeds or error in case unexptected input was provided. // Constant time func Decrypt(prv *PrivateKey, ctext []byte) ([]byte, error) { var params = prv.Params() var n [40]byte // n can is max 320-bit (see 1.4 of [SIKE]) var c1_len int var pk_len = params.PublicKeySize if prv.Variant() != KeyVariant_SIKE { return nil, errors.New("wrong key type") } // ctext is a concatenation of (pubkey_A || c1=ciphertext) // it must be security level + 64 bits (see [SIKE] 1.4 and 4.3.3) c1_len = len(ctext) - pk_len if c1_len != (int(params.KemSize) + 8) { return nil, errors.New("wrong size of cipher text") } c0 := NewPublicKey(params.Id, KeyVariant_SIDH_A) err := c0.Import(ctext[:pk_len]) if err != nil { return nil, err } j, err := DeriveSecret(prv, c0) if err != nil { return nil, err } cshakeSum(n[:c1_len], j, F) for i, _ := range n[:c1_len] { n[i] ^= ctext[pk_len+i] } return n[:c1_len], nil } // ----------------------------------------------------------------------------- // KEM interface // // Encapsulation receives the public key and generates SIKE ciphertext and shared secret. // The generated ciphertext is used for authentication. // The rng must be cryptographically secure PRNG. // Error is returned in case PRNG fails or wrongly formated input was provided. func Encapsulate(rng io.Reader, pub *PublicKey) (ctext []byte, secret []byte, err error) { var params = pub.Params() // Buffer for random, secret message var ptext = make([]byte, params.MsgLen) // r = G(ptext||pub) var r = make([]byte, params.A.SecretByteLen) // Resulting shared secret secret = make([]byte, params.KemSize) // Generate ephemeral value _, err = io.ReadFull(rng, ptext) if err != nil { return nil, nil, err } h := cshake.NewCShake256(nil, G) h.Write(ptext) h.Write(pub.Export()) h.Read(r) // cSHAKE256 implementation is byte oriented. Ensure bitlength is not bigger then to 2^e2-1 r[len(r)-1] &= (1 << (params.A.SecretBitLen % 8)) - 1 // (c0 || c1) = Enc(pkA, ptext; r) skA := NewPrivateKey(params.Id, KeyVariant_SIDH_A) err = skA.Import(r) if err != nil { return nil, nil, err } pkA := skA.GeneratePublicKey() ctext, err = encrypt(skA, pkA, pub, ptext) if err != nil { return nil, nil, err } // K = H(ptext||(c0||c1)) h = cshake.NewCShake256(nil, H) h.Write(ptext) h.Write(ctext) h.Read(secret) return ctext, secret, nil } // Decapsulate given the keypair and ciphertext as inputs, Decapsulate outputs a shared // secret if plaintext verifies correctly, otherwise function outputs random value. // Decapsulation may fail in case input is wrongly formated. // Constant time for properly initialized input. func Decapsulate(prv *PrivateKey, pub *PublicKey, ctext []byte) ([]byte, error) { var params = pub.Params() var r = make([]byte, params.A.SecretByteLen) // Resulting shared secret var secret = make([]byte, params.KemSize) var skA = NewPrivateKey(params.Id, KeyVariant_SIDH_A) m, err := Decrypt(prv, ctext) if err != nil { return nil, err } // r' = G(m'||pub) h := cshake.NewCShake256(nil, G) h.Write(m) h.Write(pub.Export()) h.Read(r) // cSHAKE256 implementation is byte oriented: Ensure bitlength is not bigger than 2^e2-1 r[len(r)-1] &= (1 << (params.A.SecretBitLen % 8)) - 1 // Never fails skA.Import(r) // Never fails pkA := skA.GeneratePublicKey() c0 := pkA.Export() h = cshake.NewCShake256(nil, H) if subtle.ConstantTimeCompare(c0, ctext[:len(c0)]) == 1 { h.Write(m) } else { // S is chosen at random when generating a key and unknown to other party. It // may seem weird, but it's correct. It is important that S is unpredictable // to other party. Without this check, it is possible to recover a secret, by // providing series of invalid ciphertexts. It is also important that in case // // See more details in "On the security of supersingular isogeny cryptosystems" // (S. Galbraith, et al., 2016, ePrint #859). h.Write(prv.S) } h.Write(ctext) h.Read(secret) return secret, nil } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/kem/sike/sike_test.go000066400000000000000000000313361365325520100256230ustar00rootroot00000000000000package sike import ( "testing" "bufio" "bytes" "encoding/hex" "io" "os" "strings" "fmt" rand "crypto/rand" . "github.com/henrydcase/nobs/dh/sidh" ) const ( PkB = "7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57" PrB = "00010203040506070809000102030405060708090001020304050607080901028626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201" ) var params = Params(FP_751) type MultiIdTestingFunc func(*testing.T, uint8) func Do(f MultiIdTestingFunc, t *testing.T) { for id, val := range tdata { params = Params(id) fmt.Printf("\tTesting: %s\n", val.name) f(t, id) } } var tdata = map[uint8]struct { name string KatFile string PkB string PrB string }{ FP_503: { "P-503", "../../etc/PQCkemKAT_434.rsp", "F11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C", "9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6735A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DD0D"}, FP_751: { "P-751", "../../etc/PQCkemKAT_644.rsp", "7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57", "00010203040506070809000102030405060708090001020304050607080901028626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201"}, } // Fail if err !=nil. Display msg as an error message func checkErr(t testing.TB, err error, msg string) { if err != nil { t.Errorf("%s [%s]", msg, err) } } // Encrypt, Decrypt, check if input/output plaintext is the same func testPKERoundTrip(t *testing.T, id uint8) { // Message to be encrypted var params = Params(id) var msg = make([]byte, params.MsgLen) for i, _ := range msg { msg[i] = byte(i) } // Import keys pkB := NewPublicKey(params.Id, KeyVariant_SIKE) skB := NewPrivateKey(params.Id, KeyVariant_SIKE) pk_hex, err := hex.DecodeString(tdata[id].PkB) if err != nil { t.Fatal(err) } sk_hex, err := hex.DecodeString(tdata[id].PrB) if err != nil { t.Fatal(err) } if pkB.Import(pk_hex) != nil || skB.Import(sk_hex) != nil { t.Error("Import") } ct, err := Encrypt(rand.Reader, pkB, msg[:]) if err != nil { t.Fatal(err) } pt, err := Decrypt(skB, ct) if err != nil { t.Fatal(err) } if !bytes.Equal(pt[:], msg[:]) { t.Errorf("Decryption failed \n got : %X\n exp : %X", pt, msg) } } // Generate key and check if can encrypt func testPKEKeyGeneration(t *testing.T, id uint8) { // Message to be encrypted var params = Params(id) var msg = make([]byte, params.MsgLen) var err error for i, _ := range msg { msg[i] = byte(i) } sk := NewPrivateKey(id, KeyVariant_SIKE) err = sk.Generate(rand.Reader) checkErr(t, err, "PEK key generation") pk := sk.GeneratePublicKey() // Try to encrypt ct, err := Encrypt(rand.Reader, pk, msg[:]) checkErr(t, err, "PEK encryption") pt, err := Decrypt(sk, ct) checkErr(t, err, "PEK key decryption") if !bytes.Equal(pt[:], msg[:]) { t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg) } } func testNegativePKE(t *testing.T, id uint8) { var msg [40]byte var err error var params = Params(id) // Generate key sk := NewPrivateKey(params.Id, KeyVariant_SIKE) err = sk.Generate(rand.Reader) checkErr(t, err, "key generation") pk := sk.GeneratePublicKey() // bytelen(msg) - 1 ct, err := Encrypt(rand.Reader, pk, msg[:params.KemSize+8-1]) if err == nil { t.Fatal("Error hasn't been returned") } if ct != nil { t.Fatal("Ciphertext must be nil") } // KemSize - 1 pt, err := Decrypt(sk, msg[:params.KemSize+8-1]) if err == nil { t.Fatal("Error hasn't been returned") } if pt != nil { t.Fatal("Ciphertext must be nil") } } func testKEMRoundTrip(t *testing.T, pkB, skB []byte, id uint8) { // Import keys pk := NewPublicKey(id, KeyVariant_SIKE) sk := NewPrivateKey(id, KeyVariant_SIKE) if pk.Import(pkB) != nil || sk.Import(skB) != nil { t.Error("Import failed") } ct, ss_e, err := Encapsulate(rand.Reader, pk) if err != nil { t.Error("Encapsulate failed") } ss_d, err := Decapsulate(sk, pk, ct) if err != nil { t.Error("Decapsulate failed") } if !bytes.Equal(ss_e, ss_d) { t.Error("Shared secrets from decapsulation and encapsulation differ") } } func TestKEMRoundTrip(t *testing.T) { for id, val := range tdata { fmt.Printf("\tTesting: %s\n", val.name) pk, err := hex.DecodeString(tdata[id].PkB) checkErr(t, err, "public key B not a number") sk, err := hex.DecodeString(tdata[id].PrB) checkErr(t, err, "private key B not a number") testKEMRoundTrip(t, pk, sk, id) } } func testKEMKeyGeneration(t *testing.T, id uint8) { // Generate key sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() // calculated shared secret ct, ss_e, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "encapsulation failed") ss_d, err := Decapsulate(sk, pk, ct) checkErr(t, err, "decapsulation failed") if !bytes.Equal(ss_e, ss_d) { t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ss_d, ss_e) } } func testNegativeKEM(t *testing.T, id uint8) { sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() ct, ss_e, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "pre-requisite for a test failed") ct[0] = ct[0] - 1 ss_d, err := Decapsulate(sk, pk, ct) checkErr(t, err, "decapsulation returns error when invalid ciphertext provided") if bytes.Equal(ss_e, ss_d) { // no idea how this could ever happen, but it would be very bad t.Error("critical error") } // Try encapsulating with SIDH key pkSidh := NewPublicKey(params.Id, KeyVariant_SIDH_B) prSidh := NewPrivateKey(params.Id, KeyVariant_SIDH_B) _, _, err = Encapsulate(rand.Reader, pkSidh) if err == nil { t.Error("encapsulation accepts SIDH public key") } // Try decapsulating with SIDH key _, err = Decapsulate(prSidh, pk, ct) if err == nil { t.Error("decapsulation accepts SIDH private key key") } } // In case invalid ciphertext is provided, SIKE's decapsulation must // return same (but unpredictable) result for a given key. func testNegativeKEMSameWrongResult(t *testing.T, id uint8) { sk := NewPrivateKey(id, KeyVariant_SIKE) checkErr(t, sk.Generate(rand.Reader), "error: key generation") pk := sk.GeneratePublicKey() ct, encSs, err := Encapsulate(rand.Reader, pk) checkErr(t, err, "pre-requisite for a test failed") // make ciphertext wrong ct[0] = ct[0] - 1 decSs1, err := Decapsulate(sk, pk, ct) checkErr(t, err, "pre-requisite for a test failed") // second decapsulation must be done with same, but imported private key expSk := sk.Export() // creat new private key sk = NewPrivateKey(params.Id, KeyVariant_SIKE) err = sk.Import(expSk) checkErr(t, err, "import failed") // try decapsulating again. ss2 must be same as ss1 and different than // original plaintext decSs2, err := Decapsulate(sk, pk, ct) checkErr(t, err, "pre-requisite for a test failed") if !bytes.Equal(decSs1, decSs2) { t.Error("decapsulation is insecure") } if bytes.Equal(encSs, decSs1) || bytes.Equal(encSs, decSs2) { // this test requires that decapsulation returns wrong result t.Errorf("test implementation error") } } func readAndCheckLine(r *bufio.Reader) []byte { // Read next line from buffer line, isPrefix, err := r.ReadLine() if err != nil || isPrefix { panic("Wrong format of input file") } // Function expects that line is in format "KEY = HEX_VALUE". Get // value, which should be a hex string hexst := strings.Split(string(line), "=")[1] hexst = strings.TrimSpace(hexst) // Convert value to byte string ret, err := hex.DecodeString(hexst) if err != nil { panic("Wrong format of input file") } return ret } func testKeygen(pk, sk []byte) bool { // Import provided private key var prvKey = NewPrivateKey(params.Id, KeyVariant_SIKE) if prvKey.Import(sk) != nil { panic("sike test: can't load KAT") } // Generate public key pubKey := prvKey.GeneratePublicKey() return bytes.Equal(pubKey.Export(), pk) } func testDecapsulation(pk, sk, ct, ssExpected []byte) bool { var pubKey = NewPublicKey(params.Id, KeyVariant_SIKE) var prvKey = NewPrivateKey(params.Id, KeyVariant_SIKE) if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil { panic("sike test: can't load KAT") } ssGot, err := Decapsulate(prvKey, pubKey, ct) if err != nil { panic("sike test: can't perform decapsulation KAT") } if err != nil { return false } return bytes.Equal(ssGot, ssExpected) } func testSIKE_KAT(t *testing.T, id uint8) { f, err := os.Open(tdata[id].KatFile) if err != nil { t.Fatal(err) } r := bufio.NewReader(f) for { line, isPrefix, err := r.ReadLine() if err != nil || isPrefix { if err == io.EOF { break } else { t.Fatal(err) } } if len(strings.TrimSpace(string(line))) == 0 || line[0] == '#' { continue } // count count := strings.Split(string(line), "=")[1] // seed _ = readAndCheckLine(r) // pk pk := readAndCheckLine(r) // sk (secret key in test vector is concatenation of // MSG + SECRET_BOB_KEY + PUBLIC_BOB_KEY. We use only MSG+SECRET_BOB_KEY sk := readAndCheckLine(r) sk = sk[:params.MsgLen+uint(params.B.SecretByteLen)] // ct ct := readAndCheckLine(r) // ss ss := readAndCheckLine(r) if !testKeygen(pk, sk) { t.Fatalf("KAT keygen form private failed at %s\n", count) } if !testDecapsulation(pk, sk, ct, ss) { t.Fatalf("KAT decapsulation failed at %s\n", count) } // aditionally test roundtrip with a keypair testKEMRoundTrip(t, pk, sk, id) } } // Interface to "testing" func TestPKEKeyGeneration(t *testing.T) { Do(testPKEKeyGeneration, t) } func TestPKERoundTrip(t *testing.T) { Do(testPKERoundTrip, t) } func TestNegativePKE(t *testing.T) { Do(testNegativePKE, t) } func TestKEMKeyGeneration(t *testing.T) { Do(testKEMKeyGeneration, t) } func TestNegativeKEM(t *testing.T) { Do(testNegativeKEM, t) } func TestSIKE_KAT(t *testing.T) { Do(testSIKE_KAT, t) } func TestNegativeKEMSameWrongResult(t *testing.T) { Do(testNegativeKEMSameWrongResult, t) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/utils/000077500000000000000000000000001365325520100227255ustar00rootroot00000000000000golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/utils/cpu.go000066400000000000000000000003601365325520100240420ustar00rootroot00000000000000package utils type x86 struct { // Signals support for MULX which is in BMI2 HasBMI2 bool // Signals support for ADX HasADX bool // Signals support for AES HasAES bool // Signals support for RDSEED HasRDSEED bool } var X86 x86 golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/utils/cpuid_amd64.go000066400000000000000000000016341365325520100253570ustar00rootroot00000000000000// +build amd64,!noasm // Sets capabilities flags for x86 according to information received from // CPUID. It was written in accordance with // "Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A". // https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html package utils // Performs CPUID and returns values of registers // go:nosplit func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) // Returns true in case bit 'n' in 'bits' is set, otherwise false func bitn(bits uint32, n uint8) bool { return (bits>>n)&1 == 1 } func init() { // CPUID returns max possible input that can be requested max, _, _, _ := cpuid(0, 0) if max < 7 { return } _, ecx, _, _ := cpuid(1, 0) X86.HasAES = bitn(ecx, 25) _, ebx, _, _ := cpuid(7, 0) X86.HasBMI2 = bitn(ebx, 8) X86.HasADX = bitn(ebx, 19) X86.HasRDSEED = bitn(ebx, 18) } golang-github-henrydcase-nobs-0.1+git20200305.7d891c7/utils/cpuid_amd64.s000066400000000000000000000003641365325520100252130ustar00rootroot00000000000000// +build amd64,!noasm #include "textflag.h" TEXT ·cpuid(SB), NOSPLIT, $0-4 MOVL eaxArg+0(FP), AX MOVL ecxArg+4(FP), CX CPUID MOVL AX, eax+8(FP) MOVL BX, ebx+12(FP) MOVL CX, ecx+16(FP) MOVL DX, edx+20(FP) RET