From 8502a194d731d4d1797554f3581b7d0c1ad46e0d Mon Sep 17 00:00:00 2001 From: Jacob Appelbaum Date: Sat, 11 May 2024 01:27:24 +0200 Subject: [PATCH] Golang cgo bindings and CI tests This updates the Golang bindings originally written by David Stainton for the Katzenpost Mixnet fork and uses the latest SPHINCS+ reference implementation. This branch enhances the bindings to parameterize building, and to perform comprehensive testing for all parameter sets on GNU/Linux, MacOS, and Windows. --- .github/workflows/test-ref-golang-windows.yml | 74 ++++++++++ .github/workflows/test-ref-golang.yml | 45 ++++++ .../{test-ref.yml => test-ref.yml.disable} | 4 +- go.mod | 12 ++ go.sum | 19 +++ ref/Makefile | 2 +- ref/PQCgenKAT_sign.c | 1 + ref/binding.go | 139 ++++++++++++++++++ ref/binding_test.go | 68 +++++++++ ref/fips202.c | 2 + ref/haraka.c | 2 + ref/hash_haraka.c | 2 + ref/hash_sha2.c | 4 +- ref/hash_shake.c | 2 + ref/params.h | 5 +- ref/params/params-sphincs-haraka-128f.go | 5 + ref/params/params-sphincs-haraka-128s.go | 5 + ref/params/params-sphincs-haraka-192f.go | 5 + ref/params/params-sphincs-haraka-192s.go | 5 + ref/params/params-sphincs-haraka-256f.go | 5 + ref/params/params-sphincs-haraka-256s.go | 5 + ref/params/params-sphincs-sha2-128f.go | 5 + ref/params/params-sphincs-sha2-128s.go | 5 + ref/params/params-sphincs-sha2-192f.go | 5 + ref/params/params-sphincs-sha2-192s.go | 5 + ref/params/params-sphincs-sha2-256f.go | 5 + ref/params/params-sphincs-sha2-256s.go | 5 + ref/params/params-sphincs-shake-128f.go | 5 + ref/params/params-sphincs-shake-128s.go | 5 + ref/params/params-sphincs-shake-192f.go | 5 + ref/params/params-sphincs-shake-192s.go | 5 + ref/params/params-sphincs-shake-256f.go | 5 + ref/params/params-sphincs-shake-256s.go | 5 + ref/params/params.go | 7 + ref/params/params_test.go | 17 +++ ref/params/tests/vector_generic_test.go | 24 +++ .../tests/vector_sphincs_haraka_128f_test.go | 36 +++++ .../tests/vector_sphincs_haraka_128s_test.go | 36 +++++ .../tests/vector_sphincs_haraka_192f_test.go | 36 +++++ .../tests/vector_sphincs_haraka_192s_test.go | 36 +++++ .../tests/vector_sphincs_haraka_256f_test.go | 36 +++++ .../tests/vector_sphincs_haraka_256s_test.go | 36 +++++ .../tests/vector_sphincs_sha2_128f_test.go | 36 +++++ .../tests/vector_sphincs_sha2_128s_test.go | 36 +++++ .../tests/vector_sphincs_sha2_192f_test.go | 36 +++++ .../tests/vector_sphincs_sha2_192s_test.go | 36 +++++ .../tests/vector_sphincs_sha2_256f_test.go | 36 +++++ .../tests/vector_sphincs_sha2_256s_test.go | 36 +++++ .../tests/vector_sphincs_shake_128f_test.go | 36 +++++ .../tests/vector_sphincs_shake_128s_test.go | 36 +++++ .../tests/vector_sphincs_shake_192f_test.go | 36 +++++ .../tests/vector_sphincs_shake_192s_test.go | 36 +++++ .../tests/vector_sphincs_shake_256f_test.go | 36 +++++ .../tests/vector_sphincs_shake_256s_test.go | 36 +++++ ref/randombytes.c | 3 +- ref/randombytes_win.c | 20 +++ ref/randombytes_win.h | 13 ++ ref/rng.c | 11 +- ref/scheme.go | 9 ++ ref/scheme_test.go | 13 ++ ref/sha2.c | 2 + ref/thash_haraka_robust.c | 2 + ref/thash_haraka_simple.c | 2 + ref/thash_sha2_robust.c | 2 + ref/thash_sha2_simple.c | 2 + ref/thash_shake_robust.c | 2 + ref/thash_shake_simple.c | 2 + 67 files changed, 1235 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/test-ref-golang-windows.yml create mode 100644 .github/workflows/test-ref-golang.yml rename .github/workflows/{test-ref.yml => test-ref.yml.disable} (88%) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 ref/binding.go create mode 100644 ref/binding_test.go create mode 100644 ref/params/params-sphincs-haraka-128f.go create mode 100644 ref/params/params-sphincs-haraka-128s.go create mode 100644 ref/params/params-sphincs-haraka-192f.go create mode 100644 ref/params/params-sphincs-haraka-192s.go create mode 100644 ref/params/params-sphincs-haraka-256f.go create mode 100644 ref/params/params-sphincs-haraka-256s.go create mode 100644 ref/params/params-sphincs-sha2-128f.go create mode 100644 ref/params/params-sphincs-sha2-128s.go create mode 100644 ref/params/params-sphincs-sha2-192f.go create mode 100644 ref/params/params-sphincs-sha2-192s.go create mode 100644 ref/params/params-sphincs-sha2-256f.go create mode 100644 ref/params/params-sphincs-sha2-256s.go create mode 100644 ref/params/params-sphincs-shake-128f.go create mode 100644 ref/params/params-sphincs-shake-128s.go create mode 100644 ref/params/params-sphincs-shake-192f.go create mode 100644 ref/params/params-sphincs-shake-192s.go create mode 100644 ref/params/params-sphincs-shake-256f.go create mode 100644 ref/params/params-sphincs-shake-256s.go create mode 100644 ref/params/params.go create mode 100644 ref/params/params_test.go create mode 100644 ref/params/tests/vector_generic_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_128f_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_128s_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_192f_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_192s_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_256f_test.go create mode 100644 ref/params/tests/vector_sphincs_haraka_256s_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_128f_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_128s_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_192f_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_192s_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_256f_test.go create mode 100644 ref/params/tests/vector_sphincs_sha2_256s_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_128f_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_128s_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_192f_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_192s_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_256f_test.go create mode 100644 ref/params/tests/vector_sphincs_shake_256s_test.go create mode 100644 ref/randombytes_win.c create mode 100644 ref/randombytes_win.h create mode 100644 ref/scheme.go create mode 100644 ref/scheme_test.go diff --git a/.github/workflows/test-ref-golang-windows.yml b/.github/workflows/test-ref-golang-windows.yml new file mode 100644 index 0000000..01196dd --- /dev/null +++ b/.github/workflows/test-ref-golang-windows.yml @@ -0,0 +1,74 @@ +name: Windows Msys2 64bit (msvcrt,ucrt) gcc golang build and test + +on: [push] + +jobs: + windows-build-and-test-golang: + runs-on: ${{ matrix.os }} + strategy: + matrix: + OS: ["windows-2019", "windows-2022"] + CC: ["gcc"] + ENVIRONMENT: ["UCRT64", "MINGW64"] # https://www.msys2.org/docs/environments/ + go-version: ["1.22.x"] + hash: + - sha2 + - shake + - haraka + size: + - 128 + - 192 + - 256 + option: + - s + - f + thash: + - simple + - robust + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: Set up Msys2 + uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.ENVIRONMENT }} + install: >- + base-devel + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-pkg-config + mingw-w64-x86_64-gcc + mingw-w64-ucrt-x86_64-gcc + mingw-w64-x86_64-go + mingw-w64-ucrt-x86_64-go + make + git + gcc + + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Gather runtime environment + shell: msys2 {0} + run: | + echo ${{ matrix.ENVIRONMENT }} + uname -a + bash --version + ${{ matrix.CC }} -v + go version + + - name: Build golang + shell: msys2 {0} + run: | + export CGO_ENABLE=1 + export CGO_CFLAGS="-D HASH=${{ matrix.hash }} -D THASH=${{ matrix.thash }} -D PARAMS=sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }}" + go build --tags=sphincs_${{ matrix.hash }}_${{ matrix.size }}${{ matrix.option }} -v ./... + + - name: Golang test + shell: msys2 {0} + run: | + export CGO_ENABLE=1 + export CGO_CFLAGS="-D HASH=${{ matrix.hash }} -D THASH=${{ matrix.thash }} -D PARAMS=sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }}" + go test --tags=sphincs_${{ matrix.hash }}_${{ matrix.size }}${{ matrix.option }} -v ./... diff --git a/.github/workflows/test-ref-golang.yml b/.github/workflows/test-ref-golang.yml new file mode 100644 index 0000000..04bf0f5 --- /dev/null +++ b/.github/workflows/test-ref-golang.yml @@ -0,0 +1,45 @@ +name: Tests golang bindings for ref implementation + +on: + - push + - pull_request + +jobs: + build: + runs-on: ${{ matrix.OS }} + strategy: + matrix: + hash: + - sha2 + - shake + - haraka + size: + - 128 + - 192 + - 256 + option: + - s + - f + thash: + - simple + - robust + OS: ["ubuntu-latest", "macos-latest"] + go-version: ["1.20"] + #go-version: ["1.22.x"] + # later: go-version: ["1.19", "1.20", "1.21.x", "1.22.x"] + fail-fast: false + steps: + - uses: actions/checkout@v4 + + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + + - name: Run go test + run: | + export CGO_ENABLE=1 + export CGO_CFLAGS=" -D HASH=${{ matrix.hash }} -D THASH=${{ matrix.thash }} -D PARAMS=sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }}" + go test --tags=sphincs_${{ matrix.hash }}_${{ matrix.size }}${{ matrix.option }} -v ./... + +# vim: set ft=yaml ts=2 sw=2 et : diff --git a/.github/workflows/test-ref.yml b/.github/workflows/test-ref.yml.disable similarity index 88% rename from .github/workflows/test-ref.yml rename to .github/workflows/test-ref.yml.disable index b97ded2..fdeb018 100644 --- a/.github/workflows/test-ref.yml +++ b/.github/workflows/test-ref.yml.disable @@ -28,8 +28,8 @@ jobs: - name: Run make run: | make -C ref HASH=${{ matrix.hash }} THASH=${{ matrix.thash }} clean - make -C ref HASH=${{ matrix.hash }} THASH=${{ matrix.thash }} PARAMS=sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }} tests - make -C ref HASH=${{ matrix.hash }} THASH=${{ matrix.thash }} PARAMS=sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }} test + make -C ref HASH=${{ matrix.hash }} THASH=${{ matrix.thash }} PARAMS=sphincs_${{ matrix.hash }}_${{ matrix.size }}${{ matrix.option }} tests + make -C ref HASH=${{ matrix.hash }} THASH=${{ matrix.thash }} PARAMS=sphincs_${{ matrix.hash }}_${{ matrix.size }}${{ matrix.option }} test make -C ref THASH=${{ matrix.thash }} PQCgenKAT_sign - name: Run PQCgenKAT_sign run: python3 vectors.py sphincs-${{ matrix.hash }}-${{ matrix.size }}${{ matrix.option }}-${{ matrix.thash }} ref diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..542d4c6 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module github.com/katzenpost/sphincsplus + +go 1.20 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/katzenpost/hpqc v0.0.0-20240114190904-bc8bcfcca4ee // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..26f54eb --- /dev/null +++ b/go.sum @@ -0,0 +1,19 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/katzenpost/hpqc v0.0.0-20240114190904-bc8bcfcca4ee h1:MiBBJNXAJkgv7asTOzrL0lbsL+UIFaFlm13boWz4Fxs= +github.com/katzenpost/hpqc v0.0.0-20240114190904-bc8bcfcca4ee/go.mod h1:i2+fQVPYzpv+WoZcN0KQqjQLEc/AgzRYwAFjYC/LiHg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/ref/Makefile b/ref/Makefile index a3aabad..711c5ec 100644 --- a/ref/Makefile +++ b/ref/Makefile @@ -1,4 +1,4 @@ -PARAMS = sphincs-haraka-128f +PARAMS ?= sphincs-haraka-128f THASH = robust CC=/usr/bin/gcc diff --git a/ref/PQCgenKAT_sign.c b/ref/PQCgenKAT_sign.c index 16f41c1..c7c95d2 100644 --- a/ref/PQCgenKAT_sign.c +++ b/ref/PQCgenKAT_sign.c @@ -1,3 +1,4 @@ +// +build PQCgenKAT_sign // // PQCgenKAT_sign.c diff --git a/ref/binding.go b/ref/binding.go new file mode 100644 index 0000000..f79bec5 --- /dev/null +++ b/ref/binding.go @@ -0,0 +1,139 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package sphincsplus + +//#cgo amd64 LDFLAGS: -L./ +//#cgo amd64 CFLAGS: -O3 -std=c99 -D CGO=1 +//#cgo darwin/amd64 LDFLAGS: -L./ +//#cgo darwin/amd64 CFLAGS: -O3 -std=c99 -D CGO=1 +//#cgo linux/amd64 LDFLAGS: -L./ -L/usr/lib/x86_64-linux-gnu/ +//#cgo linux/amd64 CFLAGS: -O3 -std=c99 -D CGO=1 +//#include "api.h" +import "C" +import ( + "fmt" + "unsafe" + + "github.com/katzenpost/sphincsplus/ref/params" +) + +var ( + + // PublicKeySize is the size in bytes of the public key. + PublicKeySize int = C.CRYPTO_PUBLICKEYBYTES + + // PrivateKeySize is the size in bytes of the private key. + PrivateKeySize int = C.CRYPTO_SECRETKEYBYTES + + // SignatureSize is the size in bytes of the signature. + SignatureSize int = C.CRYPTO_BYTES + + // SignatureName is the parameterized signature system name + + // Name returns the string naming of the current + // Sphincs+ that this binding is being used with. + SignatureName = params.Name() + + // ErrPublicKeySize indicates the raw data is not the correct size for a public key. + ErrPublicKeySize error = fmt.Errorf("%s: raw public key data size is wrong", Name()) + + // ErrPrivateKeySize indicates the raw data is not the correct size for a private key. + ErrPrivateKeySize error = fmt.Errorf("%s: raw private key data size is wrong", Name()) +) + +func SchemeName() string { + return SignatureName +} + +// NewKeypair generates a new Sphincs+ keypair. +func NewKeypair() (*PrivateKey, *PublicKey) { + privKey := &PrivateKey{ + privateKey: make([]byte, C.CRYPTO_SECRETKEYBYTES), + } + pubKey := &PublicKey{ + publicKey: make([]byte, C.CRYPTO_PUBLICKEYBYTES), + } + C.crypto_sign_keypair((*C.uchar)(unsafe.Pointer(&pubKey.publicKey[0])), + (*C.uchar)(unsafe.Pointer(&privKey.privateKey[0]))) + return privKey, pubKey +} + +// PublicKey is a public Sphincs+ key. +type PublicKey struct { + publicKey []byte +} + +// Verify checks whether the given signature is valid. +func (p *PublicKey) Verify(signature, message []byte) bool { + ret := C.crypto_sign_verify((*C.uchar)(unsafe.Pointer(&signature[0])), + C.size_t(len(signature)), + (*C.uchar)(unsafe.Pointer(&message[0])), + C.size_t(len(message)), + (*C.uchar)(unsafe.Pointer(&p.publicKey[0]))) + if ret == 0 { + return true + } + return false +} + +// Bytes returns the PublicKey as a byte slice. +func (p *PublicKey) Bytes() []byte { + return p.publicKey +} + +// FromBytes loads a PublicKey from the given byte slice. +func (p *PublicKey) FromBytes(data []byte) error { + if len(data) != PublicKeySize { + return ErrPublicKeySize + } + + p.publicKey = data + return nil +} + +// Verify checks whether the given signature is valid. +/* +func (p *PublicKey) Verify(signature, message []byte) bool { + ret := C.crypto_sign_verify((*C.uchar)(unsafe.Pointer(&signature[0])), + C.ulong(len(signature)), + (*C.uchar)(unsafe.Pointer(&message[0])), + C.ulong(len(message)), + (*C.uchar)(unsafe.Pointer(&p.publicKey[0]))) + if ret == 0 { + return true + } + return false +} +*/ + +// PrivateKey is a private Sphincs+ key. +type PrivateKey struct { + privateKey []byte +} + +// Sign signs the given message and returns the signature. +func (p *PrivateKey) Sign(message []byte) []byte { + signature := make([]byte, C.CRYPTO_BYTES) + sigLen := C.size_t(C.CRYPTO_BYTES) + C.crypto_sign_signature((*C.uchar)(unsafe.Pointer(&signature[0])), + &sigLen, + (*C.uchar)(unsafe.Pointer(&message[0])), + (C.size_t)(len(message)), + (*C.uchar)(unsafe.Pointer(&p.privateKey[0]))) + return signature +} + +// Bytes returns the PrivateKey as a byte slice. +func (p *PrivateKey) Bytes() []byte { + return p.privateKey +} + +// FromBytes loads a PrivateKey from the given byte slice. +func (p *PrivateKey) FromBytes(data []byte) error { + if len(data) != PrivateKeySize { + return ErrPrivateKeySize + } + + p.privateKey = data + return nil +} diff --git a/ref/binding_test.go b/ref/binding_test.go new file mode 100644 index 0000000..1b2b75f --- /dev/null +++ b/ref/binding_test.go @@ -0,0 +1,68 @@ +//go:build ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package sphincsplus + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSignVerify(t *testing.T) { + t.Parallel() + privKey1, pubKey1 := NewKeypair() + message := []byte("i am a message") + sig1 := privKey1.Sign(message) + require.True(t, pubKey1.Verify(sig1, message)) + + privKey2, pubKey2 := NewKeypair() + require.False(t, pubKey2.Verify(sig1, message)) + + sig2 := privKey2.Sign(message) + require.True(t, pubKey2.Verify(sig2, message)) + require.False(t, pubKey1.Verify(sig2, message)) + + // non-determinism + sig3 := privKey1.Sign(message) + require.NotEqual(t, sig1, sig3) +} + +func TestSerialization(t *testing.T) { + t.Parallel() + privKey1, pubKey1 := NewKeypair() + message := []byte("i am a message") + sig := privKey1.Sign(message) + require.True(t, pubKey1.Verify(sig, message)) + + pubKeyBytes1 := pubKey1.Bytes() + pubKey2 := &PublicKey{} + err := pubKey2.FromBytes(pubKeyBytes1) + require.NoError(t, err) + require.True(t, pubKey2.Verify(sig, message)) + require.False(t, pubKey2.Verify(sig, message[:len(message)-3])) + + privKeyBytes2 := privKey1.Bytes() + privKey2 := &PrivateKey{} + err = privKey2.FromBytes(privKeyBytes2) + require.NoError(t, err) + sig2 := privKey2.Sign(message) + require.True(t, pubKey1.Verify(sig2, message)) + require.True(t, pubKey2.Verify(sig2, message)) +} + +func TestSizes(t *testing.T) { + t.Parallel() + privKey, pubKey := NewKeypair() + message := []byte("i am a message") + sig := privKey.Sign(message) + require.True(t, pubKey.Verify(sig, message)) + + require.Equal(t, PrivateKeySize, len(privKey.Bytes())) + require.Equal(t, PublicKeySize, len(pubKey.Bytes())) + require.Equal(t, SignatureSize, len(sig)) + + t.Logf("SPHINCS+ scheme parameters: %s", SchemeName()) + t.Logf("PrivateKeySize %d", PrivateKeySize) + t.Logf("PublicKeySize %d", PublicKeySize) + t.Logf("SignatureSize %d", SignatureSize) +} diff --git a/ref/fips202.c b/ref/fips202.c index 8262d91..8a2536f 100644 --- a/ref/fips202.c +++ b/ref/fips202.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + /* Based on the public domain implementation in * crypto_hash/keccakc512/simple/ from http://bench.cr.yp.to/supercop.html * by Ronny Van Keer diff --git a/ref/haraka.c b/ref/haraka.c index b9046f2..9dab846 100644 --- a/ref/haraka.c +++ b/ref/haraka.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s) + /* * Constant time implementation of the Haraka hash function. * diff --git a/ref/hash_haraka.c b/ref/hash_haraka.c index 0c73525..e1f4213 100644 --- a/ref/hash_haraka.c +++ b/ref/hash_haraka.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s) + #include #include diff --git a/ref/hash_sha2.c b/ref/hash_sha2.c index 67098e6..51ad4f0 100644 --- a/ref/hash_sha2.c +++ b/ref/hash_sha2.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s) + #include #include @@ -193,5 +195,3 @@ void hash_message(unsigned char *digest, uint64_t *tree, uint32_t *leaf_idx, *leaf_idx = (uint32_t)bytes_to_ull(bufp, SPX_LEAF_BYTES); *leaf_idx &= (~(uint32_t)0) >> (32 - SPX_LEAF_BITS); } - - diff --git a/ref/hash_shake.c b/ref/hash_shake.c index f0372bf..b6572fa 100644 --- a/ref/hash_shake.c +++ b/ref/hash_shake.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + #include #include diff --git a/ref/params.h b/ref/params.h index 1d7f9c9..1a20c17 100644 --- a/ref/params.h +++ b/ref/params.h @@ -1,5 +1,8 @@ +#ifndef PARAMS +#define PARAMS sphincs-haraka-128f +#endif + #define str(s) #s #define xstr(s) str(s) #include xstr(params/params-PARAMS.h) - diff --git a/ref/params/params-sphincs-haraka-128f.go b/ref/params/params-sphincs-haraka-128f.go new file mode 100644 index 0000000..bf364c5 --- /dev/null +++ b/ref/params/params-sphincs-haraka-128f.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_128f + +package params + +var BuildTagSignatureName = "sphincs_haraka_128f" diff --git a/ref/params/params-sphincs-haraka-128s.go b/ref/params/params-sphincs-haraka-128s.go new file mode 100644 index 0000000..98de4d5 --- /dev/null +++ b/ref/params/params-sphincs-haraka-128s.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_128s + +package params + +var BuildTagSignatureName = "sphincs_haraka_128s" diff --git a/ref/params/params-sphincs-haraka-192f.go b/ref/params/params-sphincs-haraka-192f.go new file mode 100644 index 0000000..a15ecac --- /dev/null +++ b/ref/params/params-sphincs-haraka-192f.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_192f + +package params + +var BuildTagSignatureName = "sphincs_haraka_192f" diff --git a/ref/params/params-sphincs-haraka-192s.go b/ref/params/params-sphincs-haraka-192s.go new file mode 100644 index 0000000..50a1b60 --- /dev/null +++ b/ref/params/params-sphincs-haraka-192s.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_192s + +package params + +var BuildTagSignatureName = "sphincs_haraka_192s" diff --git a/ref/params/params-sphincs-haraka-256f.go b/ref/params/params-sphincs-haraka-256f.go new file mode 100644 index 0000000..642c62f --- /dev/null +++ b/ref/params/params-sphincs-haraka-256f.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_256f + +package params + +var BuildTagSignatureName = "sphincs_haraka_256f" diff --git a/ref/params/params-sphincs-haraka-256s.go b/ref/params/params-sphincs-haraka-256s.go new file mode 100644 index 0000000..46c502e --- /dev/null +++ b/ref/params/params-sphincs-haraka-256s.go @@ -0,0 +1,5 @@ +//go:build sphincs_haraka_256s + +package params + +var BuildTagSignatureName = "sphincs_haraka_256s" diff --git a/ref/params/params-sphincs-sha2-128f.go b/ref/params/params-sphincs-sha2-128f.go new file mode 100644 index 0000000..92df648 --- /dev/null +++ b/ref/params/params-sphincs-sha2-128f.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_128f + +package params + +var BuildTagSignatureName = "sphincs_sha2_128f" diff --git a/ref/params/params-sphincs-sha2-128s.go b/ref/params/params-sphincs-sha2-128s.go new file mode 100644 index 0000000..2e0c73e --- /dev/null +++ b/ref/params/params-sphincs-sha2-128s.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_128s + +package params + +var BuildTagSignatureName = "sphincs_sha2_128s" diff --git a/ref/params/params-sphincs-sha2-192f.go b/ref/params/params-sphincs-sha2-192f.go new file mode 100644 index 0000000..abdbd08 --- /dev/null +++ b/ref/params/params-sphincs-sha2-192f.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_192f + +package params + +var BuildTagSignatureName = "sphincs_sha2_192f" diff --git a/ref/params/params-sphincs-sha2-192s.go b/ref/params/params-sphincs-sha2-192s.go new file mode 100644 index 0000000..27f38fa --- /dev/null +++ b/ref/params/params-sphincs-sha2-192s.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_192s + +package params + +var BuildTagSignatureName = "sphincs_sha2_192s" diff --git a/ref/params/params-sphincs-sha2-256f.go b/ref/params/params-sphincs-sha2-256f.go new file mode 100644 index 0000000..4d4bb2e --- /dev/null +++ b/ref/params/params-sphincs-sha2-256f.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_256f + +package params + +var BuildTagSignatureName = "sphincs_sha2_256f" diff --git a/ref/params/params-sphincs-sha2-256s.go b/ref/params/params-sphincs-sha2-256s.go new file mode 100644 index 0000000..282e7d7 --- /dev/null +++ b/ref/params/params-sphincs-sha2-256s.go @@ -0,0 +1,5 @@ +//go:build sphincs_sha2_256s + +package params + +var BuildTagSignatureName = "sphincs_sha2_256s" diff --git a/ref/params/params-sphincs-shake-128f.go b/ref/params/params-sphincs-shake-128f.go new file mode 100644 index 0000000..e0ab5bd --- /dev/null +++ b/ref/params/params-sphincs-shake-128f.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_128f + +package params + +var BuildTagSignatureName = "sphincs_shake_128f" diff --git a/ref/params/params-sphincs-shake-128s.go b/ref/params/params-sphincs-shake-128s.go new file mode 100644 index 0000000..6f8cbae --- /dev/null +++ b/ref/params/params-sphincs-shake-128s.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_128s + +package params + +var BuildTagSignatureName = "sphincs_shake_128s" diff --git a/ref/params/params-sphincs-shake-192f.go b/ref/params/params-sphincs-shake-192f.go new file mode 100644 index 0000000..0407ea6 --- /dev/null +++ b/ref/params/params-sphincs-shake-192f.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_192f + +package params + +var BuildTagSignatureName = "sphincs_shake_192f" diff --git a/ref/params/params-sphincs-shake-192s.go b/ref/params/params-sphincs-shake-192s.go new file mode 100644 index 0000000..0c5202d --- /dev/null +++ b/ref/params/params-sphincs-shake-192s.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_192s + +package params + +var BuildTagSignatureName = "sphincs_shake_192s" diff --git a/ref/params/params-sphincs-shake-256f.go b/ref/params/params-sphincs-shake-256f.go new file mode 100644 index 0000000..1ef86bc --- /dev/null +++ b/ref/params/params-sphincs-shake-256f.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_256f + +package params + +var BuildTagSignatureName = "sphincs_shake_256f" diff --git a/ref/params/params-sphincs-shake-256s.go b/ref/params/params-sphincs-shake-256s.go new file mode 100644 index 0000000..0fc40d4 --- /dev/null +++ b/ref/params/params-sphincs-shake-256s.go @@ -0,0 +1,5 @@ +//go:build sphincs_shake_256s + +package params + +var BuildTagSignatureName = "sphincs_shake_256s" diff --git a/ref/params/params.go b/ref/params/params.go new file mode 100644 index 0000000..fcb7134 --- /dev/null +++ b/ref/params/params.go @@ -0,0 +1,7 @@ +//go:build (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package params + +func Name() string { + return BuildTagSignatureName +} diff --git a/ref/params/params_test.go b/ref/params/params_test.go new file mode 100644 index 0000000..c452448 --- /dev/null +++ b/ref/params/params_test.go @@ -0,0 +1,17 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package params + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func TestString(t *testing.T) { + require.True(t, len(BuildTagSignatureName) != 0) +} + +func TestName(t *testing.T) { + require.True(t, len(Name()) != 0) +} + diff --git a/ref/params/tests/vector_generic_test.go b/ref/params/tests/vector_generic_test.go new file mode 100644 index 0000000..8c4baed --- /dev/null +++ b/ref/params/tests/vector_generic_test.go @@ -0,0 +1,24 @@ +//go:build ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package tests + +import ( + sphincsplus "github.com/katzenpost/sphincsplus/ref" + "github.com/stretchr/testify/require" + "testing" +) + +func TestSignVerifyVector(t *testing.T) { + privKey1, pubKey1 := sphincsplus.NewKeypair() + message1 := []byte("i am a message") + signature1 := privKey1.Sign(message1) + require.True(t, pubKey1.Verify(signature1, message1)) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey1.Bytes()) + t.Logf("pub key %x", pubKey1.Bytes()) + t.Logf("sig %x", signature1) + + require.True(t, pubKey1.Verify(signature1, message1)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_128f_test.go b/ref/params/tests/vector_sphincs_haraka_128f_test.go new file mode 100644 index 0000000..778ed16 --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_128f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_128f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("af43a2cf16bb74bc0e054d6de01e07c1840c14e31515f7ed0fdd8cba27e09d6aa1cac0773490344d6485f7f1c1dc89a380c21dd5cf19ede9c2e463a55d0816f0") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("a1cac0773490344d6485f7f1c1dc89a380c21dd5cf19ede9c2e463a55d0816f0") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("6ed6bfcdc439a547937e55b3d4af01b631fe941dac1ef34ac8f0d74ef1770c53013fc0e30f61b320c4da0cc110c7d71ff23055ec180f8bef3505a820b7e3da146cb6e5e8160a322026f6b8705e888e42e5a3d33fecd3946eb5eb914da10cfdebbf42691f35b776322be654e230dd6e90c96eb089d78f7b5b0737903eca178b205eb56cdca7152f290998e45d98508b9960366a33dd7923606ac6507fbb6c64c74351321db8c9c27476e2f5bfee3519ea32e2fafe1197d5f472bbe56bed513db202cb8e9e3d7929b03552d09fe4c6776655975475dae8299a64ddb37ea05237984b3e3952227811d4d5e2c8bed6e7834e44e87c2221305259d84887423fcadf0ed183c0ea31faa4ba0c8a196a7877fcebe77771e79970b83b0a44865921ce7ecf2a3aa2f45ff578b30c28f40e3d8bab6d16762577f56101c489127c3ffea26596a9f47136702e1e78fc099a2e58d3c725530d3579945b31426a50a05bfe753d0c5ef53fe53b5ff5f4ee7d466b8da3c028305efccaa10b0408329a69a8e9f9118ff2f0471a08c8f1905ba1245d4d9aff373bdd7259764f2b1f35242ec9415c88e67e347fbe99eb29368079d4b78cf565d118b247b7ab7a12e81a88cfa369244ee694296dbce87614945d6e89f6684ac5d52cb9676423c99106b9a53813128de3ba678aaa34d0cbe6395a9db02a0681a32af62ee83bbac51cf29862aa983419263cf6f93c09d55092994960cadbf9abf4134a1a4462d511058e3ac9e5aaf8d95b0d1de29630e023f171746cf4199d6ed435d97184ffabc3a934f5a1359cf6a80fa1cc4b5ff5c94e52a349d29023c2539e2ec4205ecea690de40e69315d6d36de837a6abb3745cf55be9c778ad6c6bcf1ed56fe1723647e52048793409956ce281f64e275d613d233cca6ad6b3fa7e6610850cacaa22ea63f307b1d873336fb341d52cd67f731a216eb258442a3c2276316fae4b4830aea14c06e1f576d33972653b92af9f949f8caa11aa99fe5ff864720a4c5ecb7d4042379cd512a8d48b3b40a2095bf60942b36510e3477e2fd9267060949226404341ee848bf701c955a74fff8503285e44a91f2426bbb7a312e1488d55b37cfbe22139872d166e0c951f2e906160ebf1a5c05ab936747d25d883787badd6a7b7dac69f560458024cc276889c0e7419c49b77cf4255e51f863c7ad30a402079e2fa6484e447d6306ad9142665718ce0c906462446f3a46b156349d609fff1b0fa4cf329bdfeb2caa32ee6501da855f82d2f822dd1316be8103983698433532c78339e7e22923659354e3efb0d20aacfeb9c23d1694514a19e4af450c198648ffc594479f8b69a6cc87d738e63c07fbef355b5f7112f3113045e703a7a284b9c7d648852a16673b32aec57f7f0fcc1cd11caba55925e69edeb40f778bb59cbea09ea2c28a615665bea511ccee1c930b2466a78e0eab04dc1a95d367c1a628b2f6cbfe7a89b3e1f6ab9c0135a4ed5954455a11d56f72884fbbd50386a69120311152a9ab5188f1a2a9b5b2c43b97cad0c18375c0f744fc17da6b7f3a43373ab5c7ae9416266f58b7f48ea179c0b571e4a549920fce16ceba7506e4055e1158bfe80b0840d3b3d8f6578d3d63556cae240c5654f7caaf977fa49dd36eb0f66c47faea56701ac007f29f54d530f29ccc513d541dc556778e1cadd3f9a74b24cd70899feb7dd871ef4a3c8f920447fc02032dea73fdea7788fef62010de56b2d753d50aa2832a2c0f47305c8432714f7764b23200f90ae2fd7d7fb534e3f6692eeaf10eee06bea6b7f58136db32cab97e317d391547a65b63679cc47d9398e09d833ebf9dcb84caff62a9c2c91b3519cd94cf9a94c5e69e3d13a5d1d701bdec83554fcf81f8802085d0dbe9e30045a91dd1774d5c39743711a79f6a88d23577c6a3320509410a0a439b3679555631d959c5e0f28d6b0bf04e8b366ab81c68f30a91d14a4239fa0d7eba24f053d42674f0cc77c71198ed7bd9cb407af84aeb0f737662541bcc0a46dac7b2572a3523f659eb073e2f914549acc9aee147a613161d491a4e322fcb49d29830433bd5251adefd55f658b5834449fea18f33d59466c497d18d311aeb04112ec186d54e4344f0a26b5716cbb601a69c6330448681348c7f07089a48c3f4cf2b32b6593c36eb81669a09a08c638099407a40f7eb996ac0ca64ea8e796436156be5fc2ed6addf541491405054a1e0cb9f5e8aa397f32f4e221cc772335537e448f5dd3b4cf8aee48673ee80658e96b476aee1bae236c016937f9c156405c9ed61f90cdd7a7d7d3e9cab70a6493e8ce1b2a975bc6cac648fe60fb4b5114b44e793fa15a2ec264753706fdb5c2b06bd7ad4a6200b80de5558da040d048733f2bee6be3283a24141ff921ee830cfa5f2feda33c74479ce50186e61d5bc79cd9a8f179d4c229c4aad99236ecdfc79fd2c147bec5743ca8370c91f3573c5bd9518841f3d094f49227335f41b877a67b5e4e2ab369a9874ceb0955cb9865432778d43c994873503dbc977b3370c00155f21ebc48e19cbf7449dbd1aa4846360464a04c3ecc396e02308af318bfe0b5a0ef02530196816b9bc8223535b7c7349e37c50eab37e06668f07f6081a0d816efbc2f082641567e8db84aea4034f564cc5d653cba193199597aa8f44a5072947cfb95e5cb3776428fcc0cc20ddcd84b9fad3f98fb579cb8da56491d742c5de5c52c4f68278066c9ce9f6bf7afa35c33ba396f01c1c2302722dc3a095d16a6712f524288549352c5993fe075ff515b39635d6ec2b60aa7dbdaa71e6b57e3e64723c67207d0a4d0f85db7f9dad496837b0fdb6e6944fdc24322192796483688db30e82f3b2dab388e0ec9e389a07eef750efed95bc49a695755c10649013564ffecdfb22bbf958140ab0606e82f7f2339b6cdf6c099deaf9a2a90871af759a185ab56d6d26edac35b4847a7d12ddc2f5d4025f4bd6e2371491a4861ac7886d2b65d8ed361b96a5cd9d145fdfd28f8c1e0dc6451d52b1b7bd4cc2c4b136c9d314ea13e237b907d857dc7397fa1d1b7fa8058f58d27058ca3b28c0d770db047e4ffabf12e103f47858256030318c1e0f5af2526265ede7c4088e8efc97db7dba9f0e76f36f585977120974c46b9cdc93dd71aa12e82c85f8967ea33d4d65374a16ba0e814d06acde8f0337fff4251653ba63b992a8a2cc04a686bf97a2e3e890a34ec24c66fd1235e3977bfcff3b2f741b234b58b080cc30831ef4a15d0394683e4292b27b3fcf6cbd72670bd0f184b8af9d608cfeb4cdb2c92cb854ca1bb4360c745e64c5a8167a818d970451f56759cf7592f121dd582871664a7dae2ff3e8b05ce3d84e2f08d18042b76bfb825207820d71be861717afd3c418c90d84a823d81b7f6dbdfeb89a1d0a0dd38d91ea70656e29e9b87b36380321dd778613104ff014f0f9e1cc5e32f7f6a229918542ba64233c7e2485514f23d241d6a8a95424f9ab5943cd4d660fee87363088b9af1b7c5816965aa2478be163f6abe16250ade0363db0593d3d02e204f2274b47c0a84cfdaf2f1d9186f16d6e69c0014bf756c6c61315291c305accc68e8b1941a15b1a7d112043ab081bc09f8829bc1470e3624a942d284f2ee1dd3dfe36128ca0b6f753dae87a4aa4fefeca6830fd37c2ed5bb02cf09de3cdb395fec5f645d56d6d226c57485316fad00e2e71a6b54c44633a135ac60c6b9aeb3b3a6a7913fc23b78d85e43ab89c8db4473aca0506e1dbef9fe9f09488e12a1bfeef5b5a6562eb82910d54ebd0384b870f2f9d011b7f2a8fe253081b47fdd623b7279d2260bcc45f353e60d52192305dc7b7165f143b5085979a8929b9eaa6fedb93a12f9bcc7afb47bd1305eb6caff07e2a11e741cd10594b5b6eedb61f681393af887ec09d5a68043c4230979b3fa07caa8ddb611a0816fe7712661b599e6794d9c3aef1847530da1dca06c042d225c8257e0e402e263d2846f2756740286a54a4b7ed2c561c162b6ef7a1ea705b530a1a7cf64cfd88a4e8989204df9d482f03380fd562f04f198542bf7eb0b0f62ab600ee05c470b2296deb243a21d003500b079b9af20e780461adae4fda9221cdcbc4d9e58c9c1bafb887e7a133db95df7cf93c4531fbfcc1aa1b752fe85af9a877f481f26e53622f0e0d244ab774ac6c3e5a7dfe74ac2791cd501a8889b5e98912deb6b90f4e0466f32cc757f39e4d6df0fd688eccfb148491d1c9aa21d84c00bf1001861286ee3b5e4e1df56baf37e0323cb72ad3163cb20651b40c9969a826772dbc053c3500f951ac57126c9db932f688b09b757b3541508ea868a7d7cf2998bf2487d15afa9d01c807ed90aaa5ba9da8667933e3febad948feb9e39dd2cbd2eaef2696240f30dd6553f6b0dc3ca88912b0138a085d0e3a4a07fe1bdec2f3cefdf1a867582b57ad7c87280094123d40adbfcb2f9861373f97f6082ead2000dc31076d27e7bc6fcd242cff8d72b957b7d9ccec9ef8408800042daa99108e2f034055e9f2315319f31ecb923a1c8a4b3a457eeddce9882a6c6fa3afc8001d94a5f7ea369317c60b657b7e9979654aa8d380c23a4ea2e7a3c420a65ab74ac6c9490e66cd9263a21eb7e99b36fe3e3a49e3f6f7c83b06ff0726f7cfbf68ad2cdcf46719a856de68686402509d6844492e21a69408a4aaa090084fef5edc567a8f6ee8936db19b40f83ebe42abb47e2dee8dfe019ac07e1ebbbfda36a1eda144c41547a1da848a395277fe6a6dba1a53cfe13f791c12b922edae84a8566a0507c5ad9135dc8e3e6ae01358fc1d90d99fdb5df4b317a228ec652dc529f2ce39b847850615ada56ff51910366f09fc20c9845275e8f214f1d6cf6c768e8f41abf47b58b6c83db6e68a2432434d522020a4a267dc3fb9bc8505b09f6bacc6900eb453bd5d5b9b9a996f7bbbc766d3530cbc75b61426477687658987448a19ad52c419c9c2535a89b3341b1029630777dc6f39d0afa5a40c41efe51854e61a40bb18b29b788aea51a8c7681361af3a3be6f32a8aa9482b8bf40860e2333af4fcc78d0d422f28ff784855755285bd7b58f92954111bae681b8a32e1df934f43b2e0e86a23c3f535f8a4ca76afd16f1fb7a90ae42d2189103aaab599000f4b7df953ec2f4136b45b93eadeca9702db46f6ced9b62c21ae1edaa9794d6dd75eace41e4c93ef9770771796f0353f4f38e81166b3f3c7b1f0c9a7d1b8bc8764290e1659d7bae3c1446ada060b73e09a314ef92b19bcdd7d3c97814ecdbd872b2a4fd97aac2e23d08e50270181b4de3c28fbcb2ba804fd4989188f6e06b5be2857b1727a57fd1d8a67d14b0c005f48fceeaa52bf997b6da7fb431d68f55bd577a3bce63935167459becda03e71be6c2dfeb4b6d0f66690c646169645bf2fedb0402ae9f9c2c51cab43f9edc9d392523fc816a98a48260f5c193883eba2de3790475527ddc67c365bf58a90dee70743426b2bbb56fb9fc0d04f9160db06c32b76fdbdf3e70a95d294aa1d6fea0442b56c41d09019c6081dd9aaf8c2e6806ad8f6da15d14b0eaef0745313d1a5ff26bcfe2d78c5ac05d9c891f125177dd24cd22f30541a4b0a0492c6a292ad4e099339238eb390d889af92bb99ae3599ca4bd8231ff717e22703d6806d6294a3b47ed43ff37c818938d16b74009ae846c901b04973e91e1924e7bd82eb1675e0ca02397e6782b7446ba3213eba15a142ceef4ba302ee7a35244ee4f0a0fe0118dc77b0353dfa46e2da0af8bf0152bd2edede42918e248773dad3efd5d4bb24ae355db9419bbf3c533202deef5b631c1e2d20a005846e4232f48447b0f99c01d32dbee7543f4318378bf7cc1a2dec282ad98e64a4617effa5d363639e5976f0bd4346ab9e013da4af1dd5c82b6cec371b430b54607e855532486e53fa3f3f10e28103bca802c5adfec31c11205c58df1fbabd87af12e509ff1d134c129ab8405d999957bdc2e1e08823bfc131f31e24be871ec6580f3cb3d2fde599fc34b9d56a43a64b1251815ca9d0206b2f32bedaf4d0ee637f3b07c47ef5f60147b0b5af6665f247fad510037f704817b28f642324e53df70abba9dbd4d62f2b78a369e5f267b13399f0094830c5a0b723aa26d04f2b377f6c18c2c65f1dcb28bf487bd13728a11a60aa36a1844f346c1564c2b938d84f59f58ce05e8358a37aba55e10cd02e83c621928399cec7324317f007a49d9e7a22e222e6b6acc8a2c8397aee6d76a775174cfb3fcd2baefb02d2fcec2041294a695378e2615fda9ebe461cf3899c19c736a32ef4faabd416ba4a8c21180074c0d68e02911e196803676393bcdea39984075d61ecae0c2e66d7380ac6b78694a04e6350fa4f411539c89cf516d17b7633cde104c301b50d16cd5b90407bfaa538c88ecbe6fc17571855f6b81324bfa71749d53a825f48ae8d0c33cda5b6bb0548578af1438a9f97ad62fd3811bd3056c7ef449180dd746b5d2480f1f4caa0a60f64b23dfe9bfba96c9b8aeb239909063c6a3b59db91ce9928a766dd617cbf87832ff3aa0da6f9a178b58dc9725bffb3764051bf3813939ac3a633f362ee1dca8f736045c2634bfe1b44d9ee6adaa4d7863e2141b3823cb73b0aba1262b2f69d3c4101e33f6ef07fdfd3e138eca50d0a80a0b3ded37ec2c18e96ee692a10b1162d90c1021a41e5ed9300b99b8f7047c4462e3f00ea471bc3cc818d2c3b71c956daec320036bb1d7c543d25f2c02252126dd0d89d3454a33c1738ad375a6f721e6de222d486717a8838b6c9421a62f1d1bdfd1760042759683a2e2f03f2f6983a1fb65d11366d0a465daacf04f3b69610049d090cdaa56d087dc88644fd1b3cb069f1f94e416b7082832a403df46d3bf948d874897d2dd5e086c68fd1fdfa24e9630ee88cee71b6079019259ac70f215ed6a4f2dee7da6bcd2b5d16995249073ce181cc359e23528ae92e0e3eb693874626bcfcc244744ee964e17af315f22794cc4484d098e8f0c10fc33429d89176e9aa20eb37d418264b9495bf4f3e7686cce891b1ba8a889fc0ee13a4ac595a07c58d65902988d6855652eb7caf1b855bfcb366c750988ffb3f2c25344c0a89691be2f768425f6b46cc7486dd7331a39b0a39a130828e85cc442dd3d4c379fe0fee70e13cb4b26a27381462e48f65296c2b2854f534c65fa3dc37c904ae4424f7362d1141d466f700a3805dd5fc6588512d95fec09aa4c3b27d99436825fc29b5de62780beda97a95ab0c28b708680d2b615004e5365e29d74cd75eaa078fb09582e995208615bc168dc7192217bd5732c38b3135af372b8c848677e0838535e5f1c91ee8d9a24983fb4c439bb80eea0fe65436d35720779d9c87c7eef8aa11ded0489371ba57beb09cc8169b2308fa0c122121ee5278491a54921140b75d5d1b6ae2d29200d2fc02f40b1ea33872eb12bf20dd8a41b79a4ae11472b2703658e113cd923b6e14c7b69e1ab38b8df892e5d74b9b9a962a9ce96098d7ab703f004125145538c9ff1c85838cf3413f4d3f1996fc3b80be2a309cfe7daac327ba9037b9ce36e64260f57dfb2221779c94e24efdcb213754832e8982e56fd952931bf3d252a9b438eeaf51b3ee72e52bd116008d7c8b2e2036fb110b7608d64e1d85e454514035e3a4ae08f95d657d9df37d451153353f099931f7573ac7719220f4c020cbf9d2b02aefe7f2008737e5d0dc48dcd5ca2361b10b0b9ac59780dbad2a1b5847d3bd1591f23b3aa543d6fd2a6462824d0648cb1298595184a2b503e6f5a876dd3d9df696c4954256b4187a6a9a2aadb014d3b6ad0a5a4df24401cdd122b9e3763366751e6c0acda6910c2397d97bfa00effda9de25bec954c68d5ba6b947049372e67604cac01469c1b7480bec2c40876f9c92a32e3949a53cf5fea9fb241a9547a9a10c6fae17a535bfe9c5cb95b50ea64d715b88451e70bdcc3035f7473586fe718ddf7c6e4a8de6e5ecb0711962385be6315865f6868e2041940f4c61ea7cddc292d3e719bd256e5cfd6bdb17b5ecdbc294ce9a67065da23b7d35a1362c917a919ed59b8c24f334d56e3467cee7441fe31e44316f9dfd46adc890839a96c1c07bd22c2990bb38e08243df74b2753ce3f12c70d2f4a77df7855b5aca49a020b2fe349e3a1b0242fa20eff0bcae7b4b0486038f6ef10451963eef202ad439c1276b5e7ce9e4ced3c5147a12fcb662908a45e1f6bdafbf413824e8be0bad9d61674022a6ceab1c498b17e8f8c97ccc2ec647ad20a295efd9ff26bd391544988e77fea6db7f0d7597c73cf4d3a0a9d9a4ef48afe1e51d4772924b5db33ef28673d63318410e244aa2aa884b34fd9c4d361fb61ab5a380a7812fae250ef5e4b8642712f6f0c3ca57052a7045977261071febd934011a8c0b7174c936140d0d932bccaff9e3596384fc004d2dddb1b4732cf930ec82d8032c3809f7fe6e0055da8cbd0ad347c1e209f2a0c7347aaec1d1f3eb90d4a5a3548551df7047f0659079eacf68e68e151100844583d54816c46cb5f6fd143f1b6ae82c52ec167857cb219aea6f4ba73d166fda585e02d0cabb5f5868095f4381b8b5b75df6bbee32384669a4a81d588d0c83846b099cde7cdee49deda250d16097f51a5baec3d02c45e3635f77d6947ac303f5b0364e6e126d5a1f47c423711ba1ac7940bde3ceccea1a987e6e2d2d66c86ed198ac82c909a3c45af323aa8526929d61ea01c1f065e65c126db8efa3b3040b2758a00ec9e0effff6b2888878ec9b295cad849e41a39222e4d98e9550f83adf04e3c30ee1f00fe238b0c91bfe24e1093f96684c666458dca53ac77d149c2857d98be590a6f13b700487b7c50bfbb4fbbd2ced34d3916154562438e87f9ec3d22404b49967b05fb002acce8d5b86bf044baf84d2434e30ec9abcef564a455c5d27af327f97cb70153cf9c438a2bac034c4d056226e4f9cbd7288a6ccee33daf64726bd8a035617d1ad541caee114cce56b8997773954e22c160fa0da1138fc86966d1d44ad727a54da5c438fc71f94819a59359e2aa3b65d0cfd50120a9b4851232a8f4e2c48a92a8e3538544bbebd4ee0625858cd792fd7b01e262d7810e0ed7fa360d763f6f972d583d8d44c98d0f074011d988e7f0ee5e11a911714c21907845622cf2e1caa580defed6bf2e7dc1c30c7522cac462f1559c2eac7dbbd8fae97892228918a616c90534f4f302058cc43f937edb64fa18653a67645542f359f0e8f735a7e5f8bbf4ba564d841136c1b8dd41063dcf1d54f575394a49db51d69af87dc9f9ae4780acfea4d0c6d67dc0d5176b23523f8139876955b7cca4c370a4ec68a86b718328edea72f5c102a16aee9e302642c954c4f29f579d86e0b114adea2d95f575d91855596939d9bd738fb61893be50dcc3f9511fe2bc7c8bc3f1ed87e4fc57bbbc083e4d475b1541c1cb64ac4581d87e5b499fd70885f592ae14a63498a994d176bfa9938c1cae434512073f05253df71e5157e25edb93c18f6f47e3b946832715e4f6954130e2dcd8b648d9fcd8e3c592c4d06d3349d05902cf2ba1250b7667a68e4877bfd821cd12e4d1eae588bf0350510b116b72ff0cd6efc3b94ea5c8e6e68097851575870052eb8c007d47204b258e6e8cfb85f35c72bd8f70a5826fd754b08ad6e5a8df6edb9a0e40d53bc2b19d6ba6b5b2da46610af4d1d1d1f5bf5ff58b0a99c60d1dbfb3972dde76d22b507359ab4b745307e2d9a20e723eac1e2e22ddc2b9de0b5e47828aa6234e2d7414f68e78ed342f2bcd3cb8437f580d5c304fecb62bbd6b1df813ec6de936a46bf54cc7c0396e66b583308f14256cdb6f6fb1b9426c97786f05a8fdf2da4e88dff2c650da547b25923619fe4a240d0f2b65891103d048af11f00200301fe9fac6c952d50964ee51d2356cc4b095eab2cd76ef7ded57c414c4f80f3f2bace64106761213292dbfc7012f117c4e1773d3abf024945ae401d13bc9c895c319a5de88089ae238d1bcbc145d3556a69869c53ac6720402df06877ce6c1f63901afab7f516e9ece0721e9fef574ec642a498cc6dc61dff195673dbdeaf0ad95dbb104e5656ec72e7933e2ab49c51429d626eeb20341de6c672b82f1edda67577785ee4cd88f71725fe3dc677bf12db5c8f219eb95151246af77122d96c444dae5ef019059f33d76a69e807f649515df44a441f50f63999c438f2b850471eb3fa4e92230ef8334fac8507a724147f13a962f487bd3465e1a199f21152b80989c7d67051a00f0236535ae7ab21fbbfcca507b54cb515b9f30a7986c5fdbbd29b53185ae419c364e3ad6af989a5ecb5dabd286d5128a2a4eb7b1cae4512e7808ab5082cccc1175495d039c113e58c81dbbfba95f9783edcb8d6f0275c1f21e7065abe0d56ab13c70fcc982d1bb1994b136e0c4804cbc3ab7c3ee114d3acb1d41fe2b46fb256fa502982f9228baa7d8b4a05eafffde0bbbb5aef82abd3c3746e65fc21a632c681335c769f5b04b7276216a26efcb6fc825a43972f1e97f857dd9f68e2314c6759d284d6310de603717078cbcdc6ecdf337a4332b17b412e168c9152f16e11aedd594b6010a6943af35da6429fb40e130bad3d0ab75b18d7e984e6b684641a5f632439d1c1669c7e82f850bb860cd4bcd9bdedd5f1dac19e3eafc02ab28021f0b8a6235df1b13e5c0c50e4ad032e2b7ecc5460fd3876098dbcfd7ddc60ff9c8d71d1f397ff980c8269653a6c8b9e071da164e65db6c8fe9f23d69c108244e4bd4761adc0b29fac0d69f28796726be851895e7c42d3f665ec46bc40ff8b915988fd087fb2a2414133fed44f82a34a71e4c2cffc72ebfa0d381f4c502ab1c212e09b85741c17328e5bd2bb53aa3a5ad29c1590c7affc8e350afc8ead6eb737814da3e9aac30e4f65d74c91048311bb872abd1e155685076bfeef3b28c1d6eaa02d5092c632eef321701bc28b32a7902b238844049c1b5d1b4103ccc01ef39dba67a92613239c00d9a15450346bd86dc4c8e11d24a8a080e6f39834cd748d4dcda84811d522c943696fffed15e8762313a565ec98002590a9da9aceeffdbcd5de24dd23455e44bd70257e3635bf6fe9893bfcf9aefdfcce7d88cb769af61e6f4cfcd240f71de7272a81f005a54ef27926ee974ed2a2347b618a3469bf6f0a5e08a16699b934ed201a7e1e0cebeb91bef975c893165477a103e68d7bd3b4baa055eb41af5d2e5752b53f5a59fe7582d8983cd4456eef0141b5df95703d097db9a3f967f6c2bd74d0565170a20f55cb84d45a9425f8101cc65b054ccfd5e6dbca829c35998d429dc5f3a7d280f792a047b5ad37c8161d40c5c58147ccb159122c67419581bf380ad4b8cb72dab9188b8df966beb6210514616a0fca86b66f1cd3ddb695fa103b37af23ee3704de8466fff2d3cbbdd637662a288719c2107999984393defce025ea625e2ad861fea8a2303fd637246c601a484c98b40dc240e92fec26170951f75f5a3ff636ed701cca5f2b3e1a678657f9bf27ccf9366052e8fffdbbee408b51dcc9d0b00182c240bc8769b6e2c79f17f05e449564bfdbcd53aa5b319469cbd72e69e8aa3afa61e44f98f0dabc0acc0ef26d261440fac30997b7e9ca1c25932d0bb89715601b16d260ec342c57160184975a5e7b29c6b41ce8de0247e98a688ee898b4de4e7010ba551888d5cb03e1162ab12b0f0cc79d45f2d4cd946d992819f264c418a8552e3289d0cf75e0d60795d6874144fbc43518a513306c6a44d54dd7371c97090bb731ed3914239ef9f5da8985bc4652dce38ac6213adae0006df2bf8ed55f710cf5894b723db1f838835db1d93b443ac443c2444573055cddafb8aab8b40060a6cba147be83b7aa7357149c0e487c91a3206b0866ddcd6349530f84ba8b52e35b66cf0b4757c6fff9831d5b6a851984883d07703ad91b7f9f132cb21fd7c1471c407f1e3eb49dfdec41fd898d2b1bd1616e80926c055fd586a40e60719578d49b84b0c87ac56c561842423898b6cbb390c5f9feda2b669535835896cc1be00cf09f21fcbe290854d59b5c9b3822a0bbe30daa70025709443f89e484ca3f45103711b49c01561c7ce526d9a6463cc342dfc0de4d7b0b80f544f81b5b26c21db53dd5de03ad72a37ffbd79baaf79ac321fd76640040aac41692defb45a08d4d89fcaa521a1badf481a5038c324d305e5f8f8632348675158a9ad4df79c7ceea9134eb8af1a58725209ea82f2523032ae07877dc1b4d0a86698c473e67b0f41be10e18cfc8759452a1b198a1bf2be440b52b72c0913e623e7255f13aafba9f606242df09b1de756aa01cd37a5f05c19940db94761f3b9289c92eef082aadb596f7ddb912ec6cf8922f70556303360b6a6e9eba1d1469d9b8d43a9e8de928ba1d4d07355b0c012c520798835e3f3dabe1f172810406e2b7ab61c50f426842a2f546388686ea27c7e5618c395356153a77e3a958fd668848505edfda974a6e0b523ef8d0b1db827ec0c0505fa23abd513d88d3d0853d6a463e3633377cf943a1bd7bb78eefa4235d9401484b7fba2ada2016827ed7ae1cd6ea5ab1e4317849359432000208b070704886dfb4cfa55dbf40315bd0a67fe06c40fce4ad6c70a6fee0b043f3f7f2385fac24cb7fc36c419dad0e09791fca44e184661ca3cf84d63ca5a5a57bc300da8b3972df5cce20eb38944139ca3ca646f184a4e427e55c2024bfa7fbc49b01c9fed2c4371a16f2be1e864d3528b0714a9f60be34c4a16a1783f80a13e52c02ed5b2c6b40f34b31c7f46dfb4544f31e02069e42b55243a4d00c315c2ff7f5a0b9c8a27dd81cd3f3b4354f313e4236eaeecc994b89f56539c02750a6f7bfd4f56ad98b789e88422fb870e70f6e45852e85ad958e31f26eacb8e11eb3e7ffc85d40bca1894924022ea084cbfe283a671128b457f886f5fc1dc6500556308f06ac3aabfbbc2bf55694705daec5d6f24bb5746d6ec3db8a2b2b912a7f1354b7e5125e40f73ef9e126ffc185ca357bd101d74c7eb63d02c6db61f68ca54795e721eab3787eebb7e6eb5fd584e2afe074adbe0883d5ae98c91e6ee4ed09ba8116fdba1af3635e3f40f2585031c9b822c93f9185d34c33ba9befc1eb8f1e353134169523e454ae0e28da76aa0441bfe7d01fa05b9e2f61c23c266317782f839cd848265dcb2ef0baa5c368dcdb8a63efa7e6b32c27563a441d189e4305a1bd19a759ed66bd39ae94a0e678f739b20a4ac1eada8b42de5181309de5613304d56e0eeda88015836c5154263be6f659514994d3258c64a92a98917457769b309bcaf60c4712575d7667fc78a4b7b2c8b68c1beb4a9c8f158c19e3da0212db7cc0e05e5a8947e67f0b1a4cc1cdc0eb83056d9a9115c8307ebfa73c6a34ae3f097b11a9b4f248ec84cdf0349b07851937ac13a433f397686460573497b83c9257400aba8965a8ec5e906fdac16e14c36cc809e3363381f9e6235f3620b8ef4b216f49bc069de9b859b2e4de917340a7863e73d0c3c9fced040c221b97f0c09f512dedba37fbe76883ed18059abecc2e0d228f9bc6a073519981ae0d5134a635657ae7fcb36950481f75b849e3159a739c87b5876437cfee13714caee2b233dcc0e69444f365081ab804c3af0192f6910577625f16606d2a16715c3a97443fa61d8bc89ab8d35c8a849d97ced5cecf17e9f9757f53c0bccb80e6c883720b072f4b2921339fa5aeb5a86fb675be42de314e7075c28c09e3626049ee40076a4dbb19b8a80f2fc7a72ef3a1271646d6fa3d3120a428763a5d3744ad6d3e113edfc8cb2febb5a2ad36c8e7851da4b243ce91cf48bdd647b5d246732ea3ddae0401ff8a91d8ba460d39ca541cd65c2938609223c8f77119403f23c46651bbb8297c12b0ef7ab157bcce2619d0c7d1fc5f7b15fd87415b52d4ce095b631571c22f22ea0a33c0e2c200888202e0d1385e1a9331a3ff0d1498d6a27baf763b1ca43ba73f12c929d34a1f6818771e7fef2fc05fe84091c9ed011416fb367da47dfd3d9d4f3c8172aa7d2285dcb1a4763b1893c3c4afcb85a4c57a15a7dc25782a8b06b97ad3d72cf2d2dd8e9c7fce0c67179790d9aec32ec8e1db56b0b6b86d8bc07cd34137523a5c0d4b6c121ad23308c0147b53c738810342b01fe4f1c4b5ee59492cc012cec6cfb3a49426cd29d50f8209cb708be496e3714f6121a1b30944775f047f6f644a0def516a97488fd2dd01f1af14d55f0ea381edfedc56bb261dfa49ae60b0b4bc3d0e31eaf1e34af146a5421547fd912e28e2913de2cf1a20ecbc6aa2347cb5f79fee24cb36a627c3f00665e1927b4eeea19142feb2d6535d0aea9b4e371dd50f96a72d627ab21fabe0aecec32cfa54d9b1108a2e5d6670f9b0a78b08bf0f5e2d3840da9bbbc86546e855d5a0f094fe4ea26682abf70b884803f71af71624a5a51362eb09536a7205ff42042c3988720f3548d286fa89b321dd2bc6bff8f1b9c55d66cecc5e5153e36a38b1e97d5a68f72367a5a87d786d05f543d8b66ec8d59d76703b3beefa5f5068cdf652a98e0b4085db7e248e4d6074beb1b3461541f9334e2233011f0fd563db0ff40717d475e5de3a5fd19b5880fa775842793f53b06b4d69898f7f0933f414cc56f601644ae86c4a88b5496d45e74f614c228f4dff47b7d504271659238e3fe1242624a0f073ab3dd77a9a9edf244bab60b15cd1f6e81bc8929c5dbe60706259ef74158b51828c45efcd58f703100d61cf8ae33510aa4459ef20a99357a5ad0debe982c5530a44100bb3b112e5749ecf970ec888fabf8a3dbb99ebd46d7b27329757acca74cac1812171912986075ff3dffd9a4615fe1c5c48c39a3ee0f36e62737ef76fb1ca79dfaeeaaa93829d896f06069de394b7d0284e8305d5ed239110db2a30fa24eeecdcd2be688cecf5b609764462c9000963a5852cd4a85faa6644c8343614001b1d1c8bdc0ada8d24ad702946afcc9eeaa6da299dd033737511e5f17fe2f71891bf6dc2c0d9a6342066a821e1efa6051526a54219ecd52765bc60518498c22f22266a0db1a014910b1b14f2ce0d73426ce0a571bea59c1a3584dff8697c5607d3b35cdf82c1805f8f2a0e86c9101ff00ef49307d10e250964841f1c969e97b90958c05bec7cf390a23a70f0ca834406b26e87478def11471009a3f88e8f73dabfb3b12851abf466312c15095955dc8fb3ffffe4150ab4a7864a24dbf5d020d5b6584973e417ed0c5453ca1f150eacc712af78d4d0506580b3336d2d3e8e64d21dd82b2f91120953232891fee398b4b795119ed47d9deee664f8e4aebe77f63c0e51122997dea53c434d1b6c9e9191a02b51f36a1114308df32e3313add305572f137ae27db6d4d132961c7472600ff404cc55ca91cb6587a4805a0522829004dd20ce708773ecc002158399b3b3e106c7dcdc6bc4cfb4d35755cf86908219cafcd2882db67273ef585449d055961ab3d359448edfff620068feeb1fa21b147703e1be409d8af747f2f2c4a830ca17ca4312d458121299c504e82d49b8841c52003df5f277f2483792d6a299d424f1e8fb42da3266f5597c7db008744239e12598bc2200dcb51347c22b10d67dad938760cbfafc90d6a93f0c38773980eb5b14844d98b69fad16ab0d69c68936f80a1a6223d9fa67c2abf45c216242b856a062fa93ef53bd8bd65ac3f18404c1f09c3e871884a95d184136a71fc603ef7bedc7bbb8ad87f75fb323a0900358b2b2df9ac7285d574456efd5e7edfd0ccf7c4f2be739e26cece673770a15f5ae759cfa6cbd8b4aac8068d98c04d86798706d4bd5dfd541cce9324d2c2335278d4be49c4cad1699ce8e6cbbaee112c154ef2d9e5f6d43149ccf233b0433a30324df62aa798f12fb9313e299e59ba8cb304b5b577ab4769be459f3ee9142dfe44af57ea3fd5673d43a62814dd44dfa148db36740d9bdc151e9b2550487d16586785604c0b81e87f3078fbffd5219c578093e6751b647bcb2a44ab5e95a694179c03a4ab711fbd134a45bec3dbb5c220ab3d4d98df252add1b444fd8c153e1f22080624fa6512fff7a23e0d25693042080cdc3c6ee50a4840b5d89b11d94f45ab59c95970f96766cb444f46bb79e78c9ae03e964fb03b73f1f2051436640b3931392d9be068aa7b76d6cafffb1dea1e86a3d1cefc85ac31e7f2707271ead75fc8b95f12263b560308809ec0de23917e4c3ac4c9664b6034b1d2c4b1e05b2902f70784d600457843a63a3890e957d8196dc07a6ccd40391f29dd9141f7e10798270748906edb9348c2a788b6920b91691cbab87f823857937941531c0d68967baf690bb699e88113b5ff987e15094ae2c4d55589e69db3e4852e6565b5a5e17d5c3781466a8e3ef19ed07f2d44fec7799cda6b231d1f366342f0c3e303c3a191fd33be46a9fce982d9169ee0896094c94b3ef99bc1bb847a7d2d0cb47fa40a2126784abee33873a8a4cb126020845ea403211edd8f5dc8bc54015906de6b995c69f08cf20fe12e3b893c9daaead92a04b1e9d65875d3ae1cfc86c371600dbcd3df3289f1d931ac374820c9ce68d152af8d792758e15822a0ebda0154653841ae5412409b265941c2a01db9ef4f770a917f63f96d4a0b4d46c20d4fdb4353879eff8bd73196e8511ce94a0e6a579a1bf7d3d645aff5bda5223652f4997ae023428570f588b1fcfbae9e83c476d15f998cc643600cdd850386690c9fb4239bcce37b573c74cfd51b481a6b89ae47687ad21051af090565c2eb46fc59eaad8343fb5612c8814f9fd95a028c7c3d884b5e94ad0357e4072025bf783dc374d692d4ba1ce18b7f937106347e1d1152a448f9e2077c459b9ec507087c654e2167036edcb84b2ac65eafaffa6bc59bfdf686741b9f83e462cf20c623edcff0b4e6ee3df51ddc83c51c82c029d03bdba23a3bd5dfea3bf917bc66a6adfa49fcd9190a7bc16eb41cb2124668afaf69558d9374e7f9a4c58ba748dc128658ff187f82b36200a7024127186cfa1c9ac340fd51ddf5bd569095258c9a0373b0a753673749990537aae479685958c3f6fdd220e2805434f02be5c0d572556cf770ce095d603d8056a621e6137ad113d6705c2552fedf3d38553bbc63bfbcbac64593d7473b3c971ee8fc46dda160bcf50021fbc28d571737ed676a87104a22cb96b7b4beed815d9fc87824a33bbd20e1e196257e961304e3032f29b4ef52fbaa10c71889e65238679e1097aa1ecfc6dcc747a9a56e8472bce2fc2f3171d2018a2271fa49ca6642d3cd77287f272af4333d4ac1fdf8fbe1b5be6863757ef97716e3d375e93caa46e11fcbaecb01b547322c519778588882e36db6c25d0a33211dbb430c35d9b7a17b934d0c31bbe83f503d0bd7f6e2510b6d750e7cb1acad7d958b33dc1ab173f74aad098acb2ecaae0baa3b768b4c9da6fc41075357bf200bfea16f0995f7b9afa3d837e47fa57ef7c631e6f4eb61ea0f4abcbb88ddd82169234d915520fc445865d2e64b7fdea38b06407850857e29f0eac1da07df8a70ca6eacf8a6aa3529fddaa7829a2399f4463ee6c71ec6b4f4329bbd164e52bb546d0c520763b4e96bc696e1ca74841824cd9f601432ac1efbe6916ddfc608399745a58b08bdeec0c2ceb3524fb0d8ab04663299d144179fad8aaa0980fb5c7dd9ebf34513e1834e57b6e3ddf062815700b39ab4a031172991c1228cff56910436c5a27ddeb150391838300c62913326eadbcb8999f5211bd0640e5dbd8202d4f2f91aead29b3065ef365540b5a0d90f19a828bde7638fdafb57ef588b7c350731424b86f8afe726ee2b54eb6611f6374770e5f09fcfa3c0e8440d391c758636af575a679e8d16a18341af963fdf6351f31e8e24d8f118b229781dd8f8ab5877e3f64d9f81b5c1e41baaae1e986b6474fe30ffa77b371b9bea5836f9fd0f00a2abbe1e60b7df657015c1db67178c6ed28d7c3d3028f1a4575f0a8cc42b91a823e7f336eecb547fa07e4999ab1a4c79618b641450ac6eec19ad224703068b0e3a0dd14d78cb0ec0f67fb809e2f6fd3eb7d6e16dc6e59500ab5887783294a626a9039d7a7f17a2f9095e2d7ba48fe3b432348fc0be895832965e4a35b9339b448d546491c1c4dfa0b7dbef162b3c85faa573fa7cf0749fc32283602ab24d363417e13016e96740d3f171ef5fc0b9a183116dc04cc28ebdb54013caa43aa1b6cd4f36a1b7ab103236db981115b438501e5601201d499ff108d2684b0be8e1269d78e6b36d26a59614456b6dbf8d1f26cc4335dc2444193f0277e96e917a79fa241008fda737e2ca4e72b105c44afd520d2655dac906dd63bbcf3b779429c271bb39fbb018555ae13cd7b30f7240ba4db9762fe2975062cec8a875ad16f56e0b9d87239ad5f7d0857ba86575506ad6f521dd3fde86e97d7001ed4e72ef791cc8d725d991a4d92e58f1ad3051fa9e85dd41f6f32f6aa912e4dbcab9b9f688ce08d04ebd6ff8de3543d9c920be1c6e6edee2e33d0fdc6b9d38950058bc4fec253851a07950f0456753b45908e915980b4941c60f5ad7822a556af9bf7a28911617a2b1d8eef092cff24cb85210bd4db26900d45b1b24db924d3f82b78a1440618ccf71ae50f53d017d6a1514d010f867d9e9af395a8e6aa49fcd98894836734a6fa52483f9b06dc6aa527f347ff6d12f85e8eaf17b51b5a77192237469d0afbb3549f97d0b4fb50c4b675b82236cee46b09a8136a4ad5717a31210f5b2e8a562aa8d18d8465f144b5814fc3bddb7b47208900c4fc69db2504b7afb01fdc894978441674f26e74fcfab02cddf4a9349d6d0ca697cd5fc0d13992a8ee61707016126b0be6bb7eb8a5a87245b7f5ccfa12eab0d801780fa559810e2caa3c46877d6b5a580647b5d7e9cd1700a92e7a627bbb9032515dfcd5f101e3adbed0505b06f6e9b51eddb66ad4084b54be72c2249e6d534e68d30842adf2650380d62bdad3761d57e012cc8c190027b89ecba9d5772c5ef504132e854aff62ec62c0c6a480a7a0898cdecf11fa70df3932f58612fdf89c927582eed1cac4fbd02c81a42324157ad904c2eabae46221c6cc3b2591f6c8cebfc35034a5f40cc331e14abd48603c42aa97096b83980a327a19fce68469cff86e5e9ab26790edcf578fab3b230689a03ff16f9e8235fa58e217210592488125d8485fbef35de8a4921fb3302b7aad80f6f962812994e1fa8a832e64191a0d0802fb66befc2a155ca146d95530b667c91abd05f04a89a84a033aa6ec3f591e5924293e9a6a494ab3db733dbe8fcc8a371cf071c88ed12193a0a6ab76f7e74b5ad87a5a81441db2c8dc54bcd649375e62db0dc0daf8f6a3ecb1a1157bda5214d83df6aa8d3cc8326ebc4b85ba093a2a9e64e6eee8874567b476e42eb5322b44ef98807eac4887a8664482ab6d9c4f4cee041cff38a08f9e32c01ebcbe0359ecb4748a4a44ed9923fa080375a22cc790fbd43543044b498ac0dd103c18dd84b28a93fda4f61836da1c8d535221561539c177f862e79dd12bc272c645162333d03611887671389f675410ede69938c8296880f1f4e74c5cbba5ea12d20f49129903ef28cd170d1b2a5e5be81b4c8bbaa0ac24f548b36e56d9ba72fd5d50f6d4d175a3dbf50ea811f98056f5609cc3329789a75d1ca34e84a6a9b87be0d3890a6566833613b9965d81c398b665e20fea63b2e3742727fa561f730cbfd4ecde15a1cce6338170ef5d480600cedfe4a966303e4c396c1d05866f4cbda174054c8da745855b53fff854d313cee213a94fbea1481c0d83e10b51606caef273ba0b8f08239053b86b8826a5cbaf44d069decfb4e432a13dffa645f7a8854fc12e5381ad526fd3f8c117d8bca21abd730b22c350d909eaa27460c4afe2a10cfcf92c92986bb80e8dea7a035b5bd304be53a8f3f1f14a0201d7c2566b026fedfac8a3409d8d647fe114dfa148e426adcfdaa45d6e2cd27ac2558b410fa708fee89845db86414faf76ecfe93b4bc696385b1bb1302534c59f66eed6804cc8b32407ba68668a9c0313ad168dcbd93895d0e99dcc603116a2a8534a152ed697928afaef18a34723b28188c719bd6ce041014b4670b386d9005545a5f7b64f054afb189879941cf7aaffff74ce81b054c2113ea2f729391c8a1699618b0293fe401a5bc7404b2c0214a21bd6b3682e9960fe1a5969b2d7998ead3d7e045cf2895b24d523b9acb78744620fa453bd5a24861f757e3b0a838da375c1c3be7d744e344ca2eebce8d7cb5e9edf3afd70e61aef560ad8af4d5ecd1c2a8c1169fdb6b68baf009e3846ab7c32b1d9f6661ac69b1a1cecce94eb36982601b189fbe6e20425ed74eb39695476f269ee97361bcd9bc8ba89246bd83f283a9bde7d88f9407826c40263f87ba0e298e7d336a8001990dcb417fa64dbedaa9561bf6c401bda18ae9e06a49d253a207733ff53bd2a580a9ab8008af9144901810170c1a3520bbf10c15f36f3c2a4bc4c4f425ff2e3a7747e4852065847e6bd3ad269aaa7d2755e93f2480ccf1b1c4b5662c82f3893a7bf5fff6d7ce9895abea64b8f50634a861e022d05c87742db5ef5b18b087ae76bf7294d02067f8a22ff7ed924aee34cfff1c299360b79743a56b772739335ec2fec888be2eb79a171ac6d2b4035e6dfd6bcfeda9073e053d60099ac764690178b64f0cda90875f917e50cde653ccd6cccf7c83b27b4fa410b4fb9d74d25d1721047a91139a6072866f65053c618429e20080eb86cd89d944eae74fea40a43cf33690c9c3470cee2a8abda3fe8a9c812c0e4bf807a1f7804f43c29521f2f3fdf79305696f28d1d94f7af30aa579bfcc14fe886ee27942c290ac9c0e9f26f0eb220eeb7ec55b5febc50acf1dd5f00a01692fe2699fd4b7b5907cb97fc953d7546ac2986682c980d5d82acc57c52ecc2095bfd03ce1b371d902637a958b70e0c3ff58786e845a59e92d25265ef3d5c048f9d6e343ce1313b7e71e2999f932fb0b4ab112df6bb9c2d7df531d5617c14dd69b91ec0931fc623dcd7476cf7e8a8997abc3e888de1a6d127f0df44b1b8c8f024547565093be8abef477c36eb6ae7b4113efe162d682071991910831b92153cf9fda3f84eb9ab6cd77b06b6c2bcad1639422d6a52971c03db29da0e4913b82a8c259a3d6ac8a49850656b065c8b1a172f4d6e4b8725a7520c827798567dbe29140ace8c6ecac86393612dbd99cee9c15b5b714ec53c8d122cc34bc6131657e52f671fee733d5bc3ccb7504b6fd63be4cecfeda0f5c7a4b1f8cea8172e83470df141df6850475531b3e788fcd38efb9c5bb8b233dd591ff77f4e53c045e14c481c244b02b5e620abd513119e6dfc48a2b479ed3898666fe4d3364e6ddef009de310e8e4e88b9614dccc3fd890f8564f2111e8c3ceb31c639f27f85521190e4ce9c4619e9a9af3631da4cce5ed853f789354081a348f8d6c0dfb6053451b623a0f7ed20f32b7421a574fcaf1f371dabe4bc61e0b907ec86de6946518fb816fa570fe2723f7f94f68acbefb59a5cf2fb25341f6c2f73efe3588fba2b5158080e72ded75ed85e41e04fdf7bbe758889bc469ca812d3c36373f9993aa4f7eb2a206e8be2c5fd6f83b2ed22714cb15cf09e79c0b160c891dcd808213cd5d361410b213711f54c08216c9ffef26b8386cda17dd484819b38329137b87786d17f98a88aaddddf004b39108091dad4fd20ca090b2fd738f04e171d9708825dc39fec72de4038d73a3d7c5f1c16023ae5b0efb79fd22c4629908523e48e95a1c82f5dd5b97b7394e870f4bd52faf94ee790c6aa5ebc0d6840e73774a397908561712ca65092c6582ba017293157083d4443dc3e70a8a5dc09c7ae452056dfb4257676459577d87ea16082796d6d6a603bd8954f7515a527c61254291efbeca59b05c849dbd4458beb0c2f03419d544e26b2ed566f7cf43b63d69333feccf207cce57389e85f1ee09d1ce0bb54d46ed1f0de96b0e1f5f213608143aaf4895196437be540b7c79d52eb54e43e8b96e817d72e9b956e945336b854b96eceb7637088462c985cb2630fb1d3d5846c10c6b4bc6eb43e78574953b209a6419255c4559ddd9581f37fc36e75b2bae0438c1dd9ea9eabb7e28aa57a34d0cdfb8f8d44a51efbff3f4c423e8ff2cde0ebf28771122867c704c40c4f7ba8a00d6b6bd8c6d5169a9fc6a2b0789010f169353af555634b1ad579679679cf4c8557e2d91e8bda0651bbc2c93e1c05ed217d9ccf45ac3fcb3a77ef6fe4456e8af676f7915fe68b3da71905a57e8c2bb01e5ed0b727769fa03f3acbb5d76aeef911fdf8198155111a3d302d5f61c90327477bdccb8c0b4910a39d3fc0f6aa3ea70cbaacedbee1baa93b47e8365baabddef74974335ca8fc64faa90d49b665b19ee04856ef2cc3e84b4bdbc7befe84512ec2c0c887e1302f41b4051b1260bf63c98d1ba0896536dae6e713d4cd67b28eae19898f15049a0e7cfcab60e39b239aea42854f2c532488d6a9cfe4f028bb2f43c1b33644dbd83be26699e8eadc6a9e65c50c2624fd15d9472a418a02fb80dda95e1592943f7d024d15cf868eea86b1614a7cb92433d833026ed92125c05c5d7f7bde90b86093951fbb988f2c5648175f827dc181199c60e29d4be1af831ffaa5dec07904d71fd9c7b58afdfc51369b45a4a352f51de5e3dbd9a8d5335f7793d79041beb5a118f7f7686f2f2bc9d685dc3f61369e3ec99e66cda7e8b19f9f68db257505488e6982baaf9ceb1466efa8fc75212d25f8f00868aba39b7b22e9a8c7b11d7686d2549431bfd58129d9a6b4b67cb88dacb16083d8242562ce463e09b49fe5d904a646a4891e023632d129774f2665ca7a9609a24e414bfcd1eaa465408651450dce5b064f70459fec802fae4be40c43a0c9fbfffaba13f2b0334559502db2f04da610502c5589c6f41829be0d4f7d130131cb34175cabbec9fd0885a693e19923dee008b397a360b91a15f7faacadeb2d4cc94fde1c3c2e6d169a90009083c802b9243ce6e1ace4ef45141deafd4f962705e3360c8323b74676dc7f3424c46d6cc4bb76bc541b152edeb36ddc57ba80b7aca9bf64780994be67483af1974e51b3a6bfedbf8da56101a543d60993d01c2a509ddd36b0728ef84bf1bbea1d5ba6288d1df6d631a9e107d7143d9a53db205afa152f0cefdaf4e2cb1a59c5cfe6b4e554519ab25c9a4b0659997e5cd0961c834a1acee1267ae08488e30324ee36479a2543134777fc07dcbdb0ecfcfd717e216fdb7124cd872e5a74cec2bed634f0e5abfe8ac985f787e1e2ed22842a255fdc5ed67de3aa80b6e9e7b5ddb7a4ea5d81e757d029d165535aba0e54ea6dc0e3e459181c7b432dcc8f8017244e587285e4f626c295da9849edc07dad8ac5fad881ee369aa59e792676feaf7c483b92c8d5a92aeab307810c34741da6502ee50aee93e7b19159592a0a3e6d7ccaad0fabd12c029d515723a0afcd1e926553fd85ddeca2af310505a8332b89f275b278c158133f76e2bb802033173d4e99575addac94884fa660691989805054f75cfdcf9c073fabd3e5c68106ec3f88fcd63d64e8d01e2ac75fdc9bcf84203e93e01dbb0d5acdf4edb6656df8334ed074b5bd5134ea046a4eeb65b3255f1ea349cdf7114424c47823430e7ec84fba9400b86503906314a8ab047ad12fa607d9803c59184cfd1f9beaa299c4ea84431e17a12fbaf076237565851493aa8a8dfce8873e0a3f8d11c5e0ac1d1f179bf35ebcb58cf10c2a1e0d90c6c9e86a28c39f32fb46a7dbf93bcf465ec61b98342b6ae70f227729c94ab75a83bd33e841686517242c39a52b4dd0975ab5b973f2d40703a011856fb4f464609db83be45883fa24fc37d12b9ab71efb4ef88fac4642ecf0b3bbd385c34bbdc0a47c79971f4cc3aeb89bb4122615c750c80a54ef61f48ccc99af9b38db721dbc96dddb5957b8e3a7a836de7a1f65b7f049ad288405e03ca41242f3ebf6bd63c1172f6d4b5a33a7e31b21ed6e45bdcade2b7c6576ffb304882b5d75d7fbc7980167a394d829745959f903b14659e6784df059e4fdcdc2e126978e25419f81d4cf5cff7e2c249b27592ae3ff4c529a5f5fd4849d2096122de34c26921ef61fd8a134a02c86f9d7b") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_128s_test.go b/ref/params/tests/vector_sphincs_haraka_128s_test.go new file mode 100644 index 0000000..9feb03d --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_128s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_128s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("d16a29731b6d10dc357923958fd6119b5409452a429b7b7eef8800e40b962c05cfbc79acfce9efdd194998cb08b6ca163cf44da2fde6f9c20b9350b05fa12f6f") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("cfbc79acfce9efdd194998cb08b6ca163cf44da2fde6f9c20b9350b05fa12f6f") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("676aa92b968a737f65e65ed67b734059038b42434bffeab8884952b117bace6a8787b103fccfd2b7144d16f928098bfea7ecbd4d85bb93d99e6701f3bc9990baf3c580888eb2eaa7e43dc1b9111db2c9188f0d4c2962e12671a9062fcbbcae0839e1faa69232bd7a4d538182b71565d812a370d9e76e65a4ee4aaae90778af2b5e2a3cdb758c42b0016ccfb732d0f903a0800fa68652c29bde1ac807c2b5357390207ee7d749ab7ad98cf1a14bd0623b1a00d587b627c99787793d6c3f2f9c6dcb3bbd2c6e61e6c6a2aeaacb982e0c562fe9e2bce02edcb74e677119e40ea7171ff29260d58c93bc7c1d6f79db1690d7bc3f84b88377af6517d81240edcf26ee644b13e0216011936b3c6cb7afd51388a0182dcbfce8f60aa3ec205169372a5e5f2f967a4ed3dab31b52001a6ae7daa50daa19baee4c3ef8b4fa81f85dbe8858165fc2ce76c4905ad7d7db7258cf646f29b088105e5dec59213fb0cdf88263eeac345ecd3891cc2c931d2e433e22e2dba83433cb41ebee18d19324d3e899297f5c7b1b6ce380b254f7149c85415bd7b2ff193357c1ebd430a75868800e5052db4a2d62f089f01eb915a47059d3268e9f9a424f43e199df6f9430d20996e5e8e6a4c720efcd97915350277eff8f6e3370d8046ad1ab1f8fb7fffdfe550e37e7a7e2dd29a2145f350896c0eca1af72c362e3982c982ad56ce819b601bf6db7eba1c14c2b61562280c1f1531e79fac78479378c244870a6fa059bdeb57d60effefeca081cfc152acc1f548047e14483d0dda76587c022e3ded44063cba2e70ca58a17dd775483f8a40db0f13a7c4965551e5ea13ec36f77326c2f0b8d493c78f25d6797eaefbd018bec7c969396bf9ec2c20288991d38f3f2ee10b53d430c1f76bf873c505b1021f2193be1153776e5a26c4be504dae0208800b7af8081e1faf3126176a17f8d8a20c006fe56a559fe448d3cd8b3e43de76740bc9d3325632bc47c0421bffda77c2d86af6f11b9c9a8f3dd693ee8af7a038ab5dc25535c8117fbfc50bc6728b9960d78102f9620df11d036ed96ed87d14b6ae3ca5a2f8b424579b3479391c02934440f828455262b5b0ea470487d7cdfa01d26cee102f431d06b2dfc79190888d753d93b47063d5c3db023689e8c66793e0e2ebb9ab0b3bc2365842744870cf54c37ecd5a10e13ef79183ab1828dcf6776778a0dc95e1245b34551995f62817d0f40218c61f9bcbb6e7c797b3e7ce7a8ffb8b85cd5b68453a43505ad22c9cc513d11b9ad75e5733825567cd37802850373a5c849ae7ee8ec2f46640c3d0634fc6b21dd3703573a74298d58db670825a8add64834665d0776b50d57b11ac597295954871bbaf1a5dafb0901c3e0633d5c58c980cdfb3a16456b9f3234442065438c596191e7bb27353e60dafb45fe31eab1be26ac721733ca774a37299fd49f664ce9585801e78a3a11cb8cb3290d0f82fcbae44752e1135a6de7ea4505ca871d9625f8fb63a69f8fe00d36b13f3213e8054c81c99849904503ea6c0b5d7c4beff33526d10fa5620bdce1ba47989ff891a65a5cca0e2da22ad1c99a46d45cf451d42b8f390bb7d1b7cdad8ae37c16c6f565e98a76d10378151456a60898e5801b62ab718ad6d7db3762afb4d1261dc1e11b2532b7fe12ed852f07a624a585467ce360d3f79b1bbbde226d9e4e72ded95d01bcd98bb2c37cd1dcf54186a5c9916cba58019f384cbe4d0cd146e927099bce9972d149771eaf141cebdaa824107eaa00d992f53b5ffe0f85ff6b404dd21e97eede562308ba70231972b8b374fe27e282fb9d008c3681274dd9647f70cfecdec765f437a5356f71c7865cb81d53966385fbb56b6a2b80e87348be23a2bbbe2558af4bcbc501df498188754d2fa8e69277b056eb2704419784362661ec0036490d75e8711142b5f2cb95eb11fc9792f754850da20d7340ad702664775e7f5a042d088421dbd18290c409daa341837e43bd651fc8f7ae4582702fb538e9731d55c04afb81a89e8a3bfbd798f0cccb1c8245ce8f038fcd184a8de4ba6f739784002a7ae69e24174aae7528d7eff686cc7f322eeb6c6c2bce4a01f986f06f591a63c15eed524e6e98cb855212470850d117b655527c2a88d247b61c0a1cafcb2fb00d3979ac32db182c33c9dc0d5043b3415829cac80f4d25073c279cece63acfebef05507c6d3040cc8578e7ce885d0c387c6b196233af0a2e5e31b4990e09d50077133caf4aa44eaac0893050a37050a7810c09f1fe64aed345ff5f561842e91fca457868a3b264da427702ca8e74d0b0b516c58735b745445b3ae257e975bda7a0d1874c539d9847289c5828b0472842a24afeaeb10db73c1c94596c7a7cf884cd048e9acce41fb5922caf7b9e4e8210f35c94e4cf35d19c5cc280de0a9f57073fc7d507553d410a2749dcd6267245a6bdd27c70e5df5022f43e976552b936f8f30d086e6679f2181b73d76e2a7162c992d625cc0adb702ccc8961d7ab3ba77039d1f06bf63ed8c29b9560e3355cf0c69d5817afffe24419f6b899ac803817dfd0d1f269e30f54bedaaeb2d79b194bae9e45b57a1d72b8b1436e295ba32166d866c3f2fcc81e07d7aa6ce52db1beb2a5039ba0eaf35a81ce9e90a767eef4907e041fa380902c61df16ed0f493053518f1d47d3048fc681c29c4de59b08018e7eb7c9bdc91416c77aea60a36dd47af13148391317a5481ec6636e2cf5942ee646e0e328fe0a9f6ac66a739acaee3e60421dd576085d2d468fd491fce0146bf9460ded44d54d999aed045a79288bb4669ba227958a1fab9209ca151c35f338a8c6b93b7914c2a7ba304f94d2d8c894c2b867eed71c9c207dfd2556d9fa3a75d4ba47a444df115a5dbc5b5ab44c10363b6103a9e3f6274039bb5f4623728a941d3b22a10b4be0c6a426dc37bd1256d180038cf35f72f2d76bbb5fb5be98216149c5ede6026550335457704b286a5c0eab640671d7347d90bd243d1a8aeaacfc489f8720036228beac6d7dde48f47a7997d332df43a15a1fe5162465ddda749784427da7e71b9c506f1e6a635039302f8e1e375cc8d9bce769455da0931ee5d8529c3027060828a80de69bd3c0e00c31673cba094c80d804dfcc75bf16f4aa7e7c45f30a738c83be38a63af8a0bfb1ddbf4972a588e0792da8759424fdeea472a145ad397791e512566990dd9a39d61361f1089cccc831bbb8cad50887c4212a6e04fe13bbb056bd0037c337c010b2d87e7f73f5635311cad1cabf97eeac39fc98f3326065ae98797c871784b12c236a1c5aaaaac4270aa5d5d8d1eebc95c3e42cc9cb45da801c835b723393bd819a26976e4c8125f978a1633ecd6e44f37ae291043029425f74598d324b6088f8199489f8210eaee19241fc52aa1e8e7944ba3204eb4f8954c3b2132f8ac429de0be6adb207aba6808f82dde4c2c66531847c7e85a7e0be175800f7c97bf8da479b8ca3e0b9430c44d2f771f928ed6acad2e40fa27db01a7f8f8ad0ea9aacc11b5cd30257001d23e71830d1f498af4b45bec9875a3b415a329b8e1f1dc95e34005b6130fde04ef4de914b36ddccf0c96aa16b9d8e2be88019a6a8d0cfac56e6bb1182b167471d9603b93a4a970177b67455f0e081a0e40dabeb03c2828d0a3695435949ba1f9cd2ad4022c787ccde4cd420693d9e02e41687b79306723a9464b972434f1ebcc246e75861d465736f96476632249a0a20c5087b26c39cf95e30745fe2c06c01b39e4db5c91c451f6505ab3b66fa45ebd318217aa63b7764dc0f7b2a0081174368b07a5ffd12c5c434cd0b4c9f9497ad0071367c730b538cc1f7e793fcabecd84adc1cefe31c70f127024f923500a571b30b2c1f9e040daf6df9d5ee21b50394632fab04c1bd2c652a003060c9309eeb311a94d1250078618ec152f9661f654b1a774d8d8d64199c85ef7251adca569aea292beb1fd3f08c941389d38b6680d61706859b8f42aebfffa8bf3272b6e5dde3131710cbd545e681fb9c1e829fecfcc2c1964409c6704a6173ee9c43b485c85f80ebbd87292e393a1c34ebcf019841c83c4614dbf6b4228b2883babe83d504d3ab2c97ea98a96973eea538bd97681eb3ff8106c3f13b877fe4f3e77f724fb087633e6bd7beb41e71519e51116573afe6a103233caea6ad5a85f8cf0c1e53a4b3386bbed676be6a9239fa81b13a9a8f207c69ddab60d843025e86e8c873f15fec637b3a4599dc817ea88eb6546dc42af76c6a4c0755fff3933bfa760bb94a44ac9173cf28a0613b306f1c3f6bfe8ab3106ed09f38cde193e96664d2db00ac46d4a9457e8f134d8c6ee65f6789e2609ea601326202defc68f1864fae1990e7adb6db5e871935a024d45dc07d5f8ce1f3eea4798d89f69a260a2c48714b237be13bd55364328104079123d9014ad802dea419da90a2f32a9d599856a536f6397bd8d38fc0e22bb09d1337a6743599e9cbd4cf9ab36af7f412e010205b16ec9b57e560e8001c5deb73eff3c6e9c1d3f8f6ecb031f5b3701c59359347d46bdf69807c1f3864388cfa62bf2ce9ac81107f50e7d2c578523d74d5cdab34b191c441e8ad6531cc1892400b7cbf4cd5938c9d899a709b6f3c8921d0d43c3c3bf132bcda1f1c944106c186280938068e7bce06a52ea24689c068374cef3a6608d8f221bf05af9c6fb63d69d698f88cadbbd23ba7a42a2d6ba8ee2929311515681e07d8652716a5bba8c4c4b91e95c71fb1dc711f90dfc7b632f3c9ec7551f428929e4db34f3bfc58f9dd84436d76f6c53d7e608881f6f1ae23f151cefc7cabcc6c74d4a2266f94d75f265b7fa4af08e4c52d38b16b08417955413f04535236495c2bc1f2a6db6cd49b13edaa0decf2b25cacf5d470ad4feb912b88f3a78aa51868f618091697e3a546691f9448094be4a2b78300b4258fe0611c6df3dda288e3c6f23cf9b5fa6a35de7f250e9d20a2ab51c768fafc0d3f71434ff41ce98e9f4d2a3d6aa5e6d01a6cea88a5bff465a17afceab8fda72da2409ef9f4c976d1d10430c26af98d5a2e73ca2f6ae8ebb553cf780245cd244f72fb6f38bfd48f3c2d4f0f974e98299fbf8b78f951949c7de203df778865d786aa49b611dd3a09cf2d1d41fa6b2d918fb4cb27f6c7387c695b26d4739517e5d4dd3f39c0c19c211b82040ac64d4dd42ce1636b69b28b4e86523c1e3389805e6f26683b0708b0fb93681ed8e52eb974d589e2a1e994d5d9ab118c65f25365f6b1f0cb3abf21fbbb3413b11a22dae73bd8aef06bed2cab35cee48ccfe2dc69dd3de89b1b9510fdd3ceddac17958e01edd5176c5a3da4c3fb19a55a983d4c9bb1ae19af5b1ca306b302ce14d3fedd34c5f61223082e73d7f5cd4085ca815c34a55f51d79b0dffb4975f3fa6bc5f73deca8767272b91cee8fa65cbd0945418d46a0f6ab135cebfd349fc618d098e9d1d05eb5f8b54a199d9f1db813ddfe83dd6a47b1dc6c4fe802f0279e3049b58f939cc1794db406653137d6a0e1854d20073d88f1324ab73bdad7e8811abe6771341d882c00c6b8cd612b2912760f392b1309614f1598132e18ce8e02c45a0b854f30aff75df071821b81190506a1e49a787b3c521ee5113ca28f540abcffcfe83e2333fc7176d9661486986ab370380ad02bee0bf573ddfc49ae9d0aebf282c83e616ca3dca6639f6a403d59ff22e566232cd1711fb2904608f0d75358d9180bb2d27e2becbc0c329ff35c7891f5cd35371ac43a581b482044c82a35ff3fb6d03558160ca0f3274ac4ffc61c59a98ca4a42fa445e7e6057a9fd0b791b1ef87b2e355fd7b09b440ceb25d1c7bc200629af70a1aeece29730c2b589189381e86ec7d8b24ff4b0b68a2a3bd1bf6e5ad78c13a20066f7b20faa1605cb0b54b2fac10f6b7bf36d6001137fc84844b1229f6fcfe74cb5ecb2cf7a133e74b07aa9c37be98c5e563af9d3d33aabd36125dec1c327445c4c5749672b3ff81431db8724a309f8bea83c1e6cc6142dd125974b99e59504622b1188f87550537a74946522da7bcddc59e4089ac7a483550e0f2b85071a999f311bd7cb3be3742292fc85843db720581f0ff14ff789b64d8ae090b61390ed1577ce1e4d1f3f61f99f37ef938c66f2316838a004e326a710a5af3810f4ffd24d9529d4465ca19ee84ec36b7b2ff459b253fd3698a5928555e0da32c64678a8f69ef37f23485664d15a6bc043e912b1119017fb884edbcd2d9f7e3fd6550804e32b26ed892c96e52e0595bd2d8ba9157e00fd038e04c088dbb21cbe1213eb4d671bb6381d593195d0c3628e12040ba2233db050060edb345060391da78082462c46387bcebfee4380983d7f8f16aa8c3b5c8f3401638a9d09a75c34aaebae6b098b594f443674e14c072345ee87fb9dadf133484a2e18723455dee7c51e2ee4a177ab2cb16ac69f228c57776bb5a938c08a80849c8367a08bb5708397abf5e6bead91f8f9fd2b75c8756b8320d580339047c6d95bbe18cdbe425f5d5394ab6687603b5c2e5f65105ab4f62bb4526144f1f171766853b81bde089fb051aefd95f408453798963a4a3ced10ffa53433b75011e55d1ef571065816ae9aefa51233d61af54aca5ff766efc9681ebd715f9b3dc3c56cf7801773172d7805ccf0c2df7212d7da436dd62aaf8b624d77f71091e841644a3b073e4581782d5786e84fac7d09bed6a7e858f4d2a61365d432714542de887fa65a0cb18ea21d7abd9ad72a4638ce09f574c61c85572666d102cfa795345276d9409d7e11690b5216bd83b59a499a9f92adb1b2c78309d2f2c516b566e2b5c323273d477ea5f412e84293deee0fbaa58e7edb202304c97e7f5c1ae1a52ff40181176b4c3592ef5aa7073160ea4214b0deea502bf40738a898146cb1ae7164d181ff219aac40677664fa3bd591f561e6feff23d6fa63cf8112ab58a9195d0921545f610ddc7aab81ffa2b34761e08893506a39b263e2a8a37fac3fa55ad141eba3cf9bb642952f115220719d63fc4928ed5a24c441792ce8a423a26327bf89d2712ba53c50312080dde2cf5d20250bbcacd7126dbdfabe2754ec7e051ef0c032aa2c96f215614aa29b2c43fef5bcea2435c838d458e1396dc3aab05ecd6d52960c51e926bdc9b5fba9a4bea46fe6394a802a7534d3f77fa14e0e6ea962f0125b7d173d5eb97f50d683e04cdbae401dcf5b359896ebeb4a31ea9c99895d80e4862419d8280de36aff5f64ae9ea9fd77d82ef22149fd702ae265e9274e910fa01dfc6e925e9d6cad871a6b9e53d16ea59fed0b54167d5a8e8a09f7189515ba20bc3c7abfa1d4da6494195fa9cb1a855b2d9de3c1911c2985b4d4386c20a4fb063499e68fb3be5f637280064e7160ce47c9e472cb5586930db4ef6e53abb78276cf84176c1a48e25f10af496e5e0029c5cefcb992b53d173734f42c1204b25911076d74069bc7bec3069b36793cd001f4db3363690402c221240aae77f6607b41b6d64b62c9949ccc949f1f25cc469e6afc5a7668a586ea07ff4a8ad8dad1b6a47bd59a83e584a879c04fc6121f561d17b7c58c1bf55f2f8349a1757f0fc5943bc8d0b236a74f37bb027b3d2e6c85b2180b97b17f64e18c11bdf63af2aea49b64d5db9dba1410115938a602152754c1a3eee379931acf6eebb053ca8aa0532441c76412d99ca6e9198f9cb572b8fb339d1b64c1fbcf7e1cd3f27fdc4eb62b1f7465eefd15ae360d8079d0e1ef3ebd27e880c04b75664ff71c497e52fd04090f09410c9274bab9fab7a9450a6fafa7f739ac6c9c75bd885e07a3032c0b4ee0b78e2b4bc1a102c816ac6d56df6206f74984e1ca72fdd43f7c5f062950da56e3cc9eed8f0721b8c83917ee481952d43380737c8231fa45ee671c61bc642ac04b71d2868883a174cc2735f3c580b29669de5c5360d0ab5b73290e5d5484f332c31200e7b451fb5384999fdb61c82d58dbd1aabdefa61603cc8b6f7150351d6ca9940b18c46d50ae757b164a51f5e58156263df01e1f5db6c3c0c92ea36b10b87c2cc9a0d80eef1d761f1fbcf861ff773d4eaeb5c82f7625ce1c5351c759445f8555f0677a1dd5795742952da9824cf71d864ed7c576b77993ddf1cc90613f488f83fb5cd8772efd3ae1850f2a497247180649676ae1768542596fb61c16591d030fed1bfd67bbbd07553ca54c6f71e1d0f6cc7095464581d1d6d689e36b4dfde876e415f66923bf7539bdb9df45834ed69fe446403db6e4fbf4b6302826c0511a0ae9642cd59c28a166c8fdda13109312efeda684b14651b41f58f95b2e1a7c71093a4f9b771278b78ec5c906c20b0a9f185c55f50d51fd8e7c5499d20e14319d4479c457ad48e6d1c5c4fbc327efe9095e03e501176dfa113439b7596eb65d9202dd2485a7b4a834c2b4e5cff5cf9dbd58092f232568f742424bb1fcd9efb5b3bebc93b22645c9048735e28bbe9525ffe58447c98c540e8e3c323b7d931a89487e96c38607118305268279242c845d59fdd3182f709c813e988d8e20716cf1a999f0d3e99d8f4601e99490f6222e823e94a7a4d008d20b312582cd2e6bb87eda2ca26bbd208c31163902e447f36fbc3f039c201074f84e024a616e720859086fd0a3c80e14e16950b4e69d1e30a93063a58d3129377a1b469296e95bfaf7ec9cf1fd600dce5b40e4bdad4691abbafb041c80682e7b5c8e583b203cb0ad6e0dd7bdc677a142aa3ad1dbe20b856423459f3d976513a8a9b4b18c4882bddea61cfe39b652b7afd6ab8c9e1fad0745761d395b91f8990cc92f106f4817f2ebd0c8ccec8abffca09a106b9f3aaf34803850430a64ca6bdef362f90e11c2ef867375213110529574cca20b72e7ea80e9b2f50ca18567af0c8a5109c90c3e9bda50cdfe7507a456eb54cb098c85b57a8d93cdd662fdf3ddae5b7b6e9004f028c355dac9d96b551c24fd02fdf09cfb660608fe971f732d41fbff124560ae086329503fd3899f3af012e5fad0086981051a0b203ecfacf010757d31fc65090aba90d54aac0613e499f8e152a5b62676ce134a67f014bb2863d06997e7bf66cb56ed66567424a0f5447a0dea8f0ceef342e70647d5cc97a32eb947213fd067aeb0dec4779eea422d872989548d359aa2250974757bad0875e2d4f9ea09796580408056fc53918f641191ece6615cebaab02cd664177cea11733a5344537744d438c977d762ee009ecd6d53daae8f826b92053f78cef868f4920e1d0fd2e8c81d72763914333f3bfaf02d4e81bd3eab86350dbe16c76d6823ea5398c800d9e118e8dbfd03b5e852493424044b692fb5a505208e551308972ba80019b780793bfc6d3540cfc46d6bb4a6bf7f3e8cf77d1bdfac3c5d8580e7d0be40b2be1feb7d3596b934e20f03a7eb2422275810e212bc9bc42f94f36e85480d32ee50cf939529270eee3b6f9964dc20effcbd0aee4fb999ec646b15d1c623bd1a365f0b0660874219635f38b364f2d3cb383671ecd6e7fa21e991007041bcac30456d74a5e53ee6788d849f98758fb7e83be221cc663dc8e31964d9ae17e203c1515153f6e4860ac73f54235a6264a37ff247a56cbb46e85637060aad47b9755255017ab036ad3d7d1fa15732f3d8d98b20ef6b6cb4b104f58220e12807788200e74bd9027a916edd15f59e301de5d80c4dc640d713f4592290a4ddca29ae02d18a0aa59270a4a0d875fa31b4b9345f31a88d190473271ba392023b51ea932b4c89b2f5c7c9b0c1967f8e710a4258f7b64cd344b97e1c10d66816b6c6455cff80ac320aaf62494f5aa6d0cdef4353f9d774a8cd51c73fa2fd62c471a513dba904b44fc69592f784cc0b9ce9c0ab3b978b87e1a4ea707138d9e88a4a26abba1c713b2e4742f638e41f5005e703a2fe9118d1a1753bc8e966d570595b1d17644b5412913546b15adb8cbf248638b78be057ebf0006e0fbece993ad286abc5583c249bf36c85443346a777f595d8b9f849b578644f80f9aee27672038deb0ce6e41350692c3bb90cf401e0dc081d4dc53787474871ceca3d5a2dd168c8b11c5326e80f024cd5cb7e5ec45ff71b2fc19b5b006cbc07df776cf98b5aa706c38b6510617003db6c73995c867ddadff9901cb12526d38ac145ce5dcb16594bde38684a19af633758c771d43a7400dca5dd6f6ebc0a853e70330bce4d34ab9c973c1663becf1ca8398c3413a4cf05f7fa515522c49642ec46627ab9a3c9d6ad27d8147ffc8fee7b59b8c0d7bf590bae90fe76f765403c49a55b8fe31d2ff4a127a7573f56d2901f3312c2065715cfff566d28ce4ce977fdf061cb8781e780bc518c241fb60e977a01e0f55634121ddd01fa37ee21ecc58efef754712bf787f65078df321c09a9a636f1ef285225c08ddba7863524c8bcd7cefc78ac1cf998aaf6857e91bb001acfe793baed390b61991b68307b32699e89090e9eb3ba947b198a2d4232036cfd2216a3c7fb61c709b0a81b409a784250abd0d9332ca9141eb9296e504811990d1faea19f623fd7343e591b5da79728f3ab2b9fa9e636f1f43f52797b3a057e7ea90014a89a0802fbe2e5831d1641f635c510a116cd8dddd086494fe51d7a803e999e3b77e4e3d2d0a52255a37a9c0ed7e6700c1c1b0d23ba41b7e1845515c5fc2261cc6f5886a210a285e1bf8e1adb54f052a508655cd3a853d238a2453610825b0fa47c5042e48f097831df31891a4f9e988f7fee106a9ac0bac932e02c292a5b421de65db4d1136cc86f072ed8acdf06c6ea5884f8c174445db0b3776357790d9d6f8c97b0ff93c4186c17f04092a0411b81f202421b653fd1724457ea7d4b0eb96cae65f5118491cb2edae1bd3c614d009013142f21d4b40ea0fc405edd5244e1c60d3f02debde67741817f1f31d57cf9726ebd363135e593c995a203e3e5cf94d321ea6b5024bcc0a02f88ddfe984ece939b9fc7f68a2caf8d879ddd003e40e035699d0cf448cbb26abfd331397d38c30fcd810080b7647b825e2c284ea696c2ee9e5011a99a2dc980dcf637f390a8be0c8be58bd6b6a4677dbd7d4b32af55c213c0bc49e43cf180975b46a58ab00d4de402abc988d5ec88581a8b38e35d3207") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_192f_test.go b/ref/params/tests/vector_sphincs_haraka_192f_test.go new file mode 100644 index 0000000..6bc1530 --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_192f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_192f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("7304944e1e98950d13ecf398726b48414730550e3c3e893250a4e1bb352837bbc87888838dba50b2784edff5ddd57623a40b10c4ec3bd417f59a1fadf24c378e3bd3acee27da0a1cb13aab936e5c58853b83e9b15ed99c54fe84dce0721f9c9a") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("a40b10c4ec3bd417f59a1fadf24c378e3bd3acee27da0a1cb13aab936e5c58853b83e9b15ed99c54fe84dce0721f9c9a") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("a8c4f1c4c79061779b16d7d92f01a018c323c9ee006131ba7463c8ca73a6d7131e99e1206e0b1e986fd6b066970a90c7fb15a819d916f0a3b189d5d8878eaf40bbed7fb1de92554fbe9f5552f58bb6df413bcf726c8db80ef75a3515360a21478feee1e0ce7489b72f7dba7c72c657ce0ff7c9946dfe662dc7870b6831ff3b054b88721090e330effb68c138169022791a3dabfd60e9c2cc208fdb44fa39b43f110d07e42738cc97c427f29334f3a2597852082b8b7a82a05cdb69268dc5d5585f2fbab49685fbb763ed7a34935ff8253faec6d4363ef9908fdd3f3c2dc92f07d5001e358332214700dfb3faa24d82bdc9807cc1d7b2fd6538da8aa4bc42c351ad82aa7a027519820563cc13847e4069ae5a3030ade5a85a8a20d3e811cec6a8d831fb94ccc4a7c1b42c782025317f7e5dcd76d1263a0e577164e44551246585e36efe9a18acb06cccd02395cc31cbbc685c2334c1cf310ba9a58f3f33053d653a24fe7492d2f883bba2a0b4e1401c1081b2d9849afd24f407a7ca8253ae23735a0d5ab5d28c703d203e3d12b065bf94fc90c60481f476cf167e8c6719e997a61132da6c2c36ec209c836ab764a5efb52ab830f7a7729684498c526b9ef8f6afef81879f519a7a42fa05031b6831ea892cc2dcdbc204847f62da50423dadcc595b52613f4c7f960b7fd7b85af6f4fd0178ed858426d5f8b5bd384e2e7d817cf33d3b5ea452128244e240c3abf4858a8269f4e0637c598a2cd82caeaa90ad998e3d2bbf34f2de6ed265f8b39d7d4d29f57fdc31d94e2b945df0b12505f491904639dbe6921172b98685c573c2d512b421dd01491e8deb2a41a8feb60e045e95b661d4ec49fe4bd8b01a0b097d3ef9467e6faf0d2daa99ef1608c85004b4b0e27fb9495283a75186e779e43873bc6a6fd968adf21b2338cd3d4789072ac6a7ef31b731b5c6306f986db70527a743557b472def6938e349da25cd7247993e7c3a884a460b5e6fb6e485cf2b1ba070632aeed03e21d8e44a0daf44a0c29747c2c0ba32b7a1ee3f56f3fde2c66b9fed9767f34832b38d6bc99ac1e39890d907b6df41ea1c66164c2afb263be453bcbb688fd9d5450f7334d8af3458ea19880424c04fc8295d25422f026ec712952539fb1a3b5dae4ec55cdc88a4fe4e5fa1ef6714a34b12933c398db1e5126683622a20d9a27fa6fd9986edf40014e61feb176c5f508f39b0b0ee1064ee2b11a312a69f77f97b09871fe2b22783cd934d1227d47a68ea9bab89d9d8e9549c04244d9db0e144793c18539e4cceab6b66f64f1566806f599f321c1d9e3e47f3bdb2a26ce5e12041927c04b36f9310d0424a6078b0bd131c185a5914e4f8ff0f41a3157ce07c981464b4b104cf7a93f410f204b06112c63fc0d7ec447473ade5b6055b9376358288929d507edfc1128ad46a0fa1045908403b720b5ae7b230d2080fb253acbdcc8fcf849c517557b665d4d3b85c8ec05420b084a937d0764ce37a82412787321a0a7c060c518b0c296bee15a9cd62f4473bd1232f56829cb41cb5c69cd852f66ef650deaf86c8e17adecf2129234de740d1ae590e97b38be4517021b887170008b082a87d5cd91b4057b107362e687722efa5971c7e251be05a7f7e58478b2457d6031a49982b96e10be424e68acde3398c8f4170954af4b6c288ed7f11e7c0cb2abb872e503f9be2701b4e98ca9474b216e1953a8f59549d31741cec9c32605ed9f8b30ede2170122b7aa72a5db0a47cb48f33a002c9f63d670ff31177dd720a30bae0468d43863ace327cba23e8192bfd8df5e9aeb2db2dea8aff2f35178e6b44e37251b66b0ab07283669952dbae26d3417f2b86a6bc8aa7412f748c47a2c36ba4df8097ba7061afcfde6719dcd1c06ba20ef8a6af93249960b1e8aec5d809d56c3e57e0516dc96650385cf70a9e7e09495a713f7581e5d253f3ac2cebff1dad2657b6bcedd45017d7a9352a6e1ba04e3c6c861d1893e727b248a425085142b7a02d87ff212b919d393897991e3f02ef50831c8366bb1ad6889cf6abc88533f1e6b55f2950a1c3618b291a6300d32eb51402bbd0198816c78621dea4b450a4c3667ad459c7673480f6892b4e404bc97428ce06c6582b49f47c2261f51f485746b3f574ad309eb693bb6c530e8e448a16c87ffc959b292aa8be6845c5a39ebdc22739597e875192ce145006d0fdbdb9eb1d0dbfc3749a858ec3944fdb72cd66f0f0049ed81db95cd6ef033e244ed24287c8d2f1b6e30dd951eba77042b5f77c667568ab659899e5a7ad1497bc5a0dfb03cc8c58fb8fa8f0fb77049f935126dcf89b2460c8d9c5187851d5318d7a2a33a34a92c0424db35a280685e631b08d26baccf35f0d1b770814c86d749aa292098e7bf8891616224f63c67ab10739fedc614626597e49d672d601265dc8dbf715a52d414b88376c79860b79207d365aca47092b91ad17cb9a7b1d1796231c63b66afb7577af8c79435821e69372d51346352e70c66f969cbf3e45452bf6ac811fca70a265d7edef6d84eaf8deb839fb3760a0f4f5c302c03c5695253f5e41ca8f91bfe0120f87fbf729b607b621c9cf665dab7994646eb2bace3a0d93ba2418f9972f3408a88781c2ccb8a6895314fd8c01233705d2a7266cd11d376efc99cc69f12260d889e5ccf1480273ece015ce0de02676cc7fae605a4fced68c27c5b323b5ff84294ebf05f78a58f5ada3a8d0c8b0d8461de6c396fdf529363dbacfe39385139f07a669daff2003a73acd53bf64e59be3c277384c98c0d66edf08b7752a15d7d944df70fd363e41556fc86b24ac1ea2c3443d8680215c4e700f4c2c1664b455504bb8d1fe0c05b2bd40f411da29539b4eb8789c8537db3fa9ccb84f8f7ea1d72aac6450c2b7c07a68f252f28c2091212b1b66ba3987058fb66d97e889fb62db5bfe5f61a0c4b02d9568791ef9eca13a949550e923b57ab4c7d3903f05e188716ab34c4f3efdcc0ac0349d50dad22376b992408addaccc606b2d8584829f3e637c300a6888d777cdb3b2f1eb494a0ce3df94274bb937a20329d3b4b22cc9b9f18207618283918f85446db423f501d888101a697e94b08e36f0093839bb0c9329c7b6504c6e0491ff95390c9b7eccec6d3203704ef6e9ff0b52986b2d81a3192a4a6d44480cd283c1dc32bb5eecb63d5143e132d3021fdd775c6b4eab42b16c0c0da59d1b3176a2621b7d7aec18183c8bb3c0dbd71030cb04aa4c4f119ed027ce38831f2f0463f1b8db9504e5f06107b7e89a613e79f9acc95ac4b80c5ff59087a6c169085339bae5a1f602c1915382662b53c0e2930a4d8fb1ce1d3c915fbb1f39ea20a60dac289086760e5fca56b0082e5212e64f7c87851a9d5345fc52774062db3fade7939049f1f7c40f85d22573cde38536d7836eb948e784c8eef2a103a4982e7cef8b239e7321b24f3972069dbe3943c27c73597ed7a334277c8fc4d989dda9192d2c332b3fa5727da3a02fcd0d9eba419ddca1b6d7c2b8baf728d28af75c3b4a6eae2827573456f9f9444a2dbb89c372b6401b84583316a527eb5c5f2758a1ac88bfd75dc31b57b435809953dba3dc82efc2e6d455108e1257840abe5b9e44b97aad7586755a1eb069d1d914da4ead06b5bb7480bf8631fea4980e9e4caa9708d6fc2548d84ee913e56445e8dc3a11c2b829b6730455bf9a26c4f685f4786a579fc5801d747b5081a213fdb575491361c781c8ef5be228463a45ea74c3bd7af5102ed3c9510e34f7cfb4cd651f5d9b106fade1dadab2b308e76f56964e8844b80bd4785957508bcc9f86f83e06d740366e90e82f8cba3e6588ad5f5523ba96827176207c0994df4faf4e5b2cd4ba59616d64c6195e476e6009a5dacb9ae5e683feae38e79baa9b093a1ca15c266df2a365c37ce085b255a12233d1d79424fe92338bf6f34d0d32756a000722de7d2f843c90ed76dbd3ebebe481d436b931158809513933e2fd3a162bcdc2a758237996a2a1683c3f66b470b05adf96fd914accd33c7845b65799c2018e113d2ccd0bd142f4f28c7fa23c1d042fede9af5083f1f57b94bba825dee3855afdab9356d87d81b9bc93911a1810e680d3d4a7ca0ac3ffb15bdae432d5ffd0eaa3541fdd347fad534f993f60a6e135cf0652a5f0235a7efc8586592fe04879404ec3b3222bb3996442cae0d701e17950fd3a51ec09998241b64115a53911d8d1c54be3a479e8b2b200f5dee718a57c29c61b9998cb932f0f2d9f0c33283664f7a60566f96f8c398c3c07cb9ec56fd11c935c2a0b096bf9d79b14beb356bb72711e47c4a0ff0c4fee1e9ae04ebd18c8202d0d30a011a2bb9aa30eaf788b4af101ec6307767a58cc9fe9553b2616ed6f70cd106c6f13b481d36d7acd93b921af43560453a969068115c7288a195e8c6a9cdddd30458ad1e795098133f88797cd4329e782475754198dff01854d0b9b3c6946907d5cc3635dd1ff9abc5c29bc0c6cfce7766b3737b9121b5a97fdbc0c8c7bde0f322b21b7eb7b85e084dc129df7d15d2c825873e3c8389d61cbc5577316a5489e51df8f24ffee97c1765aca8ddeee92ecca6399d2bfc1da4ba5324de294aeda6e2a8f1ab7c22fdc0ed144b79934e332d6d2f34a82c4cacb12bdffbc91a93d3f030bf153353cc200e461b24b0da02b7520c1b84f5f79a473d6a8b155c2c408e5d745285559972bb28ede287d22924090c59ee9c94f161cf82ed2edf5831cea758735e32a2461f9b4aae3baf989ff2847b318945096fa885586e91f04d1b3266537b032adbde4934e442afd7454ec1035f1ca63a19f5a1efbe9244d92e5cbd4d8fab7e23c6fb2709cda8d3752a167fc45747e19f93ffde9a1e94584988d1f66314c50d4734852fba02f5e9b2d481764d66d064fc14c7a309b4519cf507f4a2ff80ed01bccde13d680f0f4f1c4da1907de3523710cb12ec06d57349b5fd9a6024c3eedd648ffc1441c5362eab3da3219cdf6146556d5c0945248117d5e6ca7de46573c2d14ceb821c1bb8d84d5e729aac0fa9275ac639b0ac2253d0a8302ea55beba0136e7dce113221a83cc97790a21c7898765487cf2f1b3e3211890c0cd7d314f4a01171a7d59ba6ea1e460c402ab3efedd2e925d4b42f14a5d151b6618b950a4e5ed32fa71897bf00f132a08114be476b384ad2d2ada8e8a8ff6317ed3e3da9059f006dee3831a500280dda760476456b2cb37eae90af172edbc456e0972be4d295e1e84e9f2ec5bac48da3e7719d81556e2a933d4da1966f683fc9d32ca91d86ecfe9d24ad1fa52a529c3ff19ce0b2c6a708f25a000c8ff33c1d8ee082dd0ddc62f16488edd2e9f39dc8f318bba90f72d39872ecd39311e558f25bb43e6462e5dbfe217307258cb4cca72195f118562997b0271739fa4860f2336387d4791aff63e06d9af18e887fe59865347c9f73d4661c2b77776ca73c3cdfff87b6f07d1686a930e4ea953c3fbcce973c0e1356a89642a4c8676c9609c4d13c7d89b2a1c472d131d6c48f4e4630d560702426547f1049e8f5d549c1535b0056a88a931b54dfd36ddabaa0692865dd5c35b281719376a8ff6fb170f3358a69e75fe4620c71de90c0270ed56d4fbe12429951ce9e7bbb18cb5720eb010a63e06e99181c031edfbd4c67162e551ded05ddd2bde56be7d14b1bf3b72806e8d5ae2dd8837b146bdfa33c0f176141410fa6804115804394b1f1e089348dff204b91667642fc7790912e68a1425a3199ef2b1d1e39fe1d27f04494893a3cd2960b561e59b1df78b13402409cab7df07ede4032344795b32f4725f45d109cab766dab9ef098982f43a2133a2cea7ab2a40565bee45b09693c85d813009d3df06dd8fac9cbf069a835427e2fb1b20667d1d9175995cbdc6b4f8096e157395e9acdba2c6af01cfeb37c56478cb8b6a6c6b40d256e77ccffae82b159beb12fa4a2ef88959664c6ea66d6b8074e6e2b6dfa1375b9244fe4781a38aed1931217847a3cdc248ca4e5c2d8644315f481d82c1a180824d9aa1ac81b55c4907d5d3c6850c310a3dbebc2653b17b1a4dbc640caf04cd1545a2fee623a0b9db3c8f6c9473c0c69cf615cdbf6b82bdca4482a50d5eb8f5ac283bc2d727dc3f28fb13321e6ad5b59c9da34e4d65820fb84cdff1b817b6d1f58afe0aa7ba7051794d2bc67adff5e2fdf13b19eb22d43f554cc73154c2cf9214a8232d9c93879113aee52864bb01e4377abf8dd5308d947bbf75215f5bd62b3a6e05b7f4cc19b747b2e819f08a337204922ca32718f9cd0fe937c5d517fcf90c8106017e0e3ce57a28c228853da7c3900208c8c2924b15ebaafdeb173d07c4905b2ab2a93a50f44ba5e608783124f6a3a895dd3069059a36fd9f6e1ab346b8620996e80fd682f4473a9b1347ba2124784c842f83e2e3f7a0b5b9d0aeb37580fd2878b15f0c14af4025430abdbc251c5c472b7697608b4c795a82ed3dd350158f1c6a5c4889e5c66fad9407b3ab9f4b44837c36bba31a28a8c0d90878a31bd04db441c23bc42111cc9739ff910124bf9465d5803ae2d49d4ce0df2ad6131081fb3ba52ae1ba2aba51c0ca494357b803a3b1df8668ef161eaf07d63fdb4b269e50dc36e0cc9d1fd4f0b50a1eed646b7339e8364b8405e65a9137c3a825b1c0c2b01c68bfc349995c891c6cabd6759ac167cf8621b7b7ddbd53719afcc46ef9c108d6713972dfb490400906d3c7ebf349ef1e319e1378bab6f4ace65ccad76b78e2b1fea0e154c7e2411708c3173757015ba0fa7c61d9ea5608b667c8e550936fe01eaaacc2740580ccab22515175aa63a281337e82dabaf309076bd0a03e0588fbeabfde67d926cb1074b4f5b06a6cf61fff2a011362f3b99167654c43d0e99116b85dfcc06acb7c2ceb0bb8c6926f9c953431cb19bab2570e9a7d912c9615114a1db0dc8ffcc9e7e97073cce8b6b3aa1f91ddfc512b7828651dc12ed3ae209cc6ac4552c2f0f0e65fefa42838465aafc5efdf1ee06427687e289bd7e22199705aab3792a5858bb6abf33fe9ca923f075a75b71d6e6a220550bfe3d1e2239c6098ae23aa3fb646289aed8b2b2e73acbc3e9a6f35384097b8181992a8b489a1465368b41d11b368e79007dce2f13bfdf59456fb80a9a7373f72ac08ff8c9bfcbbaee950cd32d2aafc4443cc1b523c75e33985ef127748aa97a4a7f09e114a4c51ca5afd1081bb339b92b477304ea4905a20c56418fb85fbfe23a0bc746ab247b040ac092f24d26dd003b1a2f6e76e52ad000d200c617b0a297ed1a92e99b4e58376c019bf8d76f09bf04659f23e0f01a3828fc78f37b3fe219d8abd0ecd329b7f06542f840ebe08dc4d8df8dc4cf0e20f4d2642a82e1f6478b456c662688125d7e5599156103de3eab56ed382b61047c82434143ffd8c7de82c54eae970195ab5725ffc1c649e12a8ae75e85cacd2adc0a543be9dddb579f903687f957cb426259c7daa8944c2845c3676623b7d7c11935c7eabfbe4e543ee1adcda41ad31ec906fd202d83391437ee12211203bcc6340a063a44a45e2e34b7a5bbfd9f0f6e0979125d4a426f2376da8082da12550cf7bb048b914d277a3e6b0c547f93c686f2751c2637fcad920099276e75d2cf18708cbe01187a582e7ae41a03d9f695efdc1d1ed9bf4f6e9d17ace0415bd5d40de6a0e108c585fb118dda8d5e5a99752f73315fd46f49b506199ed024c8c96e603038f652a875934c1ee0293450f450b788384a48e50da31ad74e0da9d4ac36a50038ee188f0e755d3415b021cbfbfcb5a76097c22c845091c21b9eb33103f6016e0b1a34a00af4ec4b34eb2f13160f08f9aa6d1c1e32c69b8e0c9dd5e778827925fbfe7a11395ee7d85e99a4bcfd010683d73572bb3cc54ab9a89cc847705834195f6838740295f52f1a7be52ba61ecf83de655693646fe92ef72aacc8aad36c0c538907f94c95cfa853ab82fcb949cdb3e6903ea029851a4c66da00c82abe9cca981f447d7cb77dfb3759d15c58bf3fec5f31cfa99967749a8af31f16272dfce1e8b181dfc6ede7386f2d6dd16c19ff35aa20c5160d76578e6af76ce5ae955a800eb2346a4304847adaa05c1b5884d37c441d66fe169779e4c6972d4d03cc13e2d10ab82ddc8e0135f0b716f20076e9eb39fa30c0faf94d886c14abe6b9668847ac8c9fe49fe9914ae6527aefe32041dc2a15009576a2e1bbaa680d38c7e53ffe330fbbfa1749cbea7298c06f4e6320b6069b356857ec2a787b892ef9b266e802a2ca52d39d8ba083de85688ab95a3083ca3c5100cfe3878a6df9dd703ecc5a1c86fb890c4c513b40c175e5cd86fc3ecef6115480051b8bbca1e83173877e6dc0e4c69d6e395e0175cf11e93f8d0e1cbb00ba50908f8a629eec9191c5fc03e9eb41d9fce2ae62eea70e3b17d0b6b2029c7c8fc8e19ad6a41aa1f3f6871834e2e94952626b7bb2853069a15ab893513b3559db4d860ea65a8cf6039464c2464be28937efb769eb6673f6b82a457f8a9693effb88d384878dd9f8d0e4f287a3e8521f0793d19d1c60425d3e7d779fc31d91cd7075a8cdd6854867508357c814c3638117ddb5b9d13080acff2525006218c7b776269e04c91089d9333f812ff26124e19530e498393d8e2182f3b5c3350c0a81bfc8eef6857d907270c587f1bee8dbd7ae1501699b1d77b69c1652f16c3448d3d30d19e69ab37f4cccb9274460d3838a96efe38102c3cf9fe70212ac0504d23dbf74e97b2a73059484fcdd69f074b38f2d4e15c3629fbca3653f3b43b5fb5211d2d9d3335253eeec38e80671dd1ec7f0cd35b955b9303357468a1e98e42e7aa985c39640d139a6415fc6ca655082633a1c8917703408a16d8757c58bd8952a177f4aaa286d1e3a7594a45023838a918cace818cfcd76da44c96c3cd44872e5e9402ed09996e814c9dbc0a9f918d57afcd3dbce2e05cdb79faaee8f37c41659ac022a1c0df466fff5c247fd79d37dc58f09aa63530b4bb943b203f9c83cf96a5a46babfa62b3872e02d92a373ab30982addcd8a1241de097ad1ba39c003f48893121639fc9fdffe6eaac5fdf682c1af6393529636af14972e6de489a73baa9b1f198ab4b639209b6f1385a80dfe1f0244d651cf73f51825b9b052f961bdb295ec5f0aa974515fd1f2389b07492531cf03acec16d71ab18cbc3c46b351b297d8e6141ba266ef8d574d09dca2cb6f140dcf22171cba94d0480eac738cc6279d1b73efb468fde87eec8d9a9f81218d9080bcb7aedf1a7e65efa6d975e0944306cea90e9e9cc7fe07850582e50d7e45995b61cd03c072f8ffc96da1a93f14c0268868bec6a1731c0243d4572f8f9824bffa682897380bcd35cd12f300e1dacce3e0937fce46f0c4c677b635c0d849168572eb73e77fad3e5e06fbd2e342a574d32ff7c6e12a459ed3e519c82c8ed04eddd0736bc774ffb78eeaff02264fadb0f5e0d8d882ab6254a2d631de02aa807a1b5cf51db5d83d504a1509123c8186d6592d4bbcdac6348b10f11dee50367c873d428f6b8c666449727151a1ef516f6c49c5759949ed4f9a8f1e4e57a79fca4604d145b5601623ea0af8aa62e082661c0fc178cae5629afd7d8e2c2f1d0f94ba67959d48a21658e78b8dc2e74b303bf47c4cbc8c7763cbf1f612eeaf798213438d43414b9b75f5015876c135342811cf2e897217d04ec16c8b8ac716cde2b7ddf46ba73229d5926b19a303f42d6b2937c2ff634266e492139b804be283171719c51cae794126b1f0d2f132caced2ef3fe04de575ee07232f19d6de58b25acf3e3bfe4473de469c1a03c9ad179344bd0764bcf22ab1fd5746edca6adb29d523c4ae1689644c9fb56d5a76ac1f2cf7e726874cf27252acb02ce127270a8ba455bffe9c415ee248fedbec35ab2203d20397bb5a454314ee690f6ae964af0b3d0a7b3b56301cd8ab57f079ab58c25f9d0b3070ec2dccda1431818bb1271681207063082b1dd6f5e700d5c471d93060c7226200ab09d0f1eba1ca7a41c1b75c31a5748027d0f593746262e054f406cc91cde4e3d15173e3fc6692689dde51605ffd29f55bf2b51c90941e3c497a50d4f06ec26e84694bed505bff18e96b8e5aa169c32523b72de4e75de5a80e9fb676445fa3b45746ae600e180ccdfe2ca4fc14506f505f2b0fcd24d72a9eda0b4bf835e11b8fa1c60fbd3eda7cc89213a4ec9bd7f6faad2595e5cb81d4d43f7fb1bc478715da138ae289c2602f0cbb8c586ed57cc0beb1f2f7a546ef94a341997029816ca0fe285bf02cd04e0dc00299b531365710dc621b21a428574ef04c1977de961b86c2a80057a648670e9462bf26e8f6321a1fbe57e14203ac99d01164a9f293ee505be5d28e6405ef3655afb3f345208988ca875cce1a17d97a3c90e5ffd4f3d9070049d1611dd9e3e2b4da59b458a49be3fce23eb024f9a927c73107a6018fd546984d9a99f284ffa76efe37e83d57cb6744adf0adfd1fcea3db0b9d96bab07e6495d5ff69c655b17ea1abfd0147a8b8adfdfaf0ac70493eb2173dace12844af701a4175ca2298e3d0d2a61fe8a03e617f75317970469187e08969e7c01c0f484b12ac1e964cf4332c40718f308cd2e23605a0bf8a4a2b7880a901cafb33fc873cd3ac05f9b6eba1c1891808dede34acd773064507de20d081f2e569c7728d114c278b49949596d13473ae4562e60d680784676c1dda1f0ec2e75421c47327d272ffa9ae07ca059fd0261e8c3dc4dfcda8096af0c23a0875321fc912eeacec7520a7b1c677a1d06fa82a7426b2dd7ab03508423b3fa13add796602aa8218faf12582faa89671306cd639c53b395750ec9df80a2a3090e1c7745bf027a43d38fcf68654e345c1258b6f8f66d0f1bc3f5f3518222ca878c7be3b394dd232e22ebadfc7c8da78a7e80bc766c23f33d6861e41b5beee1a92d58aed6a351d137ec61190d6afc47d0ad3659aa040b3081cff127840f0e020bdb2f2ac6232f38cb43854c6bac24c03d0aacde5f8237777cdd5787382c01f6ff36506329c356a3c9e6f980001ce3957af45761bf0c3b758f363a41e125d2fa64e04917d3cfbfb1a02f951d094db099dd483d9547fd9968ba86f8bd70f453feee278933fc595f333ed792d4e17890f00c842896525688c53a477ffa5724c48c58504a2722e153d55e929162029ffd359f801f24fa4e1b2c9f20522a82ce58c8178d3430f0029063f8de6692e9a3956dfc98dce7d41d1c10a7e8a432f188a27ebedfee212f0c5cb3201c40f2e36c5674445d29158190c5979924c7d4b8aba08fcbebbc16862bce23782ddef4b7f3102a5e0dd997411a27755b962bf92db6cb0a59616553b4f74f704bb29616bc09ef1170c29da360a7ec666f42ef86b53bc17416e28e42b06c8a472d2e5b86976bdd08aa4c1768b215a2d8163a3fba83963d2680856f92849f71f8b52f1995fa55e47346e95c2ffacde3c52680ff418745f78e8f4fbca8d4cbbc4e4c5177c34764f58c033302b1737f0c103124d8202d0616092a3c747b5b79ea40ff2a3901f011b75ef164d80b423b6c278ff61c645992cfb8748de606929816a3d33360c7162acdb5c0da0f962ce7e4f1c12f340ead45f74e5eb423ccc887a3995cc26be0d5b51087dcee344ab5919b4b37dbcb53150b28537c6c804e8d00adfd86404f1be00e2b444f22482fd0c1164abfe291c587d198b2019e4d1da772bca2796a79515ae217c62ea666119d0a3cb6466248d2173ae8155ba8d72ec192a20dc8373c853c8c207478db49ac64db436465c3000d7f774a621d641d7513aa7498284d06a184deca6a6555bd60aa5d61bdad6963ffa166ca9f7fca8aee0edee7bc352e67811ddb5d33ce42d5f8ca218d4fb70ec3c018d3e8a4f1eaeb2ef41d1ea9f92d513806c73a7bc1ce655e10dcd6a97d69c781c65b94b42b80787a094517ce974b3df1412e5a6f57532086dcac2bf69fc59f13faeb9ef4f20d39197fbe74913deb0451e13f99cfbe5b9babb4c4f405d4eccc08267e44659de5570c3de213d683738267bcf2a5addbaae3cae5fbb5d79b0697b26cf911b398275c40db47d7208a7551f687fb3de3f81067de766a4947a3446c363bf064dd0f7b3c50f7be02114944e29fccc52fa49ccf7c9acc1e032c468692ef75c8d128e581d9fcc5daebb74a66082c3c22aff0d55b3411eea017c0ab312bd08b29c4f54eb307d5138da759e2081464991f21c64600ef8b0a905a4991c0764c625e2fa7d1bccb63b8ce0c440ce341c561d2cc7a7894693d0720ceec58598069b9236f82d0adb8dea093ee77b087f26eee29fbf74f2d4f89c6acb0d3692ba7eb43c41ee1e74f04a1049dd8d604a58f03ce9cc991d48715237acdef2fb487511b65280bbec3019f39e7f056853f09b4acf9be8d0862d9748e1dd184af50e97d2aebda148b789eb127a979b3a473628eca1a13ccd05620e353f601516838b149f38667afd1e081731c61f7f80f866762c6507c73b6a527edf354a3e4ca5bbc4659660cb06a5ec0352f19ccfbd8442d5901819a72d0129283f9b4787cce587f117bfc029db18293d79795c6c724391c00bb29a476d18bbccaef2e10fb279a9a99fad509a2f7b13256b10748b230c2c0652edb1fcd7fe4eda52222e8ae25478caaf992eb43268bd6b450eadebe30e0ae70f91d1a1c905606cbfe893fa76aaf325d41f7fda92c0b597a978b503308b2b721827f48e4100b86b3d6f1185524c0e3a5e700f25a2735e9aae89bbd11a511925697a9d8ec7f59a3ec64c9b9133e4a41b7b9acb86e9a2b7eeb60d6cff0e7b33783e302e6c72d8f1c5a75be09850581f491eeebd322fa4d7da55f54cdb458f64f01abcab71e9d187cf2484a52bdbdd9229cf8eeac954e4a82827b68929e0565e9e21ad78ae9f09ace413d0fe409506762bbca7c9064262beacac608eaad734fec6387217050c5ce54e389ccd266cc2e59fe909310caa7af5f6d4b8a22c98d83a38b0c3989604bdf41dba5244d69bda46138fef234c6114507a52906d7243c3cde6ad69052ba2ab12154014bedcf7f9adaa8bd3647e9c63780e813fbb56c7df1d6ae0f1e834681032831cb71cb6acc885e150920d9835ba4fc9d3cc2fd78c2b43898045992061b1ea977feb141271da2e3112413216b93afe06f76fad53dd8ec2526e8c20f4530d4561a9752d4f452a1d81860bda25c9c595bf045ee9be89c97448ee6d6531f4969e5f996faca9a39d59d7e4293f3d29daf5fa84ae4cdb59566472ecc8035780b73ac5c4b9101a33b7dbf4217e54c045878c88bd912d8736944f9ff03cddddde5191b7a62fa793b8a9e3bcc7c4e8c934c12540360f650096e8efde8f7d82cb916e42a62b6ca9a7efbc1af3d1821deeefc2484a1129fdee6bb0027b63fe10a353fe50d751f75f848e80ee0d22e906e51879bc3f9a719f6ff1dca3d6f87e89e2a0d077214021746321dee15aaef665b5954af5a94f73c0355e68fba25aab1038611007df35518a3bb6d25255d3f10402cca209963b87e2ac3ce93c79c2ea8498035e2bb5e1893c1f592109b30b0fe66081318f159f3255cebdd62907e38011760767750d2e814d785e697cb7de43d9b60a842453ad287b0b971b4e4dfb2114cee38b2e82cbca4db1deb2407e809a42cd8b9a9dce37f434f403ecad62fd82d7b6ca3789a2b17b2423d8b394b8709929decbb1cff9f7beb51998514111f37bf84594a729f4c96d3a34f7a4eea5bda18804d6e4edb4796ce7e9f383c74a780ff171ea3e9a188f6921f76731ad96b2f54ec79b0953bb8e587200bcf191d56e615e3ccb95c26a90586e6438f58fb500284d31c8bcd5e33d609ca0bc453d95989b1e24d19e9636ed3b3243f6e294911c4787b6f1e08a41574fb9d01f184a24ea06b2e610f08ff08035c30852e8b9297d031bfd70427546f98f739924b509c1a46f8ff86f9bd47bb240e895aa2efe57a880b3ecd1731d2d1bd32e4115f6215d7a240098b322e2ca76ccbac7bcdea202c1abb91af7ac654a73fa3b8b3f05a70924bbd73ecc2d5efde370cfb93d8e5c23cfe6ad5d801da4d64b542d501deacd885fb3adfa644d959b20edb031d60d4dd080e383f7c9e8b5608bb0c4d79528216415ba2add8dccd94e82ae31d209ea574dc8c25196ae85ec69cf9de6e1c7e6562c17e18409c8b70082fda5fd60c4ab31309680255bc37da17a308509a48d6af860cd3242eaf37e1a8cedd81340723f5a55e987d816cc19ec0ee77ff441a1c377ee02884b93d4f420e67959db5b9f43909e014a46e228f31fcdb78aea7289c322e33412a74fb4e4d66510c95fe46621692e0d87e84508fdd728ef5e1ef39d56f99a5d2d101747359bf4f88a47ea211dd1043a656fdb3d2bbfafba8bf2980108f59c625832dec950684866c79539800d6ef70d369e42ae067727ecde44abd75cced57848167fae15b6f7ff872506d67ccc3811606362fd5810816056404d2c84877294b25441c2381557f975b6074eecebcbbbf4ec69a3cd6ce19ca876be9dfcf1b57654b8893eddceb26d28f64a8212190c998bba2bd4592e94039bb084321b135310fa4f06094fe86d8fbfa27b68d4fabb9825210e765283f72684b12d4d5819df05feda8ee70c6968992486e2fd0598fd771b4fef7023efd3d8446d13657656671913d4cb85157876a6d43f5be4459257609c756c5cbd5225abab9bcbeb930097ec3dd71d1fb08a96b0ced7ddc311277a37a68d7884b729d693ab770be4a0c0653c157c34d78832576fd390a94e051cb66d9460be860981b11f0587155dee36f1b87116a59fbdd304e57609e86f060b3b87396fbed857ce2ebcb4ef31b98d6c5fed96dcff9b22496966d455055573142112f085bf52cfa955e2e5eab5733591690fa3a954b2ef6011bbf580cab8a473bfcc91ecb43a93115543437221b9cea1b79352da4f8c5c25ae6c697b311004947155f652f97b81cf82a7048452df7a806893b5c9ba68dbda0f14467ed56cdc8241820086c675c15f023953d85d9a5c79305d36eaea53f12bded390891522944dc277c6cef5b43f30d7bb2caa6a9d26aa5cfb46a4fa77a22b4b0036d1388fdbbdf8a9bd9b7335b7e177506dbd0226e3227c8b60f2c86c49f9cb4df13e3484e83f087a403db358ebd5a1d592ccd9fc55ca5ab1a3132872e9df11fd0ea181546bf32c03840c0bc4f000e581e1082045df469c78569c9b8877f00401b2454c7f916d9b052f323e7396bdad886c217e557150ce9d65ec588cfe87eb0788d7e3e6370a2a4f6cbcfe66b60432801cdc03eacc364458a0180ee82e51ae96358e3aa5c363ac7bdd82f008785d2bf630660f202e5eac093dedc96149fa35b938fbfcf8989892c91bd5cef2e868197944ce1186bd91ac382368abba7507ca0a9189e7f4cd89985deefd2f60b38e0015cc1281cc742e4a862d568daca2f2c52e6eaf65c42a6674d11e1a400a6f6fc4f2dba5c20a267a2f311d9ea0a7b153c801005a45c182256d9db96825ee490e6e21eaaea40b6f2bafc028fd8229934774158e303458a90fb8de8cfdd77b6df21d9cb0aa0cc593d6fcc96224af38ddd4f016e6d2daef0446a62bf45fbae73782a37b859da3aad0551863cfa7be19c57f4d791a37031a6be2ae45656f16f2a45e4b9e5d67d8a19f14429133e27ad1d12f1c96fe6779c07bfcc541b550e13305b35446ff5c8166b91b76441ba97e8604402d2941d5716d30aca6f9b20104f33fedbc9ede67ca311ab70735cc8a903f2bd2ac4b0e5c41238d6b243099217c8cebabec38ec221b7317758bcabcf0508ad36e7c46069985c1cd5b141201bfeb014ab77dac9231d4590a9288fba68fc82dc0280ced7d2d477e802a052590d95ca9fb7d87deb8b31fa60c6d9484aeeb3413e004419be9b26aad845a12ebbfd21ee3dddb3c35536033f5c4db6f3c6820f228df1d789ce37a2087b9be638ce05e9afe515e410ec395b9dd229bee3275bcc416a86af5a96f6b967ec10896ec3e10896a33e3b97386b8b1cbeb9850af6cc592ee23a6c64dc76d794a7b37715aa3b5a4413b59fc4d9e73d70d639e4db79710c58fb060ac72909b59865555f14b8ccc381366a582ebeb9d2cb9cd10360c1d4f08fe5db9e00e21c2e61d729327dd79b3f323e16d779fe40f15df8cb39576a5e74fbae87afe03e09d6b18a39d5cefc12999e016e4a9116ea34535c0cd58f33e834191082a5cd74d16d3dcd6a7942ae853060cf8452793e800d80b64c198cd4455d41099ba355f805a62a52834afbaa85c0d3b759b9b0739449086fc19342da15decd993aaa5f4ff9d6b397607990c43b43c69b4df7a4fa4beb6bf5916aea14f5adc0391d03f9ed2b33d44b3ededa1c4195e6d5e04bbdbf5489948948c8f6715bc363ce001c08f21b3b06ee6ce8524362ecbf229cefadac9d57f45ff9fda1be14ed1a024b48c299508e3b90b30be3ab4f10ccbe2c627382cf2b40fba4dbaa61f6e985e92c4697272a820db07194b1b11192bd09ff422fd0e86eefb5bbd088bff61b3d51c490472e96a9279ef48c76940b0908725d59108d6ff8c013e9bbfe826c63f2e2fadc308519931ff9ff988333d9f06c0de6ce9b78d0f170f0e19f6a725b7accfe2a25f3fabc9c3adb06cbac91f6c99cda44e710e143763c1d0a0ac1568332b6aef43fd2661eb547789a6e092dfce8b428818caace8d6ed95e3c55894f9302a463639683843e837430f3f137750b13992fc797ad3a93da11d34ba1e417ae40face83f0f8b9cb68bbeff3e646f2a37247855094221be0391ac1017f92b8061d9f4a08cba2b17dbdcc3cf5f64d596bfff203f2fe48b4143c7817766742093b5e1432eed6b56b6aa714495ff049579e1e73c3c8c3bd5766285a216e9854bd6f20adef1923eea8e73d69efe95bbe90b338bafce3158b028e1d14f4a8c5dfaad38d4038a9d4149c1fb05b98c1a94cdf75bdc326a2434ed005c5c2a49fdc7a5af8cd789e75bd6640ab15791f141e3058b5952165faa3e295744e4adf276c83983eea88b12ed0f17e9c1b1eedc799c850bdced03e64a65f19d279b7774520637b80504bd298d718ae6fbd318489390cd5cd16df3be611d11f949ebf9e31c8fb8f4af69545fd33107de7b7ba2ced4399dad37665af7ad5eff4f29c8b6363cebab95184b04aa86c20002dbb8e397ab743a0ba4760ee75c16d2d2b24913771cb0e3316a7f34f90acfc684f2974c493d1a293b045e885bc5310d248b6adca7f3477183cacfb65f6f81ddbed42cd3d7fa28dd45f5e93e6bea759388bc4bd1a26a45f5f55e0ab94d250c22b5a8257e449cd3c3179c74542fed7bce40dbb19ad61a572105c85055ad760a64dac609a34b0d6da881c071239054983d02bc69f54ca2b05b488159a64e47b7e6d7c7b600338fa8520920b986a34918731c319dec765d46e728e1830492969d67cbbdfd210f0cc151bd869329c95973fd27a9249782a4bac0a63f2c86bb35b3e044c6bcc311b3cbef3778cb6279b84ae1357d6b1fd9e679b1e04eb83b930e601b9ca4963ec8321b2794b9eab3393b94afbb1960afb531c2b8bc6552a2f45390cb10eb24f629600e454f120edaaf978f60dec67c546622af4e9464b58e3d2d981fe95b36f839dce04faf4c9f75a44b69c4cc4303ca3352edd275cd6244daefb4c283e64cb1d0830edd0723c74f3c8b8dd15818900763d94dd2c5bc174683d9190f28524cbdb313b83b90b6f44beb78a2cd6d9942f28d674790df6852a718ae59f1e319e06a61b5af7fdf556c3fae0063015ae656fc542d0e0ea25b599812cb0d0135f0be87bbfe97c6cf3f0fe252ec1f2d73f6ea39d1e09e8349ce4043fc54f6212e13352bb943197c6819e546d569622bff7edbc2707e31db47841c7818fa85d33095c437640a9eb4df973d1240dde15e9e9388d5165d56b6abbb825260948045e3c9eaf72ee55e5c895f66af571e2cf4bba77af9c50e2148ddaac25052dd8d3d5c873c2ac0f570dcacb5c237a0f7e57b6a4c375a7826f23747bdf0ea177fc98341e7d81c41bc31ae13663acf908c1a44379d6db8e3ed1ac06e69c0961a4452bf9bc0075ac98aa545919d68bc68cb9e4c659830bff9366ef57ab5cd974562fb9a899afe96a07183838915840e1bf60c6638ecde9218fa4e95564017c8a2679e5ec2a4eb32fe6bdb0f855edfb4498722f6521ae94245f1a571d499446ebce7be26920d398a1873aca7f227e0d317839370513d834b1357034e00f34bf42cf4efbd0a936ff59bd76065b3a713ea6a3dbeda1f45b519f81ad3f211fa8c29d7c0d36f151545be7e712c3c8e76734f6ebe627f841ac04dd5da0a1a6ee257ccb06a98282c41de6bb68454b061c7da9e38b59472a33d7abbc804d6f90f4ad2800d61220addd95a05f1d864204be90d6912dc3a14f30553e6e9b57bfed44ba73181ed0bf48ca462978810e2a54dfbd23c000c32048b50d75c0dfffcfd5f42e4f77f9411daa379450ec6c8724e68451d168c34ab5efa9ab2b0ca007a8a3bb19e4f8493e15fd9f7a7ce1c18900b451edfd879e45085f7177e28e8b87b74004efd7161704bbd44f76a6a40aaab20a1936aaf0015105fe9b07e46189308a4b249e6908cf6ba992708c4185b4319e5cd1be382215d7a489282977f41e3601f0ba478260191180fc14d1bf0e564ab1e5662338771c6b64adf88ea51db9a9ea10be80880031916869bd3e7af27a68996dc69383b3ce7560bb556e54540957bef23fd3e46d85251a8356ec14bc156ddeedd7b4314826c6771d336ccee613052b5e8de5504dbc194b39f8cec537d9f72d05af0c771628cc9a7f2453bbdf594a7d075ae04b5d4389c8e8f9ec4d6e53a830766e66ba83f56c7a68d1e200d451eacd6335465e7ceb8dfd49aebeeba6227b269f2f645e2992fe0f827459dddab570d91f4cde5fcdfa3757d380dce489cb179d8bbe397168160af448a4f61f02783d799f9e45de61a4d6864a03dc0ad2f9e5307800747afc19b4a632a3e8233798026530e6f41e29d3cc7c6550e55fa176bb047285f15296ed129086b35bba20fdb213ee81c64bc672a93e1b3a526af495b4be1fe1fd5f37f5752bbc328d21ebe0bc9becdea4a7dac1b0afb81db9be30fd8ae1adacc8a94f29443f2c21c399534691bdfa409878b8626df3328d488edec7be9526ff5d26341ca6a93716b80ae538f19f8c5897678bead32b7e7f5b37717962f627360038349469c60c3b6f1e182b02a90deb199f55740fba7fc7b7ad25677e8f868a80d5a5acd362ba27ec1f27f9ca1b268d3a908f1b3f85051cea857aa06e54aa66157c603ac03f606f51ebdd21b69213171fd14dcbe9e9a346bddaee26d859df2f9f5ae86e6424cc8b9c370f32806c2adac008725561fdfd23f605bb07c573cce2496abce3a91fa0b30b46cf2e18d92b84f0c18041cad07e591e1d4e992ed99101a15932c6ca41c943f7bceba6d3edd3b35135ca13a9193d69d171caf9dbf7f13568e3a5a375b9aa1fdd2312da7febde63fc283ca3512ca61f2a27dd2850e0217a2420fbac98e8637a3f8f7a6716338c09a513872c71794cbd648bc1a86d86f33330cc5d88ee0430ce40823435caef4ec9128b25cf5719207549e027293f0f9507afcc9d5a88fc9d56322b9150ea90707d8b175daba475f0f02aaf3e12ace7e61b4d3ad61b10a6f92115bd49cfc929a1f03483070a7afdf70158738ea61e0b74fc3770bc194867aed3a29c75746e0a7c26f5413a6cadf938f194f77cf3389a1db7aceece6e8443f72020c03a0f2bf10cdfb16f65a83a4f00fbaac22c41359c4ea69ffa43b43a1ce5bd5ca2f907a181e5466d97153a270da0d6a18fd30f3b6f12677769bac8c7b91954446933c1d60dd9de35fe00853817b073ca462c8728a184a3e259785176258a721429fcbc1ce234095ae3caa8f948431daf01bcdb9e4da39d0b4d4cce0e98eba1526471d17c56fd163cee0da1a5752fb16ad690e4c76262da010e2a7273a43c4b6cbd9d5a5024d3661b661befe40d06c595f4eee50430e2f300c66bd19422f0dc42d4129412991e962a64c65863b557591fbfe4c3dea35b7c724d195b29b99956b07a089f1c812c1e1b2c46be58bd9cea6705c5dc00f31fa1fb9f5d00cbe139d9f009b620bb28cf7da237d2ddd5187809b9d38119846ac2bf3870ac152a832b4ed242f1a34ec874dd295744ef432d0d424759cb339950e9f558dabf6a476b914ee22286ffb3d02aacf7277fc39b0edd5d3fa8f6ece2c321a53ff9ae7eb9d3ee419d3c85ad7d660fda1fa9edaa09565a01f7187bfb270ab512361907b0b3f4275e377ab84de94c3bfa125feff53e98e2415b568cbfcf5e6e5f399f2a00abd7c5a3d4ae51f45d185e27163a5548d998924a801aaccadd16a8f84a4de57834097c524f47cc581dc69abd1511990ba8c10832ac8cdba762232511cc8dece9d6ad885bbf29216e825fd54c252aa0b053ee8ac143d46f4eda2a8d2761f8c1328253b07e1357e17edfcd9293433b31c9d2d5583087e031ed52c2c19d48f8b76a39a1691ae4df68c32e37cb9ed76167d8b527b106099223a66be8baf14a559cdb2906dcea35339a4df1faba22f4f368b9930147a373b90b63f410493669a435f5e58604146f9da8427f02ffabddb3c1c1cf9d94bdfd2ef135aa248877e79c0a7967ffb346466b2b2cf751510877dd93f77e810d644b69581135feac084c877fc657b87ba0d39faa8e0cda35cc919171abc005f7c07e1190a7d9481065cfd576aab3a1a59e1bfc4d6e3771538aaedbb43f78d8dfd0abc3c7f75c818cd3994e0d684e275dfbfa5051fa24fef2596894a70c43c0cf450c5056567d5e54265c230c54ccaa45783173fffb5f4c3822488e98a63c299858b7538f8a200c1c2233edc3622f236c5ae3a8e5c2229a775d126c95f59cc687d8f934fcfbeba08511a8cb5c4720a5b2073260a866948e5a23fd68c59024ce64cf0e95b9f9e005e3d1456ed694253ea2f51a2452a76803c6f3c679c6a339b4c34b03cb150641d3c622fb8a5fb861b96fe0ec86af578790797ed0415b9bfe5cf43c31160d845650ef20b0f9bc3ee8950bf51bb4a73c4da731bbf3a674658d52de437503f1a725906f548e8faf19e28332c5c0cae95487ef3557ba394e7475b7ed88e84ee7589d8112f11f35addd0f3b15258d24bd18dd833ce26a4bfb5e5ed454d742a0571ba57417ff3f163e1355c0b7b0081ce0fc93c88db3a74e828d7afef3739fbb63b1772ebd6cb3cb2d555445d8b5e12d35e46f10baec1845008b2737a9ffa94e42f229061ce331928f7ade3655c4bd7ebb11a77a2a85021689eeec307fb4c2511fefe524bf3d73ac2b4e8bcb4265b8508d2df4fdea327f52de712954a28192cae3eb2ec3b0422f04f725327f00555724ac57753d5093c981a6f6376f588eff37d37cba3884328878fa8ed99906e5023f80ae128a534c3658654345d840164bfb11e3322bd6b8d9a31b3261148be74c39672edc6d487637927b53f3e81854e58ab2197ff9c8228d4ac7f4877d4596c44d10f397f8e8f340112c071bf172eed957c92dad4043431992db2918569b248254e087f0c9b159fbc6480d6c3b05edf9711505b2e532dc13d42fcd1dbc59b890dbe55f7b8078ddd1a2f64af61174dd3cf0788eed5cba080cc6bcaf5ab7306afadf6530d995a87d51b71fbee03524ffcddf75ea39f85f50070f0f77b0cf247ffd723562febc5c6b138109613370f23c5439bfa106c631b797e9f8279616b8cc06e071645533582c55ef410664fd1431fdaa30f55401be3ad785483b5765a3d4b25d376180f876bc969cf58f74405af118749b2f792db61e0a48505178fe03adc887dfab80bb77e2e26774342ab9bfaf97849117cfcf91830d15d61b9545175279d59ae6160bda188b8c05802e4f4997119cf8e5bd4b47c794743ee770c255bae969fa9ebf2ce5962999815851e03b21664f14e68307f6501e42d3294a5951227b7531575a803d4ff8ca23a2147b823249ab1f87e42fc37b7230731a53e9fb037cc9afa547cdcb2db753dfce7f825ba8c476bce69d34eda927999b5e0c901bc07ddc91cfcd1cf4f6e83186fb7756ae6b4e690139fb409c969ab972ea38ca7ffb635b87274cf5d7f705747d296ff6c3d7c6ca0f0c24e960e50c0b499bcc77ec145c573609b4d958fcdbbfbcf23cc227c52ff45a9443671f2b0581e05a0f2bc0089311e3bd0ea510bd782f41b51bb61465647aecc8e47fa45c8dfc3a2c63062ead35cf4a4c3dde2755dc89026a72f5519aae5c3ea32c4dea64947167e365c7ae3f0ab8bbf4166886ba2fab74b5570280f943676889546b3fdcb75b8cd8ae1502f4166fb8e0c276ad755e90ea69b410bc7e5464902a8827cca77c89a083aa48857d353d18c34d830c1d1d96802b29f0828ae44b03f8fbbbcaf5eca28af08d5b67d95288302517971548577dd0dd1c836ac9813d887bcc11f1d07100c6886d0e2da001ace28597a5167569e197726f79c536ed8ee6a381be25ed3142d9196d8d737d0c93dcd79fd206673de3b361d6e70772f1fb9b5c4864df330c115c2383446dfb6c644e0ade99c7d309f7ca54a23e1a5e8adc4eb2f396cf840be2a0aab283a53beb5797dfaf2a00d44d9f977389cf73faebbf6817e9d7b94ee054edbc87fbc46f039594746e576f32ad3429ae6eee9f54c2e7aae575b02e2300b9f5ee1e9720bf3ce6f6880ae70efee5f2c177e972e46b1b453d5051bf10440a91cda79889fb5f778a53998f9d856e0e7a21022e09bf340e785090dddb7e2d6e63f68bdf097ae9942cf2ffba085a01ad45254edf672a2cc406ffb03fabd8e265a773496b667c9eceb693b922c0e8d05fd34ab3aeeca436a81277b201f2005357c850987eefaec0c7f9594bd3d9e64297112caa7bb02f158d8a4691acc10d07ed4562947da6b46ad7c66c2faec99fd02d7420dfe5cf70eda0c9c73dd37511b9dd310106fe8b0fb5df06b18cde7bff6c0bde819c39043ebc53152b4b059b791af97dc1df90819eed51a9f9043ec545d9f163cf970ab551c010f39dad50c4ebc42d9b517184f9c57cf78e510f7f6e73d6f63d458044098dcc0b3b12ab45ad686a990043ebe3450a5d5b275285ffa0e9a8b7fd48987176d90227e53f27ade56363f95ea2dd5b126d06a710eb23e8bacdb60d7b833ee63e321f4f815241b33c2976d121e8c245e4e372b81ea13a2069091884a84df1ecf2bb4e45944db1812c4187448796efe368c9e054763aefcda1ac83a0b430305e00b920c4c9ae9b42701b3319325dd0d0c069f6f7fb1dea247d52f08c9c6b1e2af8276cb676b623ae1c910f6765242f031c4cdb426ca28de6ac41b1e6eea4740e9774933e47cac465ed013af56bdc8b8fed3acc23a7b14f38e4744a555768bddd05724b4e584e1cd06629fc60bf42a35dd010d9b8c63f28ae332c40f0d8e5670f52e673bfa38ac5d166aea01fc3d9fdfccc1f690aafc72808b536e2e127f6e6c3744e7ecd2efaf3c7b433c400385ae1f093b605569094f3aa25ac1777cb4fb11c8990e814c6bae620b8840b7ac3aa2ebbd0b677fdcf402f2ba6ed035eaacf9953b16ee205ca506bb8569470fbf0cb14a8a2eacd47d48597132e57fc79b03d2eb73b0367a917c63ceaedc77c6ff307b6c0b9fc80355211a3069bce99541fb721cb39782ea34edd79debf6f021875a4629a27f0d7d53fa90c1c310818f7972c19b99016a42e5f60d466b27223e52ef9b7c3a8b8c7e0003e58ecf1a9d01953f378904d012b1f8920140f5b71b024ce49a66d0d9e02de9c6fc13463b330f1db56699fdd005366bb243440e530730f810cb357bf3c748e24793b696543a4de3c7bef08c4e0812137e87f5c1f5bf4f6eb4ac723e43c2013e816c87ea70eedaf19cc66a820e815a47b1b6bf1764f888dc47298d18608420b4b965a3681c26865dc20f8402b65fea87cc1421a95eb1d035b270487a689425b34ebf5e4de5b9b86b86a3bbf9662e7f32ae9a388edf07138e1c9afcc5fb1380f776eab32883e9e302cb9e513765c6ae249bc623ea4a836964988a4e5451b3bb2ca30250b3628277ef9d48f481ea83a4c248118bfe3ef513cd8e63dc80460c0c11fcfd9553ed5ee35ab5d1392ca4a59aa9fddb74d81fc591a31f2f5d7a1cf3086aee9b5d9c45f7f32a634d4b11d5b9d9ebb2db1a1958fe5389152de2d886642c8ee0674a558422800babbfaa766e9ac990f1e11c8dafd947865399e063cc8690960307aeb36658d1eea37b2a948bbc8a198d93e296bc07d0d1db86ff24cddf668d31a7cab6b99164445f4a58bca2f68b2d14b424d89c073a934ec1522cfd1670f6adcb0cb18ceba548dd7f70dbb5687647a50e2535d30c6d07c0a56b18f0078b3c67a8b59b4f773dd37bb2d3b6b40bb4ce117fa8bde75b0ac50c6e16771c339792e1d87094f95c8aa2073ea3500cdf99cff28b377f634850f363a8e552ab3845f9d22b8827dc04a3e9d9d579fcc5ffb8e7c2297981cd917832eb63d10e2d929a2a1580ac8e2e96b0d5e1a75a13a18865ef119bd7ccd85d4272051fe35b9e9043e035f0fe02af5676e69c3122a9e933a676216a4b03fa40a9a823c05ba6a82e94317d08c6bc20db400bde889d40e7c7b7ed778d00ae54ce41f9298e03e557a22b5882c8d15cb90d3189008775a78b7a9c38359a539e37436ef316065fd984622a3fa0eb49fafa7d5fc90c908b6f70e9b868c37129070b213383a0569752c414c4ed52f57c7b28b9097f342afda36ddc06879da2f80158ce899d3b8a97a3176e7a023cc16210678064928dfef41d06c503fa17d160d68359a13d63fa1091abf2ef92c20a46415d0392997233cb0aa690532ab51663c5d7091cbd3bc8b57d29f5e9ecbf01602a84723301dbb1c852729e920fe44c1aef68eea08e4c4ab94f5c51b327c99e6b5c229fed79791184f11d087335bdbd7e15eefe4fafb35e8372db50808fb206101b377a9f8389290368090b5de6b172435493ef32c9967fca2cfa398abbc278fa55ef5b28f245b59c715521d130624e7d4e0df05102615fcc1167a3d278311111c41764c1e5cdddd32a54513367f6e6e3608ed3e19b229827cfc929377c1d01c27815a8e875ca79f437485ca7a54c47f980c563ea86d93a01f8030985f806a3e5f07af90779e462f0f5550fe3f7af9a61f1a5dbf6def530d80274e5d9f1a299c3c81c2a0a4e941c7b17ba5509b0759ece3d30faba632771c1970359fb90c8f041711873ea4eeccea3f95dc121671e1d152850db1975169c9e3f03cf44c5b61a0edb2465c2cff6da6904fcd4df1feb43824d52bf1bad1473e30e2b779af4e0fc644b806ed8ed0e231430c90c8890f3075036e0bac036d556fe31d223ebd5ada00037d37a7697142203ed8e7d52b3a551c1c22ebcf4b2d29ee5df96286ad022f767b93b035fbbffa3a9004bb7fe4d9f1013bfb5c3a3cb77642cd86c010efd4f0710bcba7d073d767dab7e879b0dc63e1b3a57e4ec379f2ec958bcfa209c166b78df8fcde505ded5b28ec2746ae618a6a3660760331ce7799205fbbc8ce98cd596298dc3fe61fc41bf595516b3a7083c60805dcfbd19ece0e8cbabdb47656b994dd72c347af3aecff4580c5cd673e21642681a2e9dccbe27d5ee8c27a61c5a650895531942d383d4228500640d3844fccbea38c39c595e92a337265d868b20133d4fa65b28c5f5925eb8a2dff28691c8d50b487912fad636fec8895256a17be287f8bb40d19c55123eb044bb204edecb66140efbe2b6e7139c0ebe8f58826e8890d5330e0614844bcd33da2b9e7cb3423617cb4d8a0a3a7a4c2cadac22222e154db5bc12b31d68ab315afb9e0046a3f6e49b05f638b6ae4a16259a200e35b6d4011ae3c5f538f637463720ae40b726a40d691ce9965dec6d2918766c19026dedcf2bb157390f50d6755ade5cd376e9a088ee22dbc4d792aec737cc142c4c0e0c70d5d4c4ce65d8430c4a0e42405e9222fa96c37fe3f3de59fe69b0feeb8d4610c3b592ccf3eef109239c2873c152daca2ce4bc3612cb322b690ef779924ca4d8cc7cf4c9ad1686e548ad2932e29a510f700da332ea4ac126cae636878aaeb8fa5354b708cd72f31ce92258b2f4f757f9f9c29ab6980c3683f55162b45fc280e074811bf3640004f4141a17bf29db1113fc73a56c1513035cc39be21e35ff55bcb05fd77dc9d7e8884a524e71c0347e71d313d3a01d8d3856972aec16244cc12c955f773ff6e3208f147e2f3428882d16d3e1f430903ea81d675d0754a01720193cd333603a7f938c1366ae231a797087779684b477e29c3df7c3c2b144ace7ac723ea744386407aca0daa6e55d87e2714dd679052bf172d86939a8a59c05357c2424f4b600081d3099a3d9d8c289808ea03139d0e4ec58f33020ea243352ae137044b56da05dae4cabc2312695f4cff02790afe6061da08d0a4918bef17d888d01011b05236f8146eb32b27964ff3cc8075f8fa326f9eb288f33895e9d40862027822863c170659930ad77cd79a453d926938181c0ae3acadc6126db6378bea25d481020559430d8b8ead00d0fe7253a0b147335ca59a7dd9314ec1c44abd3ced35d36df4643c03a7a7fa2025e130cbcce46988ffdde54e6210ef39078fa5e3540fcba16b8be5e98fedd7f914101e371ba14087439a69f1f2fd17d07300ea1d6087fec766bae90740f407369f9439caa7b52f4f893ea86d8624c92d49d0bdd6aaae8f3b574867bb6c568f0a24dcf6a7403f58882143db8d7a7d7b7db1bd3e095b2700edf8d72bd16f99bdcaba3c5470a1081f6013dc95bd6c54c19186c04f63a16a0c71e10cbe8295dfb0df48b7cf89a9bd5ed562bb70a1cbf763dc09e2bc0dc67b2d72bc5d10eaa77ceff06b5cc05090d43eecbe9ce18d3fcb95bbdac45bddb1696f9f12d590c7b5e1f7ebeb0995baa1daea6ca8800bf98b95a73a3de485a9aa8dcc5c6007f4cd278a6f55615701410b36bcf6120908f9197fc84845912dd399415b04f12c41305b952bfbaeb67ae61d3cd08b9191863bdecdddbf6b89e8eb989e99568d623d178d1fe97e447050713b85a963b0854a94cd80b6a39d10c6677729f24275de6dc58d486e263a2871d04b7db68e8bcb1c72830679f09cda10f15a2e2aaba385500f1a651f2629c53455e08a73d8d21fd8749d6071175b45dc1e8cdd6ef53912fb4ecd2dc5912bf72218d2ad85bb6dcea126fae4cfe8be1ee114c08b8ef327f8861e0db1d7d82fccbb3f089a5945c0c5b954eda5953fab44bf6ae28dc5ab79be875f35676a46d5c0971617ce5d3da0d37aec3534f53c3963817eca8848eb009492d337656809fff269fae3d89d768a622b75b0c57b9334a24abe70dd7e6950a6076a47834e18165d283dd8b448d400eadd21e7e2f2c502c66cb6b0e962243a0d44e9cd4908a2df59d1bee6130d628941cdae35c89e5a0747c9430e21d5d1bcb6607d819c42a08e968e1e5dabf1a57f15b6ef2d953e8287b0ac5e2000928de70324a7d9a09eb47211587ca6a15eba702266f715e39e1fe8dcdbfb5741b89bc22a029c38c0fe98cd0a6659f444153d3c46093c52d7cb81be2fdd17cff9833d6cc72a6ad8700e03f80d905a5408e39c54fa45ae3e27b7697e4e30c94bb3c6833923a2fe04e03100875354360f05fd50c678c7478befb16ee0efbfe7da6332f707dacbb42152cab97d659a1c89cab23a35836d294b1c582ca001eccd22ff92c9182a1e78bcc2690b366fb75b9c1e802304f7bf8f21d78877d12313aeef026cbcc34ca1d37a2dcc84a92f33808d5793091f4163583d61d07afa338e8d171ec5778cef3e3c6959a36228a0627d1b79d32440b6742f8d2d84edef99cdb23dbd5dde94e0aed9ddec9eb04399e0f70de41a354df882f4421d73a530174d443ad7398296c164775230290f98c2af3e18e7146e2294b722e8293a86eeacf958e24173121b7a0ab86484566f85f743b82e8b2b3a8539dbcb665380d2f327140433884d0c6a30871766b5ec29002db80e05c25d51110f10eca30a8c3ddb1a4c8b64104a48ea54da49828876d2c5997ccbebbc35d2aabb2197fdafe4557061d8c476f31f1915999564517c7fff14edde2e1b5811e3cc947ade48abdb32a41ea56b57d1adf0d9f3e87a55fbf66d44ac1a13b065c2f059161e0d9722edbc952eccdc73dd51f6e30efa8dd495cd6b184ed7d8b79db0c6c471ddfcf246fccdb2c0c018b8d7d96d8502adc7fed432ba12eb0ad376afbda94530c113eb22763f3a23168b002fbc3c21244787cf984f51789a27640bdd67208ae540496c08fbf5b63041b974bb78aaa858d18f629aa42cd67cc940e1eb9bf8691b6041e58faadb62ede3cb98ee2305bf8c2e03fa9f1cb43040a23b14b825bed42b60892addc2217a073d9385908c9baf8b87584c54cefb5eb62fb5260ee0a11714b12a28718525ee6074ccd49c8d0085d3d19d96b06cf3a788659b305689ef648c88ca08650f099f42130eb0b7c038815d4fd62818e0254fd509e0945bc142e405b2adebcffc14bad8d67d3b1efebeedd33384a5dd810231de4d91908bb8dbea6cd0e727ed96ff246296c3d506b8e8ff6c2c621389d5f9112008f21510fcb882a73c3b2ff04901b9c87892efe3abb47f21830303fdd166a01951f29f88bc7eaa48f30d3fb22f36b6623b26c4303ba6e3199db9cff3b659a0df97f22991e11ed8dc957e0187b1a0061f2e70cbda50a3b713a91be9f67356663694f0443d9c94c08049003951614721fece5a25099c997b64f07d5bdb778a8d4cf6e20ab04c290cec2912e7c548388f6fcf14443d6ba3de80fb4b2ffd2150c09c3854d5bba1a06d519d5002ccac81272da68ef6a05fd654971c3855a54a655c4f60f2ecbbc49a26748d34bae6af1cdc70f678f6cc3e4c01d6d02f8609f74435b5c040e26ddc1cdcaf53d1ad600c43b22826aeecbfa2f667ead2ef00b65c695b4eb81a7f6858070dc3d57da6103592a6b9d27632e02b9bba432f877e0feb00d727059a32105927a50f0a660ce219878bac85725a9715090a1ade810de3460513a4c4320be29389fa23df5e073de4762677d41a403aa8b10f0de735f25bc4a0239b8ed6bce8c5bd17361f53f93741be35c027bd26df309567a3630833feac8400bee5ba949f372cae4e626a25d989fb960af65db2b2dbb87f3c96295a19ec5f0b88bb8125769d350366eddd34b494f62e7561c861d9b0dfb21fa7bef272129678da4fcb185b9560de48f4bfd5e577287ccf750bd4f63b317f940766ac5a6c3d330b09b5bee2f945f78c3b65c45170df94ffdef3a8ee6dae5849d22021761e8935ddf810305e030784d707225eaa44496f3bec1ccbc82607b2a9b93631adec7d8aa67bfdf8862aa8009ff5d3762cfb0da54f74f0020d65bfce06627199dbd1ecba8d65e8798841eddd3d65ef4d5a19757701025f59e02a50aed64a44396309f27eb1fbd38f0537f5514cf0b720f1bc1be5d2732fe70963618b0f1eacf23ad0f6192e39f82c10b1215d6ed3b541798456b009ea9e24e75b314168e9bb8090bfe514f28b4007b4796b8b277eb5bd49d43ee136810e1af97a5164eacbb4dfad5925eda250be1ca21cce54be66aee64771883d61d5a5556c088d2e0a49cac68420b94162e0db926dec8c96161c24d6ca810a96598c1bb5fab1f6bc6d166fa80459788f1a249a0927abd86e607df478a08d5cb02af9a9045cb69eaec63eb534b6d7bd08483a2ba26c9caefca55c761e1887ac47f35d9b6a2eabbb0ed51ec4c7f7157032cc600c48c6b40c572875677cdcd668718e840b0bfcfeb066fb2e20e6925548e86950ead4137efc33e2cc841979fb28ee8b7e8da10ed195e3986a3576ee199eeee3d9b229b3b9a90f6575a7ca0c03e560015d9a6c8b64838ebb86ae79ed1418ef86a3a40767c3c15358f0f4c4ad5b6f98e17303baa6e200cb03a1054251b29ebfaa49c0eb8bf95d28c34a455d41af2e2d1569f8a652835a5faa32ffa9d039667e2097b7862ebc45f45edadf4a508387d7e1a88a1a50ea4f429f4dda0e975ea445f6542f87f53ed815fbed832117064c0b786d8aeaad94938297f5cc2433996534e7ad6a11486d050bf1b1b06ab92ce69f1cc6d09be310435b01edde789774699cb140ba744454907b20149673babf51d6ae85b49ebb27e4d0e9e0bc9619dbd4c4dd71325f730648c4c751f95a1163e616dc813687a5867fcd599578fbff182142cd44f0772786d1ca78a7abf3472fd2714a28fa8a001d850980ccfe91e431c30f64de37131539aa89e892e326b1848ca60ad782ef82df2a628eb27ec777a04acc4da58b3d2f24ef83957d3b02c4fbbf167f689a9d19608c25997a038179d0502f447dbe793c0321ae2d67c3eaf2151c54c959acfc1fd0a3b36265098b22c4a22b1f1d5d73a6e8fa1878acc959f5bb54996a5f2db0c2f43bdba7f99716b4f19e15dff150d2d5536b91c66d862742aaeb796d70575276a30bc5dc32e5f6abe1d877b91979cc2852fbb2fee384fad206b29406f913d2521d14c8fcdd5525bf8937bdfdb8ee9709d6d9804ba1c994db07e3455cde89fd8d5da713fdd32efc510bb8df56bb9556964df71fee09eb6040fa2517d68e0da288c191e082fcc48d5fc6b290c6fbf942cf19fdcac075287ee506aca7618907defae90d2b5d1d0ffe5a0a4f76d34abe2654ede83df97819297d98e659741a3a73f65697526c3cca3d7611e9f674d4d98d9875195dc0fc7b74f4d4b1223c8f8872dcb7f9361cba9a740850788aceda98dd962376e47d3157d9c6878d5278aaefb9c6523c1ea2db3c11a34247826daf531fcbbe14eab5992833e26b829ba7a99af6208ed9250a8f7dc5316fc7c9fbeb1fd59a97d81f89b17515300dc810ad96a4666e689683634b9fd37156f53c676f645dde1990caf31bf90744773c0f341924b0bd26e28eb7d124df49aa584b4503fb0b321423ea597eb3c9559a76f49755d90eaba22f7370d3d0fc649e53b035c5109aed36b18452e78305f5f33a50c9a5142128cbbdcffb4b8454d1061b2c0d752233a39c56f8f7f8eade0a4f9ce88de0aef0da1619bafa9119f9e1ea8ad933ec53f0a636b4dda82ae4e632ffaf58fb6c190cfdc72a289e15724d9d62673846559018144b390c4ab00bc344f3893c6086d06c99a9179a7c4bdd2f317ea92d8d8f26e8449a76973e62b7d9ed2999c2564add366b1a3c67946e748c1d44c28ce075c0c5aa37ba663ded656b90348f93c4d05c0310f28850cbc70e2dd632c25a8b7a3b2945f3ea51a9e7c359faff9a4da96f98b0c08e3afead717bba4f277c64a92b96fb89dbde6047dd5dfe066d3a7caa4bb255c54b689f200d7094151bc87ff9ae25a647f569a9f3232c259239d7538746c998e0103df1a2a2bf6c72693fee108d3df08c6bc69d7101038767acbf09cb80d699aa9c86978b8540bf8b03ced6a38e8857acdaee8345ea94c05039bf41be5e106db42aad355738305ad519dbfc0d5885d01d1041961f5cacd16965f508558803366bcbbce87b920732960b4610d7d690fbead78cbdd138270943c64b165e4cb4efc7ce1f9be1ffd307b8c2e8636a5626d57fce92751e2fbfb97a7701685cfc986d83e4053bf4343dca87b8faaa9d7ee12b2d34140a782da772dc8666f0d06559f7cf674bb2404088b2c46e06f18a10eb4b3ee50e27edc9d4978ef08bb5f893d3e00810e3561775ab1635338397934e389978f27189c2971f2ea335bb4a22854c31ffe0cc67c9fdc88edb6cd3d4863dada764d65126f14cbdccd6bd0bafefdbf2f310554a86dcb46c001c0c8876bca92f36e6a495ba90415361c9b0ffb19104e85e4d992c72e5f74832e155de0f6d3587b34fe36e7a996a67a236ef0c6cd422649b8e2eccf02dbb33f2f7f24bda3d156c785ec820e255629b604e8048e2ed1d402bc7c3b548c5b3f13a1599dee4b3e535841855171048a3aa1fc8407a60867b30e707299a4e57eedb0f2e5f5326dc9bb5b4d103ce1b3fd1c498043eac5c7c4dc6afb97af400c7b73724e120749789089067e87eb24b45409c065d396294a73f38e6d97b9e4b50d322e4bb7b9dab411b67a29fb320710c12353078ae34a2d2a22825b0fcbe9f719fa51a45ab87230d6e0d2d24737c8765ef8e63ab4f08d8ad240feb427d221ff4c874be5d802db68300a1810ed48cf847e956ece4fcce40d55f1764745245060a51ec240d750f471f6a43d5bd563a54729ce5b1cb4adf6117ba05adfd7894cfb91ff44ddd10f231be87bdfcdd31f36a7d59c5b38d5aeac6af81f56b15c8af428a41a3ab2f898f0e9de95e17ae89b52fdd9ebe9ad7a153f159f07825c573ecb171800be883f2bc7e02f9fa0ca8122f7899615d657bb861887485d962a2480220b224d2b1e74ebba5ea907e24da81de78d953069551b6a52c36defb899e4c5c51fe71cb8b5c1afcc551367c9c05527a77d4e595937c4618bef2bcf2361b5b92f9e3b70d8d21f08feb8bbb80f44062123897399c8237b7eb1f28293c3fe6ea1addd275ed9d4c01d5f758460a2f3c33c6f42370708fd74c77e6bc483acea842abab4ba5ab6653f9004e014a974e43330f2aed986efe9a761fd43b8b097e971c662871a981144fafb3d319709340659cb228922435d14010757b75fcb2f00fb5e43e85478418da95c279ab69c655ef08a8f20dfe2be4b60f0b439e9f680df9dc74b6962429e4bf96cea9e1c2d1c967eb201e15a39ed86afd48097ad881e8ea346d27ca5a0372431b742b7bf9735e9fb8831189b74560224964bcf560534e3b6c963ea44e6f304c9c4ccf443132e65f030ba77f574973f12cf78744e05b750d96963b80170f7a8e0c16f8094d42859d4b734e0b31102bf01b7934dc77f252b52710d84de4b23fa8ca51b3d4999c6b471f01723eba0639e44248e2de5e4493d54ee0d6d1b1b23efeac97d3f24971a09feb76f5b1c5a7c09127f181f77e624c22676ac273d9a0e7bcccaa15a2f1d84faaeca6ee8172b96ec4c653afb869e3479b2c5cf8cca1c3298f0340d33bdec094a126617dd17b80406b951d0b7c06458da603f73d574b9be5337d6c0c71d980cff5475fdb40566c890c1e4aa1a8132f3bf2b94f5a2357624a5c8071cdba6a6eaa15a9192b2c2cf3383e5b4d0a3da79ac786fa8e52de8f11d41467a32e2b2421907b694056aff970df170783ff3527d3f58e2c12b8709fe5238d39b2665a0628c85a0aeadd185e313b002e1179665edc39b812fd58294bdbf726fa04f2d0b51cc21481bd41ccc4177f95b13c5dcdf6bb1ab3507c4eb66c4ee38cd5ea5a60ef6f319bd7d1b06bb148ae9654f99e4296486a449795e669b0079318c2b50eb336ae6ef357bc498c78ab995bf42c89be44f29a883c4274927b74f8618a8d67709dee062d6fef181bd12e58ca59080716628d54b1c17a1cfd405f98d034cec5bb62a2e67e8d7507eb92e7c09863331e8adbf320a4f951cb36521b5e322c74ec7a62e5c263f90f0234d0506653d9636f50b25ca06e977dd6a2f9733a083a56d9fce6fa511d3da734386f85b092f5ad4e5da3449274b068f54239c1287f2d63230abcfdd24509c722e2748ae2929035cb8c6b1bacac6cd0df41c244d606c2cd99c3ecd42585c63df370192afdee74ce57c91c1da73e9ee76b43262adf89379af63d68770e6ab75fb067107af3325c5b6d39d2dda065f738c7c1cd5b2f3355c2aa9501bae4f4fe5c12589245878c1c83592806cfc5f8039007562b97a9abfdbc5aabfbe64a9c95bb6fd63916502c7aba50d47d7d06c6f7e1eb98a57c1f1040547968de3469c360520bf4cdc623431f55597a34f5853b099033551930975c91bc205b1ee54463de08d5b3fa969dec792fc1c3369b06b08cf61a2443532917ff9ad26f03fc568d7188ccc22020df41f62352f8087aeace82a705f34a9d1d72307dcff493e0771c15f19656060d9dd53052d5532514d80ba397fe5efbc1a87089cfabc33f4d3751c2a3d363362d5727d240888571d0ea5716bb2145fad01e6d029a6ad42bcf22c9a0a214f0dd1fd5f220f657b14579b60d5e322cfdc83333416e1d4cbf35e0e50fb1a4b7d39c701794f4603c02f43726a90af5b7e84870b6788d737e2656b1ad493542db0bc0b572ceb883ad74b828ca74f993d281d855ecddfe0a702c1db1a7cdffbb7ecd2403fe74c6f1fc590210ad67d29b5f4ab97472ab50de99ef8ae3452a6cc8a360feabb8726c6b7c9c9e81977e61fc576417635eda4d2bcb25ca3fb632b2cf2f8a506adac7802691ef5c15de72105337dc9765245682cf3c4dcec15efb1c2469f9dbcccf2c17ea08a7eabccc5b29b0b042e8dc3d469f9fc9aec3d5c84a40ca57145efcef257b6876107c47ed770b7b573838b8f12c0ab0a65b30559da345e868cb8c2a733dc63f0c4789fc78f3916462c11d6d39dcfa20ef3f26f8d2b3f5f26310f74ae780b2ebbb394419a24727cb3c153b7233768f7d590685fbc78646f0ddf0736efb4b6e86982df3d3bc1949942010e306785c66bef2285cfcd7becb6bb742111adf684977d53f4e608738dae6997413d0187ff605f2d2a53cdac3d6868c314bf507910e70e996c576221301d987170b76a113f5ac968a1275e3aa487a674545b8a19f61f997c78bb57726845be81dc1202d5aa88aba9eb6969892a1988f654d078e7e97c24b6bb9c12ab4a36b2ed4501c102a01236f6d986608edfa6515bd5ca816ddd9c4606d99df57d3547844f66deb916da53754896e2f45c769680b293c710845822812650ff7ed74069dfd90dc97d0fccc240f3cefcfb4b2273cd0183d0282633fd7bb72c761055525900ed9d61f79186998d4b1fc1127252d56f7622736caa188695d879c799a51334043c34fcaa85e6ace6048d324d1b292ddcfced2813c911d35aef3a18d619344bf79b76c3fe89aee00f609a1481b6db48f790906fdbd31db689b72aa7b8f917400a0adc2dd3bcb3981b5fd327898e8450bae5c63f074f1033f733f37edcfeac27dabc6ea89b528ccb5f4fd17fe57fc036c4de592cc6a1644a085d81ee24cb5c1b3868a87c558657a2bfe1ddb6e7f2fe05cc3f0c7792a469f807986f890ab50328d033a401605c662a75f373b838b2dbc6dd3e4fb57ab5f8fa05ce22be51c202eea3ae255c840c7b0822001f3ba667d9ae11f2db89fb23961561bca905ca892b9b2dae09b4c3063462876e239eafda4fdbcbf09ab97b81bf96ef2fdf144aa8c1121da72a546b9e3c53fc82a3a7863ea79e8f3e06e7e111804cc86a6a150af2ca95487c9e5978977c355e6f0cdcd5a26c327a00e12db970877f1450638bddf378161b03873a8d5178bd057bcaad0b97d03cdd980729cd12eea9b86fb12e337876fe6b92c6fa78891fbec23b4745bdfea341b403bef124b6fa67da7da23fa30ef7c9f9961b16fd16491adb9f586179bfc7245af550ac9439f4104f7816367d59f826834d3aeba42a02f52dd26c3a5f8247a44da2f3e2f340ebb0784dccb5d5ef8c378a9fda58319f1177da1057437602df676f64eb47f1223580642f16ad3c2646e49bb523aa2a1507e1b7faec422ee03792a7b1ab274b359e367c073b3e86001a6d697ee06ea9dafce5ab69fdf48e46f47ec84a4148274c6f00c4f0fae5b0babbecf66dc211a1b651cf26137befa077cfad15683783eb5bedf6c29c5a3b93c4dd9e82833e4f9ce84af3fd1080b0a296011be0a19e11525c704e0e5351f7f3aebcd79c876e50e9fb349abeb4fe287e5c5b8ea9a3c9d259f141d6149fcc98b6375dbb8ff1d1e046b389788061f3a2835628d5beb7bf952f514ac99a7c2c04e2938a2178e0011f28dae60b459c9ed8c53ac09d4828271f689c97348e46b9235893bd10a560797ff9c040f069da77acc0d3b8ed86ed50ead9cffb17f6fb5443333980e1880ec5c737d0bb0319db4f05bb43173689d3de6571f6db1ebb5dbdd218285c35199bdab3aef625c280eff3f5b5a1afd28dfa9bdf163505bb64d6ad1e7cd25ac32b850595a672185840bec052e40ac5d0cadc167e601f58837e2c9054c1367367fcb48f094cfec87b0c68fba0c4ac8229f3ca8d57c04226b701ca6645916e104fecc035a346216181102ba857f8248c1af1af501dcd83746591cc6127559cdc4e95c893abfe35475a8d8feb8794f1a15d4270e5167ede081e004f3c2314e1672ad8bd93e45e3cbb082fb91c2175276dca130255c9802a63e77c8be508b28acc434082d43ceeb5650804197de3830165bed9bd7ca596de293e288b771b211a207b83708fd2160f328cfc0e30a82feebff4f82f7a2af23cf8eb2fa8f9f51b7361b88c0bec002566b5b258d994cc202b1f217cffa8f79c2e4e2c1a7e6bb4b107b00dbe0245d7c025b26d0f6e96bdd24c95ba73997656f51a7a0d888bceb2a5bf3665e9611b352b1ade0efe2672654f5353cf4af1bdbdd6e1ebf36d7281c69da864b7d6edcaa69f976b531615b7b73ae6a5e989c009edf9b366ecd3ec83bf7ec9003e8be4f019fda73ec7ef022de80637663e049c428f96dfcd9f6d08858e443999fe2046ba38acce480fedbe87da7afd00d9caf81560b0be741a42a332008e9f8428c44c17a0e155354507e34b27dd9ab2fef1929c8077dddc334424f1743909e61f230c1d0d2c10388a9ca8ed36311156e59a7c5cc6c14d570ef61b645332eb0bafdc36d33ed1f320e2f76b9503decba0fdd6d620163b6527f82a071a3abfc45912af13cb41dfb5f3c66418285f3ebe6341f19e252cb26db31b2fc23ec981c98da01f70da2dd5198008178bd1e79a8b77d597afb7eae615817d971f9ee0b9c849d079951fdfecd252d2de11c7c2c24f3b80316e442774d23c947ab702c804c94a69db7f0cadf9e00e64e8edc1e1ddef63a3529cd22137e58f62b615c0fad2c23fcfa151722a5a65a0fa328060946af20ffbb5ac517a19dc9bf9553c7df2524d3b435df195b374dc3ba0bf0dbec168a02ef858f241b8ebbac8c6979b09249d1579758c4f1ef80c27209a661112abe48f0ba58b2e306613507da8076e8dfc39aed9515e4e33995f3ae31caf427543b13267824d0219bf30e0bf79c44a9673c2a1d425da66b1f9936bf0890b46f6c63a028d88a46cd9ab63e8a1595b81eb1c486fe34fdf02956d3a98b9156698e194592e87f859e265492e434f15855cbc010cb955355a12143c6c098e9fc1ed131e0a88bb4bce0607f4e53c4aa43376a1a1190bb7d96081eaf8a2ae2925dbfa6cd6ce8d15d37d0140ca471947ef38e205cd1fc96e584f570965d99d0a9ebc3883919a9445ac45714a5ace75471c0c42a07c7a77a619e7453a0badd235885ab29d2f34dfd6be7e78f47e7dc80fbda1c1b98148831a164044e437bf9664900aecda51ceb1d515e602d6f6f1b3199759f31a8606958be68422b6039413b9cefcb7b015e9539c03831a274b0a8c8838c3b6e1c08ee3404c898a4d6ce2c35d5dc84f42c36b099597be2274e3df8feb2db7d4cb301d888f060b6f2a3a7afa76ba5dc7fbb08afdeae079611d0cfb3cef9eb33c93995befac68fa37bcf8c430e109ad12a44c8211b88a2f1f5f0124b262518782ada874ba20bcb183ed3f5b490f208c9809fc1bdaa754c7baaea24c9957bc8c1fce3860a40b2e3184bfc1652a0d9f19a13f9005c3ad41018a6ead1ccef5b89ec6ccdc0e98918dd8e59344668ec85824f817e38271a9575d5200351bcd5df5ed0e2e7b2d8892ea199fe2dfc6fed95eb386ff9cfb62f3d2b2fbbe80edb8dcd36f9905413ffd57eeb2b1a158338b4388cb876a1a1675e3bcaf1721373b05565aab07d24a6adf09c08e57c0e12cf971bd3734e219ad6f5f839ea71574ad520c4fbad1322c04c4760270c4b918e1f8ba88c97982af8b4b4b0db576e6f64eab935a805e2258d8fbb96cdca3dd5991a485506c8b90e99731cfa0ed938189e07192e702ad0e38f6332bb93123ca04cc420d3cb92fec004fe920adb62322335bb183233f513175a4b9615c2531ff34d1ea71e0e7cad13e23e4ba20b9a62e2d26d6cfecfda7a0f37092f3a7869e414a5faf72011c9f3c971e4411ea64a9be4fc6321e622445832a1b4c5410d96003588b3315bb9dd5fb0d982b164fe5338ef04aa9b5d886eb2145a6b21df9a6b26c6e9e4041aa9a3c2d797623115daed49681e181367cac1d7348ccf5a447c00cae4c07a0008e2df4d11fd6c13820f785db76870c73338aea2019b5415072acb3b74fc164b5b6b16b80a0d653ee4aeda588fa74a2a112270bf2c2bd8d71766e176463f5d96fbc14bd6d0e629eb3061fa3bd516a0f29033216197b2667e155f79deea8eded7d871e0a4e6127d2bdfa418fc451b758c3a2f43b464b96ecd83d8674605633df7bbae3d214c5f0d45fbe34a21059678e9ba59b92c4aad75bbd8ed92422f2a0306f149e13fb58a2adacb5bdbb302b213ea2c82c60e0ed45d9b680a767e8d467312a40e8f679fd379bf05581df4553c38e72a277f96b5b2064eb13ed7f41cecdf6883d116104485a66558ee25ae3244b690d92175030d8d87988558930fa73b7147599517b76738082bd33a522194f1442c7ae7bb50da1ec008f104836cdf39c1fdf0297968bf040fa802f195bc1cb195ffc2f744d8c0696b646aaa24e61c8d959b560e3d748eb987628cf1fc54c363b3467dadbf27e2dad2241aea1b3ebef34e42e75ec3cbdc25735cb82ba7bb113b3544e246e7186835a2e825ad99f0a708e06c6ccd294e75d1b29e19f63a8cc958308a6ad3ea5329641e7d4d8e1813d6dc33533ad0de10a6ea20e57be35c35e48a68b7cec16f957b6114c83cbb4e01d889cebd18245d4898b73101c7ea91101391ae349c83933e79cec3f4243948305b3df287d760ae26637e8ac015f9b970419c87c11009cdd492b839ccb05ef5e3bb9c552db62e6c16c656655bd243e6eb7c0267d38a568410fece9383f7fa1621695febed1104d84ad81d8004ba81b14e3d0c85e52b15b22c8fb871e9778ca5021d7329bb945028b6506d966b9052f386a89986517b30d3db9553f4bfb0769663b9166bc16a25d14128829f00683bf3a515d64b3a7711a16403da5b6a5a9d5dce8498d9c6792550b4d732f4941501d8033484af9bed2b00811ad6c5c29e10b9d42eb564e70efb39052098479e1b0f48162c2ad9c7e60401df6578bf83649b30a491d5f3394645886ad57ffc436a1df82e07a2ba04c834b049ed0b0b293271936d57837d9619e8d1b49cc6b0f34ddf35ec7902dc29e8c8e2f6e8e8cc9a397ec882f205263cd431168d3aa4a53625762e541d24fc0bc086deba4b8f11096a6e15a57d6b4615a9c26070c40ae29c23ba5dc3e7f231513a880bbbe53c9d187cfd74516027b5f895281e5730992bb2106e8509189ffecd7ac7d38bc18dc4ca522ccaa8cffd8fa6a79a319ecdf3e98ab6a326c8e9c76436561b5c207917d3d8a35af111664f50ade10f64dfcacdefef4f1f5096472727cd7864de5861d1f49e8572d6c21afedaada1fd383beaa56ad60e2c385cc5810a57f21b549912af0f6824ee9ced0e3f541fd95b6efdc0929ff83440b7ee25662b5f2eb89043f8d2a4bd776760852f32423ac23f767c38dab9eca5c08bb73a1037116fe7cc8262f7218c4a51c8df9418cf92731df08aa14603aec2afe33262b00d243de843548831c10ee1c75ce2b9d7a92ef6415d02f159b4bfde29826caf16622fb14b2749d50ba0f533232d4158d557a1a2f7640b014c106f2e9ec0f20cf4c33ed377856d8c63335bd6889592062ecf37fded1947b6d48eebdbcd8b98da4509aa82f23938eee7edc7c7315453eb7b17c44d7bfcd22a01d582def64c870f5ef74a685a31493b2e577411d39ea2606a91f44ef43fe423838996699dbdcfe6515c49ace61702c56835842927de2742b62fbcbdec9a5ad62b45e887187347f9212bc0a659de498def3c66ed4350c2a4b1163db3ecd38dd30a5ee9847206b74bafad1d4a0e00ba405d8e7c812d06d6c871faf56cda1fbff1478ed7c3d24725de1871646f0784aafcbfc405ff563ba25a27b67ef8a6cb3744d173dcee1ea412423cf4f751ff48757fe8a5d647437e61825bde4af3c814719898e8ed74ac6aa8539e6e6356e9c4c2f8193e49690b33e49217d521386f361179d13715470b5145e4dd7ef7adcc2169051d4922b1f56bea1cbbe92e30de7b41e8ba49ed678a0a309df30e5905ffd12f9d6bc2aa665ae4952bd6c3edde3f4e91dfb859b1b1dc0ba70ffee28c13e331bb92bae3b04a5f793fac0cdd037d8814d188a61c57e10ad3d8b1c41905ec56238738e6c2ea6cbab9de28af98c408f3597848323d21e142171a76df95183e57b52e905baba73e483984bcc43bf9de855465eaa46eb4e4824b1041a8116200267b41dea704755ed61e189d4ffc53b8a6f46b27430d3fdd6373005bae67c482135841f2860f43968232c065d11c42157e853dc001f9cc2f44f463d45ea89ccc2418edc571e72f8de91f3865f0d116764ac111a84c8a07c2669de54469050e26f0628ba0cdaa25f9a86d413b53adce241063b1e37d48c75e3f587c6043f4a92b3ef3ba37260fef60733028050aec762b18559f3e1cf06f566c76ce2fbf31dff238d0159a6cc51a18553dfc22c8c34956c0931c7b163b1f8fd58375b7cfa7e400ecdc5f52ccd01708ee7bc738be4e1795517e461ac9469d2ff6a14e1fe86db39a2c1fadbd2d89c0bced74f26f9dbd9c837ac64c869ed986723f144623d17aa76fad4a526f02b8d22869ea0b37bfd0c27f14bea0300e86c827633ee79eda5a644cb0d3a4e920f5844ceb17a49577e2e6010afd47202b5836578f7b4f04f3cbc7f5b8d47c2ce84693ef29780e6746d0f5dc8aaacabcffeafabd45b510c7a3730c67d0fab11b0a4ab41911c5ec2cc304d34d3fae6118c7fc166c5552639cc8e4e42a4d19dc96f1ab92d1edc2bc6c0cc1d2e03152280573744b352bfa14cbcff2b031d718fe4536d7343b040e5910965dc4cf375dd1967b825ba8d12d3e18135d77efde50cd11213bff516cc2b4cc0695359ce72a298d973c5f6b371c0f63fbd9c0959495b3e586c478dc18f04038187a1f5851c8fd9ee213a1e2cb6b9fd4d00433ef1246e0ebb72fa5a1f013adc9803f1181d17637e33175e8e64e12ecaba9f1acd48744fc0de7ed79d44a92bc349c5e9a1748703298c02b92dc0495532a71633e190ce6c179b38c51697080f3264f4742d1498c533172a25c1347412c8f18413e998b1d202d1829434bedfd15660402fbc0cc36dddd8306a70e95ca37611384baee253cd69299993428e81836fb2d0bfad50a70914a361dbca16f6e40fd2e876131382466d628966fdd8fed7e778bd59362875add49e49fb989647a2097abac30f29f55ef42d5e6acfe43b69cd013e267d9bfecdd93107cdb574f927ec73560e9a61938a1a52d7ee356d3a1c186549b2c88bf56155897c0e2c065c33160a6c07cbcfacf29adb2ca03378fa19011ab0bd558c84aeb00df31a9af67554cd0c7029fa483fbfa4e0d5d02e389b89aa7e3680da17330ede3d1f695d3631f3c7ab9ff28d346000d3deed872129a00101fc3b7c3a71ca1e4f565273aff6a6a806650f29cce9f53579eb019b9edf4b75de24921cead8e505556ca4d05c250cd65c591a678713f7b387768b4d73457ea0f589d1dfd60208df9fce3ebdfc1eee9705f074691e0a9ecd7bb1581d3ed77487f9faf0f669feaf947b308b23dd403911d77ca6ce9f3b79803f842d7d6fadc16bcfee23f09a0b6e76cbe913b501862a3cc9aa2d674b045d26b6c5e44418b26885ef16a4ecd871b27652345b9bbf3c5dbeddac9444de9cf03fcf11f5ab6184416562e2b0d7e38b15da7f60aec4625c07b668f121e453f191a44c6b027765c509e836d77f083738ed68f72bc1bd9bd0b7c6203df79f295930562b3bbbbe050f2131f3688c7cec48251165f8ba7bd103813c12d55283beb787acf4aef960362c540a757c5a2a71dcc3bbb015ad7b265b91a8f0520bb7052530f3401ba3bcf46795764807408f52b076d1c1336e0dd98e533f63572c696950d898ceb5cc0e32604cd8fa6de532b766d803dd92dff4eb3786880bef3c8f76eaa1166fc86a043d71857fdf7c7b49550a4795d30007de6db2de015fecc9eac1b8e260829ff6174e53e707c0782732c3b51420d589561656a951db555cb62ea3b60d8628723007cbca02eaf0eaf90a26c8efb7f9df17d2866216da0287199506d5211acf07f25fcf2b4a1d0e70aca281c341400362c71c8ee0017076aa89820b19ef1376e786504494387bd05b06f662d7a6333658f570cf80c8439afb5d24287c3a594a97ff05c7e05a2867629636c5a6fcc0db333e4836e2c4835f775dd83325584c37059f234867dfa46940449709df20be753ded045b694ca3fe4d928e2b184a2d41cf70437d4dec1074c5b22c1a1ac74cf06d50341787770af3ccb092232b8eda85f98f1b2699699871865aeb41b99282a54f9a5e2018e14f40cf7b2ce383aca7402d47572bf81b79f35535425b0e51de64f6d831627e4e4df7e202174582a4a69bfcd3bdcb38d7a71dd1d33daa4f1457951880b6d1167d7f4dbab2b248566ffada80d5b76c240b5a1b3603fc316d4442502ed9a1476621cce31ecdeed74afa2ee15732f1a215c989d72910f19744da36dcb69dc8f878f42f014bdf6edd8e9da544c655223163e7382890f832f825ab28573de771016ee4270084cdc93dbd2058bc4610bd3ee001ea76cb31863818f4fc29ac44dead8f34adef5d8565b311e10c5a204c9e8f4367bf2c7ef88a3e9a957ac631e838750e9720af88c06f3e10a4d23676629b2cdcc971377a00fa33f244af8ac839a0b8399abb9dfde4041e9020d4561fa251c96d008402a515e09154f735a97b7495c4a938fa9e08e593316c3e66968281d2a3189805cd6e66f0cb506b85d21d1ac725eb4b05d8d26bb7c630826e789673e223e682b16bcbb7c291c45859af0d211d3dd3c5b21605c19403d3405ec995419c719a819b9365b85ea2b4ad4f87edf36feb6cd92f33ba7e884d8032cae1a87ab7a4fa86f25c248342a0a3125dd8d95f97d077db5b55f593f47f496fcea56353a39ae1ca8b6f008954a28e5d9370567169afd461c9469542acbbd9f85532d159696fdc73a59345f9dcca3006679938a8c9dad1004fa259c0c528561d8a97a98a5d1393f49a59854ad3c7707ed78de11b1e7bfbd49710b6a3dba4efea996bc7cc3cc96deda2f89053ecee0250d5ad295598c23bd5885743924895b2d39e3955864c9b3d2b188199faa073ee07a3247008ef218c60da27c577ef3e9579d86209b923a5bfb1a4a69f2649f0ef5df84755cc66fde40f03a6e53f633fff9bf3a955a531e729c54d6243a025511aa21b83aa87691842aeab92d83125f78144a8083f89002b0fc5178dfc3fe561dbdf850618023b0ed5d5e92983305d3cfb39e7c9b0a96c74064f2c102e14fee04d752f393c4df913a9b80a1b0fbda861c9abf16c8c66dd02ede129686419be35618deff9e86af724d66d23d06191c8954dc3fbf1e713e806e3c08c79d305a44109924c764d4566775b98953749220a1409360f99722f8dc9c4c34b10dbb095c641d5dbeee21a9bdf14017234da010760169c17d801d3012ac0863276c69c175a75a9017de1526367cabeeb9a1775d01a93c7d2174517ff66c9523e784daca1f07a6aba9c5aa0251219e0583108023fc49dc14aded257e0b222f99173d901b46e3b8807e3651171429a9ba1095ffc25718c7fb405715d2c9815645e5b7dc4a029dd894837797aaa9c575c8527e3fa8cee93153a7c6420935ff44237f1bbd60995cdff06985e3d27a2fc1902bbdc90b2caf98a0df5c333ea9c9597f4a0991525f8ffc73ff98a007962d630ca7206a478bc5efe72c8d54f2cb43c71adaa4fe726ef74122cf6b5998e67aeae511fb5ec245bf8c07144b2d9859212dbdf6b84cc6770c6f500a9aae2490a6fe23f885ff4b196b9d9cd272fef139e752a22f88ac42f442b95164fca3b3df52a0b64290cbdb2d977b01d9f61b3a4657f06ea60d5f228dbae4eb987535aa8bb886366a7f7664ab28299668f9bbc094ccd1b01b6e2b8c9c6a30b821fef32345df615be66d285d5baae6d48b48893ca248eadffcdd5f22efde1ad5fa73e8609463ab610d7ab7b3a0d8d7a96db4f54e568296bfa4a107870dc5ae6337b387b7167294dbd9d8ceb8c9d3f7eedbff2d11c96cab6070edb2fa26bc03206f1f2d7b51e9aea150cc2bb08bc3b90e9b25e3cd31f46171d6c006dedc6254570145bf975bdb2f92c6749707b349416bcd3057133772ae9cc92ce5a18756b0f207fff4ace0928fb526a576795eb98258c7b105ce8c53636eafee11c744d1678049e14c37384a50ae29f0ac9b05b9b4eff51889be7a1f942f3990ad52fbdc39971cadf7bd4fbb39d9ecb9c9cfc7abfb87dc68907e933f9f6d468ce06bacfb51cdf1daf0a3e98813da823e3a1e9af02eadecede055e867173b55a4e8f19fbfae60538fdcec8a5cade0f5a0ca94b23582468f408369589744ca5a4a07baf49936c51cf2f007fdac36e8449f3e8ee51836b3b122a964e5457b3c219937ebb41acb41e19a1037879777cc3f1b9af9ef8a52f49fb45760a80e99aa14e39d369f6e1c4e9153b7bd4b51a362a4eb17ceb5e5e8d22770e0c245263ce188a0a8d13a4f37155291b960ac11dbd5da1e9ed76580497f20f5cea9daf9b6a183d24f1a06a1e2a080175cfbc1645a20424b701179f517452123f2d3c1a5346a532d2fb2cdc429ae21597eed8736169b5ec368163d8b7222d00c3abfebb94bb7360dc39e843bccf5f970e103f60599983243eaa8b1f4cf3f54729ac9c3a1b53f14c236d008bbf54e062fee4c68bc371a57825421f7deba87629c6737470bba6c097f80f65d207da495e8632f9a4c7b9e82f601ae00e0691cdac6645ba80e245369b8922fe1575b596f5aca3f6a5c6e0615cc16bd9aeddede803dd81ff3ce0f6480adf02e7b521a0414f14ee38cd8afc6e0dd03de912591da69f4ab4ac518f803f53a8db1dd881840e1796f75109c230971cb232f9b5d628eab0c51c4bc567186b5141812e48d57600a42254eee0927ba747a3c71df58b8a4ccb28cf132b4c0363ebc8013f998d1e2a281a0edf701c655d29f426aa118a02d811dc6c63c1b8000e0bd2b4e87ad5afe20fd65ddd5cba883d53a3c443c96f3b783c830c805236b2b5e1ebc95d19056f0d2088f04b179e2f51675cd3391f9c30b5c398c2e4f214dca5d2acab0f1818439ff29bc18a2c727db76d044a794e66ce9aef9628042499705a2c62803ab4ba2541c2f5fab76077ee9712b46a03d2297ad7d07d8402951ff16a8dda5221ab6afeb61a70397cf1069a39609c74484dfc609fce882fd6b2bfb494a7d96735bbacc672eb7a91348e9f158c5818f387f2da051f81634b5649a4732b2827c5604de5c43ec243c590b92c8ad0f87585911b60c733cf55a50a4f2ae2b5ba29d79a979b714089aefd8786dd9f637cde62308a2bf784d64a49d189f07347674f60e8b54fbc789c38cd6682b7b5b3cc0fcd3e1a1a714fec4d680b2edf4c5258101428e135d11070fd6e6fc168056e84e5edafe79aaac29beae9575f9eae75d6ff7eda59dd8cf257f608bc509229688684a462e2dd9de464a408a8f43366ca708e16461b1b10e90024785c70f71def8dd72fe5ccf279692619e3d6472082a6a87262e80f40cfa904a293ce94dbdbd7c70a29d2252d0996b8b150e5ffff29c249aaddc4655207bd09c621b1d14ef2f19e3c743b3d58728164c0b2a281b8f7a8d19bbc3fa5e175bbc60d14ea1afdfdf9ee1f4294c6e85567bff3f6a17fbfecf2b59f3ea9af7b3b8e3348513ab40f9714d3580353725ac88438f2fa77920f6aa9da352e2826eccd9129f0bbfcdf9faad2cdd62ab2f4ac233eee8563ba5afc5b9552ae0acae8a01e2d05b312a982e100f51a2dc8cd38139844b29b61acffe9cd4052bff26c99acd1b57e43db67de48c8f38135d7cc1c01b6b4b023fb78ee765f3d3e9ffae81c6a7abab8b629f35729e0ee9ae0c55d8bd4132b39aed3653169c3dc2eb6b2c1613fbc574c14633e580ae27fcca8c1080897bf4257ed48f7d0ac965086b4ad4d1d5cce9c5c97864d0c4af7c973917e7da49bb624ab25ec4c5f747661b9c7fd56f53a5fc5a504e074181d4b40d779011be5a848b26ca3b453eec82dee7aea8896274a50f34293355e5ad07d132ce46f7b724f7b74a25d72a239aeb9ff4d85d086759902c21eb0c2c1c416238b829d614dd29721fcb954448f411b09b2493bc964b8573f5df7e4a61b01f0036a1405826c903d46024cacb18c32c3d583150b8fbbe0d5c72021b5405cacb3808fdbda6c9505025a00acd2a47ccf68c7b71ab8e02053008ed46d30be660e0f6ce33ca62869200a04784f89d1b7ccc5c4d52ac5198214ca2c16de7b655a5355400eb1e6cc2517585c3240222e3425e1cb17880d10a2d7c4d124cbe4730e68c4459a010581cd2fb0edf4cd3867cd55ba8d676be61ccd690a95fd413d5b2efd53c7d2f69986a233ed2c98e0112e3ff9089c52fc3dfa672da8f12ed8f89a827ead53fa85b6e2fa631af51a91127b0b4973e42db07b2a9e8548c12dedf4cdb2f1bb5ad49da6b65c344ab1721ab700d6e02db65a5ba378b058a8b32f23dc96d96f3c57844dc3b35ca09155bb82571918ed0c46c6ffb5c751144781a7b61cd0b6bf7eb330afd97b9a01ed180ab80d2863045f0375471cae74391bd69f8ebe6583ed0dd867a36514f2f850c65326b8ad6edc6834e3253121989e4ebe5b37f32aeee42bd799383837428dba11b54565afbb82f5c64922db1c82995d84ec383cd1ba934695d78fc3210fe63351afa835bf44833712f6dccfc3478428120ff2a5085a0e9b7f790daf9e78e0fd5ad0bd6d069988ea6614fa7a6e2493f0a9effe5ffc0f647ddc8c5d79566cc608df4009a462bcce4258201f9237616e79e84d76d980579fb40e3bb737226ad3cbcdffef536b408f3979818e2638e894ae93c24d9e5286b6452b9ec93f635904b66ff96389f41b247e0a0609925b807c9dad1ffd144dcbce24c9733d29ec5ec97f3f35512dca914c22b35ce1d96590672e08b565fc0cfd0cae3e7844ceab11759d767ae544e08d9af8a6c02473c8916d612d5b99c6fbe44a67e1c62696e78b5ea6207e40e4989da4dd7b8c8b0a05940d27feac95ff2d55d7b086a50e0ea3671e78bfbdb555609bdc4c251a2f8783f3ace8f16bb637ee0f866bef3f136cbbc9f9d5612e33a2c9a13648b2da3b323da60e68e503e45f0d5c16e51916e3284ddf48b31d3371fa97aca34ca9af960c1de4730e0053a6dc6d4d37977017f86a9d4aa198ba53dab6c34b54252a54aa54847ee2df8d30258c08fd8d1b697b5334187a1d2e4ce8491e5726d9111725a2d67c8c0d92dc615634c24e2f1586fa5f79a0b3fd5b85b04840871b070b6fc301fceb4d6ba6676a2479907bee034dc4ad265a4f4f789f80506f9bdd37f5b60aebda1f59cda1a32de925f0ddd359f01fcec099720686b613a7846187b30326b4551262a0717f3d7494b5294005beb97aa9f9e0a1256784a855c650e399e4a1306c2f7fe64e4357b795a0e85d2c09d7bd2ff05cefb2157c5b36c9852e188d9191bb5c549db8e45ed8e4223da13ac7ae572a0171751dc6d375f94e4d8e294c6ba0bbd8f36231d5e45fd00bf0938a46a8380d21144a0f65f5fc4a70907651a16b9386dce5d8891183eba97597abf5db58aecafca590fffcf0611f7036703f4814f2529f24d352242686c9c5c451c9e67a2675f3d187039f34103ec76a711ff7f022bfbcc26313c58151a513f5edee103774518eb08b716b9a259b6b436a40369d27e84eca1cb44badd42e678548b382d77525ebbf22b24bc6c77fad72fa270b782611a2e67312146ffe0062b78d700d86bf56618cf7147adef3c8c70fb78b8cf20f2afb0e5c063357ea8378358f0abd0807cca51ada811f882455e170466e14f54403091f94a53c3a52ef347e866b8a016134f8e88cf2a615ed85d28e1a257ed0655e873126634e4cceaf977467b215ba96ca2b14eb1a28e7839eda09f62358a3448fd1c03c7c27f69bd17dbc008fa51c02c5eec2404d2dd329690d93544fccc8e0e84a2984fca1533c97caddc2ca9eef9992b7301c19766071dfa83e6e141e08db3e0e9a8f348c773431c60a584f545765fc4ccecf52e7f8b4b19e9100a07f1326f697618bc2ef0bd0c9d33d40655c1bf18d6684071f2731d8184dbcdf93c82c3d62cf2af90b0cd4c6f65f17676c5bbe35a9a13cbd5a81004fe2320572083ab10a7650cb890dcef9c6926a93d5731c187d1ef4e0a8d767f39ab81733418184f87ea90e1afe8919b69b6e4721b6d0dd770dc4ed2d38789cca86fb239ab5020f98b548ea14ff475d2af054e5de48b143e8fbda85522d5ac380d2f1e56450b49291f2dc214e23876a26407d5cefe00b97b140fa020afea141e80bf8012a0a3b424fe490e376a56829d877ef9c505ce4bd1177f46e3f71b881226b46cd9c1a1c5b2fe5b01e85ca2f8e1f49914d56719320aade24d1d81daafa12951721ea7238986ab2072b856ceca6000b2ac5c8812dc326840ab399b8aa10e5aff445898e0b23bebdcc5eb7bd898d4b42eb15807d27983d40c048742de80c232ecec5b6f627c6b3b57206c48efb33d7de24718b32b42a3b2adf49f0960f56e93d8ec79b8d4ff378aabea807ea6b6162ab704250456958af4efae5450f270d1dab5ea94ad812bc3c1ba3f1aa57864469b6b691b614db9fb8e7cea90f24a41bc9114f1bda335fa099e251c03728bcf9de01873a447b722556cd14dac5ea6a26dddb877ccc3a408ca499bdc03a01991ae98756315f0884fa0c563511c236643dc3382547a2fc6a39d932c4fec6811db925629a45cac3a9f31c8e54b1f7d3bdb639e4fc7feddbe1cfa1c636c179c44a5aaacce247ce15845bce724777cd63db507af0683a3d32ca11dab918e35ddf97f1447e20f4280e810eb32369ca4d093ff06f27f71b6e5fc901745b61783d1f8805e539c9d183c96a9c3dca873e4460cfc125277d8b6aa1a8d75e5cd6675e2da62d6f32a5c8b4eebee9c6c551fbda7cb47155237c9530de2edc10c5de1bb266df5b10f4374d04d871d8c13bfe1f4f36ce6151e4e379efcf23f8df06b7dc104a291d8514ae1b4201ffb2871cd310069901c82426d8c2a6eea37aaa6c34150c3d90798abd68e04ab689d6f2a58437144f01c3944dcfa99b8beb55a2bcb9f76ff1bface06ee208a889c3aea2a378e0125870b95e4ede1d6f1a065109cf0168a044c5fe9d5db858d28334ba06f419bd775baf1aa47ae4ff7c68460307606670d76d591e1f37bae2429540299a9c4b449f42f80bcdb83c6da681a8ed71341ef23e93f595a8deb69c4f4777a7896bdbdfd2e94f5338ae100381689b6e339ad2e4adc3c61a4db2511637b39aabf360e6f9134d6d56080cced418ca1b8ed3c5f81a7923a8d56ad25f68da292f66781a88da511a0419daff286e1712ddd879684952d1b492cb76b245e60d6fccb130cb4c3f2798fe99a9bd5f765219ac7e2f1c2b2f3fb77eae49daff78eb296495a40db173caf86bd5c0ef3773acf4ceac731cac195b46a3f07f8806491df3b5dea1ef4c1e8ec6f0fbd43254f27635f43d501de490d8a0101c903b559bcabd2cd423010cb922bbdc93f60dd494fc41f0003701c6465d7f93af460bdc4b942dfea60efa23e1028948e1c7ed221cab2aba9a6f3c31bd9d5a44a750727ad437ccea7fe24619659fcaea35b105387336fbd79ff30f9f3a18bd3f4643d298c756718aae00c98d028b659ed735dac3b29aa19e730d54ef63d40ccb6ef57572a2b8a6c42822913802768af841cabcf67a07de45d6ab336e3d5f861871d72e83eb03a945605452c8636893b1f1799ad1d3abb2d08260cdaf77ca028c7c441d1c349c3e3be829026bfb8fa196971d7603e7b796b90d69b912a4c9fbe2968bfde4fa20f962c0a9590b98752e2362846a341815f5294e9048719af1109b7fed3481b6f33b784f96c422ca7f8cf65594a380cbcd3713060cca029addb087144e7f5be735310e4bf5c6e29d0df1805e99dcbbb3849c52c6f42d6b19ae8e6706e2fe9286552136651c4baee99d396f6a73f979babc1ad8b638fcf8b6e4dd0951b8ae2cc9be87b814e2a95605bbac135b1e2c64cbad95a921149b63567ce2d84ad246ee1cca17bbb23b592691259bbfaff7494195d265b66975929ed10112000aac6d01103a7751497fefb4403b1c6e6ec4fb19cac32c0c86aeff61ee76f34c0b857f568f8490be1149e69e15856c35c626e662d87d97c4f45b80cd931e57eff515e") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_192s_test.go b/ref/params/tests/vector_sphincs_haraka_192s_test.go new file mode 100644 index 0000000..98d077e --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_192s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_192s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("ad6f902baaecb19ba8b51e9fef62e08e522fbefe2f908d1fc06169678fbf4c3a5772d0b38078fc3bd742250417cde4168ee106951c0a3d1434fe2c5e7b9392f43a73496cf43d5c66b08735f32b7e0d29612f0be766d6774c845326ee63cb29aa") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("8ee106951c0a3d1434fe2c5e7b9392f43a73496cf43d5c66b08735f32b7e0d29612f0be766d6774c845326ee63cb29aa") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("860e677340ced2833cf075e67fba803f77f8ff9b1f9050d910093a76dceafddf19ca03d2167dec44381a59b0bd83593bb898cee92cdca1b06e49172b039334a0c97e40b65c8bcba1557d08e10f98f18e3568f2e01847900ce85be3d8508e69d29cca4368eae8bf6109e555aaf52233a3d16b0198bc07127f26c162f60e4e373205a62fed23b5f2d955e746dc8bdaac5e2fa0d64f7f4897cc8e42029023fed5f858e8d0406dced77e5d2f9d42801570e722939192020729a9065d24feee797af42d49e9af98901b6d789dd1b5474b07224d7f8d7dfd9a51ca2e8a6aecf2330aee70e577677dc16305fbe7b0ead8ef520d0b1c65fbaadf173ec7ba62103f1ab6ab21ffe6237d85bb738f76f975b28d744321061cec6365d9b0c3d126a5be6af3fdfe9bce7332f01b7140551420e1cb2d2045ab5911057f643858b259594d8a1e46c81c8092cc0ba698c92154940b6bebe86842933db783408808f6089625db61795775f949ed15d8895a477e888799be43f54c122485086a600e81573dcd61635046ab465531d997ee1b50e24e8ebccaa42cc086a5986827c395cc415a6aa6eb7751f74f748bbaab46ed9024f39445bf9a4a3b1e80211df2e50e4e3ec62366d06ad6d12182b00ae8041e9038fbb84ee7eb910126855931a4d81ed9652aa4cead2598e4d31df45be727c5534ba84780a765735d38ade43b13f8ea00b577053d3fd4a7a0ba9412f6878de1f2ed15dd515897ec3ec1e611fe8ebfad30fdf98a7314ecbed55ae0556e3b6cbd067ae7c7b128171257fa67b9a44dc1f9e50234aabd536c21550acb856470484abc9f683214af6bb03124760a8dc31cbbfdb30859bab5c8969dcbeb3700727334bb5e1e336adb5dc56b8bdf511af3ae67ad25259454555b53dfa0ec57b4a17cb0ac169640cdade7e7b22153023808e3199a500ef97e9b450b31dd53e7b9e96ed3c04deacb5e6abdb3a6f208d8d747847a85e67a6b55116b91ef30742b6908db049d3bd8e5dc7ec6d348b671a2908b2de5e2cdbf0ec7579b6d1b46ddddee2f039c300b4660ac975d0f298e68de424d39828dc5ff1108251615ea7ff18ef6afbaaf9f31371df4dc0ef19a47ba90b8d6e82add6511b6c9500797e9831669fb3436c6f0e275d257791247114c6a5f93d341b03825191ab7c5fdaf79850b080d0f4571940f36eba0249e449ef6a64154826d606588c1438063f21194d27acc22251da773a987db10fdb8b7da9456e95bce5caa342d27d045e1689b747e5a8089662b7d9611204575212a4ca4e703f17413f7e60d523400ccc55a53c8a960322dfd24069dd4dd8214179d9049d40f2abfcb80dbaff6552655dcf70ced160707218e2990332408683f45825a934ac4f30e81d0ae80b9aa967bd12600d21260749f4fda9722d9f38f3ccf0fce4d01cc76652ad90587a70816e0541452ecee14c6a3ae58d7af37562a906b84c36ac48a41d478740221d7a9cfd9a6c23bc551fef9b3bc5079cc7db5a05647c31d1fa615d5352a947dd606813589970b56de2452a718b6d28a3816bad147b7855d7116ef1a0ced1956b3664663bd7f2e6e76276394d1099f9f43b792f2e27e02983e039d538a7a6d442f5ef500997a0f12e2dc7fe43c9b9a364dc2fdb3184a2f77f8d4099908957e8ffd4a27c7b11c1748ffcca0cd8445f82d7f978b5ef988a66bb042accd8f9b9b02261e685b3b965b4bfbdf1a39d57b8ad4beca0e77922df43d6159d1f7f9d2dcb78412f2ee7563404964642f701cfb15b0e3ad00f6f417dba09a26c339dd6dd72b46c777bd44d4a043a18ecc8070c888284493a5a0111eaaf220714a88d1d157ff86aa7664612b8aa8b2694ec7b940c29eb0d51a3eef5b4f46210bdfc6e48af24e8a22e7aec4d3bbfd1e836600eaa8b804c074168d2c7040c90db37c7ac9bedafb99cb52aebbbd58424f0dc86499aaab4ea10681f558b90eb958d65496db0b0e396979d5e91fe433cd0234c79a15c1d53569bca83068dc7ea4bded78f2b2446bbaaf36f77134d27f9cdd751ca4616befc80ef932e135771fe5f2676d4af880dca3b7aeefec9e190a090d1cf9d531f42e203424fbc74c8ea8afa8e17cdb9409b5fdbba20fe7e8ceb1d2484be08fe5de359a6a8120529e89cb18fbf3ddd7bfe020a2f5dd3ba621ce96c7b852463667fd3a07616694119a668ed42b7845d1a6bfeb3a51cb080a6c5daf837f3a0c2560b24a9c9ffa349206c9b4db4eb0880cf1dd745c308cba9d7611ff765f8ebe88b4ec7ab1049a1cf3b9382a69982a561d91d9f6029d660ebee7b8446d09d25d8352733d2c3520703e4765aa6f860848e2509b112ff1b157949c0f379f7a8635e87a14ddc1f9c81554d17a12e9d2704721828bcb5ad559a97965640799b61c942a7b70f2c0ab87221a5ccd3110ea916f78a3909692a4bc71c746687cd883a1cb79d322374ed554a49435eb4e6419cd7f75401c0de1de0e6094bb4c07fe64b542bc39d70041cee5e7f887502996ad4d6cbde0626769da714c8dccf6744c41c2e5e1314b939bb0bcc1c438368584b0a528db07e1d048ece7d6a14d7421489ab67e8ac00421548ee982af2f6f4daa876971b55f095e36d149ab725eb9fda43a8506555f2dd2204f3856f726237ef0efddf18919dc9450334b079d1c770b6ffe614768f92ccae670584590ea8ed5083e32cd151c6d974389a138229e11d7e167e4784ba4ee187c1823ccbb0ca49e5013c63710897fc2f8d1793951d953658aac4fe469e84ec9a477456457085b78c02ea6fc1880206b84d6072151fd1db1f020e485c299282f052349e159903afa58b92b42443d72677903338edf82547083e208dfce454d1d8e15b3e2d67b468793dce3d21d24cd1640e62309e0faa1bfa8f8d0ffb0ead5857153bc033b88a16fce1367fcf452bec37a50058a871c59d6c2e905fe6c21694bd652c86082cfe65ec523b5a47a2f8448dbcecad27d6e4639db06f4a1a32c2ee80273d240076e15a79efe28d44f999bd26889f5e8de727ad449b9323f667ae6e3a093c7d2620b4a4e76ab570d81350da72f2e01c03cbae406374f1af645a96790a8d29b772cc6a06403ef2c483c6f6e12ffdea3cbd84bfe796e7733a49ae43b0e03dd3a870f093ca0e44b9b4fdca82f57d468d5e9db9fb81d259a98981e72cfcbac2bf2e0cb575c53860ec7c6193c9fee3e3e532e3ee1a7afe3633223a41556042d50af8c54d3c63127193134e8d41a22ed1b31ccb9f38551d12cbfe827fa7bba3ca5ba42d9c0d14cb8db91b314e863356f1e489ff257830319ee2e4e5f54d6d8b40d25f688d579fc5c79dd8f1ca7fc814f2841f060b4c45dfd80df7ba4eccb447b9d8ffbf4b8cdcdce7fe368d767baa0363a069fb4004438d62d1ab89d351e0db662f325627bb3b9fce5a503352da944233255632fe6b9fb029a8b3dcdfdbbbb87862bfa1025e1675e8158d8b5ffe802a988e626b00778cedff35e4e567e84e31281753efa13d2cef635fa8c87bc13bad35fe88dccd0a6ab3e667931f816ba5bd5f8030161b92c5215ec2a06e05f37e0aa44577d3bcf119dcc56b1ee6003f4987c81f6a09c3d5a46e043c6c320cff81c5480e9032d65e973d716cb2fc13bd0daf480fd8359f4b6d3fef84057b2b3f15bc147b5f801a9f2ba5296cbd1a5cc6fb22d09cd734622074df9fb1075916802f676573e70564c80799d3decb4aa9b62df2e9ec1c3834c8d263a4a02b8e8ce42f63ea8d5862be109af89ecb8d0298c656f4304d9631fe898b9a71d9edc1c0641f2e7396fd79a4a6702c1da48646e2235264dbd0d6d7ed7130220ab48fafff57acbc9771bde5e9fd25f9e46c3887a16a87228e6d82dd610bd2ed98409c2983b0ca091b05ccb2f5b73addf10ec3641c8dbf291c7485f52483ad74da945d5b69419c2dd515aefb42f24e9410bab340ca2859eb59c140a09db07040785bf7961cfce25b9e2a1b0e4530be57a1fdb3195f26ca594726328e86f511de897859cf2354d60ce088466814d084677eb19beb3c1e3d7e399dac76311af28cd98a915d9020d2e4c74c6922eaaded0fde31020d8eb9e8c7c37f3813db4ea07aba083218be727cf08fb829804edbf2b7fc5d3a8fbc2f1634669ffc083b9ece27f3a284a083accdb5bbc3961f6f1c620742218be1e33c88eedc37ac6c74b2a4e1e8593917cd5aefaa5a70416fd98fccb928e41c157ee1cedc24b70761241d9c1a9341390ed5dd4fa9fe2f11fd7cb78c2902b550ba9e00f910e62334d80c82e431d23dbd6c736a3fafbb3060963aa5c92545655f099c30628b5ff5ebc5809fbb91b277e4b1707db2d5b5bc44e3579653a817d2612b34e229e25c5210661dbfbf8f51843f222e1c8c953daf1d093f72b332295e61b46179961b1396c4dbeea2412f896b937d39e3fc4cfe02dc763c2fc543a1ab21e018f38dab3534b8a34ea75e1e6cb1dd3db3308dfbe18a7ed7e585b1f0e193f00e5b7471958e98282ee6155bbcae33fdde68e3f66a6788aa289a07324bd532fbfde8b1fd3b2aec90af9972b7d72c55cb8c720005ba63a1fca080b11d4732052defef7569c076806a0ff7c2bc1bbb54a49e74a2fa6e52c87274b9b37ab35d077d41ff3651d213796f7b8887aa26e92cb4fbc6c71b4ace591a71dc6d28c1666774c5b3c79404ec0b2a66733a87c7ea61c99717a9bbdb81fb505dd389c9005236d489b55b4bd589276c5e7e4bbd587f77ce31337f27150a9c62eb8bc3f6b6c926acbf24c34ecb951109811039cec63e3ea3cba83f77c5b6c9d4c7aa7eac3c8f50ddf557106a3fc0e92dffcc57a0c8d289f2b5b60cfb46a7397bbced8de6a36d15b3ccd1d20bd5afcb016daf2668c45d3ffef23067ea70433fb8287b0431fd6d5660fd42b7b9d0349b7a5851a3aef987b31700f904154c02c104e9d8976b1125d4bd27296ce6285f905090d6d92ed16e5819dbf1871b47e95d1e1942fd060204385cee9b1b0f72226a2161d2067c688e08351ab84300b1982a5e2d52736bb0c6b00d883c57381d46a3aa50a5ca406818a120e90428e716a6401a817c8eb4455457ecd827c103bbec68ce910547f10dfffbf520a642c4e1b86755cb05632295d42f071ffb3dfc24f10bd507c94dfd9cd7236cd87d112cb8c7c3fd389b5a75f4573283bc98dd94e2e8f065d2e3078c72a41fd40ccc60fea4bd81132956325dc05e5e4b8d102b21769313f084f7cb21cf0440ca6d20a11191c4f7cc593242863da709ac31a981ff455e3bf69e38968717d309fc970dc9c5987a2827e8906cb84966babeea1c8f65c323967b094090f83c71b2dd50351e3a2f8156c3b69966a3d829cae7fdc20a4e302c2deb5dde4667b7ebd0665c1607d0c8e8f07dab90a17535e4f896faf4a09e9ec4185d5a5e91632cac3399864d4621e3547550f21e0871dfc9ab11d5a0111b358a6f9bedf2c6185af8afd6a19315d9eba3daaa58e2280b5764204a682e1931bbde9961e75ff3b24a64e353f1bd64ec8e43bef1123bb372d25d74936e286a67719e4eba88e147b680e925a949d0c325fad66aec9847a55c389d542efa509a1b9e70edc8105ff892554b5b823fcc46717ee21f62a3026646d2ca7f48282c6fa6f0ad46c2180a859ebdfb18635c0dab3389f37b2f524aba27c8dfc068999fc1571132e7c1fdb580b352a697a581b9e2a6fbb65aa8f00dc9edae425d3c0b44469dfe495168544a9e208dcb4d52a6c4b40c48cab5f06a894376a9c1493bff7e7ae6ac8226994b86e58cdc192c4f74c885fd6b1bfa9d7d8e65053f0bc928266ced1650923691ae4222be7807bcbbd056e51464c7f365ae9953a367f24049dc543e37635641d03b332c5a32648c67113bd12cfef70bceee60c5e9f4333ec35ceb33099e97385d5bcefec0b9019a2dd9dcfa8655adf02918310196684436a125a327cdc80f0bf7250ff18158ced4cfebd476eda67159e59fe106ed46617317136769da1df479d9954705ad43d88c534c3bd071d785f3926c7508962a00c36bcda055cba7e02b6224f242aa113f543374931671ef63e5c42a31d0111b359474fdad5724ce0f7ae2f67c9b2dd03035836c1c6b97b6558ca3eb92d5eab5ba1a29f4436f4990ca6a6461f6402f53bc989876b1a6718bae777604c02627591dddf5b4fd8944cfe547c19a6e74c5e751830ff4a02173064c4630712b1896c219c731eff9a06d1c2c00a05f55b4c45c08b83c7f2f5e7f7d22aaf0451733a696d5f76b5fdadd727958e2cd77f759768a6c0cf0108a9b20e410a1d963ecc574668cdcde3692f5ced2de6c25d4d6bdf2e516634e53bbd108dd295d338b775d98c0e2eb29885ad72e673dbc13b5ba2a00eae76fbacf5f6c87354534c5187c9e7713323a386a5e8eb1a4cee0235c5a18b2915252ba8de112df9dbe9d77a1163a8e5d4b7a16ede2d60fd7b11db8964e1185af1f1d515a316ae3f7e375d8479718ed2c42af38cc5a40955f6d4dc2481592fd4c92c7b02dbc67548d812de346834097f4f402b442e353315e0832b5ac027d8f85efa7cb838f05e93460b1ff61fb25069095e8c350e47702f4e13b5885b11929a7d101fd559c167f371563249ac564f4d3234fb2f15364d24cbdbaec1ce81cf5afa7d2bfa907009435950763248e0ca085ce77a8f728720c00a7dd74ea89d39e77301e2b72d57f781b1af279d487d044c8cc7523974907cf44aa77c32a69d44289f6a18d43e0708f59c9a4801c8c252bc6804e2b683f8161d3f4a399b6ed4fcbd6cda0ea35e0cf75ebd9284926f1c945e2b6b691e2bd2a830bfdf5858e2d3306ff4a1bae3afb0ebf7b3619955de1e8dc2f3951c6029558aa66d684884c7031a7fca6cf3c439a6cbd36df7a3bf5e6d0fdc1e891f4f5aa47ce569441a83c5efec64c2dd606a9d4a1d240460aabea71792a0f5f7981b08de5b22d66c019ba23fe0a9314e026bdd2d9e847bdca0f78b22ba9e0e8f635dce10d4d66950de766b97b89e67f5da691081b58041ad119d824013386c0c10d4cfeeeee042756d444aac50e5d94b1942802ccf3ee7890e37df1e45ecaa418629879e18c435e2f5988343fa9152ccf056629dec97d42f13e7a513a8bdb49d1639e95d7277e65535f6a99661aa6200524581495e9496b6f8df720d49a88775a3a16cb6fb5d33e3e9d902fb5fc866bba9bef75917de59f57db67e536c2a5a69305b605367add43ca9754901252f4380b0dce603aa2dab99de5578cbe73253cb5a49fa8dd366e3b8e2475152c7aef63fb390353cd4038fc1e687c0438db0aa42402cd982c42c401c986ac73e0a169a0c5fdbcad7e0b86a39ea42c092d832a79e5f28e7ac3f08fde1bfddd0b147dbe19a498752355b5a812cbf6833b43ebef09b339c6747b5789447bb3ec62c309a441fa3fcde5def6b2080823c61437961b37097ac27ac00dabbc9d35a0617adf56d53b52523bc28ae2e07492249ae576841f5804cbe93bd6a1178c1d2ab9a927ea3f682dcfff03d9d475f7fa6b1f2a94b22534948cc34dc02d84c6fd286a69d9e7b7a7b79567bb9b25d262d225dca0373c4c62cbbf9e41f95b6f47ff4fcbe0a70e51d854d69572bd8828aae3bba48ae044d4ebb59ee77a3d99f861eb8583e97fb0798fc4b23286feef576ef849f98606a2008e05bc80eeff83d7f09743da38933992b2a6162959720599ff121ef7fff7467f9f0f2cd2eabff5344f6855ce07acf0a008c16f619d42afe0180a5b7c828c603742742b61eb0471a177ef919565ed86e2d1937eebe5f8809f1f7d61ab008d8cb00b3cd193f4d73dc7b02d19b2438860035cbdad953a16271578f878cfbb02d053f6733ad73b85490d565a9f2d1d2d9efa419fac90dc9cdf402867f4804712c21680324d2d1360782b7a65a93dfa4b2764075825cf34ec966291d4a9ac66f917d6cf87eeedc57076b16a948482818655a0ee292e980d514b20042c6d74656c977593a9d1ba92227a1ad61c013c0004369c03adbb245737ff2a72cf397432f22879f171a041285e708f3dfbfc2dba809d3da49227ef1316aac0e2a65c0ffdb82b6929fc73531cb9c2ac423a86ce11012456b65be7b7500a66e61c086913080e0f1e7a2b28c2aaf3b4bb0604e6110ce4d38fb355a4fd8f730f2772084c7bdb767dc50064eab4fa0c6bcf5e2b08e7892c636c98ebf965acab47f22d310a762e8d9a658b3e14ece9393d0e3e9df16736657eb4042e94dc11801ded42877d3a3ed35e62497bd998394bbe8b088ff1148161b09178fc53ac729cedac9d9ed5856d60707b3961d9d0c67cfeb2e2e2166cc10d385bece89ea41699c417a5fd6a9dd55eba4d5240502533934edc3403da0a4b71431541b34a9b03cfefd7d4d72ea079a41389637d5b9207995ca14f73b4c8849c7f258db19c4de99bb49f81c7969a334f08d2f829e9f1a162d0c453245d5e42e66a67feba5092ddbb6d29ee2e5e10fb5c7056dd381ba691e1b6c0db03062ed2b199e60c38ebe3b030cc209c628f339be005e670248f02f5431455fa1b18ab924ea344b2a29f8356c2e9536f418ebac2aa31e6e1ba62460a5681c730dcd0470ca95a03d2d82db93dbe0eed3611534bc2b8107d092f45141d4d0f0ceab4160ebc8d4d6f666358f3eb11786b9e968277e181e95877774646edf1ff4679b63fbbb208de6860e5fe5051ac3bddabb54b0232ffc265857c3c4e10c79e2e91b0c954e45acc422ead8e083c1db66b93bbcda42506bcb3c25bbedc2418a5fe4aba9dcb05063afe7798c454d0be34b39fb7a7d1fa1f4c8816c72088032fcf4c00a97a25c666180e8fb80b2f1d75b33b5c66a3fc0c787fbd46e292a363720629fccaf395ab622d7004f7eb1229ad050037ed6995c5522b8eafc8cfde5106a40b124575df2f3b2a0c74094ca19cae8a1868d6d51a4e02bcbe2a2fcff3077c9a2b1dce9b225fc1722e05af88f9fb0cf2e943b30779c1c23ff9b020ccbbe3abd0bfb2df133f8e3acf3f4577d58beb642271b2e2dad77f226b0e3fa363c5187a2d1899568ca10f98ecd232db360f4de1b8b2024ed7ec73c46e019bb42f35af4d11981a54f883a278f132ba6037056cd7d9860192b1e3a05e4a4a68fb40fcb6a5c4368407796bf23ff8f718285d268ad9235de1b02db534706bb1490db72e074d5106856829d03f17f8345853c3b1be529a1bea016758e0a8c66e8691809e567ddd8d0cae86a438143a0f623bf722311c9f3d60908163ceff4b0414ad881c2a7fa106a11012b96bb6159c835d76352019e79f00a506c3b8161ff71c5ef2693691de505276d67f4f20859eaa864612b282b00a32dc49e78496bff8ce17ede8e6fb33201fe7b9720f76b0fcd1aaa71c2587df75173d5de28c78ab5bc05619609bfafc40299bfd8591134718604709dcdd8fd2e867a663a8198bf508590235d54e0b88bb62e962fcdf12961c441aa4572b037b1238ec505784a0780a0890a7962771b9893d2de11eea948217ed07a2b9d90f25c5059c2046f8c260969348194a08e3ab236d0f6df9918a426a866628ea54275a89779647830cba83bae8fea50a03c958a407f93704c192d665351743d7c94007a8207c8b6e8546af9cd27039a5c469281eb8955200919cdb42f7eb2698851add17947154a7df1b26cfe033807a95aa17a70efc2727bd2eae69cb0da2923c2e61182584575fc885fabbbc4d3fd0c99c1e78386b0cd1622f64ae8384673bdcf9b617dac678eb171ac31d67a0bdd09820f3c7b81d8fd54487f866612ad31d7d028ecd1aa45252b3574966f5c4d5b39dfe734778cdf007a374df2035be776fe27f19a4be312fa9f0486ddd196ee176f0d04db04ad07e3bdb8e9658bd330fd667c1f227f98743686627835157ea9684bd557b834247240463ca5749b8b5bf24d4cc34dd86f8c5f806b02155ba1fe991b05307d68ffc49a01a92a8c39edffe0e8a282246a418351c38e2c16d16d46f152728a0113160ae8d202299a759101dedb7d13688d7e30064128453a5b1463f857c13faa2217a3de6dee2b32c5f48cda6f891754227d3c1676afdf199c81b065d1fd8a17b48c3cc8b74e8a355ec872122149d46d48e79faf746196b729dca3dff083247f235444dcdb5fe581800993a3aab287473eac02d5b50f9c4cc9f5e144944678378e46a08563928d4be39534e186a9f29b34d17a648662413cd3949aabc89d267f391356b9cc9c9bc5669f040b06ccfb0b43e69884832f6f81dc3e598a204cdee2170cc26b4d4ebdc5f4877ced6ab8ddff36e3887b2bd9cabd8b97f0d21dd12e2f621028ce377b0570f4a234e8f82f71b7f4c94381d44fd8f6cd6ccd1b417be1c1cca5d00ee6efca7891ab3412f01bf8c1e7b0d86298a9b96f647617e9c5325ee89ead3278e6908f3b15c0c202ed78b8a4feb28f37e391ca3a3d765e4ab1780f2d26b38206d957a0c17b32a74913b76b04e92259db5e09ee933b1bcfab10bc3cb0e6560182ad2293259c93fd3f3dacc19d795fead2458ebc49fbfc25e12333fa4d33096e20e1071ea5f0ba2ba663d88dc4101f1705d3d3348a2bffb643a2cc8ea395673a0adc406b80aabd3a7b40ea068f564e217272072bc90acd59f7d44f255b287a661e5fdef35513aefb40274aeb820bbba6cbedf40fef24c642f5a486f501c6638b59e99b884ec8df2d9095d06c46024d30deb5acf4aa80b0ef9270231f88739561dcb2b4a9c335eb6efc750b5ba082f01b38faf8f8970b258159c44c3f97a41b0908866c496ebc8b9ded471be957edceef097c10aa1766603f73604f404b40ee8d8dc5537cc004942eaf317e1f6acd2b9ff0f36435e510b950f055b101f140038f25cf1f6c5973974862163835732e7d9045c521a5274d5d83fbca06c21209347aa1aac2118d52ee56fa7db14bd8da621cc394d5e7bb6372d8de07b166315798fe23d37aaaaecdf78f1f349716915a2c090c65db62bf3a12d25b9d585147412c73017e35d35af4d39ead8ad799602b728e1ce959f1032e98acdd5d7273e2c8053dd11893757ee52372aab4a7e44967bb53156a1c9ac1b7b05edd29a36a1c30d88ebc091683a7ad58036b6df82f629d8d83d1e3f1bbf42b2171a93f9c6c2c9bb7251b375ffc233c1e66e44e3a54129d37d316b34e46aeaad75341490b49cce7ed4505cadb992b2cf13d95b648ccaceef7ecef4b04445866dd83c7cf51f5f268263370a4baffe4e61455ecdca882ca8532843c807d90fef1cf633397108144c8bd3b3fb516b72a32cd2f2cb20801b81015498164df1af59d1495989dd0a3afef3fb5e92b4fd56fad97fc1def4476f30bd482d90ec0c40ba169f5bc438386b2109a140bb6bc56f3a593d587cbad8c831a27e111b9be769c3ec13ee90ba1b58ff01529e7696186b4fa39d8b1a88dca26890c992385f93d15de7cd223451b7c276cdec3ebd1664e4ab793455120214b0c72ea6fbc2a7d030b6c973658890fb50084aeda518793595056f7d4b32ddee00fc624aa0e0e008b73250837b886f3842046a76cd32c4334fecda31b39e75198c7b26d8da1fa9b2b6ae21ae2ff865e1f64debce9474b595a8d6bd0218af05cef8eec91977c6316d82b999215893e5cdf4063d09fa24c2eac778ee67103590109d8b2f9cb2e79b127e2836941bcd6dda4e1062f36c11e97e66818b8142fb6f583415be2b34a680d51062d66ca7bbb0980d7f8391fccaff4b720ad46af3f142480ad5fab3e3332e9b6beb9b4b57a36bf00030c75073a469ea60dc25049a3cc918be73d6ac9a56ce4126a7a92d7101fa356082bb7fc29aae738e2fb6d948c4ad8c298d98929c72a1a2f36a89bacc6f980909088f28606079350fc00f8674c8b5a41581416c718d1a82dfa8332211fbcc20a4fcc22e7eaa0c750b31b09e186fed48b1e37a7abadcf0a003d68cf4eb1fcc521dea928deed76757bcdea39d9c231e1c37d6b12d04809c9583bc4cd168e786b40d42ab05a28f91d49114adac809f5da898f48a3f6da82c4ee8ea6e14de3e4d19d31b9925dcc35798c85a6ee13e663bef3a43e9b36f09e3e6f2a7ddade58118758ffa890e7b62e7ad23fa1b0a14f3a9383d0a60a764880e4b094b01690e8e3bfad6636e4894682d755de1881714da3dd6005ea57ca7dba3fb594ee3bf6bd1b324aea1411d65f46aafe0ca6fda9f04973147b98187a7f4a92b7a345f4455bbcde4a7d36076c8482de5ea7db285ec66cd2e3730489e5e872b87afd0e71c122a4229ca7c8c3f45b9efbb578244228fb47179655b550163eccc817032fcf83aca79ff43c2b9264fc6b28662d5b0aa4aca1412aa3e8b89ceafbdbb6a7b6b35a8fe43d5a18492eb9b7a7eb0cfbdf8c236a3ecf524d03b7ecb7d146c26e2ec34b47d197f5566ef9864870c29df397150aaa9264547335806e36a46fcb1900ff8b73ce3cc2917b12bef91193f7e2cc29bc3ab1d24de7ea2249d355c8d6f270499613f976d93721bb499626df20cc5da11186b7956fd7e3dc315f4c2489e1ed5bbe6648b9b49f30f96cc92f407bb88323e3091d8ece6b427266a3d2af071912d374c8dfea912bad15b38c242ac7e041eeb76e3a4bde1521f90ee27f700089581008135623db7fd6b8a4a7c214754eda5f52fe0e8de332cfe9debd201785c9d46482cffd3fedbbfe352c6cb92d9c25f43efe3f5112fe0439be60664692901bd53a5caee76f8fa965c2a89bb1e223c562e1317216510f783ca1bbff79ff9306f954da595b45168b7baa67d8e4b6745ca57591c6078c474a010cac7101c0a705e0837d13c9d263d8762bb185123e545e4d1c86f0fb582b2f08855e764b62097364491417acb05dcf22f51a2da3710bdc242a79e3beafa8adfe6fa8ad875be57aca9c7fc8684a70ba1ede142a5470eac456254d3ae709c5f0853d99fed9e0fb01da8d5a666b54e354ffab283b3cc49202205917784e5a748c509fcf46e7c619772353cec4f0d97753492b17ee8b3dc360f8c017549a3df6e8d86db25fc0274f3461b01e3ea62eaf6424312d10f5c11af36726943d5dc08512fab8feefd0832964c0335acb1779db0157f5bb5a8ab7bc581cbc822755cd4966685608674e4e280bcda503f5f241847411fe93ddec356f7dc8308925ab44008046d3d9ad8caa9cd32b7ba599d89262d349bba5d4acd53514115772685c9b6399d4366541130c9f47e02ebbfb0535c898ba685d57eddefd1ba82ac6cbde50ae122b76f7957d916e0b64899bc7672a2c0cc8fa1c7b30d7448a4482fd6b3f638082a4997fb92577f5fa200494f1b3a1df74a21a47f4d1481230eff01b757979b90f9a7d69e3a45f12a87e8d3767dd972f5b158133f45423268729f2b2303bfa28c99a61de90bfdaf409829a662e939fec4774f9e1edf4844b6e40e0e6ec0ceef0894764e9f3c0c4adb6cc7aff643228c67bac58212785b065cbf2dc91a1917ca993a4b984eab61aa5ce7f072a5939fd67486d0cc534c04924f0c8926feacd3b8e35ecbb91626a2a112887d52de17edb77c311d0f9965d01ef9d303fec3797c386f6faab9b923452ac93a75f2144afaad3c8e4a0992b8fb4b641e7d38f192cc58cc53aec818b8711ab6ea40d4cd10f5fc13effcd75cdc0892a1e0646a49456629f12accccc0a30026b8953ee1932dd0f676ee8ecfe5943405709c878367563800bb694378bd3c799eb0efdda9f1fca4518c470c9d2501a8009744fa7f26c45b10162333bdf36a8a80236d354aad0858bda92f2cf692f4893f1cd97dfc58ae0a4117c5c920c8d10edbf9a82f49f529f7e083b04cf9b58e2ca7c44ecd71e83f4b5d0c58b7221e0890507ff94033f423ab39329b1f43a7142a9015ff46c552fea53df081b160aff4b0475b23ce9fcc441762105c39900b9207d2eaeb8ceca705992050f36bc54c5a27916114a0253b64880015795a62849e98bf30f4c211a040f850d9764f9ce4d349692342662bf6e13f34519dae884bc795b87f6f5f0ab55eda67f1f7c1b03284b46904dfdfcd2d65d0a67e967185c7d5bb9e785b0380cbd70db9a7c53608ef3941ac2a9c48965ff2eb87226e7b248a8f0e2b7783c35ba7537cb34277640827f7be7ec52ec36d2ec1d42e7d18f4754252aaaf9047e912b7a50f96814a5ba37ae18b712a28ea3fbcf034fab8636053630acfb3b532fc813c362a00f2c669aeeed5947434384cc816ceafe8914a13f289349852120336b9f5dce753c24d1ee33448eb17b4db5570da38f32054f6014aa86315a0e7fcbe08c95f9f530a8749241ea15056a974f07a7bed965f782914c263ea1505e40a8b497ee9e783105b874a455458d87791fea96985daf12a018bfd10ce5be3456e685acc4ba19d19d7ad3df907b7732b2f479afbeee7c79f14c9bb40b43774f91a00adb5d5cd4bc56574618b243d6bb1e2f01323769565e39dc7e9e49c9b0d8b5841f28cca894fb34b7fe1ef5fbdd10d2d8827fba8078eeb8523014b3283cbc89804b2599970aec8691882aec18fb943ee1cd8aa47920e3f1ec43b8110f471a80a870a7fc4ea7d8bde08df154cd393e1bba63651c99e14b0ebc3e85cc986c9429063f484870f58aa264e00b659a0dec0a6864e0e4cda6fb25ff49c2865f57cb50d2549c18769c3abfe4eeb61f0db6f829c02d3234f19042eda494c739cc27f1728d0b135d1c3c092ceb5128cdae7f9966752218d723af43c515dcda2613775493352c220a5888ef17df6ad513fc26481d9277b753b6f956a43140f3e1989943c374b75849906bd02c527c237d9b32f4108be8ed1ff93472846f5e150f43dda1aee4f24a94735e0228152e95278237747a53e40278dfa54e58f8d8d810c817e589f549e1896c576a2fd14dd15644da78255a67655b82fa02ae72e4e6c8e2ad0ea4282cedcb7092f7e92296439cc11766e3e9a3f19330188e8700f97a09aea1d4c76db61c4fd2ab499cebff04e33e43d5e6c982f79d9754b2181cbf6a8361f7596f8da342ad077e9eeeaf5d830c86ada9792cf3f07828e2a00d01ddd0741ecb7178831544f9974230986b1b094f72c18d1941421ed7de728720e24d4dee067d1b706e91a8ca6eefc11c1961d8c82bd7a6b65030ba8d7974fe542ebbcbf2aa96a408b83faad703135bcb3204c9823d3255edcee4f58e3c240e7cf6f3d6b917b0ad209d8b9b9f41fc02b9a9598fa37d9825bfee62cb18870c156ae3d99762816727a38692c7a2ad685ac79e52556083b808286a79ae2d62d2cf6ddccdd9b43ffd40f93752f702ea6c16dcf6ed4c71ea5e873ba44f8841980cac64fca1cbec1d93fb5bdc5c20a09f47f4e0553d8e01bf91435335ff23d3ca32907492af34efed800c73b755eac7f8125168010c7493c45c77409c2a4793a6db1fc9e317f1e2d4e2b83b109a9a2ff77ced8246cf9db627f4a61c0eea2213c6e2a285f470061795ad3dd6b826cedcffa3075af6f8704c49c3f5f63a98acdba2638f0c3471bee1577c4f5ae38f817dccca6ad91ffdcd426dceaca348538a68393f78a680a258b7f8090a9365cae8c10cd0bfaa92e3ab9358687121f41714d8b671ddbd51be6ff94e6cc240c3b3356678eb288a6bb10202d919d3d45df61f3b846aabc583f3d06b686961237b7aaf2a22853baaffead80744f9c155a60d60d66f771f3edf42d4e9b39561d0fd74475abd84224277ce3e3ffc86bca0ef9862ee3aefc6b36d3f95c4bcf4860238db3f4dac6f8f8ea925d4728484c5aa2feb42f22aafbc801a5d083c5dc5f0715aaf8400ad6a9e238953472e9d0f6c9ead8c76ca1f24de3ea6455b003a3d166ae3e4f03710fc532461c91fd55c561fd75bdba3139adbd1ad502d40b7b14b28cd4a47d05d3257aae7d3ac87b1a9985ba65cb7d53ec8acde99687995943d6bb80a2ba09df6b94750de4efc109593be4e4c845d0c7e8f8562206636e50095662afb741458b4fc5eac881b760e3b2333b57a3b0fb50216f038daa4174ccf69ece6a2d6f66109ef344a34a733c28c3a4d518e1e747002a4915734ee19976c6f4f7d99bdfe81b4fec6ce32b404493cf46b29b903f9dbd36743c45ec37dfd5d5dcb98475280f4681712d75350ef749a2a292bdac628e962f188371e30ac358e3d21a770361616f671c86f816367277068f8541c6da4b22bec556add8e1a277c63b9e6dc7718b342232fd3cec7e3611722002c701c1aa5715a25308efc37688fc5dc4919aaa0d02ee6894ebc2f4ff93970dff75550d787a53eab7041da26e18a23687453d35d60a7a8e580a3fcf198236997202d6b651b01ed3bdda0663f75e7c50a584559b09c5665f5590f62c682ec8beacdbb85e222f4e644322c6ab49dff25cee2da5e53bd6355298e6d88065afa453629f05bb02a151e370cff157c4721bc4fb772262e92027c72d98d9c4b8c82bf17d06012ecf55c388905a8a071e805cb1311122dec2c3bc509052da30f9658d49b8fd66990fb0d5531213d48c823729b0e2416531e72c205c6c23ddc76d0fb38174c37eb4c29fb9dbec2cc0147583f0ecb126a1721c1bd2bbf51ef17479712155c9fbece6789dab37da11a7d12c2bf47342542d72a9a5d698b7cceb81774396ec83f6cb583992bd511ff011a802348f4ed943ad76a9e8c208c8a934695a8f0eea50cdc2ef797e627a8755c648fb90c421f1e887b40cc022cea06d7af24014c31f5eb881b97b10428df9bc7e255f684d69e73478f921478fbae98cd0c06c09d1b45e747314cd4b03842a239728a33c08e96f36d0e0e34a2c4a8f32119d995ca5352ab100e23c62dbf57ebf3c34ab7b0285252d7a10dae2c308cb8303ab613adf85fe075a5aa9f3d8c3a27defa17233ac336bbfa0293a94a4febbb8781ed2af4e81a2527cb5dfedb7ea3e49f32558664fbc671c63e30c1038c4a2e4af846b9e7672c3bec87ad39b88c50a0b38f08239ba38f1cdc61c945fb51dcded9dd99fc2d00fa7316e95128c8332204c51b4fe95b87aba2f58c8981ba1720dc8ca7975183873720a7d674e59b455326765c7cc54e12ee9bd4e959f5886381985c08facc4440bba490cae296b8ae106c353562b58ce5a5bd7fb1d078a1b4fd379fe655b819844e37ce4a29de4364be28691ec5f0cc6d817a9974a39c615ce41debbf6257c2f487787734bf87670a71e7dbd90855cbd59e1377e0490db726aa22cea48a6d2a85cd488f4858c739201528e4cdbb2244af9faa2785b801f3b1176371bc7867a625da670f916efe8a6401280341615f65982b4701d32635b8b3ca045d97c07a82cf3cc7802a1e5026e8b5748188440204d6dcc81336c772ab47dd3a1cd479f12fd1ea71f0b9e02031cf6499229c0764fbbfeccf7850c065d00e3ccbdb83495228cf41ee16df5819e58f2fee4e121fd1dd68c2c39e7cbb1fcbb1a8f7d7347baa7fea541dc7409092c9bc149c08d304ab7807f7e6cf04ef15aae7b6e9726019341ac70aa2b77674c923c31eaa16d49159ddd1f7635ba2b595a6dc8ecdb80798bd385747a66b8adfa7a7743d37038bb2863dc234b838f6e3265ac990d408dfce84ee2f55d983ed6af4c2f1538d6af1a7ed21ef38cf2632e5217464ee508c27afe234533e654bc7f9fc2ebad5a5370c10505cde57e12ae735d647d27e7568fbf9c744dee4f3519767f57dbc46a74579a1db5a330504f77a41b7f23c6915a085785cc32f259ae12b61eec2b5e957cb5dafc01bb6b24414094ab0b176cbd3e4a6a3dac7affce516e6898036dd2881edc3f7e05b849a288352c7becf846f621e8bbad67be1f86dd9a899c18e67f0ef770587fac4b368838e6f79e1b59e2acb520e79d194370f64eb358cab28fc16937dd920f1a61a3ec75d0279c9b1a07288088af63c4ac2bf17d73d44a17f508a515fbd6f384689dfcf5739460bfd8a4454f2a678b37e6037db9173ad876c995018ba44f21eb4c0f354cbf567c4073f5a971d62069bcd352e8e8e706842ee69de92281be2859998e8927ece439700c644693569055b3ddc136659996c71b3d2840437f09662cc70596b2aab8ffe45bd10c4a005964b34ad475055808accad3d73760db47f317bfa22e2ce0cc16679cfac661ac7613f2a855d394ec593aa9881be146a725d0516570c6b0769aa1bbd10cc8c8889ab3f015e75077035a8a6f4da8178c8d72308f9ab9dc94c15f32fd890a0d6460441c74da1ebebd1bde0fa8381064998e5fd691c2b93d19317d4d49c09ea390fbe960de66a998ff6ef4025fc9d1a1ea8d369e75634cd1f00a2354a698a0579edd58d59089d675d783dc1c23828f9c60dfdfb8fc3a267f705d5e6c256f5a3ce7e272a4b09a96001a02fc9d9a8d2460ee4f9700dd7cef281d8ae101ac1ee6e42aa2cfc0a30c30aaf5aa2a6d6a40ff64563ca7b725e0fd779431aa5391461be01f07276dbcea86b4098a9bf8568c72e76949e2cda0acfb95f888cb679adfafa1389634e2477599041e57ec031b758ab86d005d03363732a6d3a953a5d9d130eda88d370d999c76e6ad110f4bd384f3d9401e3f311a98c47168dd1d9fd6da7f2f47b1374b78951f9aacd93db0f4ea516c83d200abdef34aa0243b6e8e8294d3c577bc5914d35d765a0927df59e660e01a27ac07cd8823c1b562b4f2994c2e6c329cf8701d4eeb13adcda84fed6cb724f0a3c75683e7b6a61680d6153c771d42c2a8aaf6ea72ed167bcdafd31c7ab45cb18fe0768ade116b65f4dc7252eb7177d99af25c8d176c431e7b04d2da33c4f3ec7c5a97b227ef632d2eda9aa70fe1923b7c0b21b5acc340f1fc74aa8cb3e069cb18479ab9c29fd10db1b41af1e85ccad80852a93f266cfe62e73e640440e1422bc9887a3ac5cdab680010e3454e77c8c30fa297440a11fdc0031f5218d2acd09d9c9b4bc9448265703106a35d47ca2c17bf6291ff0b1f8c1de43849d6b6a671114e0892d519e752ada3cb58a91a18f944d5d0fc2284abe2633e4f28e90e961ebf5fabc6144161d700d7dcecce02d8337461af915a43c3434f329f2b1bd7a374da91315942e1fa8c8b6c90c1ca41a8b18aba9e51c86605af60eab915e8934f67b79e1632329be7160d2123cced83c4edfa6590fc6206af55cfdf82bebd0c7f2b838d3b3f0fff39302fc0d8f335c4c48cd6c86ea19f39d1ad167786675c88bf919dc79d33a785537a545127b4c4750527d6e86fe6bd06832afc516c73f77c54cebde15bb68a44eaa0251dfb84053d4c7c7b1b51ac3d2d693c30e7b283b2a09960a1f691fdcfcfa869e8fdc12906f1150e6ae0ee8037340c9bd9605e0c44ccfb29a160dd0e04acf4b65c66656f1841f4bf10abb9b6cac3bc69f7e34c2b21e9f21ba9851e5b5e9c21869dbfdbc6790a3455ec709474f2e2b34341e2bfe11bf56589534cc266eb3c4ae5e40fb8d0651558cd6a4cb11fb3c68ae38afede8d5e4b5682ba823b71d561eb49f5c1a3599bc63c4356eec55b69f9cc93c70d543f5b35ba21af8b36a6bc8ce3404d73285798d0e2472b725733a0ecf23de4a8f2be2cc3916c762d211e43ec2351b996306c0e64e2f0a4e857a49812855c62ea45a254bdaef72410a170ed2abe64f835d9203dfaa1bc99b24832a0c1946ae301924367198e8370e589f0d456be67e04f16a643d65e3e5ebdb446c26893b387a79c7aac3cf1792f63cd8a1f1df938608da564fe33c6bcd81b48ba5abcc47af71a938b2506fd19a9ba0e0442f09cd8beb0175bef0240aebffa4965c6fab57094416dfa11a37f323c8821ff42c5e3ecfcbba964733580bc6721c3ebddfd16cd9096f0ebe13609bb2519d6f8e6cf98653b161d761f3c4003cfad70beb68c2784f2361cfbf2d80212e60b66190ad001b18d1d8394de840157502e1eb0632ca1b4cef5fdb74a63b133f7be78581b25aef9428710e87804c6080480b58728ea369c4106d1ad9c6b0d3d5fcf56c8c17e318a18c0c1b030056a8dec012b967459f176b8f6c128f63c210b5ece01105ca2e3322f9b8118daa07ec0f7f47f1942fac22566b50909d5f4c2214341e495334575a77c0483c45d73189eb6a803a48f4f7620e6291f27f22f9eb67f6139b0dab18be6a89cb2e2753cab45ab062fa2a78780422536db52a05a42dd4f2e52c13f16b28808c230924a2fc8f626cdd6f3a17834a72b860bfb08879cf4b5bf52cc7e34630a3e338b054d3f835dfdc244f845fc2af6e0309b6250567e28d830a8c3c84bf323bf92e62a9e73e7ead4a2ed9cefdf0e76a38c3c3b2053f02a322e04f13ae2da123987d7b7b7e4250ca1868604a6047b448cc28bfd62d22c4c254a60f646d7d449a39fc13de875ee068ef25b283612f11811b1f7e8b0b7f94e24595678a59f6d2d5b2e4787f0648e1d8c95c535ea96e66d8c6ea5a1e373b6f108c1f205fa46a5844fe67d3647fb1792655955acd6f4d241f2ad7222932c57a5e336a492b92c81d8dc2e29ccebfb39fd849c288e98177e0bb7680818c44641996841bba8ffc23807773cf1f997fc615b861fd4d0db30492c33e3d07948471af13b487583b782ba9254f6b6d07d7733a2d947859538734a6492579321628874198e6161644f474f9f86fe57234b020f1ce6164c19128988c1bda8ed63b62285febd39ed46e01b304378beb19e2e1fa3f9bb578f0d936509ba7fda3c63a5299432c23dc6be3e893e676aca73f7b9f6fdc312b768908539e4a8f6a5449543d1aca300f697fede9551adb4e07ac4976f08c4878f44b46078e4a8470e2e2fde11923355ccff37ddfa9840dcf23fe447efb70bbd0d8c8df9be0ac0ca28a4a3144d375def8c58571a2d40a91f16f7b67b8bc7dc830ea0979e4cef60080992b981e6e1e5d9a32be1c80c2ad4ae8dba55dc816d23852f24ae738abb1f2e53aed2c52f4f05914523969f270afa25f9869254efe470853ebd9468688f405b95edb2ffca17f887fc3565981abcdd55887592536d846067b2c5af0c87473e89020b16110f27b788dec5d956b2114d2036316be3f31b486e8b6b205751e861c0afb4bfb11f0732f592cceb1e6ed677bcb16a58e488fc7959c55a302bf66a0f1d99ba659ee5dca150cbebcbf0d429d5bfe4641c10b0fcdf0a1bcfbc6cc53309d8786324751d2fb7251b59d8eec5adbfc09b3c9246b23c9c85a0b9f6aaae9aa321b078ca6fb82290d14ba2b02dc250d38b46d9ca0f34fdec9609e7ddddbc74474ee5c383ecc916df0989f4b8f7ad8bbe065bda8e72bce778137451d9fc61873f205d9d353448cdc40d02404827670c18e2ed05768dc393ed52a497a3638abc8714358e7b4000bcb1a77ea91e3761113a9a552396413cd3f663192fc4ed407bf618c05bf2b3538814b40708193703f2d994d802b5cfa5f07208133c63bcbf3d37d4d0d70d6256097bf58f4c98fad442918fc106a4e8dffb58b8bc2e81bf5e744c07858e40e689bd71dc14f4a10d2818f201951182c4a348148ee85b4972c3da5ea84121427fcdef2d72fabb5b7a0b6d9dc69d4491cce4fd44a08af745a14be98694cbefdd2d0a308688d77c087cce6648d8cbb5628bdf6519315da72af4a8da9bb90cd1215bfed3c13b9c122831ca0638e2712bc218878d97ef97fce4b9c3adde272d0631bef921534d720b59cf49033548e6c08e4bc5c855bb21966815be7810d725dc8661338b3aa7c90b75ee2bca2fd32dad5ad7f1d1224206ae0d89b37651c4d3ab3169cfaae9c7f3b0ab867c127886cd33770b3dd8500a0026f7fec1950c3699d1fcae0277ea57a5d89960dd325bd7fbbf3774bd0d0b1681fbacadee6733cb45028ed6c9ace2d7c9d5f6fc70741f1c178175c85f3c58caab6f85d3e0891d13f366a22d7453b2474164f0fb5471eb8d468031288865c18b90120c4d9eb48f69b2260f704f60a8357b2695910650fa76f3fe62e5b5905a890ea85c521b9f675c2fcb3dfddc8e06df8c87285568c7b1fbcfad2c4ed7b1908f4469ae1146beddc4667a5336dfa033b891dea56c45dce1aa8cd3cc349843c5d574c75633747fc82869422aa50ffbaa57c16ff15e8b4a7796b0d0bb52ecdb3420f98687721f920c35841499272866395c776c7c5381b841f3ac20cbe53fc935b73ca23e1bba54f3823e50355016d48fa40ed51eda64e4e73d906445dbf163d3e49b8870c8eedfa9fc7b0558c090a946a270875ddc6ac1e54a66f000165383c92d5cb1a78eff34a3c3cbf2d32d796293a49e105976f7092299124cdcb16309c42e781f7498e1c20059e5c0aaf70438192955b27c6f2b136518d6248b5bc858f9e06dce2b2c8d231e915b6f72f90734179d9ac12953c6119804d2f39d302a9ee069fe2864054ee0105dd4bd06d776a3ca870c549e8868ba650beef77c8eb744d786bede1172c86851412b9a2bd27b4f398524bac596784b6e9f7d858b4943c53f2ab274c6ba22b3ae26e2e40a7b774776c722dd97330bc0038a72a35210967d465876146edafa60b46b782f6c252f8eeed8ea363333f685f5ed98de89bd9a44309345ada1351b8595040c16b45c27715727dd8b00ac013e8e78498a94354f692c4c23e6d9783c513573dee19e0606593b78648d37222a3da06fe358018480b6dffda9fa08c072e9b0f7674c2b349969edbe620429e2080a8fb4e28770df14ce157467d7e645d4ad2deb7b778047b0a23b494c137934714b7a66a5e114d1772e0dece35bb7009bef89ad69f198b6b75bf98c41e793248e95f60d2f24e4b0d23cc256ae4a43a252a408a408e16f3fcb31550140d4c6e290dea3b1d9d08845f4c544853093e31fd299cdaf98d188f27067fccfd8ddf3f1bc9e5526a6c97b609045e76c2d1af499d43e283519ce27eb5c476018027fd606ae9ea61efa6b3cc318082c57dc39d42b9368513f2ca6d76efc2f2cfec586835146e505851b9968022472c3c55ba73679c5c59791f9e810f972ddb0e923807cd74fd14c3b86082f291ec5bae52505e0074dcba27d9a6819faa1493a7579149e7f005c12e7d06ffb67ffe86a66e4fa4f819fa18fbc0") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_256f_test.go b/ref/params/tests/vector_sphincs_haraka_256f_test.go new file mode 100644 index 0000000..fa4e332 --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_256f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_256f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("fa67814e0c31ac27fd00e15166f16dfe921cab6693465f3b0cf34ddcc5e526977470d2272d1d2d9b4a1553a114622c4e766a381afe095893415ba4d6627c6abd36fe1768fe84bc0d19addac3e433e32bd04344ec5bf7de48501d82aa24885e990534bffeb6f9ef2f8bc67c35e907217bc36cc2bbda4aac2ae4833dad3a59c493") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("36fe1768fe84bc0d19addac3e433e32bd04344ec5bf7de48501d82aa24885e990534bffeb6f9ef2f8bc67c35e907217bc36cc2bbda4aac2ae4833dad3a59c493") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("7bc2b07c74eb2f986b1421104cef4692ed661f26e7a4c4bb9b7a7c5c7c251aa0f573427be45abb42edcb022b07307f723bfd455c06c91aa34a82c530f768e440f5b960e6828291f440d5410c447b84e1365d53b37169214a627906ef1c6fcfdf221f6b163e7ba7698e08ec85d5be16c84184352d27b1685949b447072c364d3ca7b9ed3074a83f91c085406714df3f474041064907061d634f7cea418b95b91194b3a00fd88345bd76900ce158e21e76b894c6d02a2b219c6a9e935f7ccd8aacaa5c4ed6cef3279852281db2132554e96a9c7e5eb595d9784f4a909e41df2915f1108560624ffed425f10c657d0b52f75986d894ddd8f2914378640b8b817cf6b75cf48dec6bdb9bded40e9efd350d41dac0b74460a5dab552c28a994e8c10172d990ce882e39e2d0d3de127ab0e7f1456a23b9a7ca0092684f873553825b60a313c1d0589bc4660187be1d3dd67411a3380df3cf52b1e48912e8f45651f4b9fd6bfd94ac507e13362f1369197ba622980ae4af9f1fa3cc4aad703711b6de76e7a3b69b1831bc746f4b4f88c9b5d701d3c9664bd246494f94c80f70ad7856a989b3e80a7eb4c12cc2b1afcff3aea00cbaf9c2a49689592f31943213dd905413de446f5caa7133819d2fd919fafe76b877068f6a4cd7332a2ff89350f4eff108b0e03ae9993868c791096c5a64c47ac53bb401a830473f9f4f08042586bbdc4048f61e2390055a60f37d81c42274f18bdc34eae43a04cfcd7ad45a2c342318a802d6887c47fad847b6ff01bbacde46f608d2cf7dc37a91bc92246dc981a27b07a788d5ed4f599c1509922ea73cb9682a277c3fb585f98f12db29d0d8c8e7e3e811a422c370fbef3e9067640d31e1e3bcbb9c80465654d2af00adf2d55f3427685f0626a618b5e5b1fb8d836e9e2df6fb14947c7575df9d20703382cc616ba6d9751100ef48127e4b98065e9d38622bc4c7bde44d231274f4380f61711dc349346a45ba870478bd801b682348349e32bcca435d6b04d972f45ff4f7831ba24b7ef3299820a13fd5d31aee35cbc84ce7d7e21428e4dc164657290f700234312ae77bed2c06290208bc6ebb40ff0e2c0dd84fd0d8159b9c341b4aecaed8874a8ef787b33b41c9a629dfa0bbcbbd1c3e9c80619276c16755a47743f99ea58a489bda52ae2450cbd4cd3e2224ac52480b0e354c8f2a4a574a967904f6736db23453ffa6f216bd8f6416aa208701a2ebeaeb530d041f98a54890a07ca412c20cadb9c36bfcdc7e2cdeee0334c7c625ee11ad56f993aeb6c8faba8044f0959c4f4d68c3dabdef3ddf48720854419ceb00a893551b5bec2f570d97c90dad62d35787449ed6ac23f778617fbdd14c1a409505016a7c29bfbb6ed4179fb595df41839e477b7cfdd02bdeb7fd375014404639d5ab033f5773e7db6bb53417d79f39a4a9f37c98bc4d581a8ef90e53ef4a415320444cd289833a1f50e247a11e80f527bdb3b32b64a3a507a27eff5a86894cda34724473c5f00be1febe86270d3b96cc97f3d7c96fb788fc478bbbd171778d45ab932132bf5de8c8a171f1a7d9903ebec103894cf4a6653aa5283b324404a6a545596b7d3c62428b998de29ba8882189aaedddb91265705978730c6950a7172105acd7db5f7c690d1bf68daabfdb1761c6884d9cf23dd994b899dcdf25525cbd18c43cf2940e05672f9a1d40cd914e5ad906b24171a48e5b92e365ac427182a1faa55604996e9a50b93be1dc05e0440550078bb9bbb389cc44db2cd633ca9d4e47d403ed5bd1b849b4d705016abf3bcf07680e59dd09ec2db6c95fabd21a360c98d42f1e09db042673ef7f449820edb2028f3ad521f0d5fe25a3e9e17abcde54318368519113eb26b53b88adbd8eb829981efe2aeee8513ed3affc4f5fcc65a5b46cf5ecbbe2196bd9c8c64ec3216b59faed794fa51ac478c2475dc59622ce99b41ab90725b13f371e9b2b58913b6f35fa8cf57a1a22458bd126abae07fe88d11216e83867512ff91633857a5a3e529b0adc45a38568f8b33089d38472ac97e52c2653515b3bf2f180a6604e0d0e2e1ec5c576125b58a7ffc1ee3e20a953cbbd1e22068c6aa1035f6542bcaaa4b5bde55e663063dd4a8b60c1e0805315835db6b183437942947af91140349dfe6fa53434aecd49b125cf11455072057b36859fae94d736a7c474fd80c0d02a51086bd9fc7209fd42e9dd19ab3431b861aecb48e2bed7c6c58c80a1a683fc90fcc66feaf03002abcc562a026ae78da418c2f0b89d9c47c5bcb37164d8dcc66c4e3b101e34f6bb6cb2f0b24f114e2b91f6c52379d1621f560be34f285f7aae84cabbbe1149302f11e16396abbf8a4742940578f9fb554f9414c27a377209f72c6c23693498a08885616b279dc2f4df3d77c1891d95390330d1706f6034fa064595ebe99a717aecacd58dd12344a0c82914d3fe80ba908684a2f1e1620a5c8d8ed0cc4a00e9a6f43e443ec40a68bc88abb0c286a1439b2e6100275b6b02b463ebf478e863f18c27145b0ff2b3259609190180a580e3efaec5372fcfc1b5463d2227c31e231b9df1a659980f3600bd293f136a1f2b31a19fa1cf825d3afe73871b7790ce22e7fc296363a5914d66f247b6a7f7b9297ffa72b37b71e0dc191174ef69ba6c7d6b859d5f55c9fde21e03f02c396136d698fc453ab25b38d2d5a220dbfd4f995d5312eb1e879bf6812ad66a04d8529e197a8f45463f5eac4dcabd81b71f04b69447cfea74dba07c5767f7a08d93a8e0bca96050d754fe606e8cbbdb654b7a9cf3848ba942f51afd2691d362b0324d9d18066ee66e2ca53af84251c9f418369d6ea57c2ad65aa00fbbb828e4c115b3232832a187203d66ba77244e72fd51afe1b0aec0460d5e3d6a1cd17dc1fd7bc2b63221fb0fc34678dc757676f99716d8fdc6246c18b1b3f715dcc80dda93ce8532f1cc386334780f7336330349630c9f5d19e920b3bbc64ae0c7be2de114bce1ddcdab9a0830e53f30c86d5f01c3f19170380cd549fb34e44e19e3d2b9b66141222419ccbbbf01f1aaad891efb852a3977cb15f7f50acf7a812db8db0fd389583df10319f22d25939382279468e73779259fe23c8f897a6f3a9f6c17984fafae7caf3c2618df7031f660be32af663a4e83fd5694fde488e81b2401bee570eaceedad2d49ec77f8737c4fce6a598c6102dd65f511c970656a9cea7f49ac7b9963fdce7840ade9ed0be31bbe270e8c4b38cba14764fafa3243044b59f2e61fa5c18ed48a3a1de2c36ddf83d659b3aacd9085b5b7cd1c6f215b92ef98a0c0d04f81ff9e044fd43c0e16933a6bb1f8f79f243425d27ec4525b998b9a59843e30cd46366fa9aaf1596dcfcf0fab4abd22cc7f662916c25782825480de681d8c7b97f8346fca1b86e5db763c9a1bad28e184a09cd6f232b818bd854cc70275aeee702b7f8fbc72066c33f7cfa68f50030a368d882c4f596cdda3df7c0c9a420a11525400f7cb552106d2ec64a657907b1c64a5d50f2ef8ceea9b611bc8cb056a9f8aadef126da9cb3988d97b8ce09443e02c44526775f1730ea79aff6f4ef4885af5300a20abb468031ac66401fe972b74bfad3da4c453a9a120c9da4c42ddc263fe10cb7b2fda148e36ab52d8c6f492e9dcb97c5e97f5971629a2a9ddb57c633f5ccd17a753999c343d72ab24863fa373534d1ef60d9e3a1b5b391e4b346947c3c77356c88e01ee67c67311da3567b4bb6f69d1a1cb3fadfa04045cfe463d9af47738051e1525b16089ff1ae5c5eabcac0e7c2e23458f2c536cfaebbe51b32f618331411c183223b4c0349a64a55d2af75cb3360abf36d1c0ef752618dc245a49c3387c431d05bebfb9ef6aa668b845fe7ed4dbe41f327eb7bd9a2d1d52b6887b704bffdc6aa3f9ccdebb162e9a1a4b1aaae7b41fc9de6941dbe4f9ae38d8b2d879fc51f37c9f60d158c940074aee459ba17cd70ba452f88b70a963a3e6a772b40d147c9f52a745aa17bd2b24cab5087ad2057734e33e92ec055d97cd58154d2ce48a0b6270c0c7c509cc9fc63783475fa870dada953948c3acfe286ac1549791f79c2fb16a4ab65ea8c40beb79d1db025e5cafe61843ac875f53a4e0f8170fe7544200e6df802aabf2bdc079bb6ced49f3e7e80a8cb35efdad49db1e59868e1a067e76251fc1561adf6a4d85a28475153b0069b0cbcdbb3f53ec82340386f967a9ab3a6abf0511246487f7b676931b11d680d061398cc6bcb0bcd62fc8d108b61fe602cb31cec2e53c369f0525399bb5243d5c544b44786b4eaa59f460b6a12d056b01df91e189a73984762640c7129fc9c37b951a29145a0213b0a6d8a8cb7047a3567d6b8a2fdf42a2e9c3f822a8404647b99f4c9ee99078b705d7f7285b81f3e2bbc42254ec16cdea90043a24598f926d77f4261027234f600e0093458c6919739978304bb3ff30760e63d40dbaa858e8d1526865f645689b9eac6b5a396b18fb46ef5b46d1c30cf3b870adfd91d9d62459efb4df53a7ff7060f0d48f7605189b22ebb3cb2e06c13f8420cb1e4d140bac3147b0d70d297b1b91a5c2dc19e1a287ff1a8408f5f8c76078572e9c43f080b4d718517baceed7cfb5b2517de487527a0cf9e691ed6a535643e2656db0e0f5b76ee6916ab0b31e668d74fcba086d9109b319b44d3f4b799ad9f1bda4fba1858fb230ef6cd9a9c38f3725d1dd9c71b5429f400336e4d6d6f673153f237c57b16eb7b7b621afa726c1172a4f619291c64ad10ca2e2fb7de77eb2b20daef383d412743b9700f4fcb320730f252d8a5af5a8a0460075e98fb94f26343c3c3e97c809d5ed84fd94098fa33847198e83ee8dda06fc6493dc9614f8746b2081ec0fff5c485ee08cc337269bd6a9ea075b2ad61b609874426a33972724e2ea53733464a65f8fbd1aca9abcc5ad65ed0dac312252f8b75d49c914b1fbc31c38d2dc02b54b080125d2457f82b02b4f1f171ab59fc2509e44690a560043ddd69ae7c8f8d8ca5977348849fb537e7ccb98b965381fa5b69f1f2d126951f9c022107ea48abe736f5c3d3fb85825a7d85cb812bab4a2fcde54538c8a75c6f8c43459f964eb66cb3fe6fdfc77c4fb42f27d1ec65ef6986c2e4682915d0f78175adce610994975f8fde75735554c180682b7118a16c1dd27c33862332a5e9b540b04f360c160441401ef19c47bd7138a3109d6b52fdb40ab953f933bfaf203152346890c56f2e4d34fb37c636f43c36b4cc82c36069aef3d6eb4e7f5cfe5a7a7c4c56c35770c8a5fb89c4f5994dea752ed77b85a015310bab0fc470118c4d3a92384977c5422ec6134f19009242e452bae6b1ed51a7cb593b49a375b3aa6237b30ec68f5ab0f8c1ef88fdc869d73493f5ab4fa1e1c5981f0317ac361ad0b7dee4236f75c29dc19b34bd92102708a09fffc68249beec12c639f0f078369581fdede7653b626c9122955b2c7c4295165a92bbc1f2eda018e59eade9c22043ec500d1240cfd50280c526d8df33cbf1957fb5774e261ee15b5e3948078c5c29001a3e54b4dfb32e61a73f8712f918dc50bfe0a41df96903952adbd4354404e8914a8e44d41cbe070d5058e3bf9111570694b312b6fc460c22a2c9735fda51793899b3d4cbfecd00afcb841266663b944bb8200bc66040e7e780edab09c3f4cba8b1b4c1ca94ab62659d6b5eea851e36e018809576cd609e21c730cc4049c62eabdad1b4a764878ca3e825f6fd2a779aa3e8a5c117adda94f7c49c2dbbecfd214875b243683ff336f2cc154b43a09bd275b5d4eeebb0ee347dc77e04ddf9f9268c4380991fe6396581abda4da98c223e4c7c872b7c6c6819b6bfa8de1d81f65bf874732d3f50c9b111f40956390f8013d7abaaa34db023f3f75ed895a171a886d347672013ccc1d7e6b4e74cc5020e32fd04d9b353db8155acb61177e285573bc834f660152e72472d275a292629e7d5df91cbdf81feeb39cb007d60601b3566fb1a9fd1371d3993f9e0f12f237cd868f7fd8e1fbddabbce872dfc92c04e5aec9effdc22e102c7b8f9d5d68035c012fe6f90541e4aa6e205acf837ee5a03a79f99588d72c46c5581686d681856954062a61ee6b308ff49440a0ec3879941d9c839fea758b900d99d18d9844e85320e2ebaf1e8b50ab24697d4d530c471aa4f5cbcd48311d3d4f28ef935e55467c911522b674d19f630c3733619e14b1da9328ec451e076556dcb194b5dc849c6ef3cd2e06ff8db050a4839350e296c739a23cdeedf16eed63cbfa31e277ff35de526122bbb46f34bd3013d110d733571456d566b221889b25c689b4e59a02c24af8d693954d988614ae9be2f4e142d7e3ec9929ca68973883db8ef2992201a5e5438facfb39d51a521e7775e781847dddcda6271d569c724161a36f556a5d1f3868b53885aeb8fbba5adc213b23d98b6d74806a037890ad7c9d5760c80d1a22879f83c1e108f288dc4e40012b38ac7402952c0882cfdd21a8d3d7daefbb49b39d84cfd2ec5f8942bc7f93222cc034188e5f58a73b91599745b608b6404152550b4925bbba48c251fbfd708e27a2fa32e6f637717175532af034a5f0734ca4e0c2983e3c48391b2d3ce702a20a635afa78fe1dcf3ae0ef5e09259b78dd6250ab6bcf6ba071958fb62ed24091524c1bccf588d95691ec54335facd3ccf0c6ccd09ac04877e167bac128dd839a69579f9c614ce0690dc373a6e662592c7595c72dc97c9d235ca2625671a7d2b68081514d758880360dc2293706aa1373609ee75ead44a173f7c22dea09114c100071c83d2c650958370f2daf0709e9d96e23213eeb34afa6b341482d80680522e5f95bae5bca266446cde408c2a633f89516938605e1b580938fca7c119cc5d1095826c46d448774eeebfdc3643a599b9c9ffd76ce3c53e07ce6eedec7e767c4583f725a3e7bc245e124b3cb34b4fe1e059580e4a6a7d150c1b01b32062f03a5c0591446a0b156e369ce83c825709435d70742daec52192bc21ccd2319857cac4193332b20cd01324fce18aca582955c8028509a5ee82ac32660448cfb1a0da8bc4244a1b05e4ff135f972f6c61d439e7cfa8f3d57239fabf4005e820d2db161c5d522c47ce50631d0e01868b649c28445b28ca62fa7d1edcc9ad841397ab90cc173cab78b2ad928acaedf9600ffb6c073b76fd4583b54264942133a3d594ad07edb41dbd5cfacc2e49a5c5dfc869f93a50d749aaa0a9f99a60a66240760f52ee526fbcfc6ad80d690a8dc7952c21e604480c88aa5cd1f3b1759327c4c989537fe06ffb17a0a3ceff3fc5e33787f23ce721c5fc114e488b14a52ab0c6384ba7d26b30673b8ac160d5509a2d598b950e59ec95a79d8b261dc020270b76ca5898c544d7b8cfdc1e166f798448a7951cb5da1fdd883d114558e0c46741eea58d371e107e942b2941e3b5d69a24ddc9239b533831e1caf0af4625240e3350774f73741b442a6d12c8ce3411d1b8fbbdf2c96bf653e3e857bec444ba94b5987407b6e8d434456d181c26a459a6c9a00e74188213d49ae59cd395bc7721de86eae9128ee228fb86f19c7641db305dcdbdb9579c8884c1cea13910eb0199723617077c82fc28a7c070de69075ee0fb902c676f7665f577de60a1afa32852c4a6bbf0a37731e3fcbf32b288dc2a33462e68b6211776c97ccc6291b264da8d1a6f6c0a0f12fada382f787484b15ee0618586be96d0e6ce61986471b787cbc03de3e1b67ba0c00d433cc3aceb947ebd22bffc96ebe9e30c8e82bb242fc108be8930bbe11da52424edcea7b01e9deef98f84a0c8fd973ebbb1ee23ecf53a5fbd3f13cdaf0787777ab218a1cb65f01410b89bd7c51bb7fbe7628332d19e8f393e0a096035cf75d6b4c89e00d59c4e74ca123776ad9f627815302c568cfde2ca705f23e23bd1a6cfba0a9f39d874dc593b5396ca9ae9af97e95f677ccb6573c78f1fd577e81b70f4a8e3601d42eb90480c9f342002d6cd6be4b66de14e3c058d22aaa512bbcdd4a5cac78729638a7354c824890b2d12669ce30bac8825562c9425722ae69c7402f33dbbb92270f60b029e06858fb216bcb9d6903cd3195621e5aa61c47a7fdca310a3bdf131fb1210f0b5864e580b23ed2764aaa4f9227b1203ff847d346ec5887f436193851d002fcf33d6a25cc70f965ffb8330e7b370c96562de87625c044ee941b88436bbda41fb18d8376b7e681a2342e0b243c32217761ab6eafd5725cb051536a9e6fbea29a601ac103d64365a450dc44b54dad6a1d90cc5fa460671e4e7277f188cb5d109de286919162722f19589b6a6959b7690692df963aee72acfa4b9837e32425309b20484ddf74878545abe448975e2d2a2ca7a6f210f04249f86d80010718945a35787dbc57e2caf87db3a402b72cd12258b436e9e9362159562d37d67b6e78f8bcbe64db03e984baeb6811c0b43e3345c9e74767fd08bc4f3b14f9ffc419aac66c704497dbe75f67abc430ba99081c894355f1c531ad18ba801dab5c05afc461111d00ae0eea2dde87bb397424bf8382effe7ef4225164f5ded5d2d30f70dea33301fd11e05a6a3bf08cc82f7b088fa37e17670193af39d9677a6c1b5063f18272cb3ef5097cc8370a0e92ff654187a1a7f4cc2f2dfa410824ff17319a66be140545e525c7e6a3d0d46932518efec29e19513cbd18a8ecaecc353576f43e522245a1e449271dd64c7841e1eac2483d7cf494a95226a201b7b57d30e7906f8a1238c9ddce74a0bfec32f7b73a1b256e77d1e8aa48c6012a0f5fdec1399316dae9e29cb5a1959cadc9ac485f67e5225351a9d06140e1ff9cd0688c93c2c2fe00ca830a88a267630307b7119466ecaf87a79335b82c16428edab89002e98843f61640d191ea14ad32e538b2b1294e1a578c054684d7e0a809c466b2cde5fc03cba7613afd9cc1b4317cac58c79f3df1e5df8fcc41ffe1f5168d1e60ca53bec571b5aba3e3c9bf0953a5a0e72b3d9674b8700b54410ddcced8fc6d4824dec563d8c1e6548fd8d3a986a39513f3bf0837ed012cc9cf6c683be7f8db6a08b83b198b41e6dbfdaa138cf7794328631b47183399a6173ead515bf4452b6b602e007f71601fcae4b2d7b1fb3b3500f5bc1f74c0cd3f82b6608f0eccf8adbd4a8538f13873daf6a78e42350628b7ccb84a6eed9793e74e4a505902cc44aea24ab15a89afbee8d308ffee5a83b7aeeee94a0a93bf3144527e148631f99ddb55b128ce15dc71b7ce612281c73ec9ae8bf03e0cec68c633b436884ee3590d4d74825f80ac4c814b22ed6b2741d0c7e53918fc6ac0893257dc6076ee857c0a771e03da118bb6cfba8381cad5db11d9a0b3eacdb1ab8b793e5c019777cbdf7b8f153bee4d420a2e3a3a23b7e11a6190e04e6679c2c1e7e4163cf70137be53ca2f57b066dc5ea263b0e740601fb0ae587545257b985a16c42654cdcbb8611b74bca6e30dc5800d08953854eaa9059e6c26ce547d7e4ecd5bf241e27341b83ed6a454dd7f61b5e88e82cea7830f924976b113a2ad0e16fedd3968f6609a223a8ac66eb9770191b68b17176eeed2f2c709533725d750f22370a8f03a3a4c6d89b668541234c318cfc13250ae98c91e23d5342dbd029989d90f9a84d8bef40d5b07deef217f194ed94c56032b9944859d12c6d263a6b17e726db80b1ac4b9225b8a02a66b60d50ed5ab509211d62234e7b4e1aa3a71652157efefbde65f24555e37559a2fe9ff34c83b25ecce69367085da23c5e0d4c14934408be0c799110539aa4fb1a3d629a8548294b1ef2f6378e191b35a9b388e045cfceeeb9ea309f61a277731e5d0f11604e86b7bd24cef46b59fade2cfcf04167885359b64718097dbfe10ddf95dc8cbe89ea63c6d5c9f793e89ab1891255bd6e0c367dc8d70f5c856d8294e69d5b81554e6bdfb0e52ef392f8bb12f7eeb9fcd03199cba3f0bd17e0940359a6e809aa8ee9914d1037ae7eaf7ceb0f258bb11e279b0c2079879d4c26c0c2ecff69b8cc845b7a6482b771f348cf311b3dea26ca1d0a1eabb61be1a88d8b13adeb1fff4a7780e7c91dd0d4ede1d8782599462260c61ec4bb131ec206d7bb0eaf5397bdae9142aadaf377856706e7270b509b62ee0a11054553d09ae4a517ffd742d9fa3bb26ededc656d5d1fa8d878a5adcb3c73088e08920aaaf69417dcee028d8c9f66297414d66e309c7ca9b1e8c1679de2d226bb2c1ada485bcffc9ab7f54066481056a99c67a7da8558231e7e50dee2a4aa574453d425745b7d86f9bf5c1b92ed2517afb4f8253303221a5fdb168339a5551e22c2ff0e609be8ebd97b0fb927c05fca17f58096e838bc207985f599cfa8c06568b77df381895ac7f4782d368b6cf14975c0ba5918e28a0f7ed7e007bd01d6f821667824ac48c34875912d3da259f9f3f23dcfca5beca7ac85063e3226566eb176328621034b847fedd80f57546918cd313943cdeb3aabeefa725fc452d042545a4c30b7e59803f904dfc5e138495b473ec95400f9f0fe76a95afa871bafd9b836a438a810671fdec445910989836bd72596ec670c8cd9da045ffbd4ac673f283a1c415adb1a8c80dad6495f9a4da5c68d146553c2393feb2bc14812bf95741a828120eacb29af116e156e9583b609f6d0b42b75773147861eb0b0af6b53e60bac6744c95874706c01a2d27c168276c228f3e536a7c54a035fc39ce0aea58e4f51ba1ce8c767162ed0ea419cdb9f2b49be77598b1b09dd4115f881407e61009dba04f04df7d8786b537e067d456a872689fec85c83fbbd14e3eb5f761a292cf20294cfe9b1e58a50d2c80bfd26fc5e84ea3bc96cead4f45c2475d3db34117c48ac4c91ffd66a6488392699fe886a7b6ab418caebcf739f9ff4caf8d1ea5e065df4b9384af2ede23c7367755bdaac3ad2dcd0bccfc2db67bac899d0523eaa97150b0df9ab1a72ed3fd8b47084d42cf13956d85cd3c0462206df5b8926651eeb7541e3a95a960852593e5a592911c165d04d5eef0dbb119e80f3f93d5bcc9f7ec961e35c0c9ef27f08e8f00feb180d717fd71a5c2995326e784c0da2499c6c09c0dde8b2e3fae543862ed45e29d3d9c4703064ca2962b9d0b25d17aad05c58cfd18ea5dd69ed05556fcfe9a8df2a2db0dd024227a53a7d36a58d5c8e1112639f2f4215cddc4c8d9317076c4501091c07c2523a711c1bee42aed090dbff664aba28060bb406a39b66cb3642ab68d0bbf2bd95c9e9907f5028b5ce6ad131a265b847596a24b5da6140e9a3f905e8ebba263b9105628a493727f0be5a5c620219d9d0a8170fadd9df3e5183366935dfae39e4a4c5e40bdf6d3343c8e31cb088e54dbdb27392dcfa0cc0bf7af81a32733c2c543b1b33660fa21840ab9d87c3023c04f86813a27298183939a30442066c0a45bbb4ef4b9ca7aa6b1dd850b2f5ce9483a7214838b81de91ccad10e4be3385140897f6f716cd2e3fc0b572bf2f8a6129e23cddc9434aae70bc1c688221ef0529c331b6b3142fb38013cad8febe27ba26237f239baf267873d8d125f553d13ba5c870f0b72f34cf62259dd8f6269898d2d667c8eb4863db3bd7f3da69202b81cb2aae48fa256d7801f8f0de25747d53bff2b280706b22c3385fdff005d225b17ed84c8a56f92331469a008e4df07564cbbc43d1f8bc118686b0ebdd6300c7e06655bdb4ac9437eaeaddbbe31391ed6d79079bd695551c01de3e919f069eb4856185a82e495de539b167e229f0078f446ea0c4e08ddc264a0191f3e7368f2b0b443515b8d0759b18b18b1453d2848e3004c480ab40c4715b901b764faa862bf70bbfbba621ff3912cf1f4dedf3ad8cd46747d3f67a2f4f8a8a0dddfb38900566860f3f50c112768d297b537e9db98893e2786d06b4a462b8c1e2df1a3e605a0e1aee9ed701618ddbbb46531c98d3ddbbdff76d67226d9a952c32b9c4499beb930c1700baaf0eb06622d775b50da77b090991ca9053d8a569e4aaf1b720601e8232c161d79f961f2f66cfa62b6f97fe6279c2eb7d42fd20c4b8940b62baca99288b365e9529947195433c5cd6b823f1ac507c1da39d64b60108bb2d9693337acdd4de003ac637e756697ed22b7dd27ecfa59ac211678409d66fb6c61597ef38aebfc8c9ca7e23e8e3b47d592a41b9b4b68a34871e6b5ff6912786c7ba005e0e5b5aa6bd2f4b6f1fe87cdc0e986b6ff561e51923e57fbae20aef704e265202630b5b08cd862af398abfa5baf521451e0f996dec1849f0c381ef8d45f5b765171f7d988530d80469eac557a0f042b15acae7a366052922d4f1bdcccf0226cf98f8475090093a5ddfd5ff02aea55ac290ab4024f4ff4660757635fd2778dd459d304d83ac21a944e26594b6b2222e9a059624855afa7dc931e69c9a42c7051a26c4a0f768c9e899475b8bf9d6870411caf648ddf3aecafaff3df9397752b3b82354c3273ab9f6640fe44ae06fb8f16d936004ce30340afc59e0f28e42e574dbf47f9ec96aee8998d578399bdf7852fad4c9baa056506b277182a21edce521d337515046e3c438c8ffcfe43440e96efe9dc07b078deddbaa0bb55d56c48b74351610cc2fcf901f4489eb7472d3322ccab515e9d69483b6c8edfc85a515906448881c95b66fca922ff1080cce79ce0c748435978e32fbda67447465b62a548115e5e7644ae9dc09cc4dc0625b7e33584351038a8c4ba3770ec3695c47bcd70276ad06ab7ef56e85e910381f36b58d4857ebcf953e9afe6ebbeedb6464ef4e19551b8b748612b8f04fbd357fe764bbaaace420d1c9c5088b967cb6c99e41638af256df8a36db6be1866cbccc964b8ed1c92f7d5f4c0f716dda3187198fd6921c8e4f26500b4286a0a2f985d22fbb077bb586cfbffbc00c7be82a1c481e05abb946184a78c2ab5ce69c7193613c48342dcad8900d37a42def689fe24049345428e5c1ef05147427f8b85bc53ea75dfb3eacf549a92df80fdff458d99932fc38c6139c0812387815e110e398a31bbd02cc162e54fd93a564afa145678404caa56e3f7f2bfa8ff1e3051aa78adc7032e11e2694ff7901126b76fb9c04554a24b0eb05f606d5cf01f70848a4a292f3d2ff94f687f2240eb3f599810ad774d6451bff3dcfaa83d349a8bd35c3a776c7ff039966255fb0906008907dd7f47b24c70064c688155ed6ef1c1c13f4364b895d1e0e251c3d91af88eb1d3317460432cded3b4b2ac6b8f21505d8cb83d0b74327e2fc78f0a461ec1786bd59d48959b6940451ca46eb9676379b3629250e70247c2b78609a922320c41ac6fc9ef0af9a68409adbe5403e10cf5dd57401dd891495d850b04b920159165c8c75723315e0edb37a7ad9e79da4819d7ff0ccbb8f250472ad76dada9f59b39783ace1d66e93ef0ae94a8854952f2aff380fa8936f7cd9fd4b4fa6a385aee331be62d88931d17622b5f46ccaaf25dc27375b6d4b1675dfdf5e9f1c202a7edce568946fc482d83b0c203f8e8e3cd387e5d127076c2c3cf5ab38626a7679c99062e8757c54f0b13eb05e0abeb83321e71ce2bdd0850ce4aaacf19fe184950233e3ea6132c2291e3a56321a91693d78916e092333c348eb8e1e13f74558a903cd9bf3dd3622ba6ff9fd0abc4071737355dcc3eb9fb4a0d41e23ca219f573d1578a9332f20da8cb840b103fbd59c8b930a361bd86b19cb57c9eb8a3457d5d106d7b524f638f753eb35abd6f18c8a5ebeec3b480bb6fbb893f25e5b720f7b472f63173bacdbb9b608a29a1aaf5b05b62d377e050d6a8da2d780a6be5621bc5c2cc4aa1f24bfcf90e4e79e2ba4028cd48d8d37680c289ffafafbd714432e47c236d31337f6523f9cb109d05f50215e9243b3ce71b596b6dc1b650ad4b0018a6fedf76b7bcd2f071dfdd89f96bcd3ba86cb318826d154717dfa6a48c73f28801c63880c9ee46aa325c12db4542518dedf3f7846e704d47d7468c373c0617b55c66322ea4db7fe543765b369804cb909d3e58159749ffabc6972a0a54ca3d9c452e9038419f0c0f0d1ddd387a1e50577c31d18861f7d24efbd0e6b87ee45dd8b0767068dbf758cb7540ac614b3994daf80ac0b19665e7efe315bea24d71081d53eebfef164011378162e57759f9eeda07eb768c8e9b28272516a19eb7e90c38ce11cb112a0e0ded1acf239c00f4128c08f142fdd6de96b12193cce68d6fd82a1c37b8fa17be410d2d020ff3869fa983580b85f54560ad891f5cff57f63df114ebf1e583f63806cfe59b01838d81f97fab967c534ff21fe99e25c953e2ade63d4e9f4ed1b857b98677f4ea11c411ae328252027b5cde34008cbb3dda84e700371e556611652c7401bceabfa45871b93534d63e101725da5948dad22ae1c53b646140fd6011d89b78b79ec04c72a13e7428c325a8ed02edea6bb14530842cf38a57baf427fa0ad68aaef673c7c8362258fa2cbe0f3f6040d79c3bb7eaf56194b234eae24a85a69761e68c5f60069e4dba93ef136f828dbba10ab6ac560c77c5c3b2011cc62084544218178aa595b2ed4b64ecb8cbf1c9a8804f6238371a38577e362da6071a35725adb4ae8c654cc5376e66abb59f6840daa92b82b68204b3692cd4a88cb4ba35028c3fb63d04fce9fceda772b8d7db7e203be652eed7fdcb8d201e887a89ae91298105c384ae51420424c43346abe662faa9c06025e7c07872962b716554de30eee65cc36e2b4a6c34352ddc4e07f41c1dd40cc6d5295f7f453781c63e5f5cd41b5c992423ecd70acfd9829acb8bfe8893d1f0151633c009442b1a312424037f236c0665cffb0aa953dfe714348d04dce6ae7d362e75d43a4c90aef120f4f2c49c154b2cd27d4e64f60acfb7af05fb429e5ce0bacf42f71056dfae5316dc257057c5f72f444b324da72b6c0b9eada7bca08e0f2e177671c4b5cfc3675e8c2937bd863738d550a5ce82c00d08de15cf729ef560edc16203e2576504e7cbb5ed8e0e29e88af8617e672680598dd1a348e0e882dee60e7848912cb79ae6aafe7c30689318b33d6f11067718af6790fd9827e911f1629467d7ae52abd08a1f2b5dc307ae95002558a86d4c69b58109c57831bf988d007558e2c83210fb7a1804cf119b00add9996872d39b79ce502693b57495221ea45cc501a8a36a9bbd144ee80603b83fa2031d839c4641279521d684defa063e42b1ea854eedb6229ba9992e17132a621a11558a6091a8adcad8a3b76a72e3a0d5efa0aa96275c6f2700bf6be18739aefcd8fe9b354f2bc9c9c2344574157251ee32a47b26d851fefc212d118410940070d904dd8d09b6213d11aab159fbc00d3fa7260d9b1906717bdf8a3e065318fee8b2c4ddf3b7915053416abc3451ca27646d20d1a529570e672f2be6690715a72d6b519870375e270f120eca466782b0a11ee260963f63687a3461bb6d2729dc67f3a486e4a02ce7416a300af29494cf712360b9492d7e0a9fe4f39f8ac2e86217eaf505b53aa3364c19657ac2ddac78a7db0ce7c83e0f8389290f9bcea3e27d1b76f153136dddcae6122272b30631192ee4e63cb4921a348486a796024d928d8eb5449aa08e606934f51ed99fb838736b234a5805639f46e22a50052cafaae61e8d3c32774c660d5c56fda5734cabb7b8cec4a03e0777bb080fbee26493f63cde5a921144284302dd959e9ffb716f29696236d7b1a322714ec589eaa580086ab4823198c2d6b16c16cd52ac66499226c8054b041003ba25b9ae466bdee313a3fb0d141b987b74ea0dc5ca8c8238a1ab80ca73ffe64c7186e57a24f879f2891e39b60f5075680613ddb73b7fdf6a16c9fc3371afce1e0bb20ed342ac3cbad332b91684460532da5fc990804e5328f39a8a37f3b659979ddc2b050307839591fccc65fc553b1dc5f6ab813c139999d45aa576509e46d771ae9666dd7704678fcfde2c58920218fc1b9f43d71c4870a3df7431ad86743786504c8459c8f201e151f280387c4306d505b5d8147fbe92846f8510974377b5e9f7d5694279d59fd5756d64be1c3500767f3773fd398bf95ec47981d10149dea9dce303c20b5c83dbc77d2c422b2f092988ed55b029846ccf7b6b053ddf20bc20f1902fb4dacd0e106c1e672246da800a9ecde25e39a38426ec4ca7af0519fd2e5e1d43808a8330cb54544ef5ad5f3572a824977c9f179a7215871be6ef2e7f6e943eb60d382e4e33358b09fc3cdb88be31e4eac87fced7959d17ca208a7070b92162803b9c1e3d5c19ff5a4cfea3de3b7a1308299b8230a6e3cd7965a77111903aa6f4a9ca358effca0c0c7bc48dcdce010a1bd46f4db19d521aa04b4ecfe816130f2c3ad572000b7435200bc0966c3379c72397095a00b4511a7475f6854c9bd9f23f1cf5ca522064c47265f753a67687beef88fb12d8562c20b903ebea4a3f4a4966ff28f08382a4f7a7ce593b1f695111c3632193d1a9fd833d62d837bdbe7105bd6abd8fa6ed2b972bff895cb1c902c40acf9fb651d848ac2a1da7a7af1dbba1ebe579824a392044419dd6c8f78d1a35e6fa318ec9041c24297c4c4838bc741438fcea81268c930e7e0ef9c5cd346158c8f222735c51d75c190f48bddfc514d2fe28b325be6a86d1799b1b6da7cdf3fada0857c0e16e89d2c71c1eb4ade1e4d4d84f72e09f9b6cf8c4394f52ff100d2eb9c6f4772cd5252c75932ff1bc246b0000ebf3905357089a4d96d0d89164036a74d15b4e1a87722289dcb0819c5713322d7e892d99616fad380c6493d87d19e8bd446959a939d6b7ac9129b0e70957bcc6cdafa80ac53fd16c13ed8218c61ec7045487ba52ade5d0b6f23981071405324e584eab97e591ccfb1b1a12e6a4f94783d52020bb6f8cb6cf2bb64219d89c1b33266216a5c6a3303f0536a0fab85db7fde25531aafa0f4af75fd6340df2f6e7288c6e74aa203d1f75a2982d9fd9dc476bb710a88ec57c4ff3e5658d9e785f9db7353dc60c000b44709751ad09520f624245eb4f6c069951e941abbe03e65b89d206d719a3c622de1a52c88d6af2e52e703e2d39826523538b6c86c9a34271a924ad88326ee14b2f8312dbd7d5e6b647de95144e7c9dbe0dda05a2a6acb0f7f8d04b20e5d0376cb55d9f26438a1889893766c62d580fc11de2bb21fa490925a95c2c38d6c8d1fbbadd448e3d5812cf9aa82ccc071c3fc9fba08a999618f0fdc2ea74df3bb91b608af70ed848287fb5a38dfdd2e9faaec13be9e03436133244d521b3895c29a57695553e3804f2ee800cb4416cbc1a3ca34eb499f24177af274cc0536a6ccf1931e3a18b7e3b08155f1f8bbe417b8e3c94fa666750e9f1b20543cb19056b2fa9f504cea0c273aa33010640eade6bd1f1abdd1958256de295c47888192f7103b79e58edf19f43ada81485e33f5fbf92f5748275e66039ea21d2e504b320f1c625eeec0fec67986288a7fccc970b15715b62933e1dfc5f50b58632a510430f058e86b918342576a9429fb3634e7b47dcbaec69ed997f556c21d46fe1404d69438735f940222b0e1ea9e861e4ed1376181a686937e7d4cb44dfcc5176e838fc4e08d20caa9ae16878a334606ea4ea211c7996f43c32ac096891ba016d02fb264559260c8bf8bf7ab759cc23fe26ac0fa0ec56ff732adc70be88e1180b8e7f03048afc06aefb88c5abd2d04789cf10ddaf7223e98ed3bc79a5c3a5a1bc67bf099f08c7f6419c457392a731fb737a8403edab91996bbf2652e3d3a52022ea98ba756371037c4b8e22fb399f94a7a404a40f119b2346479aa8ee4bb6fe03e5859a8b76cfbb2ebb77d1dec3c58c3fac6b42e0f9efd500cc28c3bb8f22bcbe0e65f796dfe150d2dc2fe7604eea6dc750c24a6f570cd474ca627c4edef9633bd79835c3b8758f9e7a42e481e1400ed03f64b666902842cd2c8ccec618bd1284bd5be9b07b83f4af7f7e522a682688aa76ca5be0f84c529d07083f024564511a02a74c87e559092bab83423a162a807bcfae37cf1be03d01c4570c91716126dc3c939ba55c8b77505331cb69e87fcd1acd5d6a91a67ec3326af105b183c342d8230b14b89c8d4494f59e22c40677660bcf5a943e61f92c02f9d5cb20948a6b6accb4ead9d736fa919f5dc32a0f9798251d6464c60ea13a93db24fd328d0e519a65153de570d7fbe703772ce8732533544d16878ace6657b56859a5e1969499edf54d12eb983468b2253808a023175fb57f7875fc763029542c08bfe839b6a2a34ff7d6f525719ec27169d63218a03e9dace0eb59a59491ccf845a6ee8b4ea4697ca6eb9ea555d2582de13bf9268387b75c39c239e033664607fbe2730e01d35c6b29273b2938d880fbb5f9da0b25a1a58284d3b76938ec778d8a55dc6006b1e7141faa351f576c77b4cf2da5573118136ace43f6321f67d1341c313fcb63205e300a3272736d0fc91746635ce4af600cdfed6b805cc935ffb0f40faacf4bc630bb49357ebda67ee2770975e002a5fa1c0ba37941a036d80179709427278e42ac5bf543f7a1e3870e5d2dfc1fe986e045f78d920d6dbf61754b0ad5eeab39b17bf86895b60a7711dfaac1b853a0e8a8482ca789212f52819280c53f06ebbb40df5cd4e77b38213cf1e2fcb8f255d5ff38a4545d1aa0b73492e8c4acea9984d4426309273727233df91613b09d71f578acf833b5948d7bbdc7646f164309d3d3094b9c985d622a6dc52b0efc6737b4c004a340fbeaffb340136217994688a28b45c2ef7f1ccbede50624d1fd1e7bf0e8033fcb887b63a56c445a121e86727ef5ab9ae0e7e9f85207ed27bbe0ff31cf83f57a5400ed51c7d04980df6ed798c592a1b47ad01b52e5ff2c44c237f91db32841a1f6fbda66253fed7acc38aa1fcfbeafa57ae966bae11e12474bb1d4d49de87e8af34569552724ed8cd4f2e05710dabb195d7d3bb760405237778c841d78ac6f0a70f6df2bbf85b3984bbe48a2418d221f45997a10985d478634847c3df1fdfa7d9e069a412f6f71dd5d9ea04e7e84c4062ba0f6ca8a5405cbd80019d29a2f39c680728018737802fe557213f04ba5b6948395e45a3e4687d1f45847123e137abf4f69a30daf11109c2547661584acc47662fd750c8bafb44a16d441a16231e744885eeac880a69385cbcb3a634c20c49b87487cc59a689e27ae67491ac65506a8466d4e81c6275eee71e3ea7cba7546dde56e33b8f0b6d64c9f9873180243cf5ce236260eab131b22b3f9698dfdf250c089e9b6e479822f94fe7849aba05bac00a94f1080e33282e2d6a96f31dd64033d7fc351b4a3703cfe497285e3b8923aa60710145fef91a42f5403881a14f6afd6f251cf5f09511f5847f6c6997e2e233534bd4216247bfcc7506a8ab7f74742a11ed224aba46a9cc3d1292531779a0273682abfc9e7e85b299c31d58a7bd9b9def1a2334cb960ba50835daf7d2c9f36107572e4858dba0d7ce4a3bff9891946b09b2d2d34ca4f95b37b9f8450bd1e8add9545b58cb471ce37e6773574d133f57ca80ac287fb51c64568a2b751bcf2646fd2cf6392d629829c7267ba74afc3741c56c1d4811df24fbfd1c2a765e825b2060ae65ea706a27457469979ca68407da80ea7fdb660ef9e929c0748e19794481db45f68015ac4551d36a4e8adb9e1eb0ce641026ebc663c6fdaf508278bb6176bf2feaf7d4e0899f1cfee60d5455e641ae872158100ec5a8c03a5d5fb6fdc760d1e79bf01e343b8a3a3a49258b079fb4d9bf7929996eb978addebe9f14191103c409e058b7decc02f4b284c2479c1213ede4a2cbb16e9b14c1be33188e015e74d6405bbf5d08e08373161192c80fa603c642f51efd7f8fc721f0673fb804f5a7f2ee530812f57744c9da979c129c112765e7d2e55f04709df683dd90096919f37ddeebdca69f256335f3c1daf74cafa2124db9a3740f26fb792d4d366ac6b2bc870fc75fa53dbd5130acab6965dc24ebb797fc0eefb9f84536c3dc9d673a36a0d984d618e17cd2abd28f39a6a245340d736586521f15de82186b51bffc8176e5d3a244f1609811f24cfa6833a01cde285ae97d267c77f0f8b8734773707897da7c42a9a0eb8a014e5a3c18fd734206ab618c9989e729dc67c7621cbfd335ac357656a0306f4f738163edd3955374fe36d5297754e9abfa37e0e08fdb1a30beb04d300ae9f1d3549956193e5e179d7fc5f73b0d4b613643385a4dde7a6f59976535e05e7dc41423fa8fc49c1fdd231ae0f744f1313e008f9549bd64578cd0f44ec9b9b623c72ef0f14cafc40a2e8af25ffb5c8236b4c946406199327e38ac883a6c8e80053092f8769419e5dd80c57b6693c68b7fe8b25698627f4b469cf91e75f8b3f365e718f2092dfcf07fb4015962060a9532c568c26ae974441a136e20db04f55bd8c1081a6e96540f911976898bce842548c57083b9483f63da71875e1d4a0427bb2417547b510e4cb76f798dc567590b6d04255ac048cafcfd2f54bd18b6b6428acb0010245477201343d8fba0c0ea9d0b72cc00bb65f8f646a9022d37e09b9a491de5c593c27b8638071691ab637cf34c6f6f0889402957efbe50dd1997e8081f922ef422729eb785f0ee752a2f677fcfc70a2dddd7ede93de98b4fe84a050d6bbecb95f8e48f03e804cb9db600c56c4d36227d46b8bdf3ce8d29ce7cb651ca6d2c99b773603138af1fca74f66ad296feea56a2a4ddc661f028d41e346a5ba9a13143cee4e57a7e63ce42036bb9bbc4076dac9317f0440efb5e5ff8293d297df0e0dc99b2c70330d2d9d930f35929ec887d340a3e05b7c1b192c202c32c3772c5817a0aab457ad78224eece1ff333c9d0f435cfe7863a2907540be622726532234963de678ea2612a01299577f328bcbf063af7296ed0d931e1288e0e8160ff7e8e440fc38ebb6f63c7f766122cba7575bb744ba44d6c83877b40121f6744b1bb99fb9faae9f4613e24287943934be72ffd137b753917b9aab8c39b7ac03b5d2bcdf8642a7b0854ad17d85899c35ed8d4a4eaab879c76961b91a1b78316ed9f4e8dd596596b44efdf2db7bef27029c1310e06b0b229fed2357eb3b295fa21f0e7a079829c956acd709f7882753f2ce9d878989c78ee018afc41c3ac7d740d4ae2a6baa185b36fb8e5f8c6b3817ca3b2f9c99bc4b4792cf0d5b626e3efffcf746d3ec8690182a4e6d18446f7cfbae5bc601037cea2bc57debab14cf36d8986148879494fbfa05cc37eea84b55eca6233b595a49516adb89438a2f4ec9a25bfb1ab5b8ea0229f177f7a412f31fac3ac7ae2cd6500e6d8ec67fbf9d6caccf9b4b8a3a9e1aba390dcbc509e16838e1af09870871ce5ba95a4cccfe235b5940ce2bc8c8a0e3def184cf5d359aa683fd0d29e9a4161decd07aee02f0b39e7003a4ca094385b6ad92785482f77a690b9ec780aa034eb5979afe0d13d3bb565ff2f0fd0cfd9375e8e5ac05870ea37b4e0d47c85452486d966c453eae41c11792ff7363387579edcc05d62d0034bcac7b744e4c52380c7144ce3ddc733f3534a20de8b92f36805e106721ad85211729ad19a39503668ead177e31372a9ff23021c9a74ffcaa8bc2c2c11d663232fa4e7c27ac99b56dddb395acbb71d7a5123509bb528c352b32d088c5fe71cd179be4d747aa3a465d4ca32a784b51052e9b833d5102fe10b09923ea15c359ba29630dba3fe98574c78a64ef61d7ed315cf01a404ff041a51e31e46970311593c9d885208f7b135a3b5aa292ab96d35b9ff9ef474f5d0bcee738a4b2c692f60e4e9b336e55ae0c4971b73b9659e2966976b9871805281d4ccbd096308aedee4427759f7080e52ed4013cb461d8bc1bc4c505bcd99eba9056297c4772152aebe16807c3843f6d517817504bd96b1269cf35f17b332b598bddcacfe9b9bef02d7cbc5ad4aee3200519ea93a452bc84bb23460cd4c3164d3edce5079e9918b087e2fff3e2a5110d5abcc4ebea9cfe5f96a3f86cfec5995264e637f692ed7ab60f07a529920fc8883a2d36911686516be5bfdb2655955c9d23fe95954702abd2ecf3f370b66c95508b760e1939a0d8f80ce0802609c11cb7f98aa2844d2a662ce796e33c09da3b2f8a2d904f912cf72d5e4d23bcf6f014f26fde150f2d15a6f1251ffaf081fc035d79e13ba2e90ab6c6917a0604063787ed134292c167447c7bb95cfd2c96e6ce3096547a7da84931e3d6e19ada177b4c9178ae0f9b0a7ff6c3627fd9a16cc82dc4e73270a5f16eb12dba486d40c57f29458b4cc70c998723df697fd108fb255bb50fd296bde53d332010166cbbe1b12327013e610673b54146add0d02c0c046776a6d32e0248ae9ebd36bf1fc2331240368da1069b4a5f4d59814892d9389f30765dd36166b8f8ea0da66b9361b95acdf2b32d05ea05966a23d4252bfe685b0ac4d5e9dea5882e058ab702d3ae593db943d9735c33f051735f8a7ae981c341f2034e7d157dbff0998f0ced94f84fa44dacc3a8dec4f977edd8c50adb6e8eb7f0058f970db3af2f5b0c90e613ee9bffb0233f39d15f85ae9cd75b5f1bac2d9e9b5ede0bf4a7e6c7b1a327930c3b83628687acc4be1893bb34a0924b0b4298630388c43c7e7ff8b598092afca5d7d87373ce56448a2ecaed13634f3b79e48f5ef65edec56104ce57fe9097e59826fc6e42a52369c68a0fecdb878d00c543d2d4ba89c565d554163882d97a47f092c7d0ff7f734db2e093cbb963375df115a83bcee09b3aba5772693d4c7e8834d091933f3f27b0b36742be4788af9a6ba0fc49ae758cdb21d8969351cca547b336bd3b1d0de951669bb0e397c5ed2eb9011651318dd95b8f6501f8dd9267bde84275a4342ba75c70925d984dcb5f42bf00349eabb5d2a31c461271ca5edf3efb18794d01bdf89de05c6004a2b73126328adde37993d7c64914ac36597bc8c14db3e87412c518a39a9c42d3a0eaeb233383d616002804a8c778101379d381fec0f8646af5423bfcb3f634ebc70fb7ad4c38b6d0209257a489b883afda735905acea139e774a57a2cb2b86bcb4221c9913053c1e637712163afc188006da6752f717cda3c795e653ddbe7969e1e7dc664e81fab11ed6ef9cc968b03dd405ac821ba283c0bb78ec82eb8afcf56993197897981bd3b4ade41d5b967fbfb2724cea0e77a359662a9b8c26ff47d0c743759265d0fbd27c9ab8b65865c954b705398a60f9a7f56f41fdf9b5ee458ca43ffde5606b03535b24ea7d628167c3220afc9f132e88f4f4bf077996ed7945fb345be5a1a0c2617a40b38282fdc402fae6168f1d2ea6c8ad986facbe7aab2ac5f3f92097967a23f372ef4034ba8cc4dd996ff16fe55ac4edba122cac9c7951ebbadb4d8f873a7fca5a1376d2879fbee6a2977b4986d548d338e1accc9003b3723605d5841b1b25806924f9b3e9df06690b296f712d63188577a1f1d2ba67381697eec40f83ba202979400e81cf587338d0fd18365cc6024d59fd709d455890d113a1738775f94cfeb23a69103de3f0119282280d9f7c88cce597793622a9d49662f74957fbb5e8c0d2e7134d3a5bc420067286cefa0441996da40d3c6b85ad6773c22a3938b4be70db7eaedf8ed4a3c5066c0c322398f31170c3158badfecfa89e0104251cfedc50605e45fab601004923c3046d5190d5b71a2800d0804d4fc76a57c187314595a66b19b25ba229722addeb5e469a589909680de31e013ba98b448c53f9dd21de2146dfa6489fa80eca90b4eed7335da4afc39d4e4b56d846091e8309ed39d0be24fe17421572daee87de3ab676ef8b129ca66e34459f0801dac0b5ea9ec5ab498333672ca192f328815856949de5d73ef811f8d28eaeb460e7e139c2a7a26877c8b1859be7084325d416325355d491973b6c16a34ca85ea23d21632807a04794dbf371dbe651fce92aa5039e493a692381c5fc7c827f4ad19ea5247ff1023e4cb9ad10382f81066f2c17972cf4d200af03da65065ded59c84b31efdda2c821e2e66ac518d4df2af931e158259a80c0c4208782dac88550fdda4b73f762340cdda05cb2696483e9fa7a25db8c92e1e3e7c3212ed08d863c7abd3f94227b68b2cdf6be824836462a61b65e97c001c1a794cca5fffa0df7ea78bb7d4807eee45e3c95b8d6e1143efa24fc3363314533bae208e651e6ae58df8c65681eae193b43e7a74bc25a75a83f1e06900c6247efd47aa0ccc11c8391429de05e57905b57e7d260b4d8ef76bee892bbf84d99d880203a6c948cc8a218627e18f7a7ca546806b8fa665cdb75d91ef3969fad3fcbeed8b2202501bb448e85e26da4b0acb0caf0dfc63e3f00125dcc9e9ccf8560b7100e13d93a4bd5db76b60cca8f08b4b6216457f4d6ebb6d8e82cc83eeca742f857ec9a695a423c51f836724ee507ec1e575bfd5cfd8e9f74efa00b9e65d269ee43973e8ea9903638b32da50d7477227a64186b53be4b265c8600137dab662440a2aad7a3dbd27dfc69ab4bec4ffebacdeb18decf618e6f0138822680f33a1ce0b26c6e83af062efc172cc2db37d605b5176322d410e30ab75e8bb9c578da3d47243fdff323315f13895c5a9c3593c099f20fc80a25584e41724a20eb88f706749193722792beb14ab55e91b08dfdb2a44112d48690434cc50bdfcaeebd1368192a48aaac6038b75e7dc5c1b6aeaa373ca996299103b3286ca18e8e916e75cbdae083331b33bdb5150c037296f787c8692818c1e70d132c51fffb1cf4031a325af9caa723a9147301ae8f54d84af540643306f7fd86d806ac3b5b7dc1651128d34a970e4073558a56d7ecf25d38e2475786154992c28b8f23e8e96421b2a1a48bac6d34fcf73e4a27926460f4c930402de1ba6b0efbe06a46fd739657a7f574208d33f1e6f3a8f5864199c1dbcdb3c387632214dc344fdca10384775d6c3806ad68eb60483e35f14d98baa69956fcdffff710cd72bf38d232d8a3ebc2786e0f0fea15405066e1629218e40e218e405c33ca683ea8be70754396aca5cbce5449e2e744ff66e7cdcef370681a5b4ea27b11c1c0b84fe92c4f313be3720de522f8236a203935336ba31add61dccde47b7271b6ed5d78f1d09033f391b5a67241ea22d7716302834b0cf620455f923d9f4b51b99d02b4ae6f6595c8b8112c46c72b16155602223f8076dda7236b3e6783e617da24e4b6e7350700f5a2f5608dab70b10a2b20c4953cd341fb38ae7b9271e986c38cbfb5a42e0b3e8bd4f7bb39967f3589a205b4f2595b856dd0a619d548fd8473b0f64e5b1c427821055423f347a6b72440a8f090cc55f20d9165a70712c0a933227ceb02acd538206e43c835b8af3be67db87d20d36aeb244fedbaf183b70eb12e3df08c332bb08765a42a16c14c76c5caa7944313b32bae26e694356165f0142223fc1099d7245a041fc79da93bbd41c3a0ce10759f203f7c1989e5a665c3053f30120d233fd361af545f23e63f7e1dadca7dcd5dd1f5101335e8562d6435bae4f36acb3031cad283e905f398ee777ae61612f27ac29fe274840d66b95323d8c615ca6ad13d1fd0d49ff77c3dce2bd9ef256d085fddbc3839cf6fcb52c9d906f1762b2b66424155a25cfe482ea69bf84daaac622fd8f88ecd59feac86fad4dcd3d1abeb43ac86e0181b576bb75bb3421e71231a071395b6d10fffb9002b4e0bb9318e8c15357c2cd002de742eabb0eae94bc60df4b4ad66e0a5af0b7db34a8dbc457e0fbde9bea061d5650174ac8e7a5db8c76d9935d4fce187eff89baf28155a8f4d4f2a7d8f06eba2754fc6d823514a36058144dd9f756717a218e97a3432f69cc35e70cc6d0cb3d0ee90a8699b38b86c05c7d69e97524e3e74f73721157dc57f776d35f0af4c2abb907b084131e9a168fb65ed20d987d35394d438470b8c26b1160d9dd150e6173eda7e9e4bb433a502eef0cfcbb955bca205416e9a79510a44d546c4e6be037122966f0545204903f1c4f0c0848e9646ef3fbcead1a7314e1a27579d04cea9f547ea6d52640d21c2bcef5f9669f1903588114ce609d2f90c90d00ea23b8765665571dcb41f208a2a5d3959de9b84a05a77c91e874ce2f11385685d0ae85a19fdedec3afe3f2ab9938a819c452278adc4983eba661fde76d77dda0333a7045191721066ca09564f4e0b963c11464cfdb319fbdd9c5bb99cb3215b10e8dae6881cff7ab3a8e461ff5e5065e276a80b171b5a9173b59384c1fb4d63bd25e6edc072b3a74077e652fd1ab51297335d364c5b04fed4a78809c95bd5b9b733e602e2056a840c877f22e6c178c14daae49f6bb807fa0efda2ec1f1d12d3ff675c74a414b0027a05c7478a6275c3a9e3f7a06570925129c7a1e558e6f2e211227a0bc4827eec2beacf328aaaf6270d78f1964f81bbd929d5363255d3e9860d4d32f283412f13f1ff870f98936608b6b0e5652c5b7e01339872e6f77849d32b2e886f477668260210f8617adb4a192f939858c029c3fd7ec2d2005746cfe81773887ecd7f6b18565ec9e192ff71821075dd4e601d66abc152d3c3bab8828d85ceac56947d15c6491baf1d0c4306f220c2a04195434763e12d6c65bc85a147a86f048dde589700f9a2f13741881ef91ddd533045b39357cde502fbf5c25b0df5a2a0dccb9c40d309a985d000609aeb9cebcc78df6ce0a1db50f9e8c7479a64aa32bac9a7a44c167079c69ed5bdce7904c8ffe70da8ab91a2dce0cedebf6629e4f19e3f7605b7d1321e65b6ed6b72258465ae9aba9914e66f1db8858bdb2930791ff5f89176f5e711b9df5e4df68cd64362e8aa8fc78dcd2a1747f937fb7d67e5fc6b60bbff2f71dd369203021e072ded476ada6e99f71802362084342e32e578061832e2786372335d4f986abcaa332b9c65190006067cf4abb68e31dadda074535bb60b4c5c6960055460715c742404a160c9d5be7e065c5bbad417b213ccd9a44ae825329b3fe6225e9ae2c7360b79385fbea4d8a747f0b99f712e6620e1a8c4440e33194238d6c3dddb5eebc62a7638ca24096a6c4e98723aa283f739c67fa6e9cca4ba1e937eaa1ce478bbdd1c13f7be1ff552b29fc0889457fdd1ef263b332217f35e4b512131105974ec44eaa0ef1480cd258b761449daf95f73b9a6d3b455211b1b4da134a5bb7b36fb55acdfacca7f38416d58f198f38a38ec27689aaf80b8ada7372dfee955834cf37d8fd8e9cae5ab57f4de5a03a5371172d33a7dc5a3ae6c8383794bf96b807659b1efaa28825aacaf3bc66dc4fe4f5a978a2295ef9ad4510798bb67afddc6e2b9ddfa04233948ac5432705ed42e5c25ba55050947a18a22d35290d0558d3149411f6a4d4c5f247c592916958205f6684e7c9a546967cbaf918533d8620647047a089f0a381e617d64e3020f90c83f549e235bb4c41fa1a882dae681ef3974f5e5f59add56c0c54a147e416fa2f54b1d92ac2906b3f9d5134820a953a9f59a7b6d7faea86125d58a6dab28b51bd1793eea8c4332a2b663676d0b88b3fd845cf6575d08dd479adc6d75c6a8d1cf89c016b4cf538ae001ff27471f36efd54f5a47edad624fc6b97d45ddb3827b7fa62af404c29a0626e55415a31d441de78ec3e014f54db5cef5dad62019c27e0e690215997cf23de8db9aee68247a1a000f112ee3c4aa783f8699327783c4ae92c5b8854451fe2395fa4391fd53b64be1c0c05ad0980f5efb0a4ed9b7381ba8d6bf1bd229462e82515c422f080665f626c05d9ca4cab93904cda5074ff239fe23235882c951416331d8cca3a92ef571858397737d3743091755a4eacdeca3600fcc322343826d61b520304584e2f5e49f24564f7754206b3d5f28affbe39664ad74652e1884146fc8824d4d6b6789f0f81293a5746553e6c51a5897327e06225d6398412613be706ec29680da50baf28812126659438373c527189168bd4cc9c2800ef16d8dde05575217d1d0552b022ce1d8f47ae69ec29dd927c484b023641e0a02cde286b9c5fda6b19530b5cf7327602a99d8a048ac97a571cdda484279bc55e8c2f71602f5dc251bd4384a50880bca49c4198ce698a733488e63eae2d81bf5aeab46bc2cd01762c56edff7c74518a671451bdac5788a5898448d2e7780969d49f822ea2b8e695ee4e94985d21e18906830447b5af34d87acc2ab8d51d0e9625396bbd28c40c4b124f32aaf6cb1d714abd033bd097f3cff474f67391c1be1a80f9f6c85648e36b593b54c590544bfe1e1ddda162438d8a004213b0fbeb3c3b608ca56abe7763237ebdc3a3c48aaac8ebbd6265aa4f94e14bee516b7d12b343c0bdcb26ea401fe400b2908ca5b0ac3ca039570031e6b568060a5aa9ed51089e85547b498d507582b41dc0b691b5a75652eaf90c84374371229cd0724e549ea89c3b170dc6aca5d7b46189275b70b5b54fd5686014fd6b8b58fca841dd49efd39a9a9fb2e652d9c0bd69e22555d7d91ca5689fb82f808b2a9ea5181ceec6e437244b695e851294ab109840ed7656c73aa50ecb89309cffdd5f848a8ecfd03a3adffa1af0d031b7d823b07e181e2141f8267d07a1227678cb097baa6e3c99959769b0723cee64dadcf9b15a36216bd85e1ca16f79f090042b7fb9edae5af2788e6d4776a8c7da1bbafe3f14f668452d9ff0b2040c3d697756335925e3b50c772ae9dc4555f1e6b72f0269deeff842f436a359c3d17d729da35cdb23ff75b0294718de86d656a77a313a9e2782e87fca352308997d9331ed33575eb8c36c00756a090225a846bf793ec0dc671d8668bb9779b34beac8df7de0c4cbce58948c1cdd3eb72ca5342a60ec0f74dbaceb6d92890a78537e142979b4491831715ac00f2a9c75ec19cae0f4a5974cb642403a784e84ca7a55d46bc1366363b748f0e321b9541a60839647bdff764c44ebd9d231da0f3bc0ad6aa579c0627dade7c221e5ca8bf6691d951cc9c6063f6fe90dae291a220b9d26dd2e4a1c8b2d320fbbb63927bc1d8b80fe9a8ec2a85c086215b0c822b45680e96d7ff05261870896117601b7524151162725f488dd12334050904f653b880ac834d6b35e94adb722a1f758de2515ca01f64132a44c1fb254c36c738f29d10870f9375f4d7c2d6e7713d7edea8598d3329437046289e0491798a214163a9f106daeb4541d3b9682e5017461679ed8b54bb877caff3585a833d835d8e282cced32c5413a4ea289b1c767e06ff57db4f27831b0baa148da718374cc9a219b80e3d27f23e77ad78a34b78970a397cb1f0ec57e7891f936f02a0bc46c0420798e81bc845171591651dd7a1a19bf3f271a9c31f9402ea564747d9e9f40618a9afafe52af8120fc7552b4087a6cabb9c449bbfed6bd06758622ab7c240e5cbe7d737d7e701f9f4fd8609946340f935d758448821e691b664400f89bf4b9893b4983352a2919a41881aff81025b01bb71c696ddd2c292ee526f4436f6ed78fdf324631fdadeb7edfd31f3c9520dbeb41e090427c4fb15cdb9bb69d6954fc1e982d232366e8859b8956c476037532446a246f00545e4380ad787a8ec6accc6f8c9ab35d1f30d3d5166346ff9616554d942415e53e71353b5e98d8cdc0d6acd1b8643c3dab258200a8a57aa3304282574bd0ea6ea88e3eb524aa8dcf0e7ee62961ff04b4d6d81c4b3c8978a7f5cab09945f5b1c059b984567ec47fc82ca06dd6cb2de04cb41f34b85269a1b7eb86707a41af877160bc4fb369532299a88f7ab1fc46ee010065a6c7536afe2c560bf46190c54e3f4e6f9da49e8d7b8f8aa7746381c0182c5940b7b75f2586bc8ab228e257d4951f733fec00bf8f9ceffc0caceb6be32ebc5396511ddc830ffffcf227105c59e00702f061bc32b5534e28897d24b7c09bd678f7c3e24b2a7f4c01974a7944f60da4ec20b5a7a7405cbd16505fcc7ea3f68b61d96654f3421ecee6bd9917f9f72b000bf9eea64dff70b9cc7f090b0df86f1703e8ecdea89141615d6c5e231d9db8fd217280bc5bb5fd16602c383c4f8a8ace897066caa659838b7eb6ac7230dc8c701a0b6ce7a4a6397f167150825f9c9105a318b7df2981ce5a171afcca96769e3d6bb5665208cd80b046065ad37466b07429ee386d86bab853754557f41d789186f7028967d8aa22520a4b671a0c1bdab0e1b72a8984ed8d89374933ecab54f7f7908474a77d57d64cba02da21ddcf91c526bb9e6df4148e6df35fdbeaa5487ca8ed2af6d502b04432da0b973c43d45d03fded60a40a4e9d54ec7f9d6ff1743c0a212ce75fef6b97462702a771b3d1d63c41ac1fc4414361c7db839fa007f3bf0cdd49ecd7cd1e3f48551d9fcc286be0b2a2db0ea2da21d8d70fac610b0d1ea97482c77a1135b9cb6648baf2b41dbda39c4532aebb78b0d566a928a600c8cb90019f2d495912f1d521422b2562a304407e5514c676e23841c853e1585261a855c08765f694a0c9dbf02a2038aae9070210f06e803d4f73e92752e30178ea6ca62df3933e93aa4ad9b2329ac3ff20b269bbff07eeddb7142eb08b4d077d89ed3ec36c02724074d3ce25cc94775abb16e2621bf91191a618cbf583071369294217e2fbc7df1b9dc530cb61f58f48bf4458d432ead966a3b68dc4d7e02202e767d023515c0c4bbec1213fad7e7fcbccf5c6ffbd4265dfaeeb2b230cf92cfc80e3fb0b6d4566d959bae43b03eca861cb7aa69f98b62524d6e6f35ffa630710b954ce7d3f13ab4f40f4c1a346ebf2e620cb8639b0c9555e3d990f29f3ff3abd7251717a907679055ca4b0b0a244d55c2068251a2444276b1314fd8a51a463616662e5572c145779e2ef90fcf8fbeee4c70af09f563de5b6064dc3d9714df958ed5742508f6159300aaa6855c1b75d06dabf948a6782524d0887b17ac7d078ea3ec547749d5a2309ee16e6eb635ec35633c065f0440ae1af54a5c94e8306e84cc57ed3b57c8bb1fb69d41f14d6bd8db1afebfe8742671b420929ea052f8ae971d1f3eeac7488a965a0f2e324c0fb3e193ba5589527e1de10f352ff75e992831554fecc6790c7437167ea6bcd861385f3b27ed103841ed4ab7a93bb0f3aac06fc06704fc9b8284ecb3028eeff7c400cb8ad2826ded05c49e5f03a268152399318fa7f216dbdf53516f61227973b2459e62ed0e818f1efe62a714c526c3e49a09de2db4d46c3e2591408d53628a6fe8f530ce9fcfe461eee285d4a5c48f30c63aa046d1e2ea0f0a211a61de2ddf1f506fbc873066e388f5dbbc1dc1cffaf99bd06d1e930d06bdf3b3c89ccaaba850f1e7334e49896a19a183f7e08f28d1e05622dad099b2ad251a420b0501f48226ddee23c2831e47c6c382db8a7ec3bd3902889566001ff41332680d6e10af98401ff82f7616d4e5d070e3b33657adf066d61e641007ab37314648043fdae02ded29613dda4d931bb9dfc902ca5769096c96473fba6e712b3eef8ac7b7ae6c7e651fbc92ce5c6fab7ec58970e903ad94083ab99f426679c5be83252989c94861251607bcd854a87d4a482b1cec0db182777863eeb49cd33b1ffb00c05ca1935d1e94ca318cf0a61244f3b6635e281b7720e5624bf40ff22f829c61edac4471fa6ceb14189a1473f69614982a7e50030e3528d06c385bfe78654d32687695d97f2820cd9c54f059b3cf636e6d06241a063bfc7687d2e938ff33e7541cf08ded6b8011665f56be44f237e6d0444e2bfdeba05672101218fbf1b5537b9df866243b830437465a27fb95c72763c25e203445e923a511d1bf75ebf85d2ad4ef43c8d53c82b08b28e9852992587f74814834fa6fdab15b37af1f14131b3364055ce4d3408712ab4d099d29b83e44589792636de2b3c99234b7919108b84e9c1e3b49a47dae682bfad7ecb18a305d2efbc85d0393988bbe95269d41bfc611b1a301ebc333cf7dfa80cde983e636d07580b319f16aee42eb8c3aec8e9ca7ea1b8ce31aa5e80c72f2532008b9fc444541c228a18f51af4f15b6d0ec23dd72f46392e54f18a30c0282c3b8fd2b44cbdfd5ce6839f8f5207a4b85cf48d6e9afe7d12141de11d234e77a32a7bdb0cec8c13d858c46f8a54ae24b8d87f4eb6a8d05befadfb4583448eab40674326fdb694cdff19d157b47c66b1b57b0fea44c33ed244fbd327ad6a8af823fee4af79c38f2f5ca771175e6f177bff9daaa17ded05247c6eb9999af9387016c18084996da21dc3108dca3a627931631c8f3c8a747e6d7284f9b445ea21af283e82c70a546e0fcdac4c97f96f671d36e97507cbb6d70e02195aea69495c18123d25b02963ec6475bb8d6cc2228e3e7046799f3744f51028c6492fafe95bcc254525286696233c9a7256c35e5b47079a0effc71a23e09c67a1750d4a744bac68dba2db0d2b9565fa711bb3a56b1fa88ea4487457e9351c33cd5608d0b05e0c5685f232846b1feb9657096485aad63895636893e45f30279741463906be6ef91d77373cd839d0735bd13908adb43381811073360076075d540250adaaba5dcf52c434cd4368cacbd6d1b6b688a6053e0d1a14853af058d7d078aa0aa31d07a022d708357b0bb1d761751b510a5d52aa6655bc6382e3b4ce60b9847510e983890422873092a32c22cadcc9af93b7ec1afbbd6df9600d24d9e2241beb2a128045e36b8327b0f08ab365393e29b4a76f39c87ab17474804ccce9cd331c81ea4eadafacb675f6b3f5099d2cf941c76604f05c6e8691420b9696d76f521ad058cd89989c6389f4fbc6c751d286fbd84a93df89ab893ae9a2e8df07d6ce0e91e49477aaa7e268a206f94b400c2234a1e2aa8b1f44e618d1a23c2f2b7df860e498afab1397a74251d73f0dd086a05b4b78521c23a8cba83b77a078249791bf2869fd4aebcc6df1427c3241614d7b5369776edea310a00c8c9935b84683ce14db2431b07ea16a7b5151b619b1aa94ae7ddba622c6d4098b3f5ddff79c3f9ac7fac05c19d6d424eae352ddd571d77b7c8da1ec456994aa80f251eaa31807e70dbae5c2097117b6b660b531f1936ba6b2fc1646a3a01b7fb4b1834b2e75943b0b75ff6f9f5382437032982fc3fcb159ce14091347348367005931fd12975c23fa8cbd656bc671f2e869953b2a0dfc6c72cd059553b1824c8e5dabb0398da10a5e0441511cb532203b5de06c8619688e0ae5262c96949eb8f34e6d9ef2a432e44c576f082bc2f036dd701c77157d23804c5d6dff59595ed9d9766c645e118520aaca61f485b8942ce2bac2b43665957a20ec4504d4e95cfa6b0f51e673b4825bc1f11584326fa23076970974365b139637decc73bac64e876bc0e1f17c2411d030ba65dc30e0c78560c42cce5c94a6e7ebf3e5f1e9cc4014181245aeb1601f8c03ad8d1a3729ebc8bed0ac828a64b6f40b540fc845af1a6370d1aeea82b83aea81f64affdbb69a5242c9195ae650755cc64df5a065ebc16fdfa1d259c4b8dcee936e5628e43f9983c0d63a6a50166d8f63beda8b34d72dbc2f374668cb9a834938d6df0b268bfb9f8376fce092df3547ccdc12f609000dbc3bbc4a181438389dfcdca056746a243494350af7104c8b95edb679f1a3f400c5c4084166a203f8e7efc2df234e3667104cf601b40482043e3043a8e0e46dbfb2a882a413e7b96e98b35175266542bd97ddae8b5ebaf89c5d38cf60c5c40137fb908b49c7a42cb120ef7222dbe48a2156251bf6e8d550e170e444ab51f3dd71053eb095eceb24cd6852c0696336039312b81d7e065c0aa51f393a5dc2a3ad1638e236f981ae9defb6fab5960d26f57eea9186f32aa379519c54849c9a093758bed6baedf271e5e3934b23b5e16fcf6c17aa9271fe1b918a71f3ad0756da25a6bf5d991986a0e3e4cec2f4c1bc09d00b53c69b61eefbec145585040558c9ff985413dcf134805cbd3c718d6d2ab87f2836f4ea061962315a6f59db4d1fc79d9cc9f0216fcdfc6090298cc2ab07fb2e62764ed06a0664c3b83ed327b433d27ef2fd0a3bb74e90fd28f1c5db3028f6f41f193e4c8c79d574d766678fa22abb7af4d3bf1a3573c907b427c5216c95c8f63baed5607da1255951ee247108cca675905af1d3589dc3cbb34748542b733cb6569f6c903e48c824d0387f99ec975b66ba705e59eb729fef4e56938cd770b602f59242051e49dfc580151cc49aad97f6de5703dd82f09f3cfd4036a5f71559cbad190721841a8ed27179b54c9ce36a9d698fbe75f3af57484bd18597ffe3f1990d8f729e461ae7d6bde1d2cce604e595bfcc8239fbd336350df62e4d4f12c2217e47f98dafc8c1d0d7afeee89bda9fa270bc79efb3392cfefbe36f8560a1db4716730d801f24c039386692809d864e5d76d29508f5802d46e1a6dd86b4ba6ff76dfb56a77d6f2abdbd5a4208b497b94f01a33e8f7de0b61ccc02db247aa30e74c28d6e089add9324ed134bd0fbaee9550472b42ccccf941dfb7b6fc85264ab5dba897ba2632f303b3b2eaaf89787bdd50d290c41219d04c522a51f4d1d0cc2c16f5cb8a1a435e05c295f748eb261cc327b4ccccd5937c54cde20ce38f076a787aadd36d8da9b199cbd519ce88ced29fe34e5aae005ed57e3589c5e3c04f7ee266c4d00f548de00a3b038310962a95f1adfc4dc8ca5f3cc7e03c9c4bcd59b5cdb02103094e4c6442e99668cf08fb253959089498335abf7b29dc9d5ad3ec89a43ea116772d1d8aff321144754a696f8750c92b3c267d53423ab1666c1b4c32ab154328f82c6a6a309432abe7a48ca11854870df99273d32b7d1f182932b478bee5f2ce9e21c347dcea84b9a7b9f0a8aefe2cf197576d667724f809e8992c95025525025978c93727f85ed10d207d150311d460b144eca91d7f78e148a46e17f5b8dd0f2bb366012866c4e17d29a6fb8ccdb06dd3b4ec125d63d709f2bbbd63fbdc40b32c5e8535e6f74e2f69ff90d78396a219455c2372e1355c6e50ce7d052bb73ec4102f81bfeeb4aa6fbbb3fb9058738fd346cc8cfb55e3ade0dc124535b8a5944a8e8324beb1f642260b2e393ca3880d9e990cd1b7f89f0cc47d8342f6e8263d1e098551316656dfd4769ac852c0370d07d7e7bf3965503181a3501a1c1fba0ce95f7e5e096ec49120b5f712e14e74f637bdd15a9569bc4b44ca7f2afd1432ffffcce4afc19d6b6be16c736a045c196e0bbf232a76d48ce0ba1f936263d6b52702980dd84989e91d9af9b9d851215d2eb5f55fa00e2f8fc6545890214e5738ae8973b2807e2c11e816db36fb9d84827f204c2db3854e841f8dcf66a08332d21f2c7474b795b92c7b5d58720ccab2973851499b62f2af810e1427bf9dcd2d5279d7514221cc3b8e57289531a49154e54483d101f18dc13a322db49d361fc948a44a5bfa7918db4a0319b0584195f44e9fd6c9e83c20a05f376f61f3d6d835a9290b7396853878974c05cd9e489bc5ce4759993f7cd00cb7535f718105495b12e11971421105bb1519875f3980477341a3c6fa2b8ffde1b4aae64819c23d3c75a4aabf405f21a8de740f051dcc57f8b5f9afca12002706e155fe04035c5c8eb68cee4b8993df042fd87c728f99a15326e85df6229adc94dd9c888914591ada20b8d473b605156dfe09bfa0f6e24a107b22ac21694e00509992c37416cfa4f6502b1e29cc83e889ac17dcdb0f8e6338c6a059972889d9ab9273816bfd802e02ec08f539f24502b8b0cbe7c6881fb6d00e5b14b2f839dcb1bed73a1eea1fd8e38de8780da8f219d1c3927ab187ca0ecf972582379a00f895e0cdabc5b92de74e8945de17f0e9d196625f68b6b98bcd06ede8aca327649b7ddce2ced5fee9c3603e5dcf5ffc950fa4d411ca329945cb785dc15a03fa62f2b7d4bbc93b08fc3fd7499e8a6c3ae573b64dae9519689e2e1bb2adc3fea8fed845545d38423b81094c9081b844f62bba9809f18fca01bda7acba87f739811a71799e8518b8fe1b191d6bf393b31a53e2f1f83a25350c39c73bb00c53f543363e5d5dfec9cfc54ae4bf9f379e9d22bfb5b217114e81877d248c32f5f0ee4138c59bf3d76077d32183c68b07804f498327cc431447b8b90fdf0e2b213b8e294dd5bd001c74f0195be305201f0a9d54887520490b92a36307c8bacf3b81e8d8bad62682b0c738981092d9a26c962529ed0f27f5302b8ddfa12204d925765ff187790e3b67eaa82f8131a7650c54467777e93d6bb0edc73ac0a54267aac999c37101a7671491fd01b191360189762f92a0ab1efd944901258ae703f8e4e0f99de9bd183ec7fbc4c186dfca783c750eda73070565c8ea55e19f2312b17c096e517fdf90d67e571ee6a23dd9f3f14ace70df64c563f060d519ed9660c33e31a97c04c5fe1ab0b4a0ec571278d1b185c2cb89452f73981d1d5a899e440d170737315ae00340ad8904950ceb4cd4475f6fa2cc1314ff357d326b80a576d1f5a0ed361cfa551957788ad4e21ce01beb2419d0825aacd5f4a5639ed5cf751c3ed2817ba2679fa5feac534df6259166495502527c427f65884bc42895f0edce7a31f04afcbf298c7215b4b44790eafafa54d2ee072e729371fe94a2796ecde000caa55a2e06ea3f4c105290390b5dcde770a8c6f858b5543dddd97db501be54ff6d2e553a3b26442b00936d4526de82d9d3f70dd75d7409bfbc9376ffc5b2147e3c0bcc3164c8469b79bf3993d974badb78505c1b830779bf681fcae8ae7d0ceceeff08c76f6f556e64bd5d5606235d33e02dc0825fdbbea52909a4b33fcb65cd74f01c6ed2e5172bb164fa471719f5dc25a9a61f8de584aae8310d8c9ca06102befe00a834a7218b50868d29b0ca5521781ba2b746b7969b5bace8d579ed483a6df858c05ef4d85140f10662d20880ea2c0c2bc59554a21d470e2388e08ea593c930b4ed6b954f1295ca85257f078f39293e12d3a9d71da18c642bb182942afafe6014bca78afe79fad7e089ccfb4f26f977b1f5118c974db411f5e2ee87cfe4c1a2e2180ca6b56f13673873a35d81584193861af52a162cf267fd4faa1cef385d13c8f97b1a8b73a805276367c75f8b52b64013c5f675331b099ca4f5e476347214e2f865475379a5e7a96e317d0d90854390d4fdfc7a8b6ae4894edcdcb51b3fd81c8d3f8eeeecba0f0fb6355d67c22e2387944543a624d3ad4f03c9969adfe6b5833ff105a7996165b94fc0998cb888c425af889082c57250fb0ffc634a8e5a7c06ab63ad4d5b138e79c9a882239a68e05550d9c92cac2d0f9176d75bc1cec1dc299289886be533cd15c659bbb2b943009861cd243cd2ed4b93f0a0c412edb743cdcf875ff80ea6077c80952c04fb11f57bd010013c88e71d952008f78674e6b8ae9d3eff0603335bfbaff4ad114a7e6593f227b20998bbf63a3b2700cbb84425a8a23d1c13704649eb1258e6fa52ab30a72541cff5401321adaf963a2fa76f7aadeffce5d34d58a35c10f32cb7b8644521b215f653f83d093812ba086b3b4bbe1e032cd5216bd9cff5dc608c79c6db93ddbd049746f9c35086e5d48a7f22003478551384a5a170bcfcae359af361462264f5313c046f25b555a7d54725bd5b83d9f6570ad3038c090ec9eccd421781c31da28c0a8a31a1f4b3555dad96604fd75be2694b103905042acda69ebf827191dc504caa9827b8fe8ac7359776ea670f20ce80e485bf8c7f1bede1e4b2e0f91d8f2397fdf469965eceb767b6f465b6ed19178017c9ab07dc19783694aa320e8c2bd46a1a19a3bd4ac1ca46a8105a6939ee3a512e0687ea916afdb34ba4e33e81aedc35bd357deb72d891f376901ddde352d15adb498bc997d3e4e0a5f921ebbff2b43cdaf39a66e45103d8a6d644038f8752b4b0c3cfffc5c4caf620d55ac26f05cbacd45845a813045b40185b9eb7fd10fae0b77105edb660c09b5accab5239301d6bae9205957de7e684d21bcf55406d24dcabef60d9aa7d5174994933476598175b05724a5e9b90e66211b960841308c26e108ffc1375561dcd4231e7a64b6713a22d35c3be99523cd36c4f710ff0a47899d5dc4ba1928d8ac882006da9096c0716f2724e74d25a5509723e425c7c17b75993c2a9dc8121a9a04efe8e60eb5dc1e8daad10693efdbb1ad5b7b09570e23d56c297fc6e4ff6d8f368597b1000114830fe0c515d78c80bea539f46e91db603c98596d84ab469c8ad973e117fc14b7d3c69371a9d2f40c80f1379f3bee058680735aedfa6015f84e86a608cf313be0e8d3fbf08af38f782c90674c9ca3557456ebadb412565a8f367d639e84e8b6743e6e6cf45662bdd62d81bb43200060d37d756b74dd387876830412b6c3712f47efbc39efc55b71defb9c4b1eb55f05d38c00c248ba571efbeb9d2304ab142c51515f755518c24e0a3f17d79b812cb807732ea695d98528c88a9ecc60173239a461ef8cc5e7962e939ce59e2f381f92e07b904728b8e36c9ea26e2c07d503609cdc307baed2b843743e68e0e3e71aae5cf82f67e8ccc95e18bc7fe58d7efa9f1cebdc2e1d86684686b175777aaf1bcdf8e965ca2f20c67c5d0e6ea80d8c9b1c9f1639a6fa76b2f5f5deaf66978e7d24c9e32a5ac80d91b3465d181571f804350d08c472ec66f7959e3f1599395a77809831b9b0333301bd308721efd5fbfb6bb1b8e906eedc8fe4d9a22a7614c565d19e5c49e636d11a7e2615f2343cf863f63b9ca0a73b08ad143dbdd94efcc014fb9a5091265eed234d07d182d75a7c39edbf466ef0ed708e633698271d26b6eb7de6f5e8fcc1558ca01b7d17835463b427bc8068fd19b969d1527ea5a33e5bbb2a827bae934e78a52098ff6ba50eea542ca036446db4414e85c1b8fa80a79b54f5f3c77f2043dbb5c5b210ed2e4daa7796d4618aee8725bec143fc5343fcece8e91da29950cbb1e7f5dc2c303080c8272ce43ac97c593f534fce0198e3f01018aaed2e7244a4354551b9885299b1aaf362937c0288f2aef05cab554fcf7c7c724780c97f946757d704b376e986c413a5537536de7d34a9421cd6d1a11d584e2f46273e5d70c893b00d4f6e6f019469ebd5994af47ce32ee2c8e23df7eed1d025ee9e5b560a8a200be93ba919bcbd0aec3b0d7f843a03bdd8b63ac648f675373d7e5f4af3285a98c04c703dc21d4126e8ad8799f60922c66145f258cba58a14c68d2f84edcfcab0dd0dbc75b7077beeaaa812241ea3d1cbbdac5347c55c3a1b1e045e5a776df9a0f84851e50b0ab5e605cc894222fa76d60c428c2f709c61b322cebe90452e51468e0cc794889c73204661e9a44d234ffb444d8623a05bb52caba546217e3e9eede154354bb164346b7eeb8f0636ee13cb817c503103e4e823aa067eefb784b2d12e5941e46fbd457b2bbbf7827e13c936e4fa1eca2597ba8e596b864963f9e9f8511e29ac1c3678295fe169c861c5ad4c999813f239dde63d8fa0609519855cab11ba8fe5b3006c937806b2aeb8bb0859716313a9139d3e8aec0cc1b943c2acad9e9d917a0ca596c5e5a950456898c5afffe20b9c617841b79cf32ea1d952ab99508011925b20c5840d39b9579231689458090af1968c5f750262eea1da5dcae603a9047dcf6ea9ff6a07c8a028db17fcf7dd3186f4a60fbfe801119cf9c3b45cbc1109631afd80e8205daa7bc5e03122240fad38156d1d414472cfd036f29a66577ac2d415e08f2708a39e9a79655f465f6e57aa683795f714057276370c2d7a9a7361213e008e1ffbfe9bbfbc283b2551e9a7d138ee85603de56474588e4dc3be22d3e646f5034a1d753ae5e2c10f7ac1da15b57cf54a5d2f9da9200a4cd09497dea189e7b6da748ce1bbb46ff94e97adf4e0d6390c1ef501fb855111988a6a28084abdda5d3a27d98040943861ea34c8d5438a99ea12fcbe81c5fe507c1163b8285e9a278bcdac17afccf0038c166e06cfe3a8a506c452e2ed62f62be8167b193d21a19ccd183aa67f705e7727db92e3c48d72c57cd4e84a133e638dc84c86d86adcac251d966f4ed7c72136892e51189a690c390f58a87e48f468ee1183a22741c84d864c70f796370212bb55c5acd422ae31db47d4280a7c9dbb41f1b8641e20a31ca338af52509e7249e591cfd98ccdbbbfbcf3a93fc8151119399be6b9bae701a5e2bb07309aba7f11905042bd4015472c88cabad83c43927efbe7a7700712eab002e8915ccfa7cced2b80a35168aaf753c70c123a52481b411e667144efd8f3479174757892fe0c13efdde727863cfc910e7e592070d978969d0c6bc18ca0a9edb4a4fafe4b60a45f5bf36e79a8ecdee1c3d766925eb2cb06a88d1e071ef1c92771c20ebac1d1bbe9b1fa70d722b95d6c2bb191287730dce5ac4e4d1f1cc2407e8ddf3a649c575c8e47c25868b2ab9f3ef46c547ca823d8524e954bb4331f194fa80514d97f84f65d5d8245b78d90f871b98c8252af8476a7d71e6a52037fa5f1ab283218ef7b92cddfa045966966d9114c5fe5ea972c6dae03f0be2eb0bd310d30a2e672a26aed4f308e2a170056ab5e8407f1f73bed493df7f237052a6b0cdf39f9cedb740a32353db960538b2c184610782319283076fb006a24e7b8e8fda1cd96f49e5b5ef4e5a5446b0dc4d1d21f3bd02543675c0356eb160a75775cac100bd99af8990e2cf16ed310a98079505fa04af9eb0df24ad8d1293f874d01a375a5510ac5898239cd4377083b3430730bdf24ee347203dc834f57dae9cdfa00b99c6616f017236c818addc44ac7f06f2b94f1fc4a7b262f470a1b37560698ed389ffe01defea6d8c8d369c55bc16f94b897200f76742b6658785146d7b2c05098f96f67bee4f7ea4f96c132140fd4147f71a730790bf4aac063a6d0a0a7174b767929f178d936d3b6a0c292a1ce0deeaa925c7b047f824f49ec9246d326add58a60f6141123c0f4dff39746c579fb57403d9ed07a86319ec170e8e27608158d58c17a414f4ef048d72acf74192a8c0417b8e95225df1f8bc2065eca36eadd9ab106792df419a1b922fb220997ce29da66a5f7fe3fdcceae9b67a36330fe86d76a119fb986d6d74f478705d179dfb46734ab0c450f4714f048c410ebe2512f6a902737a6866869fcb7e79084ca634f9c3937cd54cf04592876151359f27baabe8142bc3126f740f90d5d877ac6baa2a126f5cfd5ee357cfc17470f3216e24944672d975603d49873f56f7ebc914f50ed402c79a9cf407739c951e937a555fabd3ff5624ff2c81256d4936e8c7665e29ba2d0f4d60d8b3281fcb53f47a9c46a0f58ca9f40d92d8dcb69437c072383820c9efd9e02b81234b1cb08da0d32de5ad500c56908d31ddd2b1aca5d772831a82f8fddfb17a47790116ad970164137514a83b2de8d8d5808b0db43bd8705611aae8ac4cc5bd6bb9e5b18f8840d37cab0eb7cb48d186096556c50bf9e3e851116c67c4b6e8f087b79c51fcdf9de0985c183b46cd42a432c4244e2bd67604dc398f2402975920043c1c4923c507e40e1ce4b41617d45cca38a9134a09d463dfe1dc97be81157a79c36893214b50139e5c6eca3e83e6814a44c6d2bc2813a6432ddc998ea38d46b604580b5223e9617a8978ba82e29449b078afc1f76df83051a169c932bfbbfa087105c8589dcfb16c211c5679b3c3439908b4de434e923a5a1696c289a174be8124d8fef2286c0054de4249577b2eb8cec68fde7a398117a26d424a95848cfd840c9786ed28fb650c13ca1aee107b9aa2eef8672a2a33878987a3facd47548ad66e47c13a83673cf89fdaa6e32f9efe8139ebf0c4b72c218691090acee240b0f297efd923f565566078a4ffd55967a02c9b42a5bf2d31d0bb906651d4b83ee602c9edb3245341dfbd216c20e3eaacc0057832eab5f0fe4a28c86fd77a9e9fbdf051a040475dc4bf0ceb94a8665bd670914e079aa37c2650dc45ef31ff1035829228c1ebd95d4a8597c1b471632dba832f219fb6ac34336d9fdd06f34c291ed14c2d5f70c8b67143f6c2b290b365a9e6540fcf9d0217e72df5eb74fe180a7080c48dfef148459000cf0bb8567246ba54de1380e601a8c1ea59a672ec40c03b8c92b8fd68f9f01e6e3cdc910fd53357db2e6baa82c073d88d005c523c005f8166ea04a76a7edd85ad5520572fe51ce53bf0ab22458c3d2942a91c46042d731e1f6958e669237b5f8df8686f84b8bc581422186117ae70563abd2f1380e75df6bc74b8f6be8793059985f052774965fe4172e53e35560016e9254e103939610d88b54264e96917c086182a8c07dcca6bbe27b477bb0f710157a0c2ec53ed83388190d792acaa0b77609e7e88f8627cc9ef527844c6c9a33860504079416a926f4809ba476f00d54ff1860f57e368e3401d7f2be295a7aa9aedce3556a04be969e641f915a015bfcd0d7808af58a51747e75a9881546e656a67254083594d8c4ac32767c4092abc7d0072b11424f3fae19d5bb287d257ba5cf4928c33dfd1eaa6f62ff0024449c82ba9fea9c62fa046395eb80c8ab68fd6d4046c50332b4deacf349cae9c5579994a46c19994f1052af8aff18317e1420f336f4acf6ff9d20117f7d7309446486989bf2414216dca5e8e298e7cb033061fc1b047b68a145cd2d2782658200f0d73754ffe15651c80918539775f7133f0e161f81d3f68174908357542312781b7c7bb462d04152204f7683c1928ad985f30d8547aebaf4ebc56c48353803a258ec8892c3d2f3814a85edd6ec1c5963de8d760614507667560a22199825249687ac4e7617b105e5612ebb62c8cb1ba2ad25949478cd3738b3ea1f69a764ba62e8cdd520e55c0265a8ab73cc25649bf741097ab293bf756ffd39ec5f4c39e899d475618ccadee0f707fe5c6b74812e6714a39b5b8ac2c58905e2c248a58b5bec61028c821fc69f5d1440c9871d13e8141d25c2d89d51c820dd06e4aa7704b3583b78ee3d776e4f230f5f3d73e5c5aed21dc25b9071bb1712c7a57ee964b6910c4ee28bc42c2c818fe56cc815fb1c4e51d53e24531e72fa5f42ab8f2e2fa14a2eae7c062547a3fd22a2baaef96a20c71979a3afbae56070c1401c9037b671729884d427d3f0bfef9a11387dea3fb4c461c3d76c151614b3c789a5bd64dd6f534f0ac776d9a0cb39960882f213f2812eec034e21e9b7325fa5dda5cd4997d34633c4264f752339bebc6aadea67dbf7732b6ad2135f96d36814e4ecc5d6d1fef5bdd44eb00cdba1b75bea3e99db1eb1cc7d017f67338b0f665c749f74cff4c95ec4629dd936d21436e8efb055a1278d8107fa8af641b0f6bdda14c6be0ddf562f7379f2150d5efb6afadaaada8960cb636d8a9f604d0666e5c3a589c0757ede1608d7819421ecd733f6545e7a2a5efcd8a82ef8237842155af20e5c4710fda05de8a4e67fbfd319aef89617ce71118bd8e1603ea1dd730d708921520fe936fa8bad08c5aa57200ecc6f0d6e19795349b138c362dd344895a030b3107760261e937f89ba9ca40b2372f3a44756146276bb0ee7d2f0ed8c34c769f60a2ce4e52487455141b8dc68562e13c1bc778e021c9a65ed8ba1d124817942ed41c2a41e3d08e165781f03f2e59269836ad728f3202ce3e6ac3148a239f90d65759b0cea124d08cb57fe284f9791249ae526e7cfd6bf555e2574aee812b47a23eb62412b0e38bc490c8f8a855db34716365b1c6e054ee44774fb440f8f10661431ab81d0102212b6f155578ce5bc56aa44a94e62dc0c7853759553abc1dfbf70efda5f0ec6edc6b045c79920f86ba38f1170b77622b75b6e009ad0ef8c36e129d991821b367c12b0cb49bda39cba2011bce7aeebcdbf9f3b1ff0bc13a4bc968fa3e487022e5b1f57984b59880f40746ae0cc2a399e32dca5fac1ed3e47630f599820b124e4e75a74329cf79a378989ebe093bdeb3ffbd890197680b0900f63336defc7f87f7d310fce12a68c3096819ad368ad9a15363cb50d5a1a8663cb3d88e6d37ba25dfb329753ec9429939af0c54f8d34550d0597cc1a46cc4fc2af3ba26c2cd48e3791ce2a96c7d2c8eef1b84afc5c537618a322ffba927c77eea05ff15ca6e07fda41dfaf6b0db70dcbec01ea36f0510ef3a4d6af49323bb836dd353a354c8bdf4bd0664d15f950fec78798dd76e94f035dc9f7e2f834f039bd2132379fceb5e78900a635c44169972fd7df723e731bb0a3c2911bed61c57fff1cc98ef3af34d7c4aea630b41f9ee77d58ac8cf698ae29941fda24c0ef97356399141b3fc593b99034d77547cbb542deb83fe26616b939cc47140ec2bc64d170a426b4a31ad1cd713446a0d7864e6d3d3e43e1d6581634ff056c289465cef4c6a6af5eabbacaed623dd762474435f056a299c89d0481eab24331cd212b2b58155bae975f5bf90adaab488361b055e287eae35f7ea6c9ffd0aecb952f3aaf0a1bff8cb17d24d3e54d9a05062e082a9ee6ec7b2408480b47abf1e61d3b01f302b726681435307b13a063c9155aacc0840ecf4d043c9d7194c79adf38987c16e39d22911f6ab415e9c5f44f4bbc74bb1d50db636edbad76b9e01895571f4a177401bdd26a470680af877052229ff9fb0b47dec3f196a9229eabe8ff5e925eda1fe1a338d2c734e694f1ba36bb52723df31a5fcb008bd8b849d68b339e288e0dedd5c056c717220007a9ae2dcdec3c47bfaed0c7e06ac7aae2e92fda693e068bf4a159dd5f8075c6ffc4713656aae6071810c8be7ec61d38c46783ee822c21b92855ffc5cfaee2483b190986b7d5c71ace608731ac82a28c722785901d9b5a1c5ff13b9923bdacdfbb179ee14bff1fb857512333efe8ac4674945970f036a6eb4c21aebec5fa2a506c55e927c4e14fc81ba1698626a2d53776a1b7f057134b5480a8550d5261343b3999016585c6bf9edbb3756881197f6bdc780c77f35a2b23b4d9841ec04873190d53c27c4d3f4dc0d2e61711c88f2bc0144daa90520e2722d0af28ee65eaf8d844e41808f7f7d4d0fed7dad8ee165ef8b46d984c2a08372df6ae182c7a1357c290fe0cca547d7ba57f645e280abcc66f0fdb3dc09fdf51d7f1f31f04d9e235d9cb6c9747f80b8fa376d517cd48930c6b753bbd89e16cc7394f50120b88c53ab05499179c74fc54c282e948ed917fede31b514c472eeae99db5b53b92f30ad51bd3210aa641f81e58ff02574f19e29c95febc895b01fd5ff09f1dcb6f6b80f0b8975d393206043bd008478c0ce064c18e29b618d5edfdae5bf823f0c8c892c9487e1295d2800dbf9cc3ef4316881edb0711fd77ffe4890635ca4d9583ddd02d90ce79262f5aa06b44e0af3bf54c146b8eb0ccbf6135cfc11da7e142255e56b8f48b79f5f926f9d266f83acb5e732c5bd712f996bfa9cb2f81f7bb15b63ec6f17277fb7cafbd29c2e709ddc1a35d50dbdf45b7ddca7d57ba2bebe48f3479b5044a5d7fd3bab246938bea549d257a3f4520b5565476316f363ea7b99fc58138557cff2858105dd7c3933aa462dce00a28b8f6ee0acd128c99868e1763ffd42851f97ebbf7b3a026072bec7f6dc8b545c639931bf9e910e97698f097dba52ee58c8878d2292026263ac9f74837b898883bb388af90b83c78c3dc9244a78d7c435181964f03b7aae05b5f2820960ccada68ccf51fc202dbe77313d505a2aff05915ac3b6ecc695e748fae2fe3fd4d8254e89c132f1764e34c5a711e5179fee9dcb9bbe06ceb2fb3b5b891ef13a0119f12c91f47dc364dfc5a7558ff32f09a4f90b85725bd6bd571fa9ad7c7c610cb068fd13074014d6a763bdd116c749b26df7fe88d7f9b78b2497854c70cb69118b1aff54a4869d4c67a57c21819975137902e7bca9f5a66590f286e827f3e6b61ecc6f4d040453a85f99468634db18e0378173b897667bfa07c476e137e2b66b4a179c43fad8fb988f60c35da02af79f6bf60870a5e8e68ce96fde9c042b9617b60ce4b9a5fdd2f52fdeafebcc05ced62f80d1f63c49b292240aaa25177d6e40334d2eed7569cc458562c4a1790d491f4ef8f8f7a4c67d08cbc3bc4ae159da7ef37d82d3fbc0a6cce60b4f33621063919406deccab4c9d45bd13ffcbd1a0c156e9ae384219215ba81920a2cfcdaca7ee948138c1d3dfc98dae4764485c644a8c22be99605b59a26b0eb0f99586cc68c7e5e7ce44e2266fe0c4af5d94436f3899eeb7916a4498a853d317049a8221ecc6e6049e8796fe630e9203843fd950ed837990fe3376d20aa83c48752b2be0d4bff424998fe43312cb1b5ac69778f6f2bfc246799162cff58750cb78d5774a70046c7c02fe155504692880bcf3aa832afe39891f393323fd3c46e9b4ab3dce0c0f795182685b87ef960959f4ca2c1df8cc8ba9d30e2d4558146ef96dc47470419e93b058eb8a38a410b6ca28c96ec1529ce773a6bff590dc4a4f18d279a278ce01ca8b350f1cc85e2da25529573a2f67ec4ff921899645ee02d7b96787d7fa63839f499842eed927d0ca2305cb475c4226f5360d4442921d8f6deb299ef83416f4a8b7a72d44f640ba9a791d145c5e8148ada47144b3d5abbbf269a1a6204831f56080c2a0b338f444a247525e7b48b32a9bfef17c7406b941297476374080840004e0c8145375f8b1794371a5353abfcc2eb1678ce9b03eb8da53c1774b20340b294eaafa135a9d7c666c5150f6955a5ceb321b904bc33756eb4b83ea7402852559770799b1815a31f6c70a1c8549cf4f45d83184a194224a07364ad9d8af7791c41a607794c678c322cddbb3096188cfd496962cee28ee6ff2af6986b9d37c2571b38898e0c72d14adf0d76324d189189090f5e3edb98fa5402061063065f15c5a4dea39af8a9a542a4c97b0f0c099817bce1da71623a398a5fd5c8509d052082d9fdf26b2d0521d98f9ed20f4e8220c2c0a3520a6d882c546efccf1374634104f01f6425c75402134932315b5412e0169e79d117c4cb40eaad50d6f6c1a4183cc0776377a82cb58dc1ade566102a1d6caff86fc41fe5c847e717fa5158dbe2a501917b075e1f994e6bc2d7a965a658a502b7aecfb4724516e76a959236b41f8527645f90d8c417473019885058fba5dcd185452d91c7e223469ede6e58a62a1aa443b54ad6cb20c554dfbb50c5e6b2a114f50413268558d0e5a4c9f59d38f0fcfab7c27bc6521f5344e07b6a91531e5abd1346964ae4d956c8d559809ecf6b24e5e099174c5d531c1a88fe3b7ee07a9bf0e06d7f14db31124ee6a7d6cde551ff3f118200ced177ffb26e8fc22fbb49b2971ec7d51e06682ffb65e293b8107b69a01ac1e46807c1daf2063c2255ab024706470c814eb876a6d46fe94b8d16d151e7ea6773651501eb3dc67ebad3d3597af64564fb725289dea8ec2883c5aba568790033125094faca9027e854ff6b43e416204670ec42b39edaff01234267bafb8b143ee218fb686e55deb3bb3d15cf1120ef71c4e0bfdc83533fc49c618c734b702c2d7be89295a190f54c0a6f683f2f1729b6987c860b3df1f09586709a6e1d1406b4885b03519ee7b93ff819e10472f418040634f0d68158a971ac802d5c4ef0609f708a5e07cf0731465abb3da9469426302610196b28fe4cf7f07fd3523dbbb620059d528717921107c33fa08242d64c245a3c6ecb3e25e8dd5dc16ad7d1361e9633404cc4e7825f5aeda9876aa475a5db29b1f8b05b4c1bbf50c542a39bdf3e1e6288a999c6401c3233bf5344769c1f75de63fc082a5e4b6c6e5471594a314eeb244ba0b1e9b63cd41ceffb3b9b9a92ef3aaf5f726c2e7e1fd12ea765d04fa8e4645a009e4f0fb67c91209e0600537ef9b5a4ca36eab5cbb18ba7ba90db6ffff48abb44b387b47aca1a03086e1705e3222d259dc15527499d80229803eb81f354fb0cc0eba0519b154499891510dc9880610b7add6e72967f8f1d8f3d87aba01dc44347f292e737438b584e7acf86724d43639751edd22e8388a4288b23b37e5a16a7ef21d2a33b6a8088be3ea96b6bc0f5e2a01adbe0f4bd6be7ae88d1fa561e7c79350c23eb5cfbb7749671a13ed95f9b1783ec7a486ad937645d982d66c89ee27cfb27cfc395098e4194e0b34e3dbc08b5366f8f6449b67d8662066e57bbb6a7c4cb83734b0ae8e6fc2e8bef3db846ecb0d848cd240608f04f6481a082e865f64b6fc5a6df37e4a02ff6667f16abb8639b3a297f8c46ad083371d3fdebaf3ca59ccf78be72f6b3e6bd963df8817a80d5252ec003e6806dfad7ebc52962129f226dd252f88b22605c660821e90e28d27607d96ff6eed19060a16fe3cc9e0ab09b624b1fc08a60656e50cfb65d072b5f8c912d6c618773beb922c8cf3e26e859a0f1ee77d60543ecacc01a3c99c3ced5dd9f53bc5eedbca03c645573867d7a280e2756b2b0265c1eee48644d5bf8a6a1ab8582a981b0fcf3eb5f9ac0b6c1dc1b003b045a7f693be49d31d150657ab556bb40785ce87f9e79139ca5587225acca00493d3b5b9cc539c0e1d2f30bbbdba6e9f4c5748e82b13764cc804eff3fa0b3de0fed3f2371ef08b6fbf0c8f316cc5335f13a8b6556437167c3263f865307963418571d1d50e21322ebbc5c7e21c994c2dcf12438ad2de063e9c7e5e877c3891af46b2dac118463571be5c63ce144ff79658331405db9b3ba10c418ba8b8cea601946e144f0cde1fccf99a308cfe858f213f847f17cc8cc4099f06e4ab4df7f1924d6123e7c54e4469f95a3b19ac9b08c79fd0ee03c24825cae2f57f5d186c550064dfc213e446048c20e3a43a90cb79a50d65b79ce01833f744a9f83928bf09b7aeccaec74ef827a988614688f83ba347ea466d939df2c2008c8ed771f04a6d8f638c51e2e735b6f0cc9082814677a8622c524d002da50cbba2f45be27ed472dfce3a712990c1de3d9f4eada55bfd6d7b95336639246e67553d6988a98c4a268051c42cbff930529a8a184fe645a0c1b25c9a9e267597a44dbc5cfabfbb250a5b0d957db10ac9438f6d90b7dcb8eb19f8744b929de4c9bd8849cb91b0b9d21bcdb3dc91eee63e938b69a7d6bb81b7fb62f9501f1ea5b315a06d06fe84e485a6f60af9cbf49a245e1ecb0c27b2356a48eecbd356cb3cc721eedcee0707023b3fdd0fb5c17ee648e12593b02696cfeb37fd44350fb934519b5430cb797c90618956dbf3f812ca666e099f4b52664943a3178f50d1364276843b49f89d2ca5a0f35c6f9391e33459f2fcde79369d559fa4bb7d16755271a692604a6fab32874a69f23046e39152bb3912d2123c7e6d5a5b3bd47b00ae8ea43828e62a0c92a866777cae7b65acc30cf111b1335de8d0927a2f7257f023aa460d5436d885484d1ff0871815249a57ad76f072f62f9a8d0de02dd020d41d5577c43958a77b423b18222b0b711970df817ca4af34c8fa233d2926598e1e089ffd701671752fa272aba96fbd85d4863c837b590b4435e6c2fd332e00532d6cff459146f6090538fff5eab5c18545c15dca074ddfec34f5245a8bb295f5f9986438c4d21b5b46d25fad94bdda1e270c9aae8c91c524f12de01f132d8be3632e4bbf60ca9d6dfafa977342781d543bb23afb7678458730a6379eaaf55a24a83ee19190b02a994352f2fecbdf4a2024842fc9e1e5d2b9dcc147f91fe1b17681967dbf003282bd2157ff040c0e8a4135b61423e132a16587f16ce62ff5a5d10730643b3a944652d4c619b1e5d396d6bd28d0b054790e356f290cb084425010e035231bf2f200296c4a9186171a2eaa9142e35b26972c2c8db2c987d84c676506eb9f9d825f548e27a3865314c3461ff67aaaa4be03c4a15e8831a9b1234da56543ad6aa07d9dc3b8ab928788927d5e4c5d4f189b5bb77e35f9c7b10e5353a6975dbdcb33d124c973a329d8f4cfd352a7085085c1d8cd5e276188ea2cebd0c8fe2e6126bf2b4438e31264ad6c7492fec73c3322242b03f516d86d822ab60a352b53841c0094fac316a3a058413e7c9982015d17e0c9ea008c34495ab9a83cca90cde36ad22762b49a9675cc8ce83954a209df8ede567e934e5b6bb518237db51fd60740632ead7398ee8e73586511dcacdfc57cd1871de8ca9405bf1969a9189635a1fff6b848ca732ba9dc24e25025148202b0ad32557b258046d556e89ba90fc8167d4e9e41a1a925ef757b29d421bfccb58d99759858b5e7ac85d91fc96c985e8e9567d340662d077fbb1a8965ea8199474b497a6ba277c887a44727b7466acd275dd0217b0b34576d08b983a58f95e8d2fcf556166b430ee18f41680b3a513a28cb552dbc0aad75fb10e0a5d570324bfb398c85c7b0ac870f600f3dea76bdf47ac339d3466230b2a9401f4b597cdf588db3ca18ee0c5073ab203c4da59737ac7b3e186a8a96e85460ff3bff65a3b001f05b33d08b2314d8130759c4f05b60dc5dcc30f6031d7ce37760dd026514a17c82288c22287880a717e97fa2a6f937642cc6f0845994408df489a6d4516a8904032815fcbb51da7facd2ff21b744e574f451805abff1f3c9e5e41f2d634091e511cef3bdb4e1dec9d91863c176c652f10a31cf7b71d0bddaffb67e8a1e576da1492d7be5d4e339ea1db8c212689b0b62a5286da93cc2d7b3774e3ad9e18fe9d31886556b376345fb359959a8ee7d2386fbc80427aad45f62ea764f746a7617a03a4d7bd03119cbb3fa1ad6ddd2782b33ce3b5afcb4321e3daae5d9e7f2858bd217a1d5af64432201b6b8fc75a3d8188540d3507a06a0e5b7e2c33f92a23cc60e837b0356a95338dbbe41442c93a78d4a5a7572f1dbfa34964f2d13eaf2ab6d4889ad9fd3e398369c604aae0583d6f94104c77e69bf9bf45025b80f04ab21e3dad84d67676d4a35e8fe0050b8c65338ff620dde1367570ae29a24f574a3138e64a3af6c0452cfefb6850dd0016bc3819778cf7f8ef33683214e6525c4a1e5cb6217fbf659875c8af20fe887a4a726f94b7048f6a93f62781ff6417325ce59899f30a24075f05a5d7459afa71350d01dda6c75d9429af4e7b97c783f9e3904c4adc950a7928cd18fed6cd304d9cf06ce4586d236f198d07e50bfc795aa0cdb2cfc4fea28e0349ecdb4b191a53b3e2405bf96ddf76a254eae1d5f7525314036c48450aadbb15fa23681c49a39a47df678f676519a8256c280c335cc057803e05ca97ef3eb3493c28af6687d352fb8aeba64e02d7358bf2c25b48fc60aa829deb3531e96aac05234d3d7f9437586a1f50075f3d2a208bfa54a44a81a7613d1413e16f885e2170c23306c17dfea5eb59f0af036103c883c721bd4275d58bf231018da961e34ad5d039521e64fd4d68e1afd0946377dd6ba14e3a0247b34a6e22bc53c8173f8b2fe7153cd9d3b182b15c30ba39214afb5d82938dbe8857414eef4ae5521eb4587c0b9be1f8f558c02fec5322e5ac74524c39bd23160bff66872e6c75813151d7f18156a4b63f4b858f65ddee919c529d0ce32cf26004d2a1f7ff2be6da230765ffee4606b86aa6a4850f64585427c8bd254e014ec90bba5cb7a5284a6871b10018e687f5168b326d0fb473fdc9519caf467cb590a6f8b7e26faa9574cfba8fc83d0968077943d27501cf3301c08ecbd3d1f29dbb084e3ed973cd1b37788fef37ba63ec396723da73f6513e69cc31de37a5b72ec5e7d3fd318d8c39d9064f8fcdf90ef8905160f624e6c3569193c5eba5960475728f0e4d14cb835b7f03ea6a4bddaabca882fac84d340f5258f10cf2b768703c7018a1b3afe47422e65539b75fce3db525fec0ec42d89b50047253c3df236e82f0dfdb9d768a330ee5c1473324a66357b279736e89ae76d2cbfabf95274fb6ed6f81540de96cdb24a74ce3af98d1b27cd99e85509748d72a5ce0413e79cc9aeb5fc95fe5e9a3424d25d2ecbbea171bf1992d049c18d81e2d784b27af7d8ccc78608c69185109d69766511c8b077d5d5cca76ac84a12866ce699d93bcf215db5c7f184e66aadae573fded6ac8a9e369e6f1a54df4d05c50de4c41abd1045ab4a9cefe30f1420e137f1f08917c59686adead4c634306974136c18e6e7168462e2e91f8cacf66b82ba049775c87ee0ae741694714149c5f20cddda2142c06cff0aca7c044080b31a8a32a2e97e1ed038da7db12a5f80ccc82e057afbcacb588097b641ef5ace853893a9c53ce54a4070df7a52959dc7518e42991dc54588ae01786bcb5edf5f8905fb14180bc42c2dbba2147c55e1884b44e6b1e71f6dc87767c59e106124e0fdd5d44d0648d36146d0a745d28964119f6cfed20124b70dd396d4e04b222baca6970bdb71296618d36cf2a9e96059e92ca8c46f6bc3dbaedc6226266b4be5fe8136f5f346c0d8db210afccbad7c2ed340ef58c013bdf57865251e071296d670a9cecc06d9b46568206338615fbfd604f437e60c7ad4a743110abf9be108477e91c1dbb4569f6c2c4c84796fc71e5569ef225bce9103d35f4720f387ed7c2312f1affe04fe29516cf42c4a1d9d3de164de1623756408f14e3a5d26237da47617f4377ba7f8f3bc9208cbf5b25c4227ef6251221b245451e237c4f7865f90c6bb253f477219e3fa3c99ff05d3b3ad006960c3185ae9e3722cdf1bd7712160ca52674d6c30620a9d74cae72ea053d0ec20da0883752141c5daa60ae8087e08497311988ab3e83054d3b03befb842770aad92d73b25f8f789b176bb179da0f73341f12ef45960a2e407b468dbcf3252dedcca153642959e0d00588b8c5e9ebd621aceb183905b59c84028c52f13bf7634ea633cb493adaf0f42224a4b4e85ef0658c3d15f37ff69dc6d533e62e01c4aa65c59ee56b9b28da25252eb3eccf676610133b1e55dfa7383f71f6bff1443fa629a5937eac63ca069ab604ce86f9d20effe6a1ffc50c087bc6fbc571309844998a72735772e4bf761598ac327fad3419e4901ee1116e4b76310427c8dc607e192e44d0ab8995bd26dd1eee42d320de634ef1fedf62812c20294801ce84356b272896c0cfc567acaf5ac02b61e87c6fe8b63aaae356fad1f18935beec36c116b615bc826fa952d759ed7a969895a7cf05fd7ebc89ec7ebd0b9dd00c97b9b5dc2ca600c11bdcf67ce8193b40fb02d0dcc7d285a61ae3c058315fae3567eee7aee4e4748ad64f063ff22de73caa99ba24b3182543ac1f76d29c2d08ae883d408f07c0214f44385a1db82983e4b03e21af7b28899aa37d84926a593c144cec5d4dd0b69e1bc9bfb5a17943252d748cc17df0d3aece7bc3c3f46b922f4642215ce694005d6a830ba95deca81fa07b030696d1e40e2a92127a753877d13441a182a7f9268db8e7c5d5bc1eac7f6f3e96cf06cb1b0b9ae2e981efc846d547e91c8677aff49f3a37bc9a366b2f8211141309149c0e579154bf54c4a6f1ac87a8b1ea7655209395447ec1d584cb9b76767ecfb5f4185335d0a4cce5fb01e6d12d7a61fc4e5ffbd7035b0b6f4c1999efe7c055ea9cbe530243f31e930d69c9ffb0380b154507af8b3fa72a30b0501d901cdcf0fb0c782c2e8853ea8c49781908b887d094805fbdbdea8da083926b299970057dc9e94741194c3281f563740aac40d84126e34e3fc099f02a356bc0aa3963403aebbdc4576b150b741f9c9d7d2a03f72821ab217200d05b98322c1c79040eee6e191e3eddf0d6f40d0cbe1e404f05b034afbb3c020a955420f6df976f18d5bed60417af7677fb8c8d4a15372ab970cc29b537c4ceb09f57275d3bf87c057cb0bb8b03f7e22927c376be8889e2df236e2a68c4bf5b8189f4d6d6955e18d0407acacb1c2c1f81b0240291b766282bbccd8300faef502d17654a38fd70802f06e739fb7ca4d13517b523c3ff2e9c7bf09df26ea33b3d7116c361f9f8b5c28c6fbc31eb2cd94adf28d20e5e6d4fbf1587bc1110531694f9c8665caa2566c5a18baedf8b1b64925469e4e17580206b23e164577944f8cdc1b040ee4988b32d3156f5ce07e82076d52c1d76035258fd697d66fd957815608dac29200703d7ebb8a0bb135d826d9a36c10eb1b596ad040e4393d220d6cbd827928b38af2d55132e1e57de1d8086ccf148cbf4acd46fbe735965eeebb72a01da62bd826b4d7beb02bc7e406c6b948198c0ecfcc92f8d22671da0a0e57a66ebc8f1d79f52984a290edda4e834d5343b033b5514a8636228caf5cf4f2350f7bd2510daee796a1f3b3a641ef44e1a7123d2e9f587a89d272a91a3de2d011d44168c631d62c6b41c6dd77177eeb8bbb9d4cbb16e8bf43ac6b6f3f73ca0cbd2659916de368c733a066760c4aaf7c696fec4090dfdf3cbad5b0b04dcec23a1399d8a08e630305f65840053fa147a9778f206021b5cf9493576bfccb6124f4f3a7fa50477c7404ef2bd4ab0d5f44c036b8a400f8bd0fdc9a1ab5658adfca2a6c6b39599a720537f128a325e23735c642976bed3382f57ae7779d3df8ff6d31ea03a33d23acf955a177b3a5d3f89246ff7942cc8e01dd0c9b36b528dd7e40fcce25d176d6f530b309f908815bb674017a0ce61ef225d5d7a8a3160d61630cb29097a51f207ab82fa934692ab6c8b48210be7f503aac5931c87c6e8c69713c29f31564736b08820287edb853efe21919244d8f2bd1dfa34bb5502a914604b99b48387e4017c9d6dfa170466ad9c45f389a703a04e3e509bb477aeaf62e67965e94233ee2576b3517095bb591c2197f8cc42a2970cc03046b64572b48d009b0199e9d1f0a470e9f511fcd76980ddb173e922486f621ade96c2f7fdf577232b47bfabc42a0ea53a88d985201898dede2741431c08a41610f8eb4678b922c510f6fca1b87b1182519e2986ea2781d262803f129edb2c4052068487301267f51e05f7b5792920b9ad7f844c15c0cd544096f13944b5d21defd433d86dfdd6ff293430841c0988a57e25ece0cf5b1ae66f4b8a6bc06271bb3ab85059c07f5a5270531226dcf7ec6c13626b0a0957b89ee1cb9b0b8d317c60f32a0f7d2ce4790d45baa1482b128c1372772b8df11de691f3630e67aa9bbd9715a551c61bba68b6aab094094897a84157ceb06871e38056c5da0952986854c2a5ac7adfbc2b47f16f2f86d9db721fd70aede8cca33cca5c3ee98049af0f2eaeaa9fb0922378cd5906d72b6370f6b44db9613644e9836e5bf7d3e2a79862f255a6042016578c9b2eccb1b17f71461bcb9c740ff5cbc8b4afdda226363a4794383985b8db976053c6c65d2b628b5af51acdf5dd498fc1991d41308ce590dec881037f7bb505ac94d08d672567fd072274f6afc3b41126958c0797d9b60bbf8e54a6ac9b04ca719aa2cade68ab2dbac101beae5c12b3c970f91d69a3aacde0187128349c01cd57a26290f5e75361579dae44ed9fd44e42479171fccabf5c535fbbcf4a9155d5c10b34a2426cf8dbc3fd2ee823a3caa5fc2b8e418de3ee15052ab8575e681adfba7acf0b7b043ba104b0bcc173c75113be065650523b669844b418849ef379ab39500ce145cf6617039366b517e2187264ff04eb4d87a30185808a015b07bb3c75840f8bf4ea6c96800ee346597c86cb2c282d6654a3db711715deaeab7c8e1ff69679b96582fc981d430a9beaa61aeb92375766c7641efa17bcb411b78b2ec26d1153bb425d7d6035c105295d4aa73f0a4d8e88a54877e6a2286ec0a8aa450be0742cb65de46257f5a01b65145a356775f117eb5076375bf300cd9619c67a632df0866ea8b84aa90221ddd6e1d78164d336204e8a57881cd005bb8341222bd2d995f9abcd81abf1f6dd5e402d105fb600f426fb317de39f75df762e24d9fc92993b6d1cbb505bdd338769ad2c2c541186c25b02ed6f7193c210ea4e679e22e94e34b2fedb3bc4f66206ac4b09bce9f614531e13dce03e7fb7cc6fd49cce0e09fdf2bce86eea0285c9fb0a858c72695b1487b316a35a88b72c1cb8cd4c9ddf3cf5bdab0ada1b1b087e4de06ed794c3a0ce0f03217f91cee778d450cc53f78c44bd9c8a1fa1c4d2b70621e49c0d7ff029725bf6541ff2e58c8c62b7a1ba5cb344caa7553c85d1dc15f36eceda572edce3d0d887be36147c1d741e9b5dbfcbc54f089846c5bd38a16988c1bef512522b248e3128477f15f7d25195599b25187abbd7603329e78fb50285c96a75b5dc28aeaa3a74c304d3dd31e73c3470647996513b5be7dc1245d23d01e6b1e8c57b2866fc55cf18ac1450519a78d250a479412bbe7e2cfb41d9f922400095c06eb37dd39650a64a483f9abc7564b8ce07f807ef5849e135eef4f88932caa39024e6a9e153c5325cc09274ffd97a0c24db85a617393485a7094d4e37bb9ddbcab5756ba099758ed28f19d947b804e08d6651dd2b379d06033b1db6d20526c4b5a4e44754bf5d0c629356364dacac75787a50cea98d8eb06d3c7e1fd3790854e3ccc859d2283d63bde1f956f74caaf0415f2c65047f1ad4744a52d5c02c5f96d3ca42c0de8793bd88b404c87a32ea51a9d1edbdaee78d73835c6e1b374f872b131f0287951370f7adda50ae873b30088b0a4a70f73ff521ac347b4c0872c3a83372d677dd2e9a1f041a56fba0f85b191dd6575d93ccf3c5d5d50f049438fc7ffa6837721e342bccbc7f79338d705df6c19a3bdc0987147b40feba85e166faed8a6c73d0dc5a28145ffcadcb18531fb16efc389c6b62cd72a270dfc957751efa6a31b25c0b61b920578f0f651e0c01fd2a09a080eaf502503ac0c97e2edaa6390e1667b1f77d3932fd0fa92f7f7fccf50ade3c60bac0c4dce3439ced4baf4e77ffd293d83b85587a11e95929254779387be6f4cde0b61aa2e38a12414b40a5aaef72011e0fd10117dc2048d2023a52725bfc301b194a690f9ce55a988b3e77f3894871ad04492e277d6d24744e8fef76de911a1b24db3ca1ac6de08ea5252116caf3bb8ddd94edb5bfb74811c72a16aacf4f4f3570385337c30895a7aa158ca8bb7ffecc21306eeba0f76012e22b06a1151cc15a8eefa808240bffe319d8c98c35b64b94a52266aed48ef2d91e974da081bb95493b3d987077a1e6edb92662976d52ab77bcba92f220ef1ff84ffc0f5ee8e44d1949756a5f88d58e4d963f60520e230ec83384d34a0f6fcd612e2ae4095501963a5af115189e5a282877ca22195ab33823c4df019ee0a519949e7287f00ecca002e3a91de5cc2a4cd9ad83e15c7a04c6c44af5ac5a3aaae6e4425eafb33e2d3c4883c077262bb9d72cf2fc0ef0234dee9137f7f0b388dcf6d71fc277e6149ac4d05e0232158231af7634bcddc968d2671e78552eabafc697deb2f6161839380b6f081cc420b4d479503fa8350cf629ada23d45adce0e39511f31bf0f8ac7bb4e6cfb3f2f8534a5523a96b3e50fdb78e77be89970a9f9d2f3d0f9e15869f339aabead4517b92f8a6e951c07fa740ec6a8df5be58e93518a3eae79ec1218bb7a481821c2efc0d84c52e1d1802574680ca52aa41d3f3d2a132ce7ba59302e42cab45695d6771216b75b65be01e46fe9cea6ddc43690320b5a3922b0dab356520c7a1cd24a9061e1abe34dae0f3562cda24d3f86861f58d7ed2d274272f43766cde7724991ec5944ab7710a3479917a9e6b94699272fac3f87df71cc77299cffc625d2f387db16214716c19b4f9ca6f3b61ea12bbbc265d2772e24250d82f4efbecd032cf7adbcf43b0d23801749c827e978a835047a5207f7358263a3c9d5d60c253a8c53d57024a9c93dd937f7413a6253fdf96ddc93b10d59fa44272b206cdd849c61ed80975fbf80fc842578daab5c379a2bba093993bb243c2269fe520dde8da84bafc6ae435066b32e603901faa6208b30d375a36272ecdbb2226217ed55ee7db62fd4ec967030c3c43d25a6577928fe70b86d3b2f676981c080eef0db72ea9f6865192306679487ecd8fbc1bc5fcf6458c3f262bbeae9518d9ea96e69b47daaa9ff32804545623ce6ca0969729cf0af3ef214e1b6665dda8f0a43056169f2a935e7d6d2ae3a78b05317575f528226308dbe754324be1b720202a9da4e2e59a4fecdbdc02440b8337fec91345f01417924dfd9b6f61c015b6e0dd797c9f80b8426d2a6c7e736ae68ba2f80e1ce9286a0c43fb95f1fcb057cf1836b9f9c0578bff51731e1ff695c4f3b21be2fb5e7a2e7e6670308273b2cd004698a4567ecf87de557e25cf25f02d0f490ab65e0bd17e85910ca05ab77642f8a49f9159679b2de71a2bdabb362618363ebdf1de04a5747f58163aa37f6d83c04ed33c483538358e25848cb983dd68b0ce30b1b0fd974e9a0b0a6c84419857728807b9fe09f01a604d98d278d002480731088c9503a08c1b84f18756b25ff74ad10bb695ef9829f42f5417ca2f53654c8862d543f1767300a4a856081f2b132872cf86e55ea51480105b04ea5ba3433076806eb9332043babc02a979c4eae66ac3c186c4feff98286a74c538a202dcda06ab1bf2050357cbbc3468c85531f562a1ef2e82e2fa6268d0db5c5b0dd5d540401a20c33dd8dd3534aac63f7e03bcdd83374b1704d15c22dd5afe0423ab0fbbb08e7a1da1241b23213ef741a7d65b1a62e535fffdaaf53df1447d9682945d674241eed50d1e7b31a37c6072bd3eae60ad1bd9d0cc93c3d179b1675cc46166852cc9aaf555d70d53cb24334e86a6cf994153a58169a29680fdc92ddad8dcb40f1fcf0138776486b3727282d7044238bc7217ba0b6c9efb069e985e8d8c6efb72b65bb408a72ff36e067aeea8033c986e6ef569a50c6ae023a8b203d43c69c829bfd95673d7c0b583591506f5b54a2cd01f77ca0638ba73aacd6584cee6945e02f685a80270ce08a0f4a1d1b0375424c5a0ba7dae854b59a27e9fa752d397c69cf4050de8648222e2435be0b90de039133fbcbdbcf05216634ae69855ffe33490cf110c3d6eeb894e5d83983c1b9ba7ee28834ededbace492abe86916f490644a1fe6a1eca0cdc270e708f6f1779dfd7e8b7a26c4c228b2491bbbf4ec9938d5bd533d85991eeb363a6c041f3488af1b3517551cd26f6ceb4f338701623adfa5eebee4de14db7f040491b529947a0db1e1f17ceda6193a84254090946239cc0966d50fea059dfd62fa3037e5aea80ac7fbe9b960dc0f1b493020e74fa7d39c8d44f136ae47fdebb4970e122cbcfb0f20b2f6213adbafe9ee2fa85163cf24d75cb48ea729e575b052e6294a4f63035376a381f5f29c6ebc5dcf7d7c107aa42c847375c7de2079efc9c1b6c85969c4e2d6141cde3950bb559981795132ba6c1519d835252af549136ebf200a1ac517170f43b492757f9eeadb22c9d986e53378543e5e4d511de51f295f33d2c65139257fa6fa6b2289c79eee5862b31ee091cdf4f0c2dfd2f4cb680199eff58649708af1d6b7bdf62e225ccef3c4cbbf8794739fa5c24f2b94fcbcbd4f0155bb19d22365f532457a2de0f8742d1e7b3d1d2e44a0ba42f269be99c73f14285a81b0b7e6a7e5dce4719835e6968da3edfb1059bd0c08211993ee48232c463bcb20685025f4cd22b9cf4384d9f4efdeba11e4a7a2507bf1174075a7f7354a8c80573cb5e678795fb0ea0fee6c43aac5cccab306d3971ea53fc10aecfb0c8d24a77c3e92e8493c5527767ab241be5c7016b4249545ffbb9bafde4401af65c554a950d27da4ca135368e3eda277cfc32e20aa09f938ae648cfcdc9dbff955eb3f110b4cef7014d96f1a5c1e60215ef8bb3b475174cf69053caad38415d4cde62307ad4b42ee01dd59d037f5b68718b1190851cece19931d45c95a4e28a5631f65e1f2b10d6cfefdd10836d22b54c395a2cff4ffef5ceff9e8371387e02f737c2a9fdbf3a1eb2ff7f1c73a35c9cc23706c2403d3cdc812b490cb06dd9d543555c854582d0b7fe9160d12c37bc44b814f6d287902fab8e1fc8d54c5e1ae8a773ed30af549e9daf689d321e6e3d927c6706fe4e9e8d159296363f19a083f7b8a6b86bb89ac64f1b7a4683bb9c11d7df455d5911163de756b8884b3ce57149298a92fec8f86afe752784983dd00c060c6dc4d94df969390a5e7cee515deec26fafacbb6eca38d864987db846569c59313a302f01b358f7b2271297b48f9dfecc68d477c1fd64f959d64610505c588d8ce323d1920190b36674eb74ca841db050f5c64ba00e0d49802b3778f84415dd0643caa08eee85d5fa150f8e94e7c3712da632f56a4473839dac1f57fdde5214a4752578104a03874f360517ef94d976cb9a6e7d830ca75665689363d4f6409d48ff2b65b14e1e96a486e04ed2f2686ee82a40dbfebaa3d43beebe8a3e7f69460a95986efc31b0589be69e85905bd503a72d1749bca03bdc3ef8a40d12a62a68b860e3b0f14fe518e7dd57c91c206f72e3c23ac71774f4fd21438307c1aa7378c21496526344b8b8d0f1303f9a5d069a45055771387c9b811a67b12a41a59f74d3d718c3bd21a34ab55d6d08b439b91e125e812bdb025f25a3369ca1795d1002320f55afa714a881bf26923bf54053ce124c2fe033f7911ead649084c55bf66d1a92dc3126ea85be9dcef400cf57415192abe5367ec1384036467ecd386974d3c56073f18ef2f4a39aeeb7c4c0604cb3f69af0c4f41764ee363196e381e269e85e75e660b408783a442951bdf8278e987370222e0f66f9dce1f644f7e7a672a1c0df8e6dde05698af512ce2d466a311aa8f50f28b67881de21c4ca3a5d96fc75f74bfadeeea0c7c159ad69402b18e2bd841804f0778ab1636f6aa7266c3221447377ff78ace12f0ee675af98e04170957b91884ca4031108f64c643636788237d97d55250ed31e0d632c11996bf2228784e44393da63a8024f50cd2d254c863147e2871b8a543b67b891b23169f0bc9271fba660474309a8e41d953cebc3f24f5901382a49b90a032f798be6722e0e19d772096110a3f589ce568b0cdd47e2d5473d9af95be47f173c940217f1420924e925d935da0606a0cca5fcca28e37354cbc6cbbacf7371b8bae2bbe88f082c79ca99e9b7b69df282fe817fecdb189c22c5a3c37987788782b745382616dad8c68feba5e6adcc3509e6340447ebe0831047931193332d91cf91461a21d364aa028602b61fcfb695d3476e56300ecbee7d113c732d7de23d8167d8458e60d191632ff347b4220fbefd8adc89bb989e992ea074d130d0049b39123016cb191b82713539aa20eda368c0d6334d222daed9a631cdb32389396c2a88c9f6d04b2dcb5a1ea76af443e7f39b58753064f929d053a3dd8d9118f373037a8c90d139d00cee72f4ed924842568385f1d7a83a9cf50dc65521eb9f08836dba98a739a68f28a2fb2c036a10ed5d713625719e79ce0e04c172209ec43cd30ea3c014e1ef814d6f1a7e5f1f139dd70c392716dca007f23c5c28dffe8bd5209fa3de4e553ced4829a8ccca672c4234920d68d4c3c44abc05ed3c0bd4b5f48801c1ce16fd19a802d8c8282c355ddaf0dbab5a9a4d57e495004e8a3d89701b4d67780a982a78e33e37cddd469286c1ff0321c3d905b97c3cfe6f9602a0830fba58866e7a2b351326161036d48b753cefa3c26e056b24057db60d4f09317e74de9fc23cf3500d1bdf6244d9450a19efc104fda5ad619f9bc9d00640b99b9faf2b98a691b175aea8765a6695060c5d1e5b9410ecf621ae306ef03144e5787dd1d7289b78eab04799e19b4ed36206fe984ef165f93d0676c8de462fb360da665edf22eb9d98f9e2e7639366cab210408565ace468160737e7fa637442b9fd1863993093bd228590ecedaaddb89ab8acfc4fd5d1b85cec62a86b846d4029d30acbd494f27abe3deb97d17be2806b99b56b4c0d11cae99bb3b1269b15b22440125e89625e64d1f60ceb9259ec2e8312276cdb2d9aefdd4159361e23bf59e38649c2366d86386d227b47d06c311d71fbfb1fc4853788138fd230e9b2fcbad0a80000c4f99880da80dd2cacaabdc9b2ab31bbaf91533eed1956becbed9d649f298a8bbfdd0536618a203a1904d915f58a68aaa59c6e4a671878690f137e8f1b01c4220cf88d597f8303ca9182d0a21c7b8896680ba585870828ab9f9fbb50906a5e8e23fd89823a34615ef2df6752eb33862ff07235d77c83a0808c8a621ce00e72496f1207a5c3d540ffc89619dac044a0864f5aade9b88af0fbdd31f047ec5842185b6bbd59d3a43c59a52278557441975e9a829a0a9c62221a8f7b2cc2fd130e8232ea2096cb31cd86a83280500dbfea3107917cbc4a3fae7c73f6f3512f018bef77b017ed9297ebcb88ca4d4aae998878e974932e685ee88ee2d5c64ff3ef5cae709ad3a5f4c9a7db0b943836010a1106f1fe2ba248f4191997ebe6eab058509b774e8293de165fede82422293ef3d25caff490858e9c33b4f6ee40ed1b69bf345294b14534a4507364d87c477ff5e0b4450c3597f9334b762c53711a7aef08d6276a081c9db10f603dad84be38248626c2d9dd114b346343e5bfe300c797e62a50263744dddb4dc7a6b595626377571346260988be31b885b16613a451a848b6f589f846c21233639e76b9514dfec67ea6cf01ea5f9f821491bb8ab186262c98a191485afa6c97f25658cc7c64bae58be27bea4e2497a3eea00873a314b6dfc5dfecc9fd50a41f9b19e4517914194378a181d3a7ef4c81be18ef0670d16f261bb0ba1b9f8cdf83707b6a5e89478ba4299ca99a610cba7cca144416c4bd9fb4fb16fd8c0a53124729872c13098921e8d5a44fd0ab3bd22419d08e1c0bdda18b4495561fb99d75605ee76e29204bd6438383449550e11a93ca12ae6b94c445d1c15aeae542a979464e2388fa6f9b717a70ed41356cfd85fe7beee2cbcea04be8d3be9fc170c436fd689e213d7168c442d17613282215004d0e4188c3595c5ec543941cbebbd832f24549b52ad588aa10c74bf46043f444374fea3e942f56dcb9c236e4211ec807afb78c756099d60c920efd83e2f7385c34b546e85c2255e6891873546b46bb3544306f0110243d82a00c69527dbb091e12356db050bc5ace2ba1edb314b4f6ccb1c03a1426fedb0070a38165e91c017eab7e27b60392b3630f8184869f3675b53e0f6a0ebe872948a82b3f54f735bc02ae9d9a348ca601884017725bfce7bac190056f35d2273760e0fdd53c736d5f17c8f3270d1522f44f1042810177f605725e0b89e817be402a797b05542dcee85f045aecdbadc65023dd550688523f580a8fda0bb26890b54c537f7c433cde7ad70c1a53d9f4fee369aa8b20efe63df8f0164e2dd106877764ef6bc6f4f355f60ba4d180753685872907712a5adb024bd6ea5d5e3bd8c93b94de0dbdfe2e035128fa14734587f0c7fc26f493b0971f8d34bd2ee83cbc644243736104002b7d27ed3b283f463ade67f763e551ad75993652fc7a12fe179d9adc8740104f4e9e0c3dd528dcd25da64c02562ff398269df4b77062c80b41e9ef29b3d18edac59b4e23e424c61cae45b2e95651ed5450d84b9f316fabbccb07f06f1634bd4b3da9b5fadc487f254cf3cba184d7c3bf91f04990f8c15f0038b6fc9d6e751232afba05c4d054a348cd46d3312b1035bf38fcd7f92f526390e4a8b8a46b9c10c30c4d7c9d7595810d7f132cd4e1c1893198cf8b528bd957fa0da4fa05656529546cd72a6b0e38ecef17a1443c0ee964601db3eb03795bfc06d3fed47f6b85092079e9a3b8ad6d5e7f863aa7d4a9f3b661de51e8d041a51870eb4491e07bee97cd19e938d7142119436b1b825ab6abc5c15de36d46bc7dac0ac0ec1e5063638af86291596f9f4aef7d86f50481f4feeb9bbef236cc6dafbd84db3bf9bc3227ecbf3a06632a27bde9e2cad06a510b5574141cd69ec302337c6b38c96f153fd726bc03b9d24615d35046f1119a3586f6a2fa8d23abdd8c8dc05e194df3885811a449e8ff0492a11bd10074c3426fe4c32c174ae60dacc2f26f9a1fd1ab047981a98567b4794478e2ff1f32417788a40d33298d8f8b3f5bab0dac03f894cd2dc19e0c9782391f3e6b17d5555562791cab6cf91a63b6fd5201b95b733882f5c7d5fdb5640faaf77857397d511b928c3c5dfa818221f9f699894e057ce201fa62894c7d1e8c53fe859c9aa48d66316aa4bd45303547d6ddbca06dbe3e8ac610b3eb0a4ec70d988f3c389726cb31c0bcf5fd26e61708272be789fa9f9f2297c2b11d3bf6e56b1f271b67a7d134a728a9dd36c6298729d57a37ba091009d6ff9237514f540590166189c54c5a4ba064953697f5f77e075e2015eb647d432a69e56ea0cbe65d097ae304b185f0b9bc1b2d302ebc83319fb37ef89427c2504cd0bd408de4c7a06cd8824e07137aa69e8ad657ac95a3bc23e6e9ef277a0cc45dc6800eb9c199f9c0a6bcb990d6a06482f3c02a0e6c8574ef99e02c0599274772c976f3bf9d3c6973b35fbe1a0833d452b7405292e37c2f164349c8eabe47d99deab957c5b46af7a0adcb28b0bbfe092d7949777c2dc41d09078cd61180fbcfda498a3b7d8d03f0efa80aa49ef5e8b0cb13b8c3fcd41d9874fee25814a7a81e25bf287dfbfb24f4427e37e21cbcea1c889b3448be3bd0c393687da3c1cd904651ebb06fcaa9d644e807e68a50e91d8e44bc94bce3d4a42d1cbbf5209b5fb84b832f7e1b29ad1e01879c7ed2fc6bda0dfefb0552e226ea8cdcec473518f05579393892b52036f60979799262fdcff85e2ae45b051e77d57b31fb3b7231125b1af6d900073be1b00e1eb8b7d205e9ce677df1c98205e4b77d11f22283579936a1ac82e92fd7a795f93d7666a0c05007d432ddad8d6db709a6d4c72676d3131be47bd2eaa6ac7d4efa2d746497599854ebd4b7ce2e6a259eec6ccbaa8d6f7e0f953c6232609c70f1ed2babb55a2be18a185d222f94c685151835369addff8859611551a6627e68b063030d41e11f7d1c3cf451a2742e606e57b6159fe7c50fe67397d58042d4d8781463a834c30af3276fda66add3cba689f96593a267f4089b19574a9b44840ec9453e7b534ef1a348a614311d86f2c6e61b5b49eaf595abe5e063e7895d9a8d5923024b23eb549bdb341af4397b3becc73300bf7292e2dd0b12eca30a43fa760ffd60a694e5d8279fdb02f9affe66b24bc307bd9e0091cad9d59a385b7eaf75a5c19fb0fd591532182d227cf89d5909c09842ec65976878bee00b425d0824a7527074f4ec234065c9a8ad8188b6d548fc926e484cf3c054c434423d5333dbb4e035fec0f5320e64b94319fd60687e3a482b8acebd84108fe99f92f6a31b4e2b7bbc0c5a3b07dafe16338333b14e77cee630d3241879ee25dfde933e07ac74bed74d974179d47b0d46b63986c0ff5779f7858959aaaba82f09e02f9e4f9803e9dd8f8a8d6fd238505d82c424b58850f0a9ca193a48263036e62501efb6e23dee79dfaac8e1b673fb07ee261fd11236ec1f2d77299a244e6fdbf30a348011634ed2bf5cb7a2769cd86ec433f5501b8e11ecfc7d70983a57288e59270c3ad0e0702faec4db428aa5048b437873daf77a6bb53916e05d00fc347d5c36b97270a71ddaa801475ea049dedef7783f34bbc45313ad591e13e37678ec0b9ea4dc2131cade5fe9c6015df390686c926e26d1a23eedead2cf18b77a1a60fe2ad759463c1d058e7f04c55d240a1ae3c33bc1110ee50f81f889f5260707dfb672bff7ca18cc2f1965a0cf56d482533b9213ab7e659a6ddf9a954e579c25be477383b2a55d27b6ef22c1ff723fc94c3afd8e9fa791a2051fb2bcf157a47f8cecc38ab33f38ddc155652eda7b981475baa15186ef0bead6ad1c2054404b9025a21e9e1aaad68c74245475b482664bbaff0c7ebd63ad127a809df1d7b24f93e5fa51bb049f5976a22d12f2f9e46305c7118f92adb1a0abd7828002c0951338c42e7dc84f32880696f124888c1a95497b6c0159bd0a220704fa876ca9e5d4df8d189e10523392ee9e483a97ba596594d0ad3e231eccd8ed43dd8f6685f4bbce8150b754f9321665b72c9a935d8368dd86b004c1ae3c8d85e31737e356321f71f469e9adccc92ac86052d95b2671c092b4fb49fc0395a1b21b25aab2813523d2c2c6a286d2e0d660c5899dad01c21077d36f131d6a239ed96af27b5966066ec76ba17b973fa7fba9e1b01b0758fe7aeb0c376be300330523931c3e4bee25a44071683940d274223945dd1f1a81667c6bc2210d6b1c53acfec6f1b9db771afa51ec64bb60af47860e82cbaeff32b7832fd759e8a61da750273007080b75df70886a35ccb841e22f23623b9f2bfac79e795f2974dc46a7d2586b69b0b8623543d09ef08ddc6ae8ed1d1e7bb967f6455b780b6c23f460843f40b241d96f0977230992e0c6522aa8fde807f6ae7cf53b6511fb035146025ee701fbccfd39b37768761801bbbac4583d272babba59f3649c1b82e3c3fa88a444c5ac01f7239a3d2d753420ce05ae18cd5b2e9b3fe3353fa8b7b50d79c8fa0413cb3ef05eb28d8ad7211108e063f1c6b1ad6eeb680ffb6afc0b5fe04db4a14c86cd115559dae3a1cff343791a6a9f232e2c9c92de283bfcd6806b7c5609b507591e3a6532500eb5e2f0d6f33ba705409d2cf2852c2b31a3a0f567d69d66d6f17022f4b840a51d38965bf3a572dbad5ace15654a3612702c69663aab17b2f64c57fa8f4e0895bda6a74c9a890047f408b2ae0433673f17fedece3e4185047044c98ad598887bc7ddee60ce44eee2515c5cbbf571f40d541597d1ee25b5b7572de4f5969839903ba3d3c4eb8dc4f27b97ef2f01277be65319e7e7de208173762a9c8f367ce3124050505c33bec9f40e4f6285231c8bdb72a9d92515f021806077bc6828bc32dba8e0ef6af2d11ab3090a366a1c1f69ac5722aa4d2cd93e2eb2872644bf02bd1c25eac165ca87cfa287b4ab8905fd301da89eacba1679279134a53d38beb1defcd69782f2204090639ec9d33213649f05335def31a4032737ceb0baedec314a6871b3aeb05b75136ba788564864da73800c45c6a3a713b24093d55be2327f655b43316afbc4fc0d17479ed29512b6f754e6d30eb89ac7364f0a0cf408b225766f6e877672ebdc2a9e3fcf7f213143ca1bd5913ed899c72e8badc32465997da364c422e12542e349be81ed5d02c21a34b1a4b23bf2f3e099ed47abec0f9010dcee03c4bf3d1b0a825ee191a582dffa0971a8b9052342d5945ecd83ad11d2c428506732d21077cdf89300b5ef64544c07b7a016bec990bfaefd8317e61b044310841880d7983c33e91cd4d23fc4cdb506bd42f5f67ddf0d356936a446dababbfc7c2591494b8dd297d4ab10bd3bf6f0f4409574eba69351f8b2d70df54dd623af79b24cc1b72f1a2ded6b1313e9f72313b84bfafdb7db023bac5419a7e388b7e5367ccd6779672f978e063dd71c30b60911afdf586d0e5ff9f9959b70fa5e12d59f3bb173d405c84a6120ecccac6820a1f6c16dbdc26645be942e14e4becc1865275684bdc37ffde06d19c74c2a42f5edc115381d78ea4398db699b6bb369172339d3e92605b49f5bb74728de8c57068c73960884af3d6a4873928f6f394cf047539f61b3f41859803945b6384f3172ac3ba225e1f3e83a69579b46000cfe419e0576b895fcce75b94eed2a97b87fbe6a2559db73892ddaa8edac162d112865f7b226a4ba95af7bdb34571315b091b8266b0418c045412ff9006ce97e10767181ce5908be4b66b303b76054d21aaffe131b4d646913f870dc76f652b0c42a5e16f228338288b4d1d7e6b429bfae164f9ef818674cd93bbfbcf42935bdcdc5787a8cee2ff467c42aaae2829e9ef2cb86ff2ffce0a9189e337d4396e12dfa61b83dc014c72e140736cb09f84e2ab42f54f9430bdd93c2405c0e466d89f1f470eab644bb6bc92c8a62720f25f838e06274aa9e7dfa144ed1bd49ba812b43f8d888d3c646c69a2b4e0891d7ed22bf9b83db5605cdbef8a2218e561628ccb5947d0f8273de968e57a2c1370c4a0cf507c75089bbe375996adcab03af449b50c9af48c556345c0ff6de4c697bde1cff143f9f394a1e03e9a632740fc87e5c7f2e3b5a49a8668003f7f1801e044e4b4746e9b2c5d1c0bc7484e439918dd576944fb2bc407ee83b2cc9743d191fa7bb3303ffe18219bb092479cb05de5acccfa2b9831c02fbbf86633f3badba16362ed270acfed6f4927ab9d31dc118d8a2177ff4941d27f4f892c6413bef66bf5cfc55ac60618d394c8b4b5ad35fc24bbdb152ae0978c3803a350fd27d43c7ef1bb2f4e474571087e8209e9ffcee452f252aac2edbc6ba67f0681b4714fb3379ba82eee668bc87ead34446437ecdda35ba1c26353c8bed61a08507579d47e01b16578636b07f76b32e4c8543d27b35cf603f00e6f635a46fda80ab917fbf8b5eef6494de391b0495880bd20590abed479f44efd9750ded1f00f3cea25fd1850b3b0b174256d59fbf8bd12757ec53c408368e22d5ad5c3407564cab12a7889fd678eb5e7d1b77f48bef3fca7eddcde7581cf83ead288fe836bf5b15692e4c17069fdd05e4b83e345d0c536ccacb67661ae32873ebadd5260c20ff1750026875da3cc96bf1badb560a486ccc6b442bdcca81678a8c802db43947f653bd535b4e053737d15903e68fcd32143c30959a09e24d8a0458fb1cb3f063ae8a20cb4d6e5c24e354d9c7be8cb343343d118a29cc9dce8f50da133395f68c10b49c589614b1a6e05ba92612f43ff3758216d98d94d074252a48ecc8dd1ad47479e58295271a9be9afe3d8f2bd29d330651372cf7e4146319d813d5457ac7d3a3de0cbbe52c648147c858001e69ffa7e5cbb40981c4a23901d53197f850f2e84ec162ceb726f813664840e6aa3e83c8c57c370b99c6f113805412e5103b0316e28eaebfb041cb6c2e2470bf635c12455275f37509b26e9da2fb70789623034d06c14aa2c628c9e663113a400c7904e460d39b03be1eb184d3107101351b90a7b28a2d95fbd2f0dbe2523af6d0b63455be0fb953111788c953c12744ae26143df693877085d07466931b4c114af2a74d50ce9fa421a87d2d230d817c91bea9de8c4278a2f5b9d5c3024942dd15a0eb58b2ced17ee190755ad72985575cebc10b8f7a5bd7ac8c5f3722d0f42fb1d98ef7c0f0caf447425665403cca62eccb48cca5fc5fd46dc5c0a29e2d035f3cc3a3e8bf5a442b1399c5edf4a55655341415265abb257fdcb0081ae39e075b6dcf6b11f12aea14deae6d087ba5e20d3120e4fcbd88b873e88b7ca472124bc932e0fc9694ec784e3c43a524a106ff320d49f600e5f759e1f1d4ffeebf8be738b5d63e08d2c7ce5a878a76f9e3db6a9960667315fb28b11703a2ced06dcd9c974eea67dcbbd777132a26c49eca2764a7aa9483eea99162a34f9d89a609d03305bac7c6752242e04be49ab3fe3920c84e7cb74b9e55f8d54da2f1fe9fc8bb3c544e43d4fa214adef0eb54d8b26492117c5ff0785ea459cae6ec0c43a2d348aa44317425d810c02376b02d89cadc1139da3fdd86422b3bb648c2e3cf66cb5cc4626ce55e8e03b9b4df3bb41db85d77e69df74f4f53ecc96583841d9688ec7068c1039cbf616f22ef6b3dcb994c68ab94a8ad321df2855e3c962b46b38d8c8840402d0aefdd010a10b673d7640f4937bef4fd3581492d3b3b649e578e368c6c179b74475ee5b619c250f2f5240e9751bcfaf86310fdc909efc127a47cd3196086766cb119a1698dbe1ce5a4d4759ec3800c0760535024e664a29d57dd97a81055bc8e36486fb5000fdda5f457f2d7ea215beea67f244afab7826ce78ac49cec71efd273ac9a266733363b7a2b0aba6add59a16fe2565dd85f45f77d0f08bf68ff67a3bb6cf61ad184c5bd27deacb5d800e70480533758b67a941628e36fcc39325921629a5a5b3ae06e28779188c1bedcbfef0c078fa8dc79312ade00023e919a2f08927b0bb37510cfee81ea17e909115b6c3d114d7987daef332876a917e12399f7952c99194525839b5b0b2f81a10adc6bc131759a399526917a7d354ee53f786ad9ec56affe3ab5ade556f5e401e5233b12dd34dec2f97cea4a7b2ca5c0219d707578741d2cf24a0581f752df7864925443ff4bde08258a54b42e54e24d79c6819fd3ed0ed3dd67ba168b681a07def14f21dff7c39476fb28106c4dc2a3bf1a679ba21d6341b458f21dc4bd07ac555d95a8034eb88521dcb479359c10c031143f2ba8b713d17339c6d4ddb87715cbacd6f157819d3ed1e112ba59c893bf33712f3db6a03d5b9235cf8d39058966b133a0ad7f73679b8e53dff28cbc62ad13d1fb130f6df07d5b8fd81f67b7a01ef34bb0f6e525e73e940766a9b668cb7b6065864ccada3f51626d2bc6aa4eeb27d929419cbce43c5ba0377699d2a58daf4c895ba721d660032be502c575942b5fff9c15745d2f8b71ea34ec8e80ba120dd6ae9abd7c8baf2516e883cce8631c53574b6ca7b96ebfe54ab732e6688034230050d927ecee12b0748f025d049c558b41a57d6e617cf47847bd430e16bdbd098061f1f68c5c721d7f60d50a3e3678d70b81774ffee65269bddf1d963763a10a8d1dd509f906b288d246e2105f4c7589c3a0d292436726cc6439f4b76621ceb0f20b511d37eb4e59039ba0ff70e815cc0a142ab59ffb8c40519da9a675b89cc1ad3362d9d45dea3ae25d") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_haraka_256s_test.go b/ref/params/tests/vector_sphincs_haraka_256s_test.go new file mode 100644 index 0000000..1b512d9 --- /dev/null +++ b/ref/params/tests/vector_sphincs_haraka_256s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_haraka_256s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("cdc31d62e90b9b15320d3c1aebea0e0940787c212d8666b4096e2ce02144ff50fa0ffea9a856861a8a074bcfd2ff632786dc36e1dacf863afcf87bc3753b6d07c0dbf5174e4abbf926b63723287647a593a4b4c8f932a5dc16b4f18f67730565afc924c2940eda660c65547d81a869aa88bd209f33086ab237f2cda551850572") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("c0dbf5174e4abbf926b63723287647a593a4b4c8f932a5dc16b4f18f67730565afc924c2940eda660c65547d81a869aa88bd209f33086ab237f2cda551850572") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("5dc549105f16a36c42ae4fbea26f36b05784a44c4b1f034280deabb1cae31e5d5263e024f62e2c5b1dd5d317134d6e765dfa041525e93833c191fc460b1466054b2b996ff1adf020928fa0a5727dea940327593604d7490dc3b67f5f4420b0e70b98639bd16be5018eb597efeebe080d418e1f8e4a4dcb345483c8e79857180ffe9bb101b12b1d60a228f707fc1debcfd077cc285217610ceff87a576da10589ed3d47d151bab938999ebc2b956720e2bfd5a4edcc59616309301ac6357fa80bba5436f1577d8f2b846fec392d89908ba0801f7b0b781c7d86002afa07248fbe2314a9cce8804f4a80de61f73abc0aa9fb5e4799dee8f061d45099074786186686c5d6f747956550d974f295daa2b4f9eb09f08913909395d571b37d1ab08fabbcbf433227421ea130d9d78033fd3997a4a5bd53d7db8592b256213c53803ac5df4ac026d156df2aa7dd6912806f48483e30fe5977d90474c653d25aeeb13b056c676df047f6855d2872ea7991f32a65f29e98d5aa12afd5992b72d4c5b287564641fa9eda0410644b71bff50a183cdb40cc24e096e5ef056a48941524735be1d88b53460ffbfc3b34377398fa24359514308514578a7e4a080965348ebe2fd0e4a7805522cfe5b90aa075318447ea17b78be839b2bab148840e34e889805bfc4bf174ee8b1fff5aa8ab7a54342973fe71c58be100d7f43d89635a6fbd5dce5e7c60230c07e7e966154d59bc32fc1d076990741767df0da09e962a5801860d4f60f32f5111b808cf10e67bcdb45a59efbf79de796a0463d2976d603108427b4a67f41bc0a49e062a719cf6996994bec825df2f5618c23bfb206d9dcc0437c787093bfd5e4499253d371014e6c96665537121f9dc4f155664c1a466041209ac5eb176fb4368ec7fcb6062fd3603dac4b732dce01b5c5962891e8961a77b2dcc34e2a8494c52ffd15b1138c4d69e8a003c87605094d6504bfd1a84dc06a87d2deaa7459a412a600754d3660ac32a49c38af3a75da9d39011a703fc758427fce241dc6cc1e9705884de4be27c634dc614a6ea498e319afb835a627d83b8d313fc31a3ed8ce54faf804814be0b4414a12b7b8b2eb52731620ea18397dd43b556443474b6dd9b5b2a9d2e6f8d21fe354fd8341a37fe45d689e752210f91d92b98e3279ffe4dc316b1a93c5c15747b7e2df4e4ea9431599a58b2dadf99973b3688216334983e19baa52dcbb86cdaeacd0f0ba98d31e4b18c68aeefe619e0dabd94276541a63d0f8e7a41e9f42d8b72553c2dbceaed4e126f280204ec94375c73e5fc9ea6015635fa71ed0e080b6b65a8eec32f822259185ddcdd7631c6d287ab3a87504992e6a9ab696519d8c08fab1f889ae004855d5cb439419c80598533145978116083e370d41621d4b51ec7b9c928770cb09c5145ffdc1514dfbd17079eef1bb64f0cd43f237b40878785be20a73bbed1c9e013162ce5178289f8d60640ae1d97d728f8d8882fca6312e5730f3e1a2923e79abce5a37d613022043a02f364becc341f8495fd16a28858359ec99e123b8996135bb5de85b101ee80b4db0d7a5091eafea213717c1b1e48c7b77866a93256ec3d78e3d84aacb20c6d989cb23bf2eb4a21af66913aafa6a9fead482266f74823cdb8b075187615b4ed554e392bf753aa6503c95326859efb1a503e68cbc3745c076776e23a9f36df634e130c4b0348840d774a628c4e0c45f490e77d0a498350b6249e6e97f66292d03e052d8097d2cefd944190b71d129d36c317c8f6c922788562777856f73e4c8a7140085177caf18f093e6c34f8e34f6619ce45c2d2cb4d1be593e7dca3a050ed8b309204365b3d465517b88ad831385dc95606877016afc8648eade7ccf5ebbf8ebb030dbc19f4ddcc7a4276d2cd180b4fc5f515484f9acafa8f87c4d3e004c13d224379bbd81ef5c0ebd95bdfba377ea3715f05dddcf29c4b116d9041b451d1f425f3ed6cac5bb69c0fbd48073232b067258e6a9764c1ca72257f659c883994fe1cb71adfa3c064fbc1ce9b8c06a7ebe8d69d804a6bc8e4addfa6df6bc2c6876026bab179b7db209cfaaefc0dc1a8aabee72097800ccf6b4b1c9af87516778a699e07a1264b547444ad6f7ba2169cbb44e1d08455b26bfd4954dfd89b816e18ec82b4499bbb540c615bbaf1d133e57942d506a2de78a4c76a528b72aaa749815cfc50767689f583311d9344d28bf768fc1cd87048152143abdbe6f928971b3b975a5def5b08bb57eec1dd70d7819128df405d4a080b9cb783a8e937e347abc682908aeaaeafbca86d17544fc37283458cc3b5cf143992e9c6f8aa2585a1743a81cc0328a713f48a44e706688152d7b6845c93482df0e273bab8aede13a2522bc1216df8176d0d7eb24bf440dd64e08a6b0c83b185a87a3b2ad09eba56071ea61484e845182fbba5d216cb6a96ba002c05b6e779096178545daf90943f7548633f530a83f72346490a7c69017a17839d9cbbebc39a8119c9e9fd71c166894b6e5fa3003c36c5fdf1b171d7d8c23dd9afbf04a3e79cd487b860e4c5aa41c2fb47251af48b49dfc58dc62eb94d2b496dbee5adeea7d03a12bd6c0a2457165bf774e764e48f37230f06bf20095d83c3403b8c4189bdcd7597bf0863408277b6c3b25e4ac73c90b327a21237bc28803be7a8c7fe436f557503c12a95c2fe057f4efb11bd24a859927711b316d32bd689312d5d4aa3f2f00c176c3361c03f4e882573f24202275ca3790c57f32c6b508ac6909e2dd121595d8bdc43d73f8994e2a9f27c14f9a62eb1c275d097c27f1678d8d015a97b1c285b846999585796112d796584221c9912135e5edbcfac3d822412d8ae6cf2f01a8d6b8c0e0a391ff3b541472c4f91e2174f5cf06a678b96a1542bbee139b06d82beb9ac748a5b4e7df50a6ed92dc5f39d58b984b0bc2eb70edf5ddcfe547fcbab24ebeb3ba84837b543e7894e408f734ddd07fb34f8f48609bce1cad91ff35532b45178b85ecd1050783bd8fc49d2a07eef9b5199c22d8adb619c50271f41cb71930d7fcb628ffc60adbb023d44124ffde51f7beb102e4560ffca0c47e378b3c541476cc1a06ca22844d74a6e41e9293e12777f43199880a433eed7273c0ec485b322389e9d547cd9c884ca2d497df49b2b857f8bb0fbffbc6d2d49c77d102cce3eb8d28a8f3578c5a8f5295c3ffc8059fb8c7377ef5b2f11039b80731fe076caf05c5c83e5ed50beb3c59338d3b58baa8e3a01a6e3ecc694f54b188a9c068a9aa719e246df7539a322ce29c580679eaa962dd65a5afdcb4eb1a28db315d814f5076f6925eeea311f094ebbe10755262b2fb102e8836e08f3dd3545ad6fdad360eb76060829bbe1cc522e2362cd203b3e1b3b1a902ee56994f2788dd095cd981600ad86be1ee1814ad1b39eaf6afaea3a94c07e3be805407785f22c2ef9fcb4fb7e67ac083fa8492b0948b170d0777782de5253743bd966fb0fd3912002f6ab4911ecfd44677140ef427d5faacdebeb9b560f44ee5262003ae06708ff258c81bf4928966708e8d492c7c796eb0054770210e42a40aa31c0c9db6a9644d3716e7655032b69de08553ca6531d760d847d0246d137621068f891dc9208db87c05c8aa96717b5b47215110b0943aac5f1ac8f79df54e8beec70674a0d43df28dddc2af247894fd820dbaea13eb506a9367cc8634802c9513b48040a4bbb99110857e0d1a5ed6986cc7b49ff92d8ebbffa7becb38b50bf8ea01b8b88d616613912f4c81f67d681d88848fe0ba3b54652b57ef67d87f1d6467bd8f3a3ba85d5bc24172c057ab1882f25eab561f07a45af39b4ee00eb7787365ba6aa95ef1acc5927369a53e68c41e31d571e0ebc94b1c1e68c834dacd09f714856911595c39ee631fbe8a63fce6050f14098f8fa6f3f21f9ec2d5c8c734d98522eae9cf84b372d5088acea7cf39a5a50451d189164f47030219c859d2631cc864de3047620c548cdfabcf8a43067b33b7bc41c4e89c6fd45a731c1cf3d45c1ee548e21b0dcac6e8af22eefef26df32f30331f3c7a1094675d58f5e3ee74b2d13bd582b4d65355f6ea1965910825f6f5887ab744293dcec875d35fb9df2d5bd70d437bff172d57b08315f648af3c53fa6adf00aa0599ca098628438b9a6cd231f7c57aba256e65bbf395cfd2881c2f38a9d6423bbc5f44ae495fb8cfc9885bdd090659b3c1b002fb4b50a6241b6b2509343f888fdede4828fe2280db99f1635860ed3d10a3fda79167b7c7e285280e1f070e7deaecfa38b46ec2785b6a6253a76c159eda4585ad69f2ac234b58d75881d7b571d03b1d8e17046be9e0b27016f538c97665d6243acda27842c858af484f72d84526a6265e5a1ddeb28b0fedcca02f1b64b1654296b0a84049b76415413434a2e10038882904d167a2791eb6e7788307ed090f40edd5439c806c9fab4def65ff562f8bb92cf65e10b232e153fa70b412ee63e3f36d133f9697757364fbf8471af1df6cf824a12308e364a3cbff9f50f1533befe64cb29be8a09d90593659bef7852a557f91fd2651d1f8a114897f33d4dad5a926efc54feb9cef3b14f24c1715415ba66c8692456a6c4c0cc93c7f349dd956b323012efc025f4fb28e419929e0e886e5dcaf5f3993c4cfe26ebe2faf45f1eee7ede009eaf4150c1ef24b93ac36d3b3f8006a5708d2ffc0ce0e17c947b6ccc82a5c186827677802386d7d8e77d283cd663478b4e0e5e84c5db32258d50f5c8334c13225de358269b475f9f0f438ee5b03107156ae667573e670f01c1b0389d95025fbab510ec131aa140a6eab506c86b182e03a3d77d1638df372a94ad08777d0170a2179134a36033a0a49db41afb4de42c86dd5446db3bda57f579c44fd81c4f798c213fc96e6421d8bfa69e6a4143293759c596d7469a2ff6e8f2716e78563fb1a232b97d697f79d1eb07c7356259f5fda25fd6616a89418d7906066a1b60db5eb707b1e8069608679ddb4308a5fdd854f9f9a80b09b7fa8dd6c71421b1e68b6b9cd7dda3355fa378d26121463d0179d044675ca52cb45ae1f017b79ca5e25e4f2158b3217a4760a5e0a6df2792f7c57b6cab2ecb4b3880eb758dfcd1a2aa1a55688bcddfac98579c2b826c14b81627c1afef7ccec9fa05e6342ce80457bb4022e74618220d5683212645f4b44d32b430be8a961cbfe77af1bf5c1e39e2126b725fae5033d118c1b59c20a8fbadfb6099a93963f6ceb2fddf6e29aa83d1969174abc9239f9ed612b2499f7304f63807f08aea337448d891b63c821fda255a08402a6339674d4cac2bc7511930dad28855d926da473ef5302ca3f6ab7590c1d6aad4d85b6c01e3a2ca03249abe28ebbb6e7081c71ab1eae79d97bb8cd3e7dfe30429a7a120f62bf929b614dbb16defe01f723fd1b6c3e5f596972e830402db5e68aefb2f3957204fd3a3d5bfb811a82b28d8c77e824960a154ec3cac4f6edd45ace1de23c8b807f7bce5b05dceafa0c9b5c3f02deea2f3af6a4ffea5de90197060721e992449f46ec0edf759bb5e65f383743e7eaa6923df6ceb310872f780f116223e7882cfb5d64d4d31fe2e6d2719e2902f891b6b70bad3e40d38132f7ee2f3359588727a9f4b4a900de59fae1e5ae3ce25fe265fa74b34c2f2729f810f5d6cda37626ea242af6a28e34b261efc97aa3f4f1afab49227fdbd668538006072e291d899ab63b15227c455d1c7eb2a4885fc1e6bd7276c2e5c68dd791e7b8530045191f3e9b2dcc19838fb22461b50aee7733d3e267bdaac44da005a46c95b96fefd1486ce18734ff4903371e28dd8e708a53687422574951040f4ad2909f07c15f9dfabd3024cd5762ae86378042c018fb0dede167d3031dc36997ca03ed4099d052a6bd92fcf2632f6a5ccf37a0b19fb479294fb007d95f95346810315470836d69c98250cdaf70834ea89d86c459deb889dbc03e24c8bc9fb4958efa6f2379ef07128386f80c57c75a0c265d34cc1b9869d3497bb7b1dd7e8bfbe25cf6f77edc392fffe8ab3484525045127b49619582ef2f7c6186b532fb910675692015080f9f6895d072fa990e7606d3daf64931164f2385f1d59a9bbf78fb863126085102ab179b1dffe997423c4044828e7e0964d089683bc5a027545f227f1538c6c44a8581ae15224430e1a1322f2393643abda433077f71302b509db8a2499d0da3dc77bcdc22e412b46af2a416f4f56cbeac02728dba19bbd2a5e6596fc05e08c4d7e7d42a5294b6a4f6eebdf5f8a986e718477773055848fa4770895c964967328ae86ef17ee07ba784aee24b0f873c8d66d752363494907681dec4fcec2b27ba61d71376eb0c89a884dc36db46747333fede0f1a3902e03d9ce74fd8c65e335784bf295143fea7f2ddf5ea822c0b1df34f57f8cba61579898cb547856cc84d574b754463bc6f9c1e16b0b6b11620cb8338fd490e3468b0f54d7b29cb8c758cb09deb21cf563e13793ebe0703a3b64befb1a115b4267e2e1d88240bc281dd0cea22deda5271e476115471d9fb345423d670deea92f5a5d4c0f81bd58e6d5abef96adaa66e6ad77ccfb7fb25562b99c01be2a2910599e1db935dca224706357d2d02a9f4db5ee567f504baa5f3bf84b4272ed951d264652ae045bf783b8df063522e0cffb735aadad43f4b025586fe155f2b6d20b92957e98b9d694f38cbf8cdc40e40795a7924f49b2e0fdd847816cee12eda7445f41b808095fe233b9e04a2bfb89d9ac3bc8b96063becb6b22c735c4f1e3e4cd12a45042370b0963355431425d4847387f54bef05f9989a9f17aecc09b5a815be737141d2df2ff7a6f2e00a89b49d402a403f2358418380d3364def6120923e95b0cf81ea0198add8bc9fbacc269ec16319475a0245f457df6b628d65f1c5dabcf0490ab50fb0bfe6a981c0d18ee9836fbc106e15759532e41a54a5c835d1177bc8e4d76a705a7fc1cb6997d0f4ff9640ef38c29d54ab4b6e4609e15ca8a7e0c2d204b2e9e072e2954a89cc7573190574be7bd911bb8060a6ea4c490256dcca6811da670c39dc4c814a9f9546002a28dc2f68821aea1c84aa2775f772520445ce5d770c365806cc20b12a929c0fb2acf8b3ead4f8f08323d6834e75d51fa60235035c9e7a8e745edbed14e8c0c3dab69985db59f112d0b0f6d29fbe56d9a00522b149d4a2331b6fd43de7b2304a5d72bc6ec7f038f2426dd8a22613b90efdfb6a2edafdd89da2fb95f6cb21f2719d2a8db4e66fcfe5eac1e0c8d5f5151f7c429670210aafdb1158295652e56f905ea8e9f1716178c5a07ba766e634711cb35cc56a21cd4d679a4642a41c1f23d37333fb20ca5ee9db7fffccf7dc5b646b3f7ee83dfc7701bf81f734e952c2bd5f157931d3484a30c0ef886c99eceb59f37820a57b6bedfd3bec1704c343cf618d5016c407181caa679616b0fdbedcb41d430718778054981f7e110e5de5b5ac035a487b0c0895c12a895d3b3fc94a1ddb43f823802240a2f202a3b2e942beeb6de39a35c3058eaba9aaef6bcd79b8aadbd40954e0e82c2e598f8b1277020739641505ee55e1a40c43afb73a7c8053f4faa8ed47c07d682bcf5fedc1992876aa7a79f4b70c7858513169cb39bd123a7d922a3cc5171c25e2039d9c56abe47b89f23563f982ddb79be4a1b0b2f4a63fefe285e6b9b77a7e252c20578b36571ee275cf6369a862b0fe87e5a0d87853f788d07b6e7019c5938bd67acbce0a68b21721b566a1f05a05f0e454cf90a33d9982957c03ca274dfa1ae9799d587e0641ed90349992b6b158b75491ab7be908ad1f61da115254c3f6b1786bb31fe5b587014c20a8f1c01b1652fe4aef791763c314774b3bd4dd628124d7c568dc4bea36bf61c5f66651614cce9a09fc7dbdd23dd86f98a24878ab6f5b180d3636d6c4f7a18178e7b4f3955d615b62cc7efb15c07b179957520ab845f2169cca2004ae09096f5d46307d1f70b21cfb8f1fda16cd6ef92552691ec52f7805c2a8a6b3a0a849662642787d282470178973bbcd15b89d3027ae3ef0a2a0992836be3c3667b569146155ee3eb2e8d3e43bea38a5408801ba21f9529a63066b9bbd126cc77f54a057819305d205830dee255d7fd1a7e28f8607afd02dfcdd7a1effd57143e8663046ff410601c13e35aa541a36377dc19609fee87f52b36457a1ebf9371b999ebc53d3d1898b7fbdfbdbdf8ec726aa96cd8f6f912924d840d5bcb63bcc37ea93ff2986bad709774e93137b1feabb0dad1817d782d1863b5f943c34169cff14284683dc3af8abeb5a7173c08956a25f0c47c07d9ec7fab7bd22ff3d87eaad9e345864714143a26799187cbc14e1158ec14644fbf8f4ca38342f3758823e5e34873a028ba156134637be6cda524db2f9688e887ba875b5ae4407b274f5ffcbf1ae47e0d0fb6579c26f5b609422ebff99e3b4d277ea06abff20914ea87200c619cb352525e87acfce53409f5efdea143f9929312633c04a5a6f83b0167fa3b284166d931393c89b9a770d07bdaf74f0768fa805ef8d47bd0246fd80717eefd43483c455ad320060301c9e54c4c2226025659a2637654ae278a60f09dfdfbab4c75efb2194ddddac6b8be2ad660328ab48640fce79f6d459ebdc407aeb5e013299e21cc3bd3c13e057f1c54c6faf618ee9a39ee6f99c104f4bc136e7f9def619546b26747ebed5c1706a68b1f620cc04b6216feb3f847075f01378e986a93d70e705442a2ff3901fcacb555f00f8304c91eabd62aa6a7cd1c9d8126fb328df5a85fa5c3f4fc58b669d85853ab52d45724be2d0244804c5b7ab991ff0f7a6eb967b9810b2316d53b66d18bc91bee3de2b6ad8b374a7ad29acc4f9cf74c6dbf7f472b3f331668df2caaebe3143b8c82ec76d1263fa90357dc847bdf4b28ea27193bde8e63dae759a4d2c1ece4e07ba279ca8378e373c68c15a979f6e6da80d820bc362c789b6b604e910b3a8241b3aa3fb72f8eff4bc98f1b0fa8815c6f284710d9c86c6d4fc6cead806af15bbe6d8a8c4a39ac1c7f50d8891a689b485998b85b999274f040122dd9d33c0224e6f41f953fcdb80dc0227409d11be041015a599f58be2642411d995bc1f42d8f41b9b17e8eaeac73340ad930d8102b78a524d6726f6da6ff51dd0fe2c95fabdd784e0e2460e49d8846034f859db65f60a0ebd019ce5afd9d0a4acc6e54c16276f4f5c4a76e382007f3def276701107003b1612063f6c929ddc2ae9c9a058187816b54aec364e4868f719e5453321fc74d36109ab8c2b3277c072fdbc785948ee680f40f1700170be1ea934c701ae269b3c77929712810aab2daf5bfeabc3bd522aa8cfbfcdd9d83e5922bcbe21bf7f9ed3bdd3cbaf72cbc3835bab9e5682d698fa3733766722ab30ba34aed6b2077039abc0bd5050a887b329d5247de72fbeab3ddc1cb1c9918c596b7ad917ce1555f425cf9762edb882db92d65960907f55d4dcfd472b1df36df1ee86f21da8c90cd0b2cf49f2fc1364ebf34d7d30528541cb4be7162823b6ee5a2da129d668a1a7284aaf4e49fc6320f3414353a63249df481c7e972c01a871c3d6e634a0382ec690c24538fa593075f7e41022de7b14e51b19e3cf3b1c752856a2a889725557c9dd7ae1c228b566451b72a7c9fbf2dd1126e1933d7fc2671d1c4b22af146e539335cb43512825ba323a8b24ab65856b9f0656664b465d4331a66d729340205c5f8d4709d9da80a469e250b9300d602e3abf5c0cb29dabc3e657a2257fe9c1a393672d275bcfa5cc47c29583527129ea8452d75e072432b84863537953ed087f1d5c4e4880e2cdedf18fa2091ff425ce57ca9240450e47614ddc7a7442532e1db988bb3b685e43b81cddd4cf3fb1c3c37ae1045db12517fded280049c432981a265aa2cb9828f3812b19284109ef7d295d72e143dfee3c6af7a0a8b9b2f86fc99e733935bec942c5b072562ea13d56b0e0c4285ff56b1b059b13c95f588498122891e5fdc5b6acbf5fb55f31f757afe4984530e6d5ae66f106d506e36bf598007cf156d5ba261dee64f10cd5b157fdca8b71c1dbac65d77b8cb9f99d7062eae0c888688a4a34b9cfabba2c940ad376bed1ac4de41238dd827edd123ff8c8d5061f45e5d6af027b9e73dc10781c2929934d2eb839f3a3ab1b2575cba68a9078feb2c0f03c9cbc3f93ad087f1b33bb2c1c7650cfe5da7243009059c0cf318aacb8681aa89ac0f514009c81537d560095a13b2473632d1cc0d88848c049d03e0c04eb42980466b43adcbdf7ad72f7e546f749f9348cb0dc1d7c8261cc3cb1da544f1a961101d0edf19d085f523ee5c7bd4c82fc068ee074c3ab8770a9baa6d96d7c01d8402faf5ecd1c0b619ff08016cfcce8d2a6a05966a5f9f02e67e02b3c1638e487ee0c7cde6f15add6dd17eaf2072eed2add7a6e5055f2016f55ed495f41350d47ea40667cd5a0c8816fcd7a9ff37b1b55e1374e1bb9dbc21920e76e238b6cba2229d90315a09c6bef257d7edcf55623392912d72b2a07bbdd7bc7a54d348709890e04cf41295b161fb622380cae032c7dfe628ddcc7fb5a2de7696e7e63c30a13b274055e16c67cd57ba3631f321a8515030a2c0f62ace39d73bad13dcc326875d259c391aed1aec323bff1d132593606bef4e7531aa72a4fcb24e94703cfd15980f8a1c44540c9c4ee9a3661deebcbf0fadf45e4e009054c747fd90da77c85bf8db8038c4c281d14bb90ad5b56940d80835b520e3ca6dbfeb19eeb3e41ef40ddef17ea5273dc42bcd74a0deca2cf8c8c23f16f77bda26db00d81ef7957f692d3e8f5c595e82a6a270528fff7ae878a9d21bd76e3375c17b27df0f6086228af93f12f28bc128c82f6411b1a7be36e7694e05e1e51d8ac9776261cc86c7297206a9c37a4376ecdbbf089a4087d2b63f1346c3bacc547a46c861a104038bf06ac6be634fba29d16c9e1361f71642b101d5978e5bb4ddf0ed22853e1be6e0db02bf4203f09270e727eaf610eccf8cdf1ed952116156a4ee335bdef0f773ca28305799d0cd8defa14b2c0151247215936b4c1cbc0b436ab171a4d68dcc0f9910ae51902efacca51e6866baae799536530ee9043bf5f90c47c4ddf85321bc898d12d6c4a821261568a001b16b91d03945954b2f98990339a2ea45f92dcaff85e479b318eccbc887d587e0ebb489edc30d6d70a74da469fbb8d11e32135243999c5be5c0d8936f1a98b1ea9cc7072211df8fa836bc96d29809256c201b1ce41ee3735c6cb28b0bbcc2d26c746f873170448c61cbd7c2a09ad95ca378cba2a205684e0cc16ff96fcd0b80e387c6b5f7a7d6f1efa2d79405b8fdf3e329e09d507c1a1b470f9948215fa84920546ddcb466ca67715f9c45ba0d8fdc6a3b0dad91ac7b0ca6c6973d22a93bc981a403505ca28f53eeeb8517a4daa94cc340be6d09ea68c01d00af5030229199cdb59b6fd840b755dd25c8559093db43cfcc19bda372c644e39b3cf75ce2d631d87e293e00ac923bf2a6fdb1efb934d7c2fe42eb6e27dbd95f65c37a35daf6a783342d8e6a71c0417acfc61f2a123cf24bb46ae6ba035ce71ab4b4c284c0d4e3b3b567bc0e6f86e0a290edb72239fcd9927fc93c5de7ab66fb52eda196866ddb9d5be6bfef9a7de7c21af2697e49b31da1f6053f6e1486acb12ecb124005cac08a63ec4cf5ce4c36cd8564438aa17a1a9fdae0887f7bf7030c7a76100becec302a94a55771ac6a234c47c1f7d239fe418cfa3830d178428310a1f93703d4751387d8d04aabf2e7fd6dead855a22f90130ebebc9f3658451edf9390512c657b460502b4102a16f21f445e1b856d69e8e385bff352440f43f4635bf7d9025e297c487bb6681050c0e7dfd1d7fe722234e7222a437030f58abfb41bb5b3364846c05669d5249be5285695026972cf209f3c0bf7f80d03c56eff9cbc9e385cf3fbab4602babbed74d059edd92ffb2b12dfb0bf0b81214f42f98684e7ce7206e48c842fa30891e6ebded0e99ac4356f563036e6a7172494e4db26dc9619c5d3ff4e143f2a5218b3e6ef3c6521437a70bac35d43b07ac4de7bb965f45e46cfb5d308c641f7c1e3ab28ea1ae22854a3a77d693ab159378d92c31c3b04759af6f37e5c85bfce81b6b189c4e62af318db6e1e51b5ea61aae7e442c87c8a27180b6ca18ed688e1c616d4fac4bda452f1a381c0133bd22e7116dd22cfac78cca2f363d264a0b1ec4b8ee0ebbd1342cc4526f08b3829b7322e6c6b6c56b8b6cc6e05bf0c9b31c49638ec70fa0e4dc5b0f18beca2e2d782c17e16dd37fecb9e9a2e2d1386c591d0030817d6374cc045dba08ab402d0d3887bfa049a24599b150593244ec8dded707ee5e0523ffd456fefde70ea640579ef24208fcf0e9fd2afcfdf628f48d46d542536e58f31c1ee8253401f9baa0cb53d7294fa8e05dbec79f8cd6cca931920342d81ce5c4fcc396aaf52e141ce681f4e9d048a17eb6d77033500f884ac6c1bee905a8163859b6333a383ecb12be93785f4cf51f26cc3f7442222a61f075e34cc02487d92d3d2ffb4b13cb681f9e3177dd6a5fde134ee604488c27ef2992b20364220cac0c2cf5317153b2cda3cad0721bdc70c176ff06fd7e1da4b5f110bd9912df50981f5b385103b5b6e1eb2374c6612c30645a0c9dd61929e34a585e831c317242c810670775eb5ad72a50883768fe2f27f091bacb75f4e6b8cb18448551d80f14200573a27739ff4e542df0a15e94925b4e0fe0de09c846c21717be9aade6afb6c5d116d431d297499c396c1595f04cc0a64ec39c3b07611198890915228079ddc64c913bd65e86159099b351654cc3dbdc67a3f59e785c5bfe9cea657e3afc9b6befb48066e33d344041ae9ffc125b0f8d58b6628e3f0dfb54916d9abe2dc71d4266a3b8eec5af4872087f3421ce3ae253d4020123cf363a0ab29fc3a31db73116816eea1cf844466ec1448bb25dbdb9a2701062bcfc86ffd30ca8d13ff13b8abda9c7927affda00b476cf1855a574c92259872d6875b9d7e48ae5225b9e4b243d86384999ec592c5e4ca4bc2eab40455ca258167d9fabf1606c9914987a919aac82a97604a61f4de9298b975f7ada4b4d012e87c95f4a1692ba06b6b7c2274c9ca5dc2da5cfca9713e80a854272599d4e3e28a631cd427e2bb60ed35f79498995281939fffc32d07eb745c67975402714fe2f6ad40c8fdd97b307376c33991de4ab12b8e9b7ec8d4c70eb80e20e98736f280dfc21a4d0f77700ef2bc0b62e0c71860644126aec7a20af48209bfee7ec77da8616eb4969340e7b8995fd0d4987f95f1745651e7e6be09f17896614b992ad74f66f42119a69811b5be8640bc7d0f18146a6d880594f0c0c3d6adad1ae06d1e50ad4f28ea4bd7e364ca046677efaeb742437d84e1b26550f5d5323cf74732125556959ea0b83c4c6087a573b3341d25e3a8cf09943f6fedb50a3afae8ba8aa26951a44f54caad8252f2a8ae3abfe53e0108dd99f8715d28052062b5b29cf34688cc68f6667a6663acdb78ec41ad779bc761fade2488b1c187718c5385f7e6e948f220e0e887148e94a043cef4789b4c5cfd53a60f1b23bcfff5aca07a5a5f2951e19dda9beea8ffd6cbe75a90e5c5ec20ee496d15b2c3ed9484d4d1a637f0a7326fe544fb52ec1385005cbdb23c7621bc8da7e2314be97d65a5a05a7ebd874a4f357c8a8d128f273c791703433710a3d8951379e2484188f3c7191747516c0753f5bb7dcce107ac46ee2135a7061eea59a9b60537ae170005488b606af4e5ee97720ba0218196998c8c01ea49d5b685f8456140fc93b497e1658360a4a1a5852037a353d63441a8608e149e6e3bcb8de3bd73e949b7c4b3308bec009c2a53310e15277ef0f98ae667a41d45da9223250033ca4b062ab9dd549fd0b741238ae2a9d8adced5c11b9d03a862289aab46df305dde4c94ad8bcac32193505a5177c69cfd558ea194e78be201febed0b071a3b2a34fa2001479b90cb7d8bfb01746ebe9b43a1522767617ada72da7f4c474f603d57a7906b33d3b4af67fed9ec5de821dca909d27673cfc6d90fde68af415594acb3f47436a0f78bea3a7207ea3186c51838c5c279c1e75ed3a5b42a5cd15365e633d0320efc5e897e7fe7f7465a128c7dcd48ae7dd39f2d6cc69729625866c2efcb97ed9389a45ba82455f7f4bf973cf37e0b50d51eefc8d4c60ef050d500b87acdbbfd66566facbc66f3c157dd120ce41aa078dc33c5f1dfee7bda97930abe4833dcb7121899edfe8befbf96d4110a7259a8edf9f6b506b091f9d3562d7900d1f0b05393a0e1d94e7af2a59956e383e61d0f3fde21a2caedad9b6c462c39cbde92845be4ecffbf8be83150576136edd36875ba602587e5829c33f747588b027986bb8d08d4431cdfd7f73cb29c0aed33bf3d90578c909efc49a05929874ec8d47c694f38be9e05a6fe10b95c4e7ffa0a493b46541ed6e8ef48626060aa472995ec7ce38b27bb147f30cd37dd18dd409540fb94d967103afd25ca41ee7153cae4e8d86c55e9693041bae676869676bbd4839b60b14c00941ad8b32bd9486bf8555ea46518e7736513d67e514cd3977fd880f32254067d816b0f9666c825ddedc2a4509121c99d1b7352833cd19a03519e53c213b824d78ae8953bf7986334a447029deac68d9aecca17920741980aa6c3a9f2fb092cc767b3f25a66c50e47d9478c7902727947313482bfd53b5f25cc277c30f8ab7623f036a150fce5f04cec69cf30f7c2c52a5316f997e3b88c4c356d810f4e682af44d9f220fdd7f16ce54ce3736c95cd168dd6e0d30e8a7dff087154aad499ac20e3c2b840160b783682cef86cf72a318f72fc565142ee5756cb89592aa1c2897b7440c36b2d3bb5329c045851ce73411a18651d2a8699ea7861c7a457dad1ec593268cccc60bb9d6c81ffe3865c878b2100805809b3198788d036e10dd3bc7175a2702333fb5b61f3e2ccd4c64b2abb93885715a7a0f3af38f9563110f04ab11b91250a9b606e8e2e84ed89bd9d90531b625c83f11131787388ec8bd17578a871085f1284680829767b48ca58cba3f98a7b23405f2ea2b550563151916abf3685c0b42e04930e18285278d091a3635c3e8712b4493f61528daf51749f1b2d4e38b1444c92490f39dd8e1a64633554070c734c4912c2d9dcf31e7729e69d18e6984362865aedb6cf557f1875e9cb74ac8af77f68ec9dcecb1d8d8dacab9061f7b7a8e70d9bbcaaa1d6c121ea08b1f8bdcad1998ea3daf0887c560f35e2b1b7faae334e46312eedfdeec69420a3421a216e7a0b4adf2cc0f2d4d8c20733484f1a76138d6f5232fcd946b8c245babfd9ce32e5c88398beafbf56d79344b4966bb9576abf5794ed11abc2af815700c500d7584da6a053e28f7a338a948293b9ba3729407e7b41520cb2646ed8da8e2e770a2b918db5d5e150a75df04dd8ae5d0c4bf47f39d045013c2f5ae02300a47a39d1a2fd0da17421d2c586a9b8154b83f9cb2cfeade2eecb6384c9c6dab89b25935ba12ede65e68c01f14a19864f8b2f25df427eaae4d31d095ea0fdf9ddfa42f6d92233e06a223d23163c91af5b471f0e7d3fdceec3fa6a1e2f602a0f8d5ccee9c0c422a96a93f3359de1abd0b8ee2f9ea26d51e57ee4147374b0d95b82afffa2c65310984e044165d103fe57e6285afe76407039c5dd0d894e10a6bc7a7593822dc841434c257dccb0c5d92930873f6e91300b62758d3c776ca7df8b2ff4d764c86a85375f7dce666817843250c339f0a2912e57e0333ff60eb4bfddab16056497a71d0ece52abfe9d93cf8dfdeaedd58259faaca0e6debc33edf10ba741d5ddfcc52642b590db347d6458aafcbb863c875bf90ce37370f01f698ac6dc8f3a758582fc9a8d63eda2c56f1c40448fde4967530737ff3c6937c2fb94ec521756a56d554c66d9e3b4e0d624494793bd75ee45f8e696421132ac4139766b77e8213386e87faab142362bb0e45c694384419bb7d39e2702b9d457187a78bb9a3b6ddb23edccab73d4dc5fa4efb85c6f8cc7712b29888e0cc492762dbd05a737f1cad2f821d16b60f7f44da0852b2a9d39abc0eda4e4dfa1b19e9646089b881665454539e89bb626b5be4990c294a65f163eeb552cc8d3bbf91cc0569ec35c0b8e71fc66b96d95e4a5322c2383a17bd6c19d3b6ab8e45427a2906e5ac9448cd5ddb291692d5fb945e6d0dfea9826a4051a2eb9bac5c158bc16bed8d407e098eac223470d4af69b0d2d3d576b8010be32c8995f8576bfbfe75584f250370bc8f83ff937960b1a500114d9c58d342e7db07a951dadecee8b045766837e16c2c1ee2963bbdc6274780e6f01fa3ad24ac2109439972e9e8f4f4d0750bfddcdc4e26871a72213395b659d2218a69c3cde4a964eabcf3dae842fa64bb768a7293466c01eab2f8842d97b01321677c6cdf0ef64b84b612885939b2346a37c2f9de5a2916c7c1b3cfcc435565acc532517e906e70c9d0580fa0aec568aafad4042af8608f7c49abf0d6171e93d0d210e33f8d3fca1e0f567a9ca3c1039e6054d1aac2a305c9d1983e222523c94f882635065e0ce99d283b381b7d40898843c22fdc56b9237eea47ffb7eccc83ed1ea27816e307f5307046ef1582a231556347aed78232d4c8daa4935b0dc4443aaa4943142e8976f43cca5437cc1c36d688100b83067702a580c2369c5bd009475735770e7291e627e7c0358db117247366586d2ccb59d5122e52113768e84b73c1517f50f20689fb5e1bd312e984e33883039098be8b91bce8a82d24b7b932c510466087bbbde7ba558e9108b599ab6a907ed4f7e51c5e4016ee58e43f3334d398106606f4e3ba74cc40cbe36eda2a26a3e78e4c86478b872d737dacfa384c0ed21d21059ee2e559b219dbde18048b75db843713c151439ef6165affc1fe143be1a11ac4a469883879c5d1133ac6f5498d4cae336b870d95bd73ef18e02a4e960a24ca28ff6de4dafda21d27850b425b49fe4f25f2321ad4bb6b9f14659beecf9b3ecbdf6a54897ebce7a43d3e949c422a7d953f300c57abe3736336343d498ff5a0b4e42df4afefd8953ba070a09eb2bead2f142eac9d821a0ca11294e8ce47cf3ad2e6f639e359901bba713df7c918ba47e4368ba17f25c6f67e736ec1ea99191319b0abd93b2d30192e0437afea5b88437b198578d0d2c795ef033ae0ebeded39b607c543c603a4d380c2bd9e08b19f4e41928b63cfa3180f51fa7f8033a79a123cc6adfa72008fc7e78a0a4fa85aa8f98b82fcd7c24b9fb98d14d016bc2fcf229082ac9fb0d0bf37bf186d836326486bbc367c17f0d59e4f4d8154949c3cedca7f51341cb4dde41183e2f90a9014819864852a2e515a7592edc274344c729772e99750d1413a6c332931b9cda399f3983de9d4c943f13b73ace3306b2c20081ea20e03a40287adc3e4861dc3f4a994285832ccda54377e39ff9585dae90e05988f8beff477b803cd807166bf35fa88ab27902c65facd7d1170e734187b18d44d67a70072589cbc05a3f5b0094732d7708c2bff581de113426bf4b06d0b99f6cdb4516d2e74aa98b4f7092afbe64bb67b244fd99fe3d0980d6b1ac0fd5ead9a7f1e3a85a5a9db1ba960458a0e4e5138aa57c2018ce203ca4731d659e85e9d151b95c18363e28a9cd82cd2606a450ed39d9691253234789b10bd429e1a9b7e65701cede17bf45554fe1ffd6d4446b21daed7a968d861dfc72dc2a668f2e62eaba749bd6070761997cb1021dc6427e5e879c6b70d7d75a494366892923fa44c3a922a72890cf16a5c5145cbeab5bb247ca1711f57c455c60a5903d80e2278b9cef077d273388602a6c8ed2b574ac55bad1cf08df58f076c62ed45c14c5099b0461967374dabc17e6b843edbaca4d76489d80fa277e6f5d330784b42d705d7449caa8c367784f758730a7630cee056d8464543e76f775f49ed2decc7a86ceec3a69b07fbaaa13e08b97bc904e79a63abfd0775452e613e3eb2435c8b8cc6afe62f86c59aca111affef1a3aa7bb15a384086dd294570b0c3272362080ee84caae61bab481ac2b9218d49808f0251deced3b0998d0bbfb79459d046aaab5e28b59c5570b14f588d39bbf762e9aaf90c3d4c970302afcdb1594057a2b8c71bfb41f1d2c25a7a107ea96b584af2bd355a702a46dea080a3a9aea217e7f94e55ca524a3a11a72ccd475e5fb36065881b493ae393c3d2bf3813f63119025885ab12df67c14b7c1aedd6f8780080082aa057c7b5f9ef76bff0aa3fa9b006098bbd9828f2603f945415d89dcface9c3b7e2a52612c76dd5958796a00629ed8b536fbbe6a5f8afa8d75684d1073a854d745c83b85bd7889a8e65677f5082643193a61f939d2ca74a9b0badd120ec04b41b398f83ecac8df134c9cb8ceaf3f5c05015c4f36a42cbbc833d2f446aa39cdaefe2c42c4b79a506ce4fda6666588f59e7feb95d075f10c8fa8cfed81f8f59429850f072297c0cd2bee7e6f0aea18260dcd62a6f0609ab7ffaff56446bcc3b605da37608fbfaa1fa5d2a33beaf6ce8a9008d0bc6457d66bbd97278375b9f52b3e2801388e47d2cd18bd7633810d914d87d060d91181c02db9570ea0c15a03b7e4dffb1984ff218a9c7766cbfbf29c3b0e13a45072ee77d044dc1dab13b421de9c436ba2aa65ccbe44af8b0f7a9133b6b1dcdbba24871aa21d302b22b2846179a1dc6dccdb1c1d785ab68c8bd0eb28c372b0b828b9470f2ab2b338041419d8e6662417fd8b1731ef61f418351c7f91664be5f468db9622812a5f1652f5d665e8bcfe5769e348bcfb0e735ae1144046b211746499409a8e05de7ee468007bf2728e23e7803efde8b880d7d856f3663f6596e01b4573b2cc53dd09afa5cc3279eb66423936fcdb1ac79ed80ddd54c741e68b4168aea6b1e3b9e131224bac46a70a78fc91e6e5f16c466d5df5131c0b1ee389c795dbcbeb642de9157862408287b2dcde7d4b47d418bd004539b16a5a596e27451bc44e8adb480550a4ffaaf9cfb4003d0606721a72a78480153b8b5ff923a7ec5a408e427e9dda702171bba293f1f5006579b5c6827ad204e99d5caeb37bd38e39d9301586145901be7f83b81fbdca326c997ccdc8816b1d173666f294f09920bf0bec5cd45a35889eebe92cdfc18a0aa8ba8064c38c4db917257a96c01821d5bdba02a42d0525791d4ca56937c15f6147c0c0e690ca29f1dc25687286aa8699331914fca22b5a68e462fc2ea4c1e08c4b0cdaedfea59cfc4dd88be10bff1005cb540df8da0ff80bd90e6c80637e8f24b76bdba2906bdfec29d0471d8143c063011b1b65fd273026db9a43d805d482133b7653f2d80de8162242b5319043d8420e518b7dfcf56757e014cf7d222594d96d19db5a3a4ba1e98e3969196f6c0028220a7b1e3ecffd93b6519c23a7f56f13bd22b7bf931584c4a4d55df8d5c7a8ce8be57987d618cf3afc68073e1334521a329a158c7b3d3fe027e067c588488f99bdb96848d19881744f1a1e74204856a79f3cbc7cad7e515318a04f669ee139057765dd11f11f0de28a18c6bda78488ea492947aac86ce36f6e47b3361d4a6422907ceb2af744da3d58fd99dd6015c816fc760abc1112c6ddd428a5c91182b9bfc969cb44ca8ef995f10136d0763376ae622350f54228c192065aa06c61f6894f5892b15e75ff657a9bcb21441997cff5d1ffe3f05fa106512f4066bb23a2787205aa307134de316445617cd49cd9bc1db18c1c841dca3215d8fa63b29e2b7b661e102b8eecd69662dd4ee49dc91495d1f9518d99ddedcb2b144493996a7a9f13fbfb5c357a0fedfdd980afbdc3384905415979156e6f28db0b3680a8c8640b76306a78d1b4e43522dddbcd4b70a1ea0bb070db9d7c589100f9709d3d9a14964a675849b5f9c1aef8ab8996fe387e9e0405baa28fbb3f28c49717a8f9a274bdac09b29aa44cffaafd1f721e507a10e1a15d1d0c48fca9fc18ee986c48f4b97e3407f6516a6230170230556869ee35edbab8febb3c00bef6beb200a874121a9a12ec36f95838f3fbfd3b0f0ca9a7c44d25b1fe35bc043ee061703be44ee2bfab26c4a1cdbe76a5bbc9f1f348e5e7fbdc2750175a52c804a15c809969bc91b642dcca7b79c3a6a9a8877d326ed7349d7a70f735c1bd579155e9678ac1ce869c476b5ddc0c49694a6d85b840f2ff53cd3d718e8115a0c32dffe4fc69b4feaca92484e275e7f0d73cecc4f3e473fc3fabecea5ee3f1a82fa51ebeb8a017508335f3f209536498db5733c3c1432fa36e826c81c5cefc0307315c37ae445dd13f3504f58065d3ae63768fe4ba637aa408aa433c1af09ce786a734c8b4e68542cefc6de07abdb7638910c04f0eeb474c7e5ed305a3294aa272a203e5e5e5a74f7072fbac18cf627428b1c5562d27d543a902f2a1bc94ea1112f52d30c2477948484d8e2b426444e748063c5d152b908f10c389a98374cae03c4d5e44746d5fdfc26c6837b31df3d6af175614e2fbc8c53bf8602acb3d5e85e2d383719d555fb3099afab1753580513211f7aedb3ff8e30be18790c53637e951c83359fc52a2ad9b6f9a7bb96ae77bd44b1a0b1115b2f99f0552d536c5a3b83c83598b03508be89874ee9111644d9a514466f8fd6c95aabd0458d6e5c0e86ea6d618ca8291afdf0ad3aa81fec1b3db93e153bd48b8b06ad798f8b8ac249cbff527376312ba6cd67cb692b3149c9addfbd3b1c7424d01ea2f88823c760a4e005f2f49d21d8c060025a36966a9ab5b137a595190a47a402a836a9c77342c7b7dec16cd2b3e8808261a98d101f2cfa2d3ff588003a93d78a0d09721f44fc7afa39398a57377b828c7e2c46fd1d7ec8c07452ea5351857cdfb5dc5bbefd18d2dd8f78cf16061834203932d578cd4081a3c47e82ed0c7a0fc1d79bbe3f49a7c86a8925ef3619de68db3b9dc970dcf564a7231d44364f3162b57806c9f33628320e160744293b53f6e732e1cfb6987b763682d6720fa23b042d92cdde257d0c0683e904480fa80806bcb1570a72f2f4e75c8a7b659d702758925d9ad259b3e10a1873224f8badd1b7ef4438d83e78bec48460b7010ca4fbfe7eb31359d7f5d101718d6bfac9aa2b8c859717c2ba1179f207918d5a63e07b20732dfb656af10e05b67fb61e12a1cbcade1ef44a2586f027d801b08855629c4497a7b3e32b9e81b8e57bac51d58c9bf7cbd33a85257695261c01e979235795dd4a55a21a7377bd879f3acda833bff125e55986ea4097b830ff07084cbd23a8a060f9b0d7449f295296793872f2a37890b50a5598ebec7274ae6d5c2f1269da5a64a3437d417e0c9f0d9b8457fdf7d9db0670db4d6b9655f771382998e1df2cf17b797b4f59eb2782119592d1ff159ccd8a90f280ab366ebf2c158940cba69f5d46f46a390e32f99e6567163f24238b6d4095d74ff1b7e051cecff6d12408d787754ee1ac091489a13c8540ebea3a761eca1db166da70a8481a5c2ca8bda89f2b99e600c4830dc8b35376746196231d84456ef55a2f4941fe5d6717ff02f137727721a64fde1cc1c33b017e9ca8016b3f75691d5aa036b6fc9926fa5e15ff25706d9301c30826fefe66a5b3048bb87d9bafe4ef2fdbc032aca2c9cdc52eca95a92761e9e120408d54eb0e296b00aa30047a765045c9089f3d3e2b34a318e70b7ca9ca0b527a7ddc2c462bb74b981c7d850822d673af32c07120a5444f336d013fbc446e77fbf2bbe8641c3fc387fdf084a5e9075bd1bf4fc5557f92d864331497b921c427bec095fbe3d3cdd7ffa81888d2dcf6a73b3893f3e70d876463041aa0c507a5a0f0081bd8884f25acea7ca34d21d2b5c3c5e205bcd2714922ca1942718d4639cff6cbed02b60a8b247a3ecd593bd6203d5979f480b0db31e2d9eca78b4d782e33200863e3e389de7511ca1c148f248477601358b98e03646d672cf579993397f650f111ea6ca70d730b41403a792ad4c8eff5f5781bc39868e5cbc9eafcfbbf0edc02541b167d379f038468eb968b68c1529a4dcb78b447a6ee520773dc9b98a26446aa62012f5113190d23b38716d891cc24dc8760377a3414ab0fd5ecd618b5e09a8a914cd08a6a33b3e15397fb55a9c3dcdcc011a4d95fb80b098fd5b5ec1f1845fdb05480a532bf6ea2fb23414cc1c324675e0880f509372eccf15109eb841ac3a18f5f5e786a61915c4ffbec0d1d700e3bd4eb334e8014fbecf8e07e72c427b0439d921dd3103fbb99d4b1e76e59f87cb4a2badf617308a351deb82a445a32634af7588504e897db5f30f029a3b64608eafeb12417844944e4307ceccf60649be8d92ad52d6904242c1c79c28f68b52615d75d7a403d618079cd3cef63ebf64a8f13843352a7665e65e10dcadc5e2c4a2793f4d6e0d10969fec17d8f49fe0a0c717680eaa3677d22fe7a046fb1121ac0c9c3d4383b1893099fdd77236c1604916f4dff201aebdc2a33e16d3f1fd4ae85eae73459b361bf0056883f4e907439e6bdb61fe93daeecb21762a463db2cbdd3f3564ca3bd129e409b6495f136cbc1a38d79ed4651055b857fc0ff842db3cb2a9171bae9a7fd29d1cb9ebddbad11165df9337a16e7ea126f74a5b81f2a11ff0f3fa4c866268501798249a3a0152631a20171adb5e43aad48ded11d3141d7e2ec786df7a513cbc49ad11c1b40d5b49f565de1f42f361de65c5a99fb0d86d090ad932e36571c533c283d6027710e735ed4a34085ded82acb96537bb127426365cba41d96509592eb22862f9cd9d59c47a2a829f6a11fb51b367fe91abf9616b9770c41f8e277c45fb18c319207df220c6dd037a238679fa551c66568ddc7f3e641a0db5313cea704af2bf6903b50fbfb171a2842acba77df934d7b9eedcf81ee960909866ea476d8a9f237db800bccf6a7b50cfee8b7edbf018998c6714aaa0b2908f74dcaac546a68b198bf624dea28b2f203645a97436cdefd36f05ddcb4a9285bb48dedf2b9b9476802327a94d507376c5143b71b3127c70c99c526b357dc2538db44a326c6013575edc0ecf9c78fe1272c25ad7f393c4e192bea93a3d0e4732ec04a3e8505c018154ec1e02a3cf587089b2f8c3796f2e4311dd9d315a37b09aa5c0f73452503f10b6d2f50441f751aa79d0dcf524c1d4ef8b3d27db005ce84ca3f39bcb2d6c757fb0de3f90ebb403811eccfce409cbf5f1bc9a8e32aa4e724ce1c41be14d41d12ae95b78066e5a18ce562267b78b59b032c4d4f640c8c8ed351a056f905cc22eae987f6eec5cec8bad7af5b3ecead076f4b17304916295c31f5d0a50a61a3e892ccfdf703b03d49af016a32c06e541732bf19c0caaf23f1229a8dc95a43cc432b785e5ea395ba7a9ce6b8a2935505e91e2f044523e632010de786be5ab16f9ecb259fb6816014df4ba81dc1b2286f6a7aff118cb813bc0e7bc0aaeb829ac4794b22bb18a3c6e0887e8a8e8195104f310b6a90bcc340c4b115c2403d3909cc2a4e128ab848523019a88f7ad342b32e0a63786af2018a1eb1d13ce4ef56fa742cda90462d759b04d020592d4dba478ad44d5f33ac4cc396a68420a09d01f0cb6f4a94ea1fde14ee22df89112d9abc2dab594543ca22f4d34efb57666bf6d8ba443fcaf1c8c6b6e757d99b6131cc8bced4e66e33b0a9455b8fb7b84961ec98111cc5b3e1ed2de2d484ed8fc4a3ff9a671747af5ab1ddb1f3805ce1556cb459b506dc674a83cc1d1c7bd53f56bb662435be5763bd59c0ee20f98168d9ddd6e74e9b0f6bd848835247ac449c652d0704ab9be4468d7f961d5e27310dcfad0b640f5696b36494b650da5e634865f51a9ea25401b7c1d1f504f028cfb7df73d5ebc6d294211b4404b7523dbefc738bdc0b756896a6c3eb12e6464e470af8d3cd7019462a0068f60112f941892e7305053f7c88b072a02460d527fee125bf75b97293839b8ee1adb6b74d6eaec524de62fe3f6ac2d4f65d4ea007ac557f8a20b44606712b96a63c667a30fa98eb7d981bdb875c22964956ef10a43d5e0b8aecfde613f0422f23b3cf2266516d0a3b7120f729c651e6e3dcc91ed750cb1d1a9e5d9376309feb43d8ab93975bde67934d1edefaad2968b3049ad85b8a86764c8238324e06f3b759c0fefd4da1b72f72e076a47f3e03ff3ed2cd6ed90342438b723a7d2cdc58e29d8ca405f300493332d669c1bda77a96b19bf91ee06f654080e1b597c9771cf3a5fd73546b9ebd6301d70cccc4561a36d92748c02747d4a24286ccf7de01d497be1fba16701bbd20c3b080bf9ba62b7ac68efcfb6371403ee837e11e5c38170a1a2ad9e73570934c742ecdfba8c5982d7ed23a3072a7579cbc123a9e4e247a65898248516860e2166c665348a30289577f2226a6c88084812bb44d9e53b00384e286640cea18b24d4b0ed8dec1ac6fa10e692e010774c92541d6ec1ecdfed331f701820af4817278538906dff75e022fc72b7c6c0c2b30e1840a164645d0707b458b740e5223a00a72c81b0c765f67a1675929678ff690acd6111b403ed8303b6f0db83213495d73a3e74cfcf3f877bdfab21d12561cbb3e12f3d9055cd5443c50859d72e819e4f822c87e25456ac30584d365ba883e9cadecbc6ed3013b99166a45104f648483fd567ed638b8533f39e65bb12ffc8a1cb522420170827ee47680f425565d62cf820bec2be7f23b31e6c543efd626121265b8a5eb489f5b34bd112acdb2ca7078933fa851370dcbdf02e22bb67c60c0fccb89afc3b8d9a0ab6baa7d6a86382d7828944549fa66032740a132d35ce8aea96987e3c109a699ea82da43b5c0088bcf35fe37ffc72c7aeb3d63cc0a20ac36db736b380b64edb3144115f1a89b268c82f1688379619b91c448190270f3598f1673264dd86f577f36a169a5612c1d8bb11166b6d30e022413bddc38205279771b4771f4bc4dcaa1909b7883d0ba45c8e9a90120a6774692607d8265d094e74dafee710d0ab1acd8e4e9632b2c79c8cebce260d402011e27e9512e84d5e615687ed115c8f54650f3f3aea5dcf061b82a1312dcc6072dd600422eef3a79e703f44788b643da7e0764d2f6159eb8a6ca3cb7624fc2e662d85864309e4cc49a071d15f96820fa14ea9a16bbbe111561d82fd4a249113ba7caebd2008fa1bf7e1dba5648e603f0f613baa72deef2432dbec800531acb5d9b08077b2e0c823591e24d59f76f70ff2610a5ecf52df6ce574561d72a5f50fa78a0b9972e6988eb3b5b76808b24bd1c060b4927513543f9d33ae045db35105d40bb7b35432fd8ba59667476e5c10f8ac231bbe12ed2d259ba2066df89e339cc3669b9bd6af3e47adacdfb664e772aa221c4adc3cc6a288778a0d010efc8a3b4f3bb060006aa4c47f6c9018a665051a705297fdd96a853aa9ce33df6822337a097a1e5e8e3e94bce359555d686a07586830bbf434d70d3b78dcde1b009b52319a8c315c3f73aaeca9f6f5545678fbd3ff679f78ee18668c5073b8bc975c0407129077faeb3bbd586a5e997b11a5487e96882cae4e92d46b8e27e4e0be82f4e74ad4beba5bc062e927d2bc80f34f6e7a0b1332428f630cd438e70d956a157d5ea7874bced2de2c6a14fed121d21301031df66d4a793aee60d43d11c679c3954e4825ad35537191f47938c57ef5a397a22654a871274c08419eeee08d277742804265e21840d30b43d99b8879aa9159a85de70197ad271be32febfd5f5a88738d01c56276a0aedc7bcda5d2e45020b0aef7cef55555eeae5573b970eb84fe8497befadac35d93a1d056dad41d74fd9b00a87fa4c79f581b61e07b18d128b6809b8fcafffa0a144352a668f782001f01d09c70e42d043efc743e88a719c3f4c0fa63c4d85e4a0e1146157fd3717a3883523886bc1ae7bc1b30d669e26bd55fb44e1dda8679f97352dd9b453ef215a42e79bfa120b5976a5741bda037a60a8690e2af73155f52c9f5e5ca93f3f244163a97bf93280c676b5aeb8cecbbfd131742d8b3b9b3ecc84ec99562445420a2a159fb6c8f3f6437a24acf1988c22f92b3445bc2de00bd51d05963d7fa06b1180c54c5fe2f7dcb1d0c237c93bba247976c83e8943877d7ae8403f77038e0d5d6dd3eae6f5b27ca5af7d0208cbccefef7a3309ef115707d6f29c18f34e87753bae74146d1845c2cad7559f07c415a3d5b40b7d89380b4c42c412bca755f11ee46d6de95861219bc373d3ecd82121b0941137242f681344edc97d0f9271c1a9675571a78b8f6948beec7c93fe192218db9da1d7073b0b2a3123059677decaf20d5c94785520b48f2afa0187299f307e4256afe2fa34f4eeff13d080cf758c615396c3f9eb2a6e63bcb9dac019b5dbce36736127c283e5bc5a7b4298c9108d5b6e3fa605dd96828d5a4ff2e110606c6bb69c70e25d89c78fe273c29e6b275c14a96ead2da0c9e9f7028d384fdd4d6f9a19cb80f9de283fd4a9b5af0f92be927a055a890b923d5b0cff3d447c4943dd3801ef6f431dab269589eec9ab4def44434ae8c599b8e03b7bf111bf29536410804ac0782d3825aae2f698dd80c4a48fe5f2bee7bd4a0dce1609519c3f2a3482926ed0fb37e9eb6f828b08242843d9b1952b37d4cbaee3eb7f5ab489be77a3624464ae1f5dd9e6e1a4c4a1da67cf701339f4e2318b5554efecf0b15ae574f3601961679c1f9442713cd15fd61ddedb2fa7d53b46662b8c11a0fb79266a51d4d4e9e72230bfeb36837a8e7879479654ec37297c307a790463ed1a403e755bbc247ae3963d0a29f9c5fee5b222e2fcad828ae79885474961ba127e21f5894ef039617a050a9bc7c934109a41cd2dc91bb750610e6d3db17f4690c483f6c03d1a4ffc205b09bf418bf8b959b79d6acea8d588ebb5b379fc79abcb973c3b327a7957641f7cf21cdd473984db91378f66ff1c4e5ac503b7db0742f30d317746168089cca9e30b7a3ce7006d4463b8116ff90dd98a278b78570bf54b3e3bb915adcc20ecebc357706c8d7749b080f8dcdbecb659988db4f378ba2aeb04ab6dbfbc52de0126e24b0302c1a48293ffee6fcd0596622e017e815f3261dfc73f09be2eb6afbafd53c85eeb0f1963a7ce21d5c88cf6f13291b526cf15e29e2093d8175d4a2eaa5278607e8e01f85172e84a1ad36f135f5af1dbbbd2282aa93d508e4f95992dcdda105970835bda420432031b7ac9fb94e274a16bb1cb0e08ad4e6c6cfe6ba201c5c6348680480b924767888a4f90e308624d89d414d3347b427fb980266c5bb0f556201e6778583b82d3ab0b744c182301de8fd8139e6e9739905f2df097ce93508b1a0ed606d0931750776dadf24f80fa3cdc1bcc1b46a390187a4c0719a5b8fe1ea32aa486418078a9e64546a84cdad7e1a8b7782fc50450601cbfc877ece6b5eaeb78e8d336a6970b031f0b0e4aaf6813dc1e00474d42311584b9559e6f88afc48add957065d663299468e2bc2c712ed1ea3308fdcde9f9cfb3f684d5815996809713e0a1e66d3e9a3d6e0bdfca21459b8688d2bbb093f131322bdc825dd944912e690e75327bdb4ea2f735060818d2056aed690383cc37bff264b3e474e8efa53843007966924f7d57f8caa55dbec7388289466baf073dc69c2e2c048412c20d783be03ae57190b16fe34235099b7b0bf14d3fcdc8403b54ec46881268e4fa78b55bb7b76d972b5e9749585597d30112e73669281370befba3ee90a852a8eb686a938b025deaff3750b90d88972cd01a029d97e98c98debcb197e04ceaa149af38a075001c9ee0aeaa0600e7a12f96470697b1b5c614cfe1e6c10a3712515812fc1415c0b847365bbe3b92d145769e31900c1d1c4a394662a19ef73a7404cba3ccdb0dccbd801d6e11fd0f17c3993a597fd820a98831b8d0471dbab8070382890c0554ac172808a13d67a533b3a4abfc753be658aad6f677631857eea4741b1fa41a6b363e71ab0b8b14a1ba30f0aa1cb8ab3ef774035a7fcf250424f1687dd28fe9e20fbc878c41a06ca1bc73ff1c50fe233cf745903ee0e2feadaaf5e7f4768a6ed5c8d07555d714a5865d758a45b21bd508c26f6b1df601297c0c5254afab175c6ee2694ce9718ce6605963ac6d6daf47b16246ce88a35b6327557a4e072dd968ed0a4df3612e8daa4f857ee326d621d5e32bf04a42d76f2921c1aeeca471753ccc3f552d8c8fc83df231e2d5ae4ae1c10edff5dc768488ba0e7d901b1a09c4b1dc31e1f4e22f243c29708b83aafd996ff0157faab6043a1992d48c1f85334b131e504a1501b4313f0c48eec52e651440d6ce5b43cd882c95fbb968c09aaae87f0a8df232d81e103569547a69d6effbbf18f3f11066cb5659fe550e8e9397207f8c2365f74ec034ef99e5ae99e8c302b8ad8c1019158ed5cd3c997c014b7fbb01fa99ebeed4eb2da309f35f37493206be5f6aaee2923ca36b5e2e6333a9288e5038cb8e68ee79117a5e762c9cda1bf94560d1bfbec5ba5a0099d0fd51f20be005977943b7f6a41b03ecbae97b935cde51f321cb38c404a7df651a80c30d698a08992e07addc2b905ff9a7c953ce555b0f54024d898f43f639ef812d0b943efeddc3c2896a5962ca13a8c373d815d1d2bc97c5c498344d2bcffc07301403cff24183346d71b4623b12f81839891020cb64d39780795ccb4462ce3e178b8f8ac0583b2e5448b1382f6f4a96762cf5f984a55ae0b351e56f1886dd6eedd95ecfd4bf8002fde281a5dc0ef8497d392ed9c8700d1ee8ddf7d53513594e275b32e33ce2ef00c513d764da680131db3638b1c474cb199adbe0c3d588af6018cf2ed39000aee51b3ff629d446a3490393f7332dff0a9bfede426ea1bede909387bbfcc4135d77438a6e455198b9bfa9f1c15ca157bf4379e1a278bc93a061e5ce5af8e60da9db8a86600e8c08d927be2e60351d9f7f7927dae97e8b351c952162f292e9f00a6994f424edc6f2a1ef3bb6e7265c8e4c16ab8e2e31f265a3ad475e7821f98b3391b666b394ba95ef0134b56c565225d081e993fc51eb0534f3e46f365ea7ca265e6bf569c0527f4d39e96028e050c2d11258efa6537a7491d81c1da2decbd1d62677235be4b3dd24df1317ead157516b2e51754b3359b1e6df75c3bfdc0ac33564a196555abc69cd368da8234b07ab64c5dbaf6b2a98f735732a1cd47f050cfc64180133a268410ddb5cd7179cdacef34d88b819df22f36f9842ddc63ba8e9354d918d1bfefd0d58cd29cfece4e3c1f906a64f9b46c879d70f155fb557f2a31cc031a768ca1b826c64c59c821d30d6afd1807e4214f14ea289da9d8208d55d9627489e403fb4fcc6d1020d815da80e21fb286454e0771b648bf158c69a2f46e3273224c3e4bb6d1e3d58c48f82b44453ecc93c1de746bf112c4eb7fa23cc17c35039ef647595b3544fecd1ec28dad42e2d2f084a63f99beaa4a8c62db95d0f29e6c32ec15b2ade7b051a13564af6ba71c9588e0cf606a0f3fed0de82f53c78bee439610ed4fac973295163574ad231349031661d0255c33f31d52610e0bff252e607ab05402057a22e4cad139b62bbb7d2e1fe0e870a3c891b58882fbdd2cd0decb8a2b46469d795b440b5ea787d0a79b73053453a32b4da4a41812cbeda8b3bb911deb8eed326d952972c764621f0a9ef42bef17ed7402eaf3eb6faf085d402157dd4e1f1e15fe8e0bb15fb0b076e5672e9de47ea5326d25ddb5c7c063a2843dd422de6bb9e9bf0f0c1b2a8ce1007dcc6f6c4c436649d4baa6da2d462d2b8066b1015f77f097c35cd0cc88bb13123fe03e9da3b7bd8b87bc9dcd9278e1a3f0674a8e17eb7d7eb72097049d972616f3fe4b02fb92265a7888aeff1074e435c4c455ae94cfc0aea633e79b28d7f38292bd4e9a982605c0b5c2c4fe133dc6a154bb82290c2d1d34c8e830e8d28084b0e0a03dbc2f6b66e28b733941aeab8120b324b2412a172221865590e3846b43f00efbb4363d4757c0fc43c1dae3a43becc4a41d2851ebb4b8ad56f17b788064048a73e37043937cc064175a4fcd3aa5340d06e612e18f8eac831f8729914d4edb4d1258c096a53219beee5809ee7165b6a6cd2696a6f3472645318c338f977b176468a4fe992062c19dde9791c86182deca0fc0e518773e2649dd405f5fec69ab637ec5a916cb7477570b01901169cedc568b9788a3a8774799be5d4abe3dbc447df365fb1ae27b459a1efc05185a105c1ea7781da73712bf44754eca2f0927fe51efd4ea2d3903127569349c95a9591224cfc8aaa09bcd5ca171dd547d6937aba585ae5edd3e55bab9e226ef2c5e9259425c47a0fb9255cf96a607b7683144e40141fe46f740c9cf7fecd80770dfddf9f069cd195b16ed9120fbe8dff3f21dd80c5545518302f886684edb4bf1ed7d90913d26856ceb33689f1337ce46aaf19be384f22a042554c54c62fb34f93044a93e64b188dfc679d4bed7d56761f639214b5170d2b577ad4bcbe97714eea481d8248b2f5d8b6733fee4fa2ece16d2aa35c3e7f432568739e9b02efbebd3221f6f3d731cabf385151b3e706354859870774db0317fc62a6c501311b8a73a6afce17230989655be728f1cd87eb34b9cb6ee2c044d34dac002225adeeb9685de8c6be8799a6029a18a1cd4aba9622020ee7a661e8d0fd8759dec4a398dc51deeb0af68f8d94f6b57c14ff9bb725494e0105e15f45eefc12fe9ea5561a22770e79868a0edd57d81994bf5bc447223712d34ee4feff83a3b07ecfb80cb9a21f6a22e38c185cb693b993d34df708d328fe00a82c7f00063748cc91f9bfb680664fcc93515c6616a5418c6cd179d2b074409b0d725b4e87a66fbe3dad127482cdaa3c2d95a06da75cbd6ad3fadce4464ba47cc6afd7a52334f1d3027f8191f46de218f06c7f9376a05b6730e8b5537b56adc822e82f197373515ef990d5ccd44566793d24534c3e0ea056b8acb9f8cb6ad13340ec315d64f23fa6f0adced5f67d080b7cbfcbaff32e1d0f585903aae61c3003753974e1d50a6472582b272621ae3984aedd7c741f0169c38b9740ef4cead0da3ce70cf601b36bf93e89bcf20b0736f04ec1d3c6b9b360d91641bf8b40f07c859880be6f36d16739b9d92fccefad309c4bbf75313319e52514b3a24e0b3f03d05f7a1ebe9ccd59d9066b97251081141c323f231fed5474f395b2f5e4e712b90ffc946addb184dd899d0b21698f206996fec7093ba6c9c721c270862decad053af204c3004fefacd257029f3d8f0eb08ce7e27eddca099ef4b3572492c17ebdd5d71efac6086847cd7a4417830fc0b8803ef784fd0bf55114b52898f81eba9cfa4e73ab3a7d17bd9e0cbbda5149ee4bc34776a668bdf452d51b4cba76d95c3d2df31a6ce59e726611e41051ba30a5fe7b08b8a6f1074bc8541d86f2c354ecb040207058cc20ebc951a5dc54f4494cc6edc5260291a9a50fd70381eb50dac44eb4e17ba6bb39425c15d75828828164064e2fc43a936456fb5e024d3dc828f3df9d31037f0b967b7077d4c657c52422557e03c21f13aea6fab080c9513a31bdd2aeced101bdeed1954d0494e56e27db29df7f967150c90a28e9652c7cbd318f255efd7b17055f1e34cd19069d92391d5ba95ba286e6058accd10a8a1dbda8b5786783fa94cb46c8d306186162501b8a47455347f14c9976cbbff605183ae6bf8a0506d75d90ca045873bbdccaae9ec565d984603e1e0c31fcddc6cae4f53ab023e1a012729cbf23e72fa4fc01c0c3cd4d0ada4fc44d530c66e547385a45f92793604c178bd5a4d3784033fafff03faa754734e13d389c07d228a44e0e355fa6e5916a243bebc04aaaca4dc79cb6a62d31145bbdc22d152da634b0297cab125596cfd721666b0529ef2710f0bc5bf9afb39448a5cdde182fbd177ade23b2a811022c7794090372b68ff7728b3dc12c16bd42a9e46b2c71b43f90c89590efbf221303471cffb8879ccc162e040005e1e74d04f4ebdca3f633895a0405f0aac23074f0c77a0564708f69b473e26222ec9707bc0dd19ab44505c9fe08bdc22496cc0ed3b8a4068e10457356838b7108b53dafed27169fd9d6e577b9066a925d9795b9e95678d74cc99a07f367ff79725ec5e23bfa8bfe24557aa1d71a92d1a0dec3fbd2b1aea577e39f6cfc7f62b319aa58cb20160c6212f3c222189dbcd86aef90fcfcc3282024af1b6ebffa146cfe926ce231d584c8d6dd5091cfa54481a85ff1d7c5a6e9d074b0c788b4e0c32bd52e7294b13a7801ab54740eb13f0d29d4dced6b848d4f661718b509bc0ba88d1cf66f0f6c6bba1864222cca70400e30714554f2f7a28a0a9e81de5fc1bfd74de2525ece52ed52c2a75ab684b0d7c4fcde1a9ed252702d132e772771a28f1f7720d64f8381d9c8346738a93770ea76ff06c23aacd028ee5bf3c0ee57d25d1ce318f378544e3c5e15cc8005b359228169cb980fe9312c12f5abc7b5d643daea0f9baabb287cfd50f26765a73b5557964c4c65070a424a06f72c283eee00b2cd5291eaa8a4812ba7ccd0171c87660afe5880478edb04837fd52584beb2b60463041cd1d2e94609cc982d941fce7eae88d3538be69d241d8f780253f7f2943eeb2e528661138bc2979426c6f0aeea760b1e0855e902968694b17a2834ce7266aa02de20134e4636347d73e7ae31ea6504de8177d6b62c02a260d9539dbb9bb069ba06f176ab77edc3918e6ee5d87bb06ee96cba9d74ff10ac59bc4fcc8fcd3339f679cbb928a48a23e93c7af436e1912e02cef8a71b055cf35973a42eb10291859fa7aaced122ea0ec4793366f6ce30ed02f1f88b6d138327f8518fa5cd4047b6614a0cf6905e54c90e7149f226515ce820b772473fa391db11de88d778b8e58e1694143a7ad4e129360dab63ab0f83fb173a619f6d4e7a7679b7eeffb9f322c6e1f8204c3410f4003babfdafdcfcf82a8981d96199344dcacc6014f8c8de6aea742e101212687b77a1aad75d35705c269ceaabff2b4f8f7b8b545ae21fdda719e9ba9cd47367f12479de8904c4e176a25de04c4227a8ea412772c2907f9f5d9561df31d19e864cb7bfa3646e4b3a80bbf839c244b5854c13ae6760dfaa0833a76ee293638c24ad844f3e162cefca0c5d25c9fab12e6ca122deace447662b51250783e8517c899efe8fff7a2a53245592d059d80d80e5e26fabd26499f8c67f193600cfe793620f15923ba106b2954562ae8bd82e416710551659536b58cc8804b172270f9c13e0bc86c61bcd6c6240135891088190e393cd2b23ceb4df9a9d90b742c3d445ec884f38e9af1f94159aef51721c64e4abdbbfaccf0167a3a0ae57284a0c8060e08b0f95eee5eae3cc3022a89e9e02561f7c99902821d68b2f587945d0661ebeab6946f3ac9df865d17e3dc6d0a43f94326d213de11e10c35c7669aec75e52290b2b308791799f5af06ddb636f0473fb0a8d6b5d18859d88b9195ab53a1a3da3b7ae52430fa1b9f60c6bd1b2bc3c2fe0e05a4a7e887bc83cef9bdf67b300645a7dbe8f98e0fe93eb0d30bff74178be7f423c7a235f55c8d8b4014ac2f1fc8e11c3a81a07dcc606fb1e5fdc149d825de73d8dc738a9f8af4a57a9db33f7d2254ffe646c9316ae80f99af280f05b7064fcae2ea75bd0ec4502ac277ff676f7520d5ff979c599dc4242b592d1ca8f14130da4043317d8ad82d9615dd301399b8852c9cdf9d735bcd9b7b012449d70f678b076fd2c5f5ce2f84c43be225a419273a751f830603da0f95ed23332c799f32cd216747888c17d172c032f2d8200cf3e5507620fedc4960c7ce698a3dfca2b2c2fce4f579b89c67d8887e5cfe58ba5dde751a5bb17afcfb8529b70cdd9e3ff7d64f4d5fcb14a5c41e649cb7ee627d490adf838fef5a7088531f6cb67767d21c304f5a35d9269a5b5a8baa6478cae69f475b0e72511f9799338a8afa3b46bb98cb7052e227a1a620e099ce1fb0c61e3d7c9404c3a4ab11d73745f43db6e3c5efd3347e205794935522ff539da872b157bafcf9fb4ba69d3069208a9dd15ddcafc2de63ff96b58fdbede16fa63ac1704f4432d97eb9515b243c0b6bf5988fa6a8a12626fe9e744cee26b165f02e68491f67a4f3cca9692d35d1257f948bc129ee495b72bf9e27cb87be1f0be1102df8d50f294580d8c3e6810a870b795ed1f246ccbe5c28d286ebeef32857b9299a732d082b4bfe170bbc58b4ae81d1d9ca14a61734594e975492d229f2781e4b000d89a799425d6ee23ba0bb4c5314ac733776ef445976b20a01a0f12a0054495b6a3138867f4fd707a022f5bc4db9d7b4aeb6879a6e427babf67f3b3ac990b49310968ee476345f65bb848e58fbbfaf9be6ef41206ee7ac85e5b02b0752b4e345843ff309d800064d0a8e99bbbe18f1e1742c2019e910f16d05b121f81bbf49fbf2f93f8e12e92ba6d5bbd738032f5ee4050c884bfd76d5d290ef2c3f1734c4f0f9227b8fd8986175e009cc65ac435128ab53ac72f1df6811d213b5fcc892bb33ba403a32f8333abd3ed4d0547ea27e55dbdaf35509b3ae39a2a68ca8e5ffa21fcf7d7c902663c686e62877c2a8bdae9fedde05d7d28c258d0d90220666d234b64fc2060be39bd61ac1869606618e5aa46365b7c01f17e983cde78e7e0748e4b38b9db80d9c2c47cebc053af56c132c5adfd695521e30ed7b0165040ac151283a4ed0f7a775d94d21d123f5cfc476a21b79fd9f929897ed819b8b7144a0eba2c533a3fe63580776ee466f7f9f511f7b38333935b063bba7ae86f12f36cea918cd4c544bf2ac4d7cddb510e972ead871a9a38dfbde73a29ed9a96643767ba263c0b511ee42c7e3a83a818bfec929f0979f0ca3aef1f07e1e8f35a8d5599a286c313bbae7af1bbe314703fcbfcae002a85536bdedf7a96b40811918960cd0944d7eba10cd66d4d4a565a075a4a49347be2235ee9b0f69df97c267c225547f8db742b24f77136b02a09b6ffd7627ad46092248279f270dd33672e20a734c85dc100fefcc5cfb974bcc7fe844adf43b2973d28cc9da42e0ebac002a87b558ba4c8ff35e5534d6af7daa354ebc5835e8488fe3658d5531abcb93791c0c77f135009836b58d64734f1326c3c1acedcfca3ae047423db1e32c7d5e75e54f3ecf7cc2be65108e7151271ad1772c1ca62b8ce09a7544ef93731dff4ab0b8c900fd9634879704845711582bcae372598e930c785dede5cb807de439ecd71f1e8b05eb4b9b28092c3973ae2caf2bb9510836420d454177afc1e549e73fd5aa7a71c046646317a8d96c8e79217ea9400f25d0bd3453292e3a5686b236a47e0cc9e0a77c7c07beeb9c65a826a5cfb1f56b951d4ebaa89d5d9123e78697812804eab7a63142010903f9fc9839f99236b87bb775eba25dc6bb2af095a02690630591b2f9c57e4eeb8b700ecf746a494dd6049c1bf6a6e58ca7fa3eb466047005a014a9afd2b57d06a43bbe8dbc80bfaf4d41718a05c2598fb1ee485bf2f8cec126f78e930c356bab72c7723cd508482d1020ff50eb0b91c97fdbc8933b7b2167c9a2b02777f9478135d1dd01d06e637a0d888697d3328cbfe64774449206ce1c74846305f009a72b6eae1f35111fd239104fcd4e7f70661b9844b37173a51834bbdef3ddc81ecfc426800cb6489e602741d9287531b8db3a01aab7df5a3d6cc7bed2c60ea221122fbac38e7a5bf58f643b231639773233d9c0a163ce836cd40fc12b1f83081b58ed1d1575e19a8ce50ecbef6fadeef1c97f0236f9553c6b9482a08770a4eae8398354c2bf46581130be912c52ca791d15b7dbbf136b01226ba635ba288aa494c39769713c177bb58c7abc1f09a5930801464c7814266d509b9f6b76215f9cad91bb6f74ec7837518cc89043b1d3486f5acdec9756bef867bb751887317cbd002954ebd53f13d835cf77a4db9a9e76720700afd46090f096a78c2424ca089db054d77a711f43280c37065aa9a1f3f4c4d0565d2ddff1b84853baae6fa5725553c8bd03703ff78862e56b51b4053f0a9b5ad377e24f0c7cfab7ad540268b21e887d48b57f18ef79e2dbff9052dfed85e132a120daeb862f6f580c132337b69ceddf419613c08eb2a87b6c24e07905bef2f967475460386983001b61944ce47a76a6ae1e4ad3040f66772dccce3d6a4e66109fe09816d3eff337cf824317e20f4ee61adf11adda629c494cadfa5b1e3546b04e2652e1d57923bdc203bbbb3a4fc621b90098154ec9b266a47dd51adacfa070972a831e67acecceca8a8262f3fee75695284e51cf7b8ed6b20c2a92e0e80c1e4afe331540cf35d02f5e6ff3520b476bc43c75df3716d81ce652e1b5f8ea63758bf683354110b24a0ab2f411359fbad8a5e43209bdb40fcc00a60bb3261ee2e60a4e62661bcf88e9063de96f6337f8db5326b91867201ad79b8c2202c1bc508a2a516c974ac1a8306833da5e1364e0cd20577dbcdec5cec419b4cfd9f4292c17240ad4844875c3f05c4d52ab956b201133a025c5c92c20507df21d6550d0b24ae40e62c6d6e58656e95c330093a135dac9324104788600c7a4054b4babcf1b56360ffc5175023b37d75ce940ab522056521635e1cef5db786428bd5a72d7bf87eb5ed9f1076f3eca3cd1ee28e92648c4627de69340d69875e0fc5512839053c55fcbf784e7624d7200c4d62d0730aa5cc97a7acdfb08977a5e854bd085946d23eb37f40668036080bd6f44627b3891624cb85f8cd89b310ec82a013bff9fb83481d1a8287bf5e32047870692d76ccb5bb6c6cc9eb856e4dea6c8542892b5e62e2a4ed3f90722402129d6b88d9ac334a05f6f0e2c7d362956efb00deb0f89c333724b50e3b717746fd8800adafa71b1ad5a5a5cd340ae1ffb3a1582f53f490ce65f0ea8e92a2318d2ff1a738479c7f7f30302ff77b82fbfba710e65773b574e534b2d3ba5280b3672f60516502c68e2befe4652a358f4dbbe2e2fadf9d391c9d83da3d4add1015ee922ef8bb089e5b2b4b81e1f97a2abc4d7062293a9ab5ccb437dec2047e50ead808201aa388a3b1a048eb3ad2c4ed9f7e86b353109c40f9cb5ca24fe68e980c33f25d03cf6a95b202b4d7464728c68b5add8d376eb9767c73371016588d054fb1918139704d15d7415fee8759223d4d0346359035da2098895c7966fdf573f804d362a7529e599086aaa3397a9bc9acd1493e50efe8b150164ea0b0a097d1ae8c8a76854f107af0d8808fdd302be1b838acaa9f385770b177886192827fbe4e9012648f9658ee4f4bf41302c587de0152555fb8b4ca5fac1309ac4c331bca5761d73042ec3650023a50ea328351e9e05645500c13d6ed81e3a97919e44ee07967fb5cb3117dc05397e78bd149e3c22e71685bcf65de4b9462330ec641a345b52f2d5e67f1c3ef99c0902d50cc68da6189548aaf3ac07df64b4fa0b6883db1b054c129fcfa62c0ed1f64ba8613fe6981bef9465ae88974181152b90b8c382944af5188681e95f57a4460e100e1d31af48d7ba2e606250d309ae35d1c2d13cb56fe516848541b33a330fd7c1b59dda4d6249a1a17587648e392419757079d7c338769e45aee705ca834c5aeb49c150b0bb5f717c839e314db329ecead411f52b6891ec479a3ea16acbf57172024c5e55bb9987d2ab05a2309464cbe6b8a0ba629fe4b940013144e9f5717a7fc2ba10636cc543c659d76d7e13885df352bed3f12c46fdf4bdb23ba267a441682c3658a65cc60c615ab01cdf7f7970b4f8f6d9fbb72d59955932e280ee13008e7d301b2a045b846b0cdaf146ab9abec52856c4f09d89260c30c4609a35c5e3d0e92ebeb8573cc17d2bab8f22a4f140e0c5d2191189f18e66717493cafd20d239299edc3233a832f1379f787b8342e3ee9c1ed65b065c7a9a66324d9950ddf1ca63e04eecce63d83da2f7b63de3d8fa6f0c5df38b05b224d375925ece412298f600e63e13cdec50a5ef2c1e91b4266fa1f564ab25494d4fef69e0d2a5a0fe6b582f331f838c19d7bfa455105d0b1c26dfab8e3c5971f9a7dc85d529b9d2182869bb20be08abc9b0521fd748a78a77de465ee738771eebef49e3b6d932d9acfc738ec3092bdb1cf50ca1b876369c700e548d16dd13541ec766959be9e68b6653c0a45cf6e76c7a892806f36299e1741adbd7d39644f188c7aa581b7095c34c8e93b38f800a756381998f53cc38e2fe0cbf7205df0d96a8d11aa7243788f567d75ddeb26768707a9cd022c32f0dbb41493c10dfd30a318fe336c80e5fefe3fe5a0cb0dc635f20d107128a2196883a56e814b97237252c84be13f2cf86f1a6f9114ae4f97dd24ce25c3362dbed041e3f476b5d1a88b6e32a1a2a4bbf60acb7c1ef0b91b20258d16269c4935b94d53b014c7913c2604ded748f6532c526fc36a6ae2fec02accbdfce24b3f8e3bc5f5e70fd51cd97dc8564b2bca6ea3fca98437cc2ea1fe3767f9aba7c5a328261ad4871824c2e20e4f59368786f034627e48a8edb9199c38eb3143c7e5b8c2aa9f4f08f298f6e8fc6a2023314213c1ebb9d63938b48aaa04e4f4d2fd85de2e9cb0869ea05239daeb11ee13b23da6017cbf1bdd7d2464b5af1f2a8c3f6c998955f9ab59824074085f790ea049b239bf015ca522406addbac2aa09793eaf8bd448cabca18d09643b31cf6225ff4959f10d76dab11c1a90ff22c257f13591d616cf8bff0e4521b16ab845ef8636fce18e612ac37cafd6c7754a51896eb03845ca2a0c9c4a0c060ae422e408eca06697650d0d22feeb369abdb556dfb1ad374860f2140f699c96c99f4f8d09fc29eca90426b724df33795678e9b482ad97c41049ed784832d0b1b2b524314b02f78b8c8fc6cf17fe36aeff07fa784a97289865c5cc70ef3c3cd61f7643e42c448e28cbf11d6cdffee47ec8d87e8a1f940c07fcf25a91d39804474310fd46ecbe90da76e4d067e4ffabee1d6d7a4ac0e971db949385d7196ec94dae868a5eabb2f133b2b900841d4fb13c4f919cd54c20cf462c71af297dc3fa694a867cb5ac4bad493ea0fe4ba4229108bd91f05ed429939ff8b164425c5cbbb21005de8d39ab822378992d6d18476ac7e5647566a9d25b1b3c17727908d07b57e7dcb0324cf5ae9d3dd4140c7904e6f81a0e067bf05d950c68b626b5522a3639f915c3c071f47ce0041c08d8a2d4220c644241ddad26935f778070ffc2de1fb5b06e1a56d4292a24414b501beebedf5db79d64a88e31171f94fde0682de598474ee794fe11f4c9b2a45184007fd0844bdb6b2ea343696c2c131cdd452ce2cbf481c9ceb2da1ba848da1f6138a746a381b2bf83b0e085ea05686e7f76cefb4c3815c8ab7a7c4ca58a7d8711e568325d6f4bd7ae9ef3c8b4c1f0047804735f9f564ccbabba56a3428bee782ecae945e05fbc8db3b0d5094e4f5cc46186cc24631dbb7a3e46507783fe702ce80f4975f45e9ba1c3d8a252590412bc518081972b90136a00b26e39fea79101dabaf94f217484b684c7d64934afb17c46a1b687bdc71d001abb44e4a0a6ce15ceb2a9cfb5216d9cd25be6eaf9d8c803aa154f18a1259d47572ebd5fd69d188734d11a347f2bb3b1164ccf077d240f69dbca848f7f9a5ee9632478306b6b6d08d0ff46cab2082bae15884258862b1e0a937f01c9051ae27e767ccc36739c2d161e85b622b06a92c157a0f9091a688834d7f72727814409c841572bc0099c7fa334a79adf958f6c38467f8cba06f959dbef12dc524a8f82ad5ff18eb6699a089b18a288c08e9e24140b13e9e9777c1452919a8b7c2a9624f7b1a06fdff2b1e064a7e698a02876dd5ce7f513715ef42c444200e3eccb621adb72f41c06c35fe9aba84033f4e59eea64a1aedf41dff81d953d3fbceae7ec8482e1e2772f20b1dbd8ccb79f6a40637d8b388dec0067c3bf5c5fddfbbfce66da614655e8ee04052123d5c40b4897121300d6851811062ba4a8543f6886b79031c84c839070d1f2d5da90b86533afb010d2768c0bf17b831298e747522b1b4ac8ba998d21cc616c9120a12be6bd8c28fa63dd5da62ed3d27f349b36b1f161b80792ebcb6cc87a60fc14a58d603fa5998a0222d22d616502efedad27aa79df6f9f4e2c2530e2c6571d1297a99f54bfff2f8296a51787202436328486618ec90a03c9150fccde466401e420a3a6dea70dedf994dd94c779dfe39bd2afaee397fee9aa8d747806540b7b81d4bbbb1856143d5ed1d1fb73f738e4f76a08eed4ade21535c57c81ffa3afeda5594fa7abfd93b8cbb892f8f2fcd1f3718239d15278224149c3b48662bf6eee63608564a3314445f852edbae50a45d3c4b9cec8248e7b96789789fcaad256214e0752d409c35ae6c799b268436b4452aae8952fc521cfbc9dcb7fa645e29a06623351bc82f417a9815e58ab3e6313b807fced13c63b97e1ad86f4350beee3169dfb8e28ffb37888bfb8f7b665e914104fb3b85cf6de785c8d69a54167574504055a578290fa29ba1c1982809baf57505e931df2912b0a7dff4c7950f14072b5143b5ab41cc5686f97d22165e8c3b3e2922a8330eb898a4440ccdeefb95038c3bed5ebb165c86936e95ee4c125f3778896ff3c6f05f8cc632751ad0e143a86cb7693a7898169241e20a6c503b3b18cd872d4bbad5e6ba8e324ad679855ce744150af95555c2954a9e365623ac15d360cb273abd467da511c0c5b938cf213a250e4b48f110f973b5463d11942ca4df96fbc1de27bc1173c61b911def254ded42d8ab632b9c7088644b76806fccf28b4facaa401add40b5fbbbe97ca47b0c7abbbba5bce84df22533310d3dc3eaf05c281c23651de861b5093d29f8b08444f6f9f57838d0308c9c17f6b8cdb387383067cff1f8567e2e11850f16905290a4d1fd9f742a8e885f1871a476cc70a3a54f1de53d84ed06085ca224a0771fa62cd82bc82515a65dd2b7c06e4f14e3c0151bb745f90991a0c6f69bc72a04c46ba5c6d3878ccc7acca2cbdafdb99461e34edf362a09d66223aad1931cdd709e88ffa39acfa0e5d183bd62ac3b4e80a5e7b723163d14e7b9eb82ee28a8173c4481e750b240feb1654d4b8bb3f9f03abc4b1c6d5db26bcb81be48841c9553c45b0f02c76ee276163fd29fa2b2db0b223737d740afbf3dee323affc475b6acb918ea65ee5bfacc829a2f20dfb94cde5052d1c501408cf13ef97ef77a7abe9ef58b845013bc87000ed35ad352d6bce9bbefc47f4f993a3a36eb916333c15ba22cf8f83aef62b675438c8424aad5db3b217f7808bdf536205585dd34f5a804337cb053dcacebf539a813e7f0a25ea2966c85ad64ef4830af3fe74552a1aba8f06295aa396f97bbbd7ad37911c1eba60ac6e1ab534f80e170a32564c3236a365e2e5aaa4b017ca4103f1640184d6e5c201da6cebb1292f92e39a163a02cd827b39daf23a25cb5769c07c0678029bd71b16975dcfe0c6a97176a8272a76c0fbda779b113605e5a8ff6aefa4bef2008bf24efe0d1fae44e3a204415564ae6dee8e0b6b444d210aa211ae3a80c20ed5bb927844251cd8931f4a5d56b0a92d7996fe164a14dce727b52976438e560d7714065e34968e72e437c85c248c13a0e700cad2c8a10d9680fdad360751846530dda47de6390e83a329ead3e3061f76e6104da2403fec5f5b90b9195b4cadc0714eb979b2da7cecdf565095022e01922ebab368bb04041bdb3a5d9d6aac629e6122acdf3d15e259f0514a41d6a6b933b1eea32844d7697ed2a2f612e83f60aa122d3c0df3c8fb3825da6393599c5bca822458d704a9011ca79f6b37531b7554489356a8fddcc8a05f2d1e26e84bdedd97535f6c38bde35dbddcc4e19b747fc2c99a0b2d250360b70e70ecab9cb654b0486b8ad6a9a23f138c45575596c99488bc6ffb55316dd2fb2348865697d9f40bb4bede64c02418e66d3a89cee350f70b33e1009e48d865c1a33790e1186d66172eb1fb502309b7150e64d41136c894ad0b5a118ee7cb718b3c972d6e8855b8a19db70758a086c333b5ceac1e35bdbf486fcbe3865c7ce0c571c5c367bff4289c51beed0098c30f0cd7c4ed9da3fb7300a592a294fec2596f9057d0584e5789c2b2ca10e3de6722be4cac2e8af") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_128f_test.go b/ref/params/tests/vector_sphincs_sha2_128f_test.go new file mode 100644 index 0000000..703b1e3 --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_128f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_128f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("4f0a4ed03bfc4f8a7d2f972ed7dc4e5eda7eea950c8aafff8a369e5e9916c6f5be7b5eb11935921476f62bbf95d0118418e12bf4dfcd8a1ca1fce3b751ba5b19") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("be7b5eb11935921476f62bbf95d0118418e12bf4dfcd8a1ca1fce3b751ba5b19") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("c1a4021a8c10e17c514f190475f15ff7dc5ec9751c64774f64be077026af62b2f12b3d397c28211ab6ca8a7d6b8f7610a95ef0d9ce71b2b9cebe6177da5990a331ba59967501852bcd04cdd3bccbfe98e0ed92bea20ce4177706c294b1f5889c72f4c81270a4121deee9dea39b0f3baa7b0f26bebffaf403d452f65e883c55c03f2eed484fc5d6e1d708ca9c8127e830f1d942673efb7f6a10ad790de109e43f38e8659cffdcadd872897b763450a44505861c7e90df04bf3293ed98abe2870c710fdeaae69998295517b7d54a6ac4384008c8926bf1f2c08cd4cfc6232ec677c15e9a9417e9dbb10e624c7ab64d1205f74fabb4be1997933fd8e9dfcc799672861ee174a8ed79bc45834b60a1abf4d77d826644feb7bfe4f7b2b675a72193bc9b3129b644394f19e38e4ee1c0c3f38e681a562fe4ef019e2c519b30e1087efbc36a67687d40a39c443963c4b463a46102696e3edeb41e29adf3a800f114c1edd666e654cd51f0bdf19093320f4fbc0f0588288a9c3ed17eb76a3df00155e2368ce0aedf152cb38639cd0d48355197e50d680699f0065e19cf576d2348590e474cda4530a445fce8c67991a5b356976caacb1a8e2f64e060057987a4cf87969aa388caab9dee0601baa903ee04a2c8dd95ff86ef387d2f6ffa3efcb77a8b24a5c7cc12d8a52c9224091eda87b6540167c334a9f6ca36cb4284cf77932a97d1fa81f0455c6fc13f06bae0bc5c7e54ae5fd11633602577915325c3b323c0d93b1e3100f95677040d46ac387b850a147ee4251ea4c54c9053972b5457e272f7a4b8a79eb680788310e87c4614ddd0b02a10802bcc5ffed04c5af079898dbb37d426bfc065afc8c2a89b497c8828c2cbf922b0738426606d6310e503848a0dacb40ddd2d08ff9f33870a52c1feb34e5f26b0b70b81896fa4982b8c7b88dbd988f0aeb376a8d996df832f1fa5f09a827c9e361857005f5bd0d4844cd9294f9a3006c69a26bec69e02e5e4648e5bf114132d9ee646007e85d5906b1e8665d9a3e31d5b274f8d39d6a8e7f13306a1b694b4027790dfe2d45d17f6b401125a38554c06f82214888c1a8b01589db1e27d09169f48d4964c1eb68056f91c4fb437d60190ebce1170dcdcb41bcc2cf2e5fb4700d103b093d37bc7c13b0d9bb4a934e31386411e6c6970e6a85e2e9d998184540a7aa5d64305a523edf314fd2434f7260ded92c3cfd9eba3ed939ac65f613ee43c3d12b7e723e1dc1a7cc855d51285f9ed7634f5e56160a18be94feaa5da222865023c50b29fd617a82666a18bdc81896a30266f615d493eca4381a04190f62925ac0d6660b5816820cd5117231aed37789249a69f8b7722e3a0c783d13cda5f91a6e29e91bd8c4a83c17eddc3d966476946e77c624370a4203854e55f3ca9d87b811d3ccdd88c562e3da9f7f06a07c0c291ccecc7301cfa6bf2c407c607b6cf6d5b52dc6f1903ef6ee76767428a38ed905f3cd0b93f0494b7c5b9b9630fcd5824a88e9e354a5c7924fc504258e22b56129e736db49710bc58b6241f5594d19c4e04a7ddffa69843ae61619d37796f79e04ed8d325979067538333c5f889b924811da3c370ff476fdcb58ee26dbe1ea455b58215c89d116a517d4435a005b514dda6eb4122a49e763e1dddb0eaf1c3054ff87dfbb249fef929e451ea7d7caf7274f4c3898e4a6d6aac2f27d5880efb52f8bc99ec41f07708b3bba8144f0b3c3103a65c6c1ef87f36164649511d3aadd57c91ec733495c6ff0124669103f46ce3b99f15ace4d23edab9085e9e9cafc12dcd4d732334d06a77e0472606c873a3788f0f315c8ceeea05ea53065a7286c7695501fe000d919322596cea36bb48538e05854ca27c264b5862c9cff600eadd25e7e474bfbea87039bca2b9f5de0d8c2fcf0bf718ae5b9393deb370b5cffcc9c130deb2d97a2ae91da0afafde69dc2c231bef4c94b8987a41d70b88fd07663584364f8641483fb741006fbfa65aa8c39665f2c2a234fb76ace515c9aab4999b209f73a4ce95c764a5c2adb828581cc0553eae656f1ab31ce0aaa1800117cbcf6b72b6c66194b64c02918b8536356bf77c4ffffab3763ef0e1e357cf3da82c6fdb9d99de7512544ef52a38ac1a1fc976c577bde465922a6f989e8509cf62206da6ff884b81fd59ef50e7020f4539d3debced1884acbd59db581ca4dcce6a33a3db3dccfe2f792481427672d688c86183c13a1f35a9de8cf440f3df49566598e42cee83d7e02b627693fc2c2a0a29a81291136a7364fa5071b19081bd4bf50c034cbeb82eef9d65c6f47c7f46a6a6dde7f6549febf175ea59e4df79dd350bc67d9559a00ccd55a036142a3bafbf9e80da84edc0a0a498fb9aa6b21531806181192e590745f352291f91b02d3dbe1831ebbd7897e8bbc9ec60c790c03200a88312e51401ac6109b0b3e5a8f0acd319c5febe24bc622e64899450046f3407368d6bcc13315edf6785e60a022fb50a2d945abd3586564b4333fe53cc90fbf73dc7ef4d0b3ecf15c7e390ae08157e2fee78b11ec8ddc446f3df6a339b2485dda60f87449303339bcfd69ea41d3d4cb60128904a310dd65c6b785d5cfb6590147e16560584e12f13c1a1636b546980651de57611548672ca447fc5bfffc99a8d15eaec6ad2fb534677f7acd097387392faf670b7f3d9cfc21fd847d008052ce2059299aff57b3ab39759f5f8974f6d22c795bed040c70a587bd71094804b439eeb23f8f0766262038459e8e5a306117a4784df60f991cf8d10ea10a70a32492d44723b8f233990201a4756898394dd7467d934dcdfe589bc8235b9560d2713b314ecc5cc3246884e0d6cf22b849021bd4fc736c85360001a816a828c69b0eaf04784de9e7b1ae9a111ecdf82fd47967e8413405cd675eadf3ab22c6516f21b4899df2b6cd659ca4b182d03c6695c1013d2d341b27cdf765dd5ae7957ffb4f3b7e1cd125dbefc64aa9ea54870866c3f1461db31f57e79506fee76c8a90e19ad6a7dbd4d45b2d187fd9e446d7669f1be50eed795800c0ec72e29b7133e49018d222a5e45a7e9ffb76771da30aa05becc83a2b2bf434a5fe8eb820bf23af04efabd4764f9d80d14492dee942dd3715e3053b9cf5bcfde5946ea898af64648313f02e16ecbaadaffe63c2bacac440bd66413b13ecf3a6eba1f5e8723efd3e31f4a81d8181fa290e6ea4a5dede2cfa0877ff7f4076bd7a65997dd484651abd403e4776f843368792303b36084f4048dee0ce9d392b99e5bad68ed95017d135662ee75f3c66836bad804f11578424ae953ad5974a913896305dddf6f6d3016a71f325093b125ebd9861850da2001a6160947b33758dd8834c2456290eca1e9816978a8f534b7b9ccde555477f442cc36d84f24a85e1d7ebad68e5e746ee51d90e9281c27d9a60e3170e32f94753714a3a55c0621df4d6ea5474e24c4bbb7c176cdda7caad463dd8d71a5df25d92f65cec849ed667cc43e9f44d67b2b2e13e5195cd4ce63075ac81b383a0441d2f3c3029984a9e40a9590e4efa0f228b6a0ac90cffd16521afc14ae2c09df5c365540380304104af7385056c1e4dd03af5b079b338fcea683281dfe9e3d612b26dbb38de4ec077cd054a6b9ad357433496236237c7f502a32b5802ccb796c965094dd88b4363bbd18f3988bc8d488a3dacba51c95bbf75295bf36d5a59f7645444bd9993234201d44148ca3414a7cc689334b73881572df494fe6ae2ace01e631836a8a0d9674183bd2e8d8231c2f040dbef126a72eb8bdbe5d497c830585ab3275a113772cd3d3511137505f8ff2a009d0191be9caf00f71e097326f9404ee4d74f9e0419bc35d1b6fa6b35b082ad519f6cc46f85c99dd5a11e7aee8851d8e9c80989e753c029e34da8bf12893f9678061a735f65e52127ed5bb7774cf9b6f164e6f65ee19b0c2ba79229e20f7b9b1cf511da6052a501f9b41e63d9142c79b663b40d587c34f47e8ac2ddc33f7c68de6fafdc3fe21adad170911495ce2e5e41f93c3f9a25a108d6a122f65998f442509c9b8e6f251ab91a1487515945cb2599d527b719462875f564c83bfafc40f6f8ce00d0ba8d246a8732888b8dbbff39622baec051d28d2327f2b5ccd3efb5fe2256a4d88a6cc4c6ebbf2cc885d317fd82340c7a2415473030e191ec95c2fac64fa0ee62be0e51ba1f68ff1435a32f23c0f4790b06caae01b79f9186c36cf7fa6a4a11d39458dc101c0bcdf8ea57594c138ce4fb140b0ac3b48addca2b8a32e93e4bd871ff2e23f86832307929059d5cc7ba1d47d2d66c44a48e6279dee9ddf738cf2afd4e277c3a2d8a41ee301f7547ca2188e24aa876252a421a415909224782462d11147ef2382564adfa3db3f459893e3a5da58a77d46609876fa6b4736652248e89b3d708645d291a1a0f954010b5091e4872c598d279f642f139fdba43073f8f4d0d5f6ecff46b7f6044a2156538dc8aa68f1730bb48c91494a743c92f16e8aae36430f2cedfa381cceab9d24118ca2173e594ee6283e28e56cc065b8febd409ebc0a608f3e3d357297a8b7af7b83dc1d882601e9760a1c0b5b7771da23aca1f35128fdf7cf35807ed0075e4a7741dccd99e1ee7133b936e22d458c0da13f2df2ce20cc7492899ac8dc7db5054ec3999e337ef056005835ddfb4a17fb8fb25104def5be0ca727327c53b45d6c4c6f7de72a7ee1acbada61cdc4e55f4c7f371df795f6256a23bec624a44bd44c7e946fd67a1a7e3015e9981714db5b85c963c95dae8d05ce7e867b1b7c423797243446bfb5b6899ed7f98fe00d5954c8a6ef50dab444bab6480fdbde1a51345d5a868fb83f59aa18211f808bfa5676b46d3cb3f23714b534e4d28ee4a901e81b9d2cf7d890a98e7f758ef5a0a2f0973fe76ab397da5247159844996dfb04d35140cf57d85651856de00ec2dfd40c7ec10e7ea7ee739a5156a56eaf938e5c1bb3f2d7566b7f5cb8fe07d4de1a10a95f4f40727ceb521a7572863bb5e9770748aed3ca474de6e5e077f6bf4d757ae4eb6111854d5315d19d8cf42269f92b71ff0b413d165731f73ae2a9bdc2bcb45e1d8b18e9961409e86229c92f30c55fdbf25b2aaeec8a8b5bfdbe77b7a144b1b533003f7cb24cd3734bfb1de8a3d66a2ebda727d8168f7d7fc92ebfd6e4fcbe8e0db5cb5b098507aaecab63ae1b8ec554f631271721da95c5c8ce80f6ccb7bf6ea20551906359a926851f9285bb42ff1300a03c6024f48bc7314133ce0ae008d394a6d77f6c37cb584053eaef868292382e9e5e04321f2d6ae9f60e74b91b9d02a2df2cfeb1af6f0c2ec1be61cb5f7c0490eabbb9bade2f9fa81625bf165a3d207d3c2274d445399a559189f778bad25c594acf184c0a85b8f8693b44ee48437182f3aa3b56b6b424f77f0f63ccc23abec0f1e027a155ef5ec74e69fe77f8c5ab3d6014e50536cbd02799293695ec047173b9f09e685198e01e4d6ab4eef1ba6752be3eec1017d9336b77edbac2d2cb8094a27e55a19be0786fef283600f28bb176e74f828c81d4578f6eb7bbc7aa89eb40c9851fd659353fcc8d8ca5485dc9b8cbfed395fdb470b64d69765c303d786221cfbcc36703d34dd9b80b1e90bd7a2a2ab1f6f56ad32cad8d43e26cc3b712c5d8cb49cdea1b631c6b0341fa0032d6e9bbc21f5849059f34b9c94b257a65f1db8a13db6165604a27d7ea80330d99b5ebb9b6edea706a5aa2ce447a02bf5561da51f32ea3e6475b270ee5309aa6ed1690d6706ef953a08efff2934bdf75e2817383f2a1fc282095de4ff5bec911188d703f9348fb3d57bf3cec33e623858c5436f6c6cdf6d9bdc8778a6ee5e3a15e72bf1d20a15cd6c07552b8d92058c7761839a87cdfdd4f9b1d79f3c7a04ebe0575352370f6f60e036885d838a607361ee62fa7358c97a2ba7fa3e1cae2a6aab6771b1ab44e3b32000b857b377f82ace3dde3d2f0e89db0e180d3cb88b591710c1ffa837ee47eba42f6edeff8e2676b743ab73fe9bada8824fc1a3e0f344a5dfbd4281d6e0273ef8bfe6aaac9c78a4c588c913f4144e53d489012e565b5d3ca7aa96be0827c5ef92a654be001aaf6959a9b1eff67c6862101f26c73cfe406c18453f5ef94bf57ea0633427d34975873761f965b5e39875862ca1437859b1e617d11b58bada7e1cb3751361f67ffb35e0d0934e6a2ad0fc0a0f593768525fcaaade2595e44e6d3b365186d947eb4f226259a4e4cb9ccf59d4a79e2e18db99fa148168953ecae0836bf2594c64c553d8d2078d677cd222000f7f99ff1c4dff639f776c9ca6ff1532edbf04dce4e33c0d5383bff833744fa0d4868d115b2434b69eac0341d76cb6147204ec7606814483210765ca69dc87bffe6e1cf758ff32d04fa1bbd51d7de4715c9c690f8e9a57db0e9de9f43fff39138f1a3e0895ad079f289ee91f3483226569a71a14e92465ac0086460ab606834c111efb64956cb45d8341fcb68fdbe58e794d677dcf00e686c5aa02e26b9016a07ad0bdacf20f2da8756bca39382294ac5019c213cf34f8b13e3f621873cd4866b95e29cecc2b81beb24be18dadf607b5a783922840c62050ef29fbc09b2c2f702a28988f64f8a920ac37fd871a46ec2b21c06c5b0c9f2aebf2cdcf33b55326998d76b9209c81469d4c7d8f658464b1dd95620967d11f1b5d73c2653c2f5e07c5a0c7fc481f9fda454043890a50489219600a6f579a2034e994b741dd7309d1d14efff6f44b3dfec6f0507aa7ad799fefa8b79051cfbcacf0daa3017feeddfe2d4e0c5ea077e0f1dd5963297f82933820d13dfa28c0e5f74071610ef205e96e3726f0235e9bbb5d05791d9851282e2dde1390bac2ef2c8baf0d6b59657a2faf1af99545bd6ff6bdb89a90e5260482e091ce29b6099f9ef3e656904f86d6cb226fa7a78c5405242520c755b170097f515f849978d505fb69899c41e4804a8ee9e92af8ba562d3e8297ab6dbbe574380454bf8ceef380573adc16468c520ffb31d1e7669ded16acfd5f65f2221b27a4c57251a86d0894eb5cc6f23bfdc589686b7ff7428206c4c2d9e80d60a9b2b3554f8ed0b2dd9c196a037c803302ca7a24dca10e1e622b4be493ef52a0682813099192eebee471de8224013c00bf21f7600dfa14c7704828ffa0c4e7933bf0c1f5e1542ea8e9d595d9233491c8269c8ceabfb961a2c1e039ba11de766439cef2372f3cbe8d967e13d3cfe3c26c1b5397272ce9ab20835979fc4268095608f402ee97da7dd4476b7914837f5b2223ac8400ecb5c6534caf522e4cb65e35ff2aa15b761ef722a3998d966c45e0fec1475785ade938d1b4d6de839289bcb5a93f1659337176318594eabd8a74306674adcd2ab5f29622146be9e167fcc3d97a2a69de3bba682a8c7b1de304001331924b81d7c610a579e68286e1e5689e90b73c12cf935fc78456028831ba1bfaa09d68b85503647c89007981855270ddda961a9f61478bd16c64d27b6a5a51f09d4570ababab71f417021db82fd49b0afa328613b2a864abb29ca93bbc0d1430e9a4838d8e47888f88e2f732cc057f981630e220f1d12513fc89300796e864e5c864515ed742cc3e9ccc211cb38f12771ef8b9ccb1dd1d1d7db30d8093356d94f876309a3bd0ac67a85a7d21ac80f8d35fe47844cd5cc1bb5613fff4fc816595a994e38ff18e8271f3f371cf36d91ec0ccb0174c54904040877e9e99cb2a22eba4150558652ceeddb5f7b8e020d3fd9ca94464fb08c9b5ddc5abd513c89739c622820426bf7e8bb6aa9abd538774e9c536ef32c9df58ee9a71fd54b6c78099ad49f5c52f9bb5d84a5363acb9485915d30397b099a3c9c221e34213e9e449a5d9a4ade1b28ea8fe0e18e0a2e53d6b86906dabe15e0432dda187503c0b6407709ff8bddae3436592289afaa116116ccb273b40119620ea78438d96821387e12d09de60da6da79866200c882fda191ccc39168aa8a72588eabafa5d8938a38f39667ce72ae5bafc859dedeb878d92ff3f270b82e716ff06195d743f314e128f95d6f446b0cfa453026fb02084afc150d721110aa0614d5bd0c58345c13a875dba23f4c747e55a868eac5b0d244d18c57bbf1f6f1609f2f40ed75db7dfaaeb99448f9e3b8a9b7ac3918f55afdc17a9035c9d566a67f5a61b825670aa49d13e4f8dc39e994ac22c0fd2771ed5f2499dd024017000b007dad46673adc3c59a0ec077b32271261ed157d49122a5685003c095cb6745e55a3b7a7688f134de084257822f62bf724832776d8c9fe07fd1bc44393190362d9e6a9f77b23a97772ccfa9d8c1fd58cc61384c48471b94afc74b25194bd657d4ea06dff554687263b7280f8812faee7ee1b6cc86ed8a0c4c78d968ae727f9f8c372a67fdf5dfe51b6d95a4b903352c04900839d04937a8a335a13a83ee0db47d935b76b7a1192e5073bab39eee98903c3f25c18bc742de36cc3b804ca0240a3135970d9e10199a622469546b92b5a37014b42ee590ad90622b8a5f5b10de159890cf19f0e97c35a7d2953a024fa916836c427fcf02cdf266eb4851663ed1547e33c62e803a0b396df1f001fe5fd1258e11400c269a08adbde3efb0c2f2cf1e90efc1962a27f0e5df6156db91af3e084d61606fea4ebad4b596bc1c2c0b3364df3c57dae2d41c0b92c21a02d3fb7d3b4d9edfaf6cdef40c4c271bb75d0df58cc77d280bef0896b8104042064f3f4468927e2e709930abd7da9672722819926d821f61caba2bec99fcec04ee06fed7118eb2612de5b30dfc92d5dcfc4bfac2ea732c5fba8ae35fcc809b245845497d7a1ae54df41398e026e3702a3b9e9a64370d7ea945fef91958e2755802065ba34c0a0391e6d33077ac5b9b0c915e65cae04e0cc6764950c0dc9b82717db72cdf6095b630ef9fd5d2a4096dff87fa3912304c22ee7db94ac0a236fa02e9814f1ae6b657c030583b87e7cbcf0b5eab2e75373f060721b833354b0c684b969233979fbeb199a90f0a70f7d1a018767014ca799b31c256f1b8dc22948e8f45c1549a1eb089d3586a2ba1901441df13dc610df52f94b81b95cd61c6a7588d16bf69d48d2a2ac8ed94312e846085e536f422ba3f247678065818b9cc9695787e1f20c2128572d8105b0c93fa3b5a615001fcd48480cca3b91110c69a334d708095a8d71051aa8b152e396849f4a4515dcff128342dd058b9662f37a2414ec36b5bf19d19e7398c2cdc91539746dabd0738e08a07de8627a0169c8ce7d85f10f22550e14e8ae560d35e49d739d7d86b7e4c89974b66026456e115aff0f1e72d798c3b0ac0daa2c68af780b28eaf1521a5fa332eb5c196929f52f6b687f711f37855aab2acbce029a320655db15d5be93c28a4e5f919f44cb22681cdb7fbf3aaca517b790fcd1e6201c8a8f60d38eaaca6d22cdfe46ccecec5a714a5086370037b85d66a4f721df71126c2fa3b83637ab2b76692e964450f898a9a263421438db9b7381808474d395d2c56a2bfa7810c3a42e09c296e84d287def0e62f887b0bf24013fc975dc00d47ac65225d085761fac039014cc66b57d3d38b42623f833a8236fbbf82bb79136932e7a31810599756091dcc4bc122652d7062faf691f852c53ddeab4afbc3e8c61d9ebaeea72e222721d39610565d48d711f99db9a9ee0736afcaa714e417569d5708d5d3e6089d4fde22d0e832e1fe6ae911246c12c9619f23ee19dc82877b010cacc9e4692f28c3be0e49c736dc3e65d030e89088de252aaba254490e388f0d554606e6aff61e981417d3aadde6a3681f1df0ba78cb23e40e0a7aa982767a80653f4d7a9c890447289ed2d055d1d0b6d0f266e0e28ea16b70a13560cabdf469cfab6186fe1013961f51070d5d5fc64bed04aadee4b457bcd38b59f0de26ea51b7c262143facb5d472977cd7c772b9c239cc1de68e5cef327ff6ef138227085bd64fd1eda5a907456857efca0cae4eb1c8984d7f09bac8efc7a0d1117a162a04e167e2406c8e1b335f927e2ff7078ce75e1080ef9b41fa141218a05e55b22059b680d87b4b2b2a4442a5a80b6f62fa3d6560b1baabdbcbeb746cbb1e707d7ea68f6953fc58baeb5c10013ff1bb5924fc5a89478a041b02f89e3571ee51217bf3a539d31290120ba5392d85dc38032156b21c80e7bd4b85ea06c7c25ecca487bb955c4cc8230e4f7939cf0ec258fed33a27ba069ae2d650012bdbc30ae7fb0d95b8cfaf0dd85df05ded35b53fb807131b2bade8a10cf7a627e72e131e7a46d8b6bf4850baa1b1a5162abc2463f9b877e2b7005f633484f0edea2d178da24d028de96f64d4b38992181e921ace5506ed88158e89dc7ffa56dfeaf74d09979ddcd371289da8e47877a2e2fed5aaa7e2a5bc1fd562cf092cac83aef155940003c2c79594e2cca3c836bfc8256a5b54dc429c8cd2bf72c2f5c3bf7cb7f0b23681ac612fa062c7f40e5f102b9a879b08073e843f6ead3414f8227051083b135484b5afdabcb0ec715f809f8c7479c23dd52b744454b937ca80b5d78662f7f961eaf4513b7d4ce86db0ee98e4f2a9de360872e416cfb563f791982f23ddef84831d175580d683ad4ac2cf72f50a6e5932bbd176942f50a3a6bc79e910d24683cb560841c714626841888cd982494f478d39fcfc1aaf270468efcfadd54c8ef0c5858b2ab13e1e5d70a9b21b30f1a6c79d0798d96ac232d85bce92a0e45f9c8917e1422220b06a1cccc2a9579c7fcf1fbecdcaf2e2693f4935165f46fc009577fed9ef824a997c2fb2b648be8eae8163f9026a0d74acd77baa0b28ae5ca2e16713c0b28cb797bf4bca3c92dbd197f0c87d1648724527293de55f824b6849f6ae41c4a320ca0486d888989eded914d2b3af40239696b87372070b97cee3a547f4b1bc41f6cea218eaa7f74e97a9596f6b2794e303767abbad7253fd2fef8fefa2015ed36c1a0ee71def07deb30f3a33e493850b368a954dd6c48319fcb384094784e916cabfa47730762f7c2742a848f9be299cbd44092fdd500dc672a6ef8b759c4479192fc7865588a07d9fa4cb846a38b8f59162127176188fe0db97715fa2e283dc2b7398e0dd25ff9a665d95211a42563b85cdd867d6df3152884b73e32c990ef8ce7c9bc150716e028ffd02efa831a62b3125ecedfffacd78936859a9b006bd7cd82a5b5c3f9ac1e75c9fdbfcf68658d83d5c5ea4989030ace0851135c634588cd0555a55738960b2e84d250aaffbeee94baebc1dd3d9feed71c600ca129d0b691e04fb36785aa592e048cd113827f7c44d2882e5177dd3ec1519610933d61b14c2832f1037ce2866a3c3c8002ff99db18d12004af9e1913939c59f912d48655747d47b8387e1adfba71e3e63f2c0f240119ebe481eea94a84402616df34dbe7e64b781bd6446a7328a0ffa7686d7f6d98f7254dcbd0c287dd1c9c0ac609e0318b88ae9f2fbbadad28651374a3aafeb76cd7523c84dd952d6cbca46da6ee5de4829890c753d88652a7ad06bd8e26f420928d23d44a3b349684b7f44ac698405447bba1ec156cd05bde840133b993255835ba31472d0669d8898ae055648be019d85d8102fefae293eb9bead23e3af85406d5955323127f150b4fac8626607e123040a879f7405cf2d64e73cf1ecf7b8d586def4c63b297a628a4509a7f33573bf6edff737a39dcb1ec1feedbddc46a5c936966aaee41c46fb57e5dc9131eb0bb55784388a57ab0154dc36b52f55beb28307f578c1b4c9338b6ecf2dac919b2b420cab4e7473bd30a41caa39bc41c56aab0e561d12fba72192f908d5f0bba4ba2a45e8a08d4aa5a82560f45c5449212dda62940fa5e6947bfdc145f46a16d4bdfb957c825161b9bd8c5ac2cda751ea39a24b67a61b121d12f46e42672579e684f785e64c70284e7cb4ef715c8fd73fb26d57ee99570113cd816f376741bd60996d550be6540a75dac04d20625afb46b1c258ef56344ee0be3b2d4a0855379517b297caab41b9fe70c2bc49a96682914f2c322739d22d42b2c38fd14e4c3b758b1d3c09c1510410376d32a6860fc3cf784b5420f7999673c8e2a6d7ba85113a03f3fc78d0fbc434e598f910966dfed1b9c154e1f4b8788db044e9b213515eff8b0e4e4fd88fb6c29036f5b9fcd4da6038fcd31b603abf8e4a326e39202d63e486e9a0a9067f9beccf89d174c084c8acee131fa219465267e30663a430f046ca5dcd7a67c1d3d7f81645881bbb31bb8ad8f4aa1b3d11350fa680901c58a1d4e9891be274e46dfb8d39ce864646548eb251826a0f1418cb210dd6a7596951bbcd946dce53528c408d4ebf5218a11e8a20483e60b717214d2c5319c94ca7b8ac4aa0c7277fc2ff46bb59ba00660adf5af80a643d8f8b3986f53af6f6301f41d36ae07bf5f463d00f502907cd43b19546b3b8261f080aeffb1b4b4f7c18795838752bb0cb7c00e177bea343432b9d53cb68ebe84e9913b78e71e7daeb6b2308c906b2af35afa91915cc1d7e27c6552b7dab605ae0947ed4e80bd376af5103b5314912ef74f1293cc189de42391e6dce11baa03e315e76a4616d8eb3b243689bbef11ec8334424e4de030a6c672dea87a4db32d8020c3eeec336c6788a303882d5417ebe1ae903e84e03bd207a8ae8463204eeff6aea89bcc8b6263222c70b355904653dce20064779af558690c6d0dca2fdd9e8671459908182e0d8e486cb9834c019204fd12265083f8790d79d2390bdab0dfe9b53fbc33efa756e17bb8ce47c31482929a8ffdd3e08e655b2e5dff48a219c91bd0c49482baf1fa73b3cf70e2a0e420bb0bf82d3776f65a9d06b38cbc1b4c942f326fe3d5bb044da6195d3daf285954e9d040699d5c879085b50a31aa212298af3a9cc59e2fdaa61ebbf341a7f3f329f2b94335ce50af7c316e6e64ae6a19002ed5141be775f0d0d086a4275170ea41f0fa751a004871e28825fc31dfab60ba823455e5ec8ea82cab0866dca25bbc5523d62020f8b42a43b8bb6e9408d1e003eefa759ae08a4da6f89b72a4d521ca353322faf052f0fbcb29868629bae6cefe9297ff3ce62a199fca27940b80ea8d48414298c6d0757a6ddafdd3fc63dd832c50c7c14db95cd3d582206454b57527f439d72c3cca94bf64611b65310617cfdffbdabd5d4c21f4ffcc0e4ca5801d6d2565f3365734a5f8356c1efad2d5099139273090e7c57e4f238f06e19cb33725e49b1178d74480f97dc8ea735e20acca891a0617db7d94f599ec9676d34bb321f071a7c87325895e46964eb30596a7a1e92ec8c9b8eefd086fe2a6f5faecb9b0a1b4730691b22ff8c676ba98626428737eb6992d8e543a8c4165efe81e4c534f16d1f4cbd95604cb848c310748f3f7995859392f9a82f13ef41b120be7a4ac507c0cdb0ff075666d8d88ee3c07d7dce1fa3a616092d555c2d0e1758a62e21ff523ad0a969336d9a4625c233860c521a4c3b0b47d02075903e9d35842a4d37805a12d5ab74be51f87228223691113b1dbd11359472f2eb08487e0492c2d7a94f62a9e842421fca0fe5733b810ab2c9749eb98af6375c75b05331e915bcbec8736925e6f06767f7adf93f4fde409c1c9e58704e7175fcf075e838e53543fe57566f480e33de9941f7fe03690bb60cdb3504d11f7cea0c116c41f8d65f1c974d1a95ea47b183b0002625043dd582b696a1297be01cb57720e8834fc7a42a26e477e2f085c3e76e05a9527ae0fa692a07866bf7057e036b9c72524a84fbfcc3f6c024248a88c06af66a1016d2588458827260c59236cb3e713c4f48a7bc42d57fc44feb61a6c6a8409027967c0684d81daf8d862dfba863749a35222e1c97dd856b9f46ef0b656ba670afc42acb7a08fe610a3622b3f76727f3e4b446175e06678a317b804ae964e4581e81e35b05e77860065ecefb93a172c2b59529f1547e7a0234078b53e3b7d7f10ed0661f45503a0781618f2e1e33cdccc50ac88f31c7cbf86a1fe46172f37a6f1b776eea90af7c44fc570e6330ef1461cca59b95a1d8b1178e62d985c2c03d2d46d048f40f08f3527a3880b27e67848f1679003902445518b673615121da0b63fad77cf92d4b6e3572d676a168ffe47059c1259c0f53256cdc910873de74869f99988fb687283ead1de9484e3cd1ca34a06e7862d721bb4d790d33bfb78095c0d038457108d655f5ac20f9964ab28a3839d59859e33938b04fdb1f2276b739c981a85d380624d06b5d04b00302b47ea99bb09ce7297969121367e18598537c8d77774bcb446b3ec255a67691e5cccb204875d51154ab5eca703289380fd7392c1b2c2aedbe00e6266d7cd58bf5919b7fc7e08aba66359fd7f58c197bc42304d6ab83bba0f38d1172da1623c4c55cbd77e42170c58df6b9aa0a83a1a7cd11fffad2c2f4c55f2c791a66a2bf9ba5658652a77087c6d572826ad5821bbd50a44988f5868dc6a2e3609a9fe309ca7fa2c0e0581d1025c5b1e6ed6662bb3118aa00ae7838532026305d986b8aea9d31d175168a150d2073910a8d37de57a353fcc710044607c6359fb8050c7c9df759610969fd7a80c4895c5b037846c6b6320861aad2b2e9678ba00ab02457e6704567ddbe90e1cfb958f45288d69c507c51483625bad5149447558eb22315aa164a3b677d181ebe7782adddd6df24259bbbd76b56cce086ff2ac85f1eb75e6bfb4c4a7465c3213ccd3f661f50a8420b56d28e91f2caab0b34fc70f0a473981a27304297b33fdbf986f051474a3036bb5cef64631d68c78dbd9e7ec6749263b75eec2c3ad008c8ff7ea9b07376436c4da0b7d9d92bd36553376aff95f0cc6cf85e7e03cd6a0ac1c55191c4137a18a30f0d7f896d67c5af73efb6d43ca0e57d828c406bbd40c494de0dfb30ca35990de965b42196f2d8408774a2d4f6cc0026ba74af410385702cc96b833634ed2c4795ad3b42948f9cfa94b9cf4a8f1e9c87e0a4c8e20737e7d2a470846a7160e7e64db236a8f3f502c4d6c496330676171b3f0e27de4e652b517d7fe532b64375f43aa500f86b280b108fa438d7e1850abb34cb311e30625f3076c40ee38f593ea1fa508d0a4ab58c347d983d15579616ea1a74bdb8e8acd06409ebbdcd1a63ddac0fecdfaada567c10f8e0a0947ced828210abb96e01d9521f7f34d79a1f2bf359951bbdc76a151e89a03a8f7d2caa09df1f5bcdb8a3e276bec2fb9ff95da79c2ed770d3697c4c59635b1c19fb7cb665de13f4ad381b7e7d38a10673fbcf233f5671bd51b68882b122e9b109cdf25c391eb7218e2ed4ce151c5ace54b8b7a217e1614973deba085a88c5f2421eda4bff99fc44b5bec471545ec2dee2aba4119bfd2aef6d42be7a8880c4c199c8e42a220035ab87f99b4478f1b744bf0ac82782144099f31cb5e39e405aa23464ea2adda8529ab55facf56ff5c0a1bca0b81b6135df42f52a410967a96eb6c57c89e9c0c8a4673793069b87ff184f8569d4724fbbc8d1f03c03c1b3493948b9a44600d0fbe1139c15905301bb80226e39a32df249dcf79666b5a78856dbb4f45d239a385a7ceeccfaa6967468c3256d537ec475593f80a07e9043423e88166a02ffcfb45b59f10f1c13676a02701bd623a9c367f8cadb655f71775c11fd0b7c8ac78bf64e3c3f8d1ff4fee2574151d3d3e1c652d3623a72a5e52b69fb3f16cfde03da533dbfba76c2b464cb4fc560e85f15d2516450525810cb301081acc6bfe2767784b7eb64f73b89370e2e4786a4572f2c5ec80b067ecd7f783966864d43dd91e194db72a79c71bf32fbdaba2038e2ff03c4b5c8cef94a6c4fbf6e31478c349ee6ab93ef72ecfcd62282b9b3e2832302bd2f2971f10b4ee9a4265e8ede90062f015993aed5293b97d4a4ee2ff62f910f82036a1f0877c737805d8893a7cc2bb72fefec31b64a156cd8f81afff9f18f14c82458e017d6727e6a9b4c7a0b9f07103568091d06cfb6a4dccb0382acc9a83c790f38339670f218dafe8a6ab00c4b0117cf8d2b46ebd61ec97521eed5d105ad2af3bf15e235c77b98edb9c8eff5f173035f65cf8278c06877e3592f2b7fe0c4a28f103250038e71e5e699ce947bc94b01540724579627412010279602e6dba1c28b8073055ece221090413516fbba8d982a6cb6380f536d971559ff3bd3c3117c5c9bdfd90e5ab01e08909ef0e38623f2b0111b4376d5b37c63ea8172f96962428e642430ffbff3fa00125e5a020ed2f3dcc50767e3bad3379cef08e0b14c74f9e453631320e63d304293b03bbdc747ab89996f4b74a1b6fa2a397e951ec59e9a011195ae6740415547bc6ecbfcd5ce59505fb8c2f948058f2203c976aa06916b0e129f26e71b360fae48711993f4189f69b70f4d5787e4bcd105be51f737c1be1216b4699397a73d01e88a98fbe2fbecba8139418674b4bd4e81ac6810b742d1bbbc897da0126698c7666ca9132c4dbd2cd0b5ef11c50c22dbfcf74652644eaada6e73487bdae182a13c04b8fab288ba555a8fabfca5ce688b5d7a8d2953f4c9cf8f1796f6e0b7a0655e067a226381471ff4119ba2cc052c75c47d45775d055d01bd2aa0b6282a00b5f84c14bf0383c3b3431bfd4a3d0c184c1ee4027de7e77688421143f43efad94a2c20b2bcf1b0a406b66c08def742bbc7b38e4a621fb0e7c95519d9759d7809bb31028bc97c68b81d564c645dd0eb30488c5576e5a0a8bbebe3e7ab4369944c286082c8d518915fcce94c08615553c7479ac1ec60d3f3e0b0db5d9f4aba30ed09af7cfee5b33f902978d31ffdf3545f3f879855361e267a5bc7a0807e0dbd8ee36cf2d2363c6e4cde0e624cad0caaefea3251cc05e174a960cf02280581768646c0b16eb3b9b2f0238356c4e8f13b97370d83cf06708f6bca04afb3f9d878aa5b191fe29a14acf8ff8eb269778bf4239770008f3967a863fc8a77260a73578829c3121ed9943eb5d0f940fd0f2e4200510e1b3dccf8bc9f083ccdb3bd770fcb7fc9722f5a0ee469bbedd0aa606add4c1f6acde040f84aacca02c581c15f2474845df0b738fbf19a44564b0ed3101146eae8492c6c21e829244e505ee0c9fbe81a5c45db80f1488f45c736257c4ac0a89a373837957787d438f9cd73a1b473aedfdebddec15cfdc10170bd35856f0cba4797c8cc3a855ae7f6db90ae698a3aef6a8f28ccfb939825423c026193a8e11c9c29af6ca9125bb78f245a61e75f7e0405cc48f5d72e87b675c88890075c6ad09813d46ac21597e63413808ac427fbe43ca1c046ebf0c98e1f455bd5c0e14c3046b30bbae234f88afdda7143d7d100873d69749cd4b2e951ac84e5b54a2169e32a19d92b2b941c6d73c2bd418cd585906ffb0a2f5e3338f090c2de92e6d024545cbc5044a9b38fc152b738fb260bc391f43f3c633a7df5ffa1db3a88e8dc2cd0923f668fa2b70b18c687292e74d0e869e418717f9c40370b43ab730db11e9306d458a9b018de5018eccd64c32b3f0e5565cbc873ee71f596bc4d4f5e3f069ebbbc084fde7fd57dda07228dd549f05624ea8779b6b6e4afb98686fdf61cd62fdb5f236d40ac88c9c98e80cc04b629ea3b539a05b6cf340f2189c123f03a3368bcdb36013f021197b7733f7e80c32e04e2ada3a766219b0eb6e188350559f54b4df6d3323e0449a175bf32ca80fce4b50594dedf76e2c8e80ccd1b98087d550e5a8fc1a63755ce2d6342c919035dc07d7a05b6e7de30291ea93841c072a08d4e3a7e68e003f574a03ff8136c586d66608bbe85b13d57d89151acae2526b9e92492ae16844daf2b1c4d9efd1e3890244009d051a1bbc3681ff76eaa7dcffc2221983233d3be2cf0bf6211b2c609b190eb150691d4f47402dbee392831b58cb737a46c1d40fd3126aba0ebc78f2ff797e9ca3597d22e827f5f9ddb6260d659c762bfe4f3ed3e69dc0792e752589d22b1f4740c981152ee4dbda1676f6bfb807d7b09dc6af35f0147103b28d1d977334a431e2a3ee25a70ba4787ab082e4afa3ac68927c5ad9dfc2d3f82e48fe9124acd7eef5cd2fa8b5d931666dcdf052e559475cae3ec730585f9ac739910f88499d782b3d32ddec829621daaf927efafb571b4ad5ee8b76240ac278be678a169b7feaf809437fd30edf86f3eb361ba0a0120562046b3a42c8f3e9dd95eeb073f7901ec23828ae5c18ed3cb1f6b80f3f6eed2fec2ef6a9920a27b2382d43d43c26423c704645150cc9031ba6e86dc5d8d0d46760c918e738ecfac2068a9540979cb7ddccc97703bbce0ec507562b1542fec1ccba6373ae0779910626f63ef53ee1590b5131d8eeb7a1047e8cf692cc440f3a87bdb3314f7d89ab5f38f2f2bdefadd546f019df1bb909f1e8fa31c147f287e3d65a313cab81e94f093411b4a9aa8f4927a6e3c1c32747b418f9837012334a4394f34530c584d8b1e5ea44c15be9c6ebdd55da104142f37882cd7756a3f7f633ebf3229cc4da9ff9fc53408ffa6a43c8019c91f92c906ce3f32a891f71c19822d1ce09147badf53315e99f15be43b521591fda0143e51eb4729b00ae3a6f538f88e15a5e895d40acbc4f9751e36b141a6b3eed1c22f1fe5e61ea8101f8ca9e45a89b02da6cbf44a41c5091c12a0e9d13bd48881215cef4bb269fa3979a5626322f2676b36f5585d1677ff8aca80ec5063e888a2c4ef01df9c7196f91510c5fa3068ff0bc52d2d0388066b864c7b75303f5c2e3f8cf522262873ead6d521291ee02624c56beb5ebf26b8a909833fa61b8f1cbcd21823f976c36d2a0ca61d31f329a5aea77a470787c117d5466f30bc34ce3b9f56837b575547765972e6291e7a3a64ba1416f54c816fa90e5d6207d1ef4556a2ea36a2c5b2ce0c914455db7c352585a1701b8d34b8023c88d47883618db55bf5a14842c169ddf14eaa749b1d1f35ef793b869ae80746f2d63d97990934afa1437a94252eae080fe0ff3862f956442f903251837e1f39435f5f0df23ecb0ee7e101dba579210cbb0cdc41397843ccaa2bbbf9f1676ec0e4e21c0525f7387bed098f5db4de7b2025fb31291248f57a8fe3f82fe5d2b7ad38a13eeaac48c4ee3fd8707253cd30696b875243bece54c1ce54f4e0135e745636c42e7654bcdfee523159494743f6a9f9728579827d416611a3ed6f032d78b78bba42254a5e8ca9a92690e2d314d9f64b01e6feb16855b74a44bddd3f9cd8fff4b0814a613cc02875c29580c72febe0c628cbe90e89eb82d2f7057e31eebf198d28c2c2eacefdee78f5db228db15e8539bdd393b180b1194958b1a157ba687b577a49c787a3dbfe53c2c52deb0266b7d1f0613eaa11219ca75776ea330e3c8d2450f78de971efca89e241d1be1854c7d647d4d9065a232acc225199ff63d64e07f58fe531a634a8b56d34c0d863c9db2be64a296c95bf169ddaf22c88a4d4349980d06883ca41270e8a36be62ffd2b1e9fcbafd7ec5d9ef778dac1502905bb1317f20265cc64dcacb06cd18f02e3d26b853b694df887a67cefe1a718e1b65ba08373ee8bc9bed500f839d0ae153e7d14f875f4ccc3a2d3f014b19e00483b33f813441672b4a82513e24f6fadea1d1a4d6d24b1484fe5ad8930689bb0466f082abc9af0474574766d61f04ba07d8caf01ab8908e4ded511a5118446e5a8e7720de66ac07f330d288de1851d90fd2891fd5f5112b3e2ea4d6b0eff8226c29a861bf768c5001565c052280e99a6c6c21d9076502df990ac1c9cd4b930512d0f4907343697187508b5ed5fcf1589bdd7e15df727f84d042a67a414e8ac0c4d2451db1de5afbcd16aefeef481e92e56254b8bd4cfcca91f525b5f5eba71c556809386e2287808ea8ad6667c9fb5ea5d6af08612c209fb38d9c8adc4806b76f6e70bcfc7b71e5bcb3a6b53cd1b92df70c30ddb465929b299a59908e1e5d13655fbf04da878a48549152307a400b6583ef1b4a1b822ea0b03a58a2a4b53ee74bd85dda1c07610746e2a78dabcbcc3fe0f1f4f0c250a9b01c28ab0956977c9fc98018a537879c4cd7998b448a7b5863625a22092c96959212d2883bed04161e64fa865a21de1adab782ca38560743e9c26c00c6be46fa435e01ed6dca27465ae126ee2971ba0bc588858734593b184a297ca1f642f67eeda211fc24c5e798ce95f6ec53de872f025aea17fed2be82ba77a9e203aa6b2abeb274be766821c3ea25a612a9c607a75afb7b206c328eff70e71a76d07e75d6246e2bfbd5a4836a585a26a48a5f1a9121a0d2fd063f91c73706997d165c339130569e5da9521268e41663de72f5c8e4178bfd815da85f04d8e227d79f22574b4b414b8ae32c8bedbb148432d7b3302066ef2497084fa1ac77ba0cd979c0d0afb6ddb6f3cffcb5b4e91374ff21bd18a8abb275c9035e7da2c00cc48ca23262a30fd69549fd303f2361c2be86e1cc2ebfa438c2caf1666aa90de16411829aed3f9cdaa334b7109079b16769b29d54afaf1a2c5c9b0e6515dcc5e4dc8e1ce76ed93cace759c78645e7140cf9c8a20e9a3e8c306071ef709323822a0b0fe8b8066ab55c98c85b7d602de7e134438710585762c2f3d5edf0eeec20861e7fbf62602e98368d886d84e7305ccea74fc9bd189a4123767b1e176cbc179eafa6772e553b46cceea3934d7062b18de277c3596d13e1a42a3369109958d1e8d667c568d2b6eddd825a535cfded8d86176177c9fac9fe91acb66d228bddf82af3d1882bdb4e526eb4986737c91d353bd1cbed9b72d1faeb3589c4c6895dcdb9657f18aa0d5865575bebbc761374d8aca4ac6041fe897efe1888218fb9f305a754541f516a82b3615b30fe74b3e0493c0cdaa66f1142f9f5bfec0ddd68a0916670c52766de961bdfb3c30356f94a5e73f6493c80ee8f792361fea3db12461a3bcf5133053b1d11866d45426add2e1fc1f9d14f07adfea4751496dc508185f40265352857e0ba30b1223f3d21656adc44f507d580e212ceb6e1327e5f9d63509ba49bf031fd13c1063f25488ce635bb8e42e5129e7e5d05fd6ca65f6cc684288fd4829c75d5cff9c9b78c9888630b6178363248dc98bd7b570bff4e2a9f3472b406f2f62517ff6d82838240ea363d5c4a5d73be487792c0581a11ae201f60f5cea65175121a9c2e7bf8fc933ecbd6e6972e2b0c5f69c7f107c5bd8c98a56799ae0fd4d0abc138525d2d9b45f758cec94c7f4674d2d0795475fc8a2b4e6cf6adb8339ab52e5dd5008db94df8ce3f727b03a0eae5ec2eadc493a1a9eaaf726a7b908140001a3432aeb54b3aa5a844aa70a4182d79fde744e141c858a1c034798bc789ccc4e0d086cde3c6254e7a34a41dda3c919b15391c67232ae39f43bb19b34870d38696337326b22cc27ed3b67c681495abe063ff8d277b38e42aa73a6d963533bf42e0c11a1963f15ace209b29428f629bd66baf14dcb86010fe2176f91baf6813cf37e6187f2a2f28a2914cc716199bb2c45c1e621a70de9e9aa2a7d49d11a8900e6bc326d0170a5f4f12a8cf65ea088daaf9dbf9b289663d85efd9880b51fbaa364087c663a96f72f691fe183e05f57c9b780afdf1be7ff0799cf7300844dac67d154281d4ee8851357a97f821601bdbc690bfe81a719115e204e051c20dcc33b4dad1803dc966aca640186965607e4393df74772d5cf3d953a055d257942432903baeb0d2a2858028812e0098f141c3dfefaf5266828ae6e2c5afea573573555da556d365776b348cb35609affd8223dde801b049b6ec25e78ec1d87754a35dd19cf7cfafacb9abd4927ef433e0aecfbb45847ebe888717d26f398197b92ca6f88a85722b9c21c2b8d29883a53de8df8b2b1be81d0dc2d9cf32b6d4d39e99d21608e698070b831cff0771f2cbde9f81fff5361ab72b85227b91c2c54a1df1e871393801298828f3b2f61fc6d9d116fab71bd1ae0b30b4c6dd38573554e08d460cd162d2e020ef94c77250b4a9b6c52c99ca10f3fdbcac6fa84c7f37000cdb3b0081a92d4f769254f2bd1cfe2f33c5b22043efff9cd0c958c1238714a4129f554389ba82128963cd3413665a8a348327b1fb47095886a539daca84da7a9cebad4b537b13a526f0f95a19216958f961af460555ca95a647fdda309ba94c422e2890c71fde46073de309f580f50fc81058cb957d157adaaf0aa5b2e5c7e74f600d9274569057b2f2ac8ca77680dbafa8eb62b63789cd129d76c647ed588812eed2698b3f1c58e519ce1e8432e98a7150c0f968dd4a3d9c7e8c2312339a12a6f5629409f3a9813b75a7ff9ff420be9512ba88fd8da492da1f96b57ead799f23af170abd5169f6cf35035daa350a7f36674d55e2cf05fc386e6c552e62450a42b750be92d0a07445fe5ee666ee235dd206c53491d614ff38f16ebad842d73735bb8931056e2fed737fdd5124fb2da8c34a1854c5d96bc2882e1dd3744d52788c2aef7e0dcf2177b31d546017c663ff489804e5159044b0a92ebc35bce1c8f6734c24be5d1dbf588cb7c42b48496f68de05068164027ff20a3e1a0e99fd5f5b70b7b1702350fbf70ca3a077ca063b685a51e7f5e2c7a8207d51005bc3dd434772a57d1259e1452378b521e8afca76ed43ec96822db0bfe50c35aa92779fe27a76302d8ec76ca100abb0c1c18ae6322d7bd044ac82992889671b2d035a6964facea0fd5f18523013c02b10c7df773eb3687ae99f152aae877e0efdeff7482bdd01a546dcf49ff8772602b89eacec8acbdb24e52433e8112fb440373213003c21fff3339178c4b9e77fa48e473271ac99ec8cb7ffc2a42b29b0c9e05f3ac5dc0c12227f96b2137fb8d0106424316206b3ec3093070bdc3658e21b802085dc6586045ab6e460c4b413ab7934b1e5d66359fb53a377e640107fd0620ca004e0c72c2e0d8311fc7f6eeae3e89860ed0d926131cd8923e87b8872faea93459082c2744dd3315098281c76544ccf908d17498bafd38d61ba0b132a4526376ca0be8a7bec10971ac0e2156096d077f07b496411a4c1517041de0e60deb27df958d7b3116d3130338764ef5721109c4d2209c3abef32dde9e3d8d8ed44a0124a8b84ddab608be7d3c52223007a124465ea4e38dce1bf274fae98c453a5058a065a492ab99e894b1b9a5db2f13ed21002c6dab3a5bfee74b0f3f309a12cd2654f092e2f2ebdcd8f28d0dad03f80af3b51fb08ba675cd899b46ac58f329513b4b4c77ee00f926bd122e73dc6a571881092632e7070ca984fbf505d63ec84a1f897b3b91fcbcd2b16138ee39eacafdb3ecd44df33812e700f44a93d7af360a0bbf3b86d4316313a6cb9569ee13a22f5e0df845a8b42f9b3cea376e2b1f11d0889070cec1c3a54f1bba05afd8721d90fcacdbd45282f3227279aa16d5d61df8ae3831d16ab45aebe2d55387e58abbc025a6573a04be6c2c79cb7847a80f005bc13417950e7292beaf17c142a7df54d41ceacd1afb047e36be06abd75c1ce3c26d2685544fa7526fc49f6eeab7d96906336a58c515372d5ef2cb0cbfcb7e56ba397ef311712de29c98532b94286eafd477002726f93f4d25999cc5ffac04cd627b485ef002067281767a704680dec0ded172f559c637ed1021bac017b429ee6815e76f9629fe5bc67641251df5cf2c3da3b3cd1919914cab4bb0dc9ecb99cc0d96aa937239336315ffb9453432b0461f3bbaf9b928fe72515200eff28920e668a7be7a58d543c526b272252d9b23f05e846488ef1a0888ca85da5b54ee3eea4c368e5acc3eb67952c7b7b6afb4fa7999e4fe0dc452b706a68f8aaeef8e6363a18af4f780e76e7a1030bbbb94e7466c2aac3a89883adb1e6f8328dcb92a195a17ea039696f915ec8ca2d68b8d344bc4acf01d93a36b0e8ed027dd149b13b5595c96d09123d26b84f96f6a0d5be2a8b013185bd5fec61ce9a3b3492a8483892c7102d91deb983b0e12862029434ef3b2fc34e5ee5170b536c028e6b613de98aca8cc3df3b13e81d81d5d9b5c068af8f80b76428777fe1878fba649b956093401b36240ea3c78bd057ca2eef0a09cbac697ee1d71ab1d2326a90ea93f92453b494a5712524ee78ad99670a114786375b6a36036c7f435142ced0fa1c8de033b9754b360462fd577d775f84dedc461b7a11ed3ba7b258dbc004618a752e8f537db4113a3c0896578aef735d4e5359336f0414f6a7fff803211162c845de30c") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_128s_test.go b/ref/params/tests/vector_sphincs_sha2_128s_test.go new file mode 100644 index 0000000..25ac0e1 --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_128s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_128s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("4c1e84003028fe9da981d65d6ce2b36d0ac4dfbff55f23b412f9f1f131890a6771af9612979483e7afbea2644b72a4f82e8ef78f3e801ef84c781995a7ae8b4f") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("71af9612979483e7afbea2644b72a4f82e8ef78f3e801ef84c781995a7ae8b4f") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("8e129c35f282c36749422ef6567f36c3cea4ff855ebb00b30ceb49638222b34b18e90ab32ae9c1ccfcf3db9daf513cc78657b4bce1fdb8dfe2b5cf3362e7e70a5bcf93ca08c2dece205d089ad55255632a2acdf66a6db8fdadff7964fe46f8f10f30e363e2a66f57a2f435d91378411df6fa7702591a747810f3def597fdc7a3dfaba6281794e247a4bf204221298d679231eba939cdc94b0aa46c225530d90d5c698fb62fba9b1372c554d311589c485c2d76f990f7516c8ea0f0a58f79c71c19e462f2caea290dc44d12e5ca68d71e7e17cc0ac7aebf5afd26a69317bf2731795939915060b23d680b2a2f79b312ffb30ae40607f79dd882f0676a94c43022f5b93368d27599a8ead2e85750065c49b7e6e53cb511c770e46aa27749f0e7b3533e58269bc4583b42d6e2714e8f774b3df9250eac9218c05c1ea439f3acbbeaba128a585ce506613e1c0e1c60b03215ea76ccbf41bd49d78466666e2af35b68e97a6c7d968768e6515bc0148fd8063465beea1d76240df105934efc00523090675895592b01b84b4af5493ec7b7638b6c0d6318511185f0cee98848534ab347fc3b5248b92c44d1c7fa510aff6feca568ce1aa71a15ea8ced0d067814536d8097750b01a392c9ec3603778e99dae5e53e2ae74f941f8d0a70cf6334fdbded63500211620c06a0d66ff0decb677285ca1c9d9fc3a349c325a068f70f976830a24133e6dfaeb549905e1f78b10373853dd168a1dad39fe648f9fe7dd29431d550cbf3d2e9ee8b1afd92717d73a472f0245de87e45afce4e4a25f51817154978628d77184e6b3e8ab83e9e2b33cbc1a0d9fc67ef6ddc7a58d760b94dcc7c7017f9e6dd74130a479155f34a1a9d458ee87fc003306771642bfeb81a799704676244898d4f2cc1006a6fb0fb99bb2dfe7f2f74bbf33f13a4c9d39f4c1abf91ebb8232abbcdc1c649761c5d7de2ed487daa11e5fa1ed77d79708d44967ea9c864257b6eb297c2342e92518b335b268f38c698fb8032f71921adc467d5cda6af786a57504e4fc5b5c1859bda81294178358d9bf549e68367b8fb4d6e0a2e68e134d1bd8809129528254d97e24d5baf60fdf0f521ccccae7dbeac33f83eaecb23072a3594e64336aa2a9c0eeadf795e63f190c9bfd10bbbc1cf4deb213ab9cb211edca2cec4d9f278986b3e4665a6ff84eecbacd90ab38220e8746d2916daabfea0eec4ed0171bcb5a08141307b39193d8d5d69ac471244ce4ed65584bd92a39e68b2157b1fb3189eb3e3faf3d5db14c693397d016f476eaf20fd476f15b0306ecd7511e31dfbdd6527e376126b593bdb1423584ea69ec08bf46342c3479d08fcbc7318597d49373316408fd772091b00887997f3e0a42f6d0cb9fb5758518788e20f6d664b71839dc846047adf2b7baae8bdfb3468cee7a98c71104e1f8fdc44b199a9e271702efa8b355c5f2a3af7943de8dc3fc596958db5da5bf36e204ba05acfa1f701b50a50d8c339e5034106352a5b31ffdf80c04a1fad849c516b53e298563426503b6707a2bf591d5c8bed30e8a3f84dd982662d3301cce4c585b3ce2ba92525cdaf7fbf87d0c14f3c30383f942594f2afbd4bab8aca53e6664321c780c04cadb0c18e23cbcb0612f28a8f5cff1dc564c344b483b43bffc98c192cade976f490accf19aeb39e5780a66267ca74f3710b34fd7501a24022ed58a3d7afed71199161453d996dadecb795b4572a8848e90e2ab2175484ddc37f0f154227a005b4ff3466f73fb89de2c0760bc0186883432c856cc8283533bf2e406d8061fe2c85fdc88b02594aafc63a7234eeec74b11719ef284147e6c874afec39984990022437e106bdc23af46404c0c8413a129295dbd0f5b366afdf60e0aa8b08e679806b3745f809319082558d99556602e32a83c178bb13b6865e8c96e28f7b4dab74fcc7ae4a5f877ebea635f1c983d3da225703d668daa7cafe4ed5307c7eb836cdbbb8be57afaeee8db2a22b028b06641602fd4388769ba21d348484da1a9431f17c7623a4dcbecc2742badc6b2825d512135d350283a54ffb2010b08ec3de838aa6efbb1e387bfd2bd778b3fef9a80558c08ca99f8347874055569cfaf2026f0ea07c838b3e994e7f705bb6ca78579d5cef3f7478433d0c5309bce131927bec6682cf96bdf34a412901ebf803469d590c8dbe2032c345b7db88f496534766cbe3051fc9a51f87d102946d6703aef82d5326454853d20364c5509449bb7261caa3e60714caec44fcc7df9110665d758a1566f27d1603764218fd10d17b7a4a0a0b1674f838db73158c4f6620251b686934cb8c99f5db2374dea85ae13f284c751d1c908393cae7dd9e1135ad4addfa98d6f5cab7dfa6b72ae69700881a44d41e401738aa9e62070bb57dba364f9639c6869dbf3fe01f8d539af4d8b5023f9aa0173f578a40a39e85c98127ebca9886f24c341839c72adcabd4a62dbf2617c106819d403297ee1cdd51c32a0c78c51aa477c3ec3fd0fba41f2a01a21572a7691fbbfe05f1d00b897c1aa7cd4fc9a4b76d4f3166b256f8a399a49bd08ff9b33801cb38fd7c75ff6c74df83f983059be34959b4a82736a9565c4849891c450da49e1152814a584d9ce1a7fb8214a096c3da174e462f23f4668f58c0f6692554f10c19514859c76e89032a5f135d507e40ed55d75b65785fd5b534b6357ef8c626dd3369b97e217bba4e4f98555f814f8277a63c8ac26feee96dc52e4e95aec5a158af1e1426894b11fdc48d693989220c309cdc7a5e919bc11d6f1d5bce24cf1b931a4a1be7543015ae4b21e91a9d7d58494c4b6ee55f40743d3555da2258cf4a4239e531ad9fd2bd580ab2ba4d5f651e39638653679ee2722063faae51321b6704c3c96a435a74a3a2e2541e5e48406cf8e58c0dfd03bcc8353e543deba7d053b1f602173a3701efda153b2a1158e1f2ce06ce86a6401fcd37ecdded3d67a4d2efe7e9c85e641529693c8a11cc071515f98333e41a617424c6c93076c6bf5c510ce50d58a0fc86b8c9bc2d8a6ff57cc01584a34da12c1396efc1fce418f4465254364de6344b4b1779227d13812cce31306741453a50331e75cde647a7d2df79d647b6aa8468a8938336d50ff0f4214be9bed2f3fd352a07e6b451b5478a179049311705c5b07bb36ee7711fec8b554783eea275145cd5d29073e0886caf19e6fbe7ca2f1ee8b19bc5e3fb4d0397aef1f555fba4b7187b1fe87310e119af139312e83ea23c6d7c3e940390721cd3b06ab884be78b6b3d0ed370d592a06b00438a39208ae5f08e033306f1d5f1533caf5a803aaf5eefd3b1bce7292ef61c3e21ecf6d12d6d691a4936af4eb6b5ae5da8a88fa52a5420f7e4f51af0304725e412de12a2d7d5c00d18f37d81b09d043475de00393c07b0ebc9da542e0ec45537a68b6a37b668de5049141c54d7ddb46ef68f357d9e17b010fc6c663cc5b4c69bf6f84a3423a96f311eebeb65d8c1a88056bb8ecb4033f299e16af28bc32322d2374917037747eb4b2def56a85c85746766eff4dd539b2a69a1b6cc1bfbdc5c4e40c1bc1ec56b2767b3f35452df1efe32271d40e1c752eadd17939df70bb0ee292692627af5c3d53a3734d975c597418ba7593736f05a63bcddd6166ea851c364f2ab6d6af410de138db0b630b0f1c06a2b43775508dc9e085d0252ecc2b780e00aa2430f77cfaac0cce05f4af28099f85609651a9fd060fdd94fc4b555c5cf8e9dc88889bc94798a82f9d7054f1a159489392c8ea355d2e6c912f97083797867cfcc279951735246aa24aff44bdd94d6065fe2221edee8721ec738d4599d5edb782d098312aa40ef3d0b8782fa4e963be8c65fcc937be0ebac044f2877e4e8777d54e2013451bd7cd437c5827ff498dd989b396129a2ec17598f26e046a808a0679d295475359652bf1c6e87e8f57c811d1bc1d665d9e73a5077b9e68ce148108e1fbba0251f85310ebe800f22c3400694bdd5553328a09d1f458693a484d4916ba77980efa0961e8a3a746a3e56768b3a571ed6cba047bd7e650468bfa21780e1733a059f06ba3952086021f7d6089206ef6cd8e52d5d36c91bae0fd4e93ecb36e1bde102f903177512bfc10bf9c5bd5efd8b26435ff82447b80cd7c07a86737709de58514e3cecf082dd0af44d38a3a7d50841283d1ee0a9695256130e64e8137d820ff2717a82d6953e63fe8fb510b83a517a0a31ea9c0f95e7724f7d206f6ad4e05baf66f750c40b8e0df45f53d1e97c804cfb1562183c56e09f019b076e6c407bf8af9df0ad857f4a6c4c1cacad9bc5088304dbcf3cad1807ffea77e4f2b63137713faf54340f60454b6d6704aa3da620691f3aa7d4f5b64e897d5c6c84407298343df76fc141cb4f5f10c1e524e9de9ebd00dc41987266c6e2ecf6213284545c707644f13496144e3f503e583eb236d16536d138454ea16ebbac19737e22e4cacb0302403233836ec1f1202d7e5c1429fd5da206b3d5744f6fc272b30b5a78bfcbbebc82dda22b5e7e7863f3e9c1877d354498fbb8889667eed3bc0c14017d5f6995e35b20f92374c5a62dbe533694cdc73b5e60900fbbcf5b8433e7b5f850ccc11f05cb279e0fea978f0c6bee5a4810a0e7155db38eaf54bcc4b82b5c2fb82aec6845fb82467d353e633396e6e210163ef9bc88c097a3ad03eeec42669ff3f422de9a949931e78c03f486d74a279a0f60f633fcb01adc76a0eba849c765587d8ce1060991dd8281d61e3652944bc23baffd9c9b1bde6cf6891b9bacb9fca043f0edbc2068d362daf4080916c091dacbe31f753d99c04840fbb5931d190b37c041148eee18836040fc3d18a17cdb7e0828dc0e50b4ed08eca8e1f8b7b1d7a8e59ce7bea0184a5a8ef9a0a737f47d87d56077df7fdfc376dc094486d6b259ff23e27c495f851ad6fbbd7001ea7ee6e2245cbba483c9498de0adc6ea21378442034ecc74cec20f073dd3170fdcbb30b9aac7661057d12cbf82dc787b948284cac01faa310bfcb2fd1fa70ec98562055c48cf3e8bbcb34d30739c5db415dfd84750d4e0a2859a85f8a542fcd6448e4a9fe3e4a776f07c86cd6e97a994f6561ecff68bbe5a6624a4007fa662a70104556339a5b45fa2e22c5c2c365eb048de4bbcca57d2a84d46fc45c85ec16973bfce156c03b8e7f4080b6e9b163763700ff40617fa248455670d0c645fe0fc856c6a4ca8ab772b0800a220f620931bf2fb2e6ba6da2a7a57809599633679780af11a4ea1b3706efce40e620fcf9ebd822af2b7d02124a38c2708b092f070d7cc6bf859370952c17b8635d94ae8521dcd32c654a578b1edea3764848b34bbf73acbc5f1711fa8ba075f611aa381057b7345cf861372cf61d4b8f45e1490421ba38b4a6f752b0798e02da0492b3121898e5e61b976d58a8a4f71ab5e64a599ef53b9a6282e202718d0dd8e9c7472f90b25e696e7022aeda2dbb0dde844193bc9891ddc98ae3a86bac4fd1982a3df3c31466e4fe21022650631c3ae00e04d97e175ae5716a3d3245c17ce2d455b6715cdc951aa1cd416239afb9fbc4ca641a7eb0e139550ab4c35a16ab4ebace7d5cb89747d32c9bb22c49601872eb232423315c03cf83897984d08cbacf5b17310fb333c265c001042975cccf82199a1921076aa112be2fc0cd6b839d26415085c892da1a5063eeaa3a2a66713492a3c4f7d0c2a2a73f2fdbc1cfa579fcb03abb3ff8cbb2f6fd6dce8f08b2ee0f1c30e122c2c980a8e722aa5f76ca3b5699fa47f61b426d3fb85d8d1516814bce3f4b9e417f961025ef0ada1d8518f143788e2b0d34066a74bb79a5a8a031acfd1ec73bb1f19b894562eb517c278ade566e4612fed8820e5e347760ea84964b56514e0ae6ba1b5682a1eee0348daf74912628f891de708890c6f2a7b6fdfe984a213ca23e3b01492f40f371a4efa90df735913a96d25886fbe082934a7a7c50ef1d64889c8b73c396932f38fda1b6ef724df067b666b3f38f0df66dc166de4aedbad0f37f86919e3d7ac5434536085a018cef79d8ce16f3b69c447a79c96b1920a694feb6955c63c48337c13a787cf690bb4c4e195451f17367164e508b2cbcb2cfd48e64bc5b109e5c8e6c5b2f2cf8e11af936f6fda0ba7db9425d9fe022e815c195d11cdd2d27ffc84f5530310dea8fe5aab7edee26a325e58ada098249cbd37d9d46ef66f068b0a1f10ffd6425064daa561738e6c75092bed2759f6fe98c003703b1700bd69e42c282a728945408470ae0d820e225600cfabc2e7d93f2fa00aaad53af442033a0b0e6c19d0adbaab896e13f6779188be3ff8dae8b910e129a71e81a3af6fe9e0fc9981723852658c85016959eb66245406e30ed313e9c19896b9ffc5b9741c60899d8a17ad57d7effdec11a461aeeafa9797eb2f197717475d1e9db7ae8fa0459951d83bf9e98dd3cb137b98cc90fa9be327bdbb26267baa891aefb494985e26e3e25402f826de47d4698f3efb459d0bf679e59b408c86297e8b7fb84e01956fa62c1a0f3b212f62596b31d856d44257a34eb5bb074700b8c4cdffb0b9dbd370d108aed50243311229431ebeabf33934d42466fc13230a55799260ce5d3e62a1b42caccd6b4b7a20156e61cca5eb57fc73d762c27b02d5fae716e20b5c8be4d00542e07478bb4757eb083f484e193162e72747fc11d8aaa5e180d1d49c100fc27e68223b3806afe262a434ff66ced42a982fb72c4424cb4f3eaa4dd6c003743b5cbc66d23253fffb7e3cbbb6543718cac57f03d61c668f168d80f2e8279cccb226d7ad881353254463aa7a167108b1f07c89bf6f2992a1fc397c2bc69c42429e25904a74a238ae6085328907412e3bc6bf7c302f9ea0cb55f52efd1ff467267c4d052c1bff2e316d2bf68e512bebe85681e66b0ac4649a30c8cab76a22d699c5410e88bb1881bc35848538e1c27a027592978a95e83f3c38d67b6fef73d0710eddcc6b1cd579798ab2bbef62d61a089666fcbbb11a21b1044f948bbe8bfe1580cad65f5d6fbc75417dda49b39bb7b3c88c23d00718738a4d0984d39783df1c39cae6f538a8252aac9974a3e851d1031572843acc4dc90e88255a5054434a855dbfa0f73e0913517a3c773c9082e1ead0295dc805b36a2a27f20b782eea806c425c5b943166e52548cabb30295b25dae725d1f64caf953bc0fb56571f1f1cac73cd551b75c35edcb017cf6f0afb90b6d54c52af62f133c735673a593b40ede24c6e5508d8aa5c79ba62fd00c52f480395e4c048cb9f109e470a066d21f299c1e3aa835f9bd8ecd49dbe13d82c2eb8a44359444d9bbc8f61803cff356835aa1531e64807bdb9da4261d5d91b489dd9bb7dc227bae69bdbe568ebf33b97e7e85629e399bb15349d3f8b247eed8fbabb53a77aae93b618f0cb08204d6a033f07a8012354b0b1f6e5bcd3801f7ccc20ef6479533c6d99a8104cdfe9c1552171c8eda4dda2812e9399fefab2a70383b3050da431dc7202e47a128cda9782a6287739737dad35c606b6f2915272d49233945155024633e90957ce208b6a0cd911f937f1a9b6a00214898d9a72dc65c70a0e49ded7bf3bd149a510b37014b2012088e5f228391c72c34b4e9e1cef6238c4bb458eae8974c22de1e405563df46005fbe4db157e6b64c9c40d22489c3e7d4819ae0f476b86eb57dc15ffcaf591462df90066a2225fc6b32da1522bb959f26f3c8a93b08106c92be31afb8128c6d65418a9eabc8f922bd55635cb137337b02db411b24cf5d14355f0108001aaf0e098fb61f990c0cb53dd14281f69ab72623d3dbd326476cad4e63f695790fa23a5eac4c2b83173c10110d13ca01ee22e9a3d1076df88fc3b4dd834fd5208d8d8dfede7077a8d04fec2314356842ae2825fa82e0b8237950c243eb6c0adf5ccd9357283a92bc662ae824c5e1875f5df2d01cb60d35822e846569e3d620fae862ba544f0ceaaed7478115639045646a15abeae1a55ad25f8f01492d5dd347378743e54d903e7b982a8eb89519378779a764659037bdb6df8cde2ddc731d0e8320cd42faf46a8e5c8cee3d144dfe22d16af32dfd4df3fb5f274362dfcd050f364576f3595834dbfcac0dd64c1f2634e150dc237f9acf7a398b54407531447d5f210b1169c69b1d38776209f82b3ae42167d47f33a2bb3e520a99687473cc141fa9f545a8fad651c70959917aa939c0d8819ab46413068396aca8681ee528806d2d44d68da2bfed4f50723f1b95a954ccaee723ad5a18778d1e0d1dbaf86c7b9652887ad0f55c5b2b834e9f01e615b9815bb188fbaa6a1a39439644ffe0d0f185d3d87c3b9131ab0773c51d498014e9b6baff9040aefe74b4b7767bcca52d307010208e090189669cbfdab1db514a12344db6205eacaa427900219c7351ae3441637d04bc246b2898b661f5600a744319a41989aa1f1cc34ace4ca7c444d8f7d6b4c71455870b544ea129a26aac46dd847be6a5e48fcf93148826e6a56436cd825f6f4e2f612444dc3fb822fdc28d1dbd36f80407e77f32f48408357ce2a7ba594953d36188d25fd1a22b711113905b9289b5ccedeb085a7e3ae5af85ba74e75e77e931c4bc85cd04630c9d6556e75a9a9cccf203b42c411b41630670657719226f7d6c2f8f3e92bb768b5e7acf51bb7bad4cbf6b5999b118825bc3116a1c09c8fc7393e25a58cd34707e6e9b4069c2de995f348d4494a6c4183ec881654e83c9d2f25eb0d26ed31ca47d2b078aa46b08d2ff09f93ad4272685b0984c38db0d630ea238788a9fae254bf641b46ccc8e920a4c91bd75e037988c03fb70bb8d90bf23bd072fee613fc4e9d4180e3870ba13f0bf9952b31b2e2f089d40814ce092547b3c095d26939e980ae7fcec229dcd93f16bc56a188567d9d2e72f4da098c8eef2fdaeac1be31fd68ac1242797eda5824ec8f8cb5f8d15b4137f005ebc218b12a276351106eff07eee6bd5491f6b2adc748d047643414763783b0c92303ebf3a112e5f5518ef46e32aa31309d4480c17867b0b792b4179b829615277ff71f3eed1a09680ca579fa0f4a94b5ec7c8c55793a0b79f0fe9a268931e48511e4d2ec13a880b440936f52e59ab35aa58ba756512ece90043109b9c54f9a75bf1c6d6269b9226af4c22467d9bf7dd077a5441de370ae35f8752feef4e6df7d55a003c52c4ccb8ead478550962e1c4551248a46b78b28800b237bd930a4c66c64d5ebe5241f6aab4ca1945d7106ff13687420038d736edb63ce0f93f1c9ffa5561b5786f3d7713f14e72b61eedc542f4614b396581ddf5205bc51ae6ea5a931a5957bcfecc36a881bf3357b06cf4fe1b4d3d9fb950d76eea7f47bfb03a2e933b66b5959d933a9d662b70dc5d131bb95fde0ba3e1b5e0341b594dc7eb50f3655013e0b0de21266693714079b8eb61dfb42fb367b5290fe056c3e77b6133439ff130c295f9682c0fc15ff220ef0f2c18c5255cf7678516d3e615ee1a38ad0397a8b33384b95aec36d162e2ddef41c63679d83c96e146d5549cd8a9021b24cd49da4ca10b5900aae54655904abfe4136a3a80558ac5796c8bef833610c845193998fdf5d1fed2b9995e02eb070ea94b36c4c530d08077e18edec568bd062c5327a07d45e33ee3c27369028c730174e9f375504a49e7faf95aee12d7b9cbc3c89c5d12b7905f014575d5dbeec79a19caedd780808262567e0f8b22cc954a0b8a4f5cf03f43978eb0fb6aca02d0f7cb2e868bf5fd8fd08634cb064ae4b125b63cbf8878fe88e92baf878c350ebe25f47f97d7635942265383d1460d86b51036a0b1e6454af8f1e88b8840c3378a970a7f289fc2fdbd8e20374907f6c303e77778a94c80de1a1b85413b53ca068ed35da21a574992d5d73a7aee5916ca4a1ba06b0da9c8436c4167c89e52287f4af5a56a3c6d47beb47b81cc635789985ca6330861db66a839db4764aad51af9adae1e8f03d9203a774cffbd5012f1935947d8ed995b74d6a005ccc59edb1328fbd0d51943f45e1d76d913b9825bb715a0772affd7a1be6e317b057090cd0c6c4758871acd031156838661ed8f63c2f2ff687473a87835a70d3a4dc50468e1345ba6f25ac1f995a5fbaf48ce20c42de9c54bbe551e6ea7fe2ce874bdf189c506d53378096b61797b25e434901a00f8442a37e910944a15af2300e9f67e92e71f16a633a9da21b050229863867e6f5806b23c5511c3e994309b83eff6aba659bb328d2c6db8b083c98263c3c53992d679ded8f3849edbb176d10f4dee1e26a4320246d73d7b382b8955d320e1674f7f88cdf311c3af16dc9356d33079438e20a6488ac1cc9d0e213ac00523ba45b6acfdcd4130930698d48ebe350205756fd9442fd48fa615ca8cc9d326ffe8981a83d87fdc0b98e0130fed3cade9c5c7bdd451c65a39ad828af8f6c94d582ba44aafb54a523c7573ecdf2bc20f099b5fb41bc0aacf15ea2b7136fc64cf4e31ec86ed8ba287c0fe55763abfd4c659960ff9b0a7b7fedb0802775bfb90ab58c327d735df3bfd33c371f8cceca13da99134992df63b7ffa6c1899d84bffbcba4d14213bac0c54685e08a9dbfa29e71ad624d6d4e42e9a8d796713aebd59f26e66c4013f2f66721d970a9f0471608e2cf54d399d6eee709b37d5bd69f100b31e18140c1ecd4f99fb3ef8368f2ea618f41b3b3705b03b98cf5de7a7501c0717be670963f2b26c999e498c6e60511a8df1285db3293774b5b9a433682a8262137320c8d93eb896ee27c0e2eb2d24f3b985ecabdbbcebcf674df93154e8851dd088f6a388d550c4f30fddd55afd1e2e075d5e76cab130b12bb64609909ffadf9e0025b84e2437feac39c9c7cf729b872f35afeb8985fa35071f33eedcb369632651a9b15cf20135a2e0e7a335f400ea484feb85a3a301078ca336f1e70197cdf374b5156d2ff03a2a770a4044dd39f4a8e0a9ffe2eea23eb4fc922140456876df0232c2652ddaa11c4379653ebb2950a2f0cecbbbbba00e87dbbef02257c3eec3626c2a4f76633ea19638d5d33b3dd38fc3c0fc458bb87c24a2ae340e189985153438def14f97a3a1bd874d1045aca420a2862a837bddb5bedddf7b") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_192f_test.go b/ref/params/tests/vector_sphincs_sha2_192f_test.go new file mode 100644 index 0000000..336180a --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_192f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_192f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("299a42e1811d7ca220629541b8167b5248eba2753259cb73b3527aaf2c32a2e3f9aaa9812c35033b71714d39f206ec69e653de573f146c9fab93c82774597325bed546c1d8ee3421949bd87d959645b8b2cfefdc3592cc1173136b2c353bf3bd") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("e653de573f146c9fab93c82774597325bed546c1d8ee3421949bd87d959645b8b2cfefdc3592cc1173136b2c353bf3bd") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("bd20dfbd0033b932b6162a0ad9144719c817c8f3b275287be78d9e223400d19481ff3e0ac991fec240f2474563049911126ef6da69915ef3f223ff287341aebab42b238d5a90de42ee93e0e7b43d25cc1b21b3108a894b8a4f99ebef5dbf349420d565697e2ee8325ec4cabc83ccb48cde652296f95649a3b268bd1da58b032e3ddcb024ae4c997ebab3a328997489b242a2c611d976cf0e63aabceae214cbfc8792d954482a95d0f246eafbfeb5098999816da2fe89f5cf67725ae07b1293d5456b6120281fe704576db2f2cd79ab179723eb3f53d6f04cf178f700b43c859a6389a9d618ef52c6596e59c54c3037ed2e6f38f6a5d9304f2c3461d49ac138306b768eeedfb23aff5e01ef8cb2de5f6dfd60a52198c63d5b4c13ac35ec2b431da777bc1f8bfb67862b4972b9a8cd6fd05ed240df81a17aedc1ed1f32394008a776ddcaa0a78d8e2c079a08a2dc3770481f6fa62fa096b84b5e4f9a097ae54687775390f6fe785dccf85f46847a66afd506074a93974054204204a635c7476e7a38abbdf1b3766c31fccd8dd6f6170007326f92e7093b99036c70f9e0cd6a349b7d8cc04b5f410d39f4a95395eae7869608b151ce0123e8e315ac5a1a153f87b1b691b863af398f0c2d2c7d1d86bfdeaa271d4780f73e07536a035407de94bbaaf28e493c6563f67a2a50843019ead68649947aa63a056da93a8fe0df776143ea1789ec57a81412b42baf5abaa3cbb79a8376a02edbff9f9b27a31fcefffef11619c349b659f93ae669b63b80c8d3128639268a206341aee8d26fa32614911144075a225b7ca75030dbf988c84eefc854a8c088b66ffb4cc0666670d51cc1db88204a797804f586b815fc5ec871223cc8e7ff6600277e4c160c242012a388afd2c05abf245cf786898152cfce50add904e580c88270d29ce253bd8f8ccc06c299f9cd37d4e601e424a2c1d22758bb609c0b41efffd0083cea9ea2ac5c056e82fcaa0a7167e2eaaaf16467bae2f1521349c8f7eedcb63cca0c0360d18443332ffae176beb8b5b341bbcfee1dfc6397d844e65459820de37847a1d89ed17dde751fed77b3a5c421c7768a688449b9121c37d354d2f72e8a02a007c9911c4e3ce1c46cc4110896026695e817db306b61ce3cc6783734190d5ae59a07b6c40160477239b53aa9e15b329f31c753caa69c6bf8d36e0fb8b7d4530ab21e2987d63d0a02cd37b05e7988e00586a4500d85503a989f8b1c5630f30d7b8474c1ee3a9bf9041ce30a13fe539519fb035999098446af37c57bfb13b90df1bd03f861b61e4d0995b3268fd055b21be616e4c1d0eeafd0b63d5322fed71c22e640680a9638c7b79bbb1606864520bcde4632639916d5861e18c129aa8216842ac544b505a094cc9f5d2812016930a7578341eb54404990ecc29ffbf4a03f8bd44fe9876fdd1355087622a09f7863ca96ed0434de5d4388ec459aa57a6bb6b84e00ac1679b75643f8f9e515226950c994e759648b3787a28820e0511246a26fffb9ae15cc20e4577cbfc01fe2d9373b322f779b739750d19a390ba07c3ce7db31f9e48b6825a92f59548d2a8a00ba95687a6312a8dc49f585fb054952e15492262c7e79f2bfa3d8b4b04ed01f4610ad45e9a299a07e9dc2dd39ac53a3c0c49520679627c1e7e9da92e99184a16e1ec7f9ee35a3febcd4614bc7a799f1148d13d8b03cd5fa694734a13ae7a7a7cda32fdb50fb2a7cbb4f6d4556ff2247878b60f208696799fe7240e429ddf19171d51a0059247de130dc1314ffbcf2b4568f2814be7d8a1af0cac3b4bfc8d0f87916409430f3b2c1f6546d029de48dad039870eb51956e4dc3609e5e9962889e79129edd313969b2b7ec8b6fd72cbffeccdb5f665c20719a18142504239afb5a0b344f01efec4915ab771657cd06bb34a277a8e245718575e7bee81739ea1d61b42e21833beee2cb6b6e95e0b4ae085de9fe0e6222ba3840e83dabf232e13a6ca537ae1bb0fc39d5090c3b432e9befa719e9819e4144273c97755da8ab49a55e5bb9b6f0385927e7e9598b885dd5eb99f710503a749d1e0dfc9c30b37cb83b9f0cf6293f8366ceb6f2e81830d116dee1e5cad61da4bb0e0a38de23dbda54ab42166d2226911dd3bc50f1e430e7e4cb34353bf3098e4b223e47fc54807e7eed34e16ee9f9dcf45e43d2e440bcd5298dca752a8da809eb626759632e8daa8bcef9964fe1f2b298edc24ea751364901b36569ba66db9c14ad247476453f3afa135ecef35742dd0592a3762f5bb632bf9371c64f4a5096a43aa11cc59c882808a737f9bbc85fb6c1b1781d27f9c393d783766eb1db121227d2105703a4c462ae9afde708bb1d93c8eaaf207c90f2e8d79571e5ea6977a25d2161b3c4e15aa1bce5d81b0df0009165b1fcecfeb662309293a55ea04d23c8b4196ffe02f6cc8f753792e5cea51af29be7a1cd72b36c5f6a0627bd0e16d169914c10588c3a2e3f402cd005d0a0f7de80c8e43ab81da6a32ef3e48dfcffad9222fb65f505c8d767a9062e8db1866d6416a1f8f4fe54db053720b60e7387ca2e485a3104757c087670dac4951a0685bf7d73921427acbf8eeada8846bb26171aa8dc380ea69bb00e38f08a7a939a3b792a9ba697e4c09abb6e190fa8bc10e96c45b2c68fb415940d59ea2b9e14923932aa0e4f115b18ac84363ca13202dee7c880f42fbd00c48d1c0b9106f696ddd086e5784987216ec86a33edad9583487aa9e5b9d9309e70636561d3ab03b28c37778bea6c69682124b2f89313f13a3553d00a5e9d70239307f9b1114ce95a28fc76afce8b042fddc599ae3d5b0e41fcaf0400742e6f918adb1c4784ad97f2f369971d56301ba39839d2040e13a3217e0455cf2f67c908cc90106695943d24aa16819b8c2689765fc0947e48f2eb9c9169e3f1a3a34ad83a251ac423193284fa8ec9d60ef6873e06456f1b708fa02df920553f8dc4268a94fa28941efb66419803649e572b3c4a39f6f21913a236a2b1b48d0e9742c8d95de3970c82d38a880859688eceb1886ba2dcae7dcda8abbc30130801f57a76a4fae8039f48d3397400d31f761a3627cb74c20211ea8f808f05e964b08a0390c4ead215f0179a40492f8b8cad7db6a70e0a6fa2afb28d73c44c8835d3c8aa597607083558dfb89ff2d3f8fd61f69fb5bab08ac3a80c3b2d37c22b05ee2330a5aa558353265e5ba6f0a1bb1294b3755c62775798dccc5429bbd8df1eccce2b4a047e8e28798fa8dc38faab18f651dde47e4d80592e03f870b2b35726d9035f2ac6a8ec3e053f3dc12943a50b97af7904b572f2e1973c5d825d2414d6b1b52574e74830549ff65e2df5473d399b05047a0caa4103e4b302681cf92a4f1f3a2a6ba56d7631a1a42ce390827dde3f0ff021d371743ccc375173ba427f12e811636a0e6c472533894d6919eae3d315beb0b16f4ab1072f708bf543acda1123d8a6ba4b4f2c71c16ccb8c2d1450268cd7e082cf167ab6a3fb7115bf782051fe708a07488b0c65d08b3d0f888889cccc1640ae855cd122b45b3f4d47ad4378704f3cc9ac5f65ea5920cd3d637a65780bd58f2aa066753bcdc32cdd5db6df7a7050c51bc29c84d39edf5d6cad918eae53290cebc1ff5c39556205d8ea4780d8bbefe71d294c32b411d1a2886a686491e89bc90b857880c07273d59fad7ac9ecb14164398134fd99ba529e753979ef7cd175565bff408f1bd968fe852b7adee59daf60e62bc9794f5f4ddb2bb25309e64ed77eb0aaa1cab2fab187d78ec3b77f89187f58c7ab31e0df9f894b99df59989638dc209036645fb05c9f3182ceb7b0cd6cefbc58dd217e6a1fa8ed94d73d5078a5c8d7e50d04afc9dfd4c103b79e4ae9b5291cf82697d08acd289899dd08e00b289d4843ef8fd472e110886ac0fa550a25bedfea7c08e3888342446a2b61eec9e592ad8465700258c64b2903b9e165c19b0ad1d0677bbd2058719215448f95f0a2dbadd42fcf5fc32b37588b4ebfe7f6119eaa33a0fd4a8ff42a68c670bb27e278ef70645c77d9e831e70a501499ab2d7ceb3e5add26378ada4724b6a54d3ed7a886d6dbeb270111e9568fcc3a25ab2c7fed34e1089d922370d6e3079a821c90929b7d867c9a1021aa9ad595df36a5ca5ff9d92b59fa8ec4b20a8607cb0f794dc79ed18282417d75d68c89ccb873f73e1fe5e46e56513043be1aef5157028766075088f0a6907295b3428a6e84fc75f2e2fb4884f608f46b38300dce43d4682f49491c0c0ec4b509002661a670087344d48852d221b205debb52d04602d9fc126b963031a864d0ad3a7bc306e285460949b60b942b42c124cb4bc472e1fa44545da65ff689a7c88ca8ebbaf60c3a3e171598446df2b5307cf7529bf50a991939527d8d236b1b411f2c7e30a18f639e9043a026a6791c04633423385a5b47dfb97d47c9a4367c5042f6b01fc2054e39e5bad6259228ac3d70375d51757b5a24d5bce5d888f6e28c37cd815354073bc04d7a7326f409306c8bc4618814764c21776e7fa3da35f7d4c72b3aa55c74b01b9c75768b141c08e807a395f890c304c8a872eda577d3db4cd291475b99c98a6f196f2976ecec3b440d92cdbb950fda16eb018c79096bfc1eb7196671423dbbe4f87b14e3a4ff8187bcabe3470ebdde4036a204c06f24f502940d00346aaec6e00a9e5bc7f32b0d0883a5f2c527592fb6e115f5310821b5c59354202f8f131767f59ba7f7424f7734d2d4b080bc11b6b77e7193d16c3ed099b0a707ecebf8a3fdd47c864d21f772c2d5ae856d5402d1e1a943bdb1a2b4f168fc04e3ea96a0a14f2832f8151b74a82307b24116623f85bf478b536167d3c9d7ea10683aa1b1549acb3b8494350a1c8e350cae1d5f53ce794bac7f1b99194b92ae77a02222c4c99b307673814da4bfd09b760f189a8829ba2c7a53136793acbde8928bc6c619f8c6b0e8c4cbcf7a72d7f6c8df060cefd00343bc179b6ca27ccf421c893dd2f14659d7fd65936ff026ee8ffd5517053670b4138c6c472401fb70b2b0dbeab86abafde64bc2df15af699fa4f1a7b8430d28e5f2bf0fc0f8a7656bea356743dc6902d19df6323d17796f582400343b2bd8c0be02faf16086fdeec5a8e294c6535540bb49d843a054e15f253194a8320802b14abb08c4e1634ebfc3bdf554e0f03d38d77cde491f1b45491521bf35b2cb28342fdcdf4183a7ff3ebff8502ff8f9a58c0243ec21e79feecfae874801169994cb5fc3acd4511025ad6dd3e3f06e90e6dffdb4fa0871d1987cab608ab36512ed65f98f6a810a0c7bee58fc8d780b9cc17a0b6a80775c44c0edf311303286a1caec88f72b7b46efa4aa96065b3d3a32211d2899f8fa91b8ea1f563fd91fce818696987b67ed3469d709d69b8afbf3baaf159673210f7e9275ab41c2e8d97358120cc68a00020b91421a6ad282a65826cc3a9aa46b742e503bda5f241389ec5bf3d3d02381a2477fdb8fa888f8c82456558e98e48b684d1080bf733e73ec33b42397e0c0f2f4a09f8825af182a6604a16d802ad09b5c6eb43a17a3688f4fc56f79320f2e50665730b36055413b569ea4214097380548a9f304ecb115699b83d00e9204bed4d9bf0522d096521db56a06fdb75772a3d63fc7dc49ae0530b5c7832b76e4541285dd9b313db6223b96ac10e157610439b513ea3678cdc014e8b203b08b9182261294d799fd72e071471624ca7058579508ba91a4212a7ccb3848809d80f7b6f6f8c1d11213b45e46a482ee59f319aaeffb772a0b16fa68a0cb01d9074d0e623c14eab2454384afb93f37a4bbbfcbc3ce14ad56fcb0f8e9d60c471e1b5f348110e5f9ba4bfc1f4eb2f8e31854429ebf246476ed4fe66e9cc9a5eaaf82d141a2be40616ea8bd405cd1b79c8140fa5b72c488930c9ea7a4dc9c6e6aa3465d0e6d11d9ca9198a931564954c72fd1fc1ac7ac7190ec3b6370a77e3485d70097965febe979376ed3f5f541ee81dbf9e75a4f5bb9c26640b2d8b1c9952fd329c10e93354405fc8aa63fa8194f41e266a181056d6248d7cd74837e14ba819aced307c42cc6e79d36e7f1804088b22f4c2f339e0155d23a625d904a45cc762e93e62b83c8b3b64e78b47a1b97f066e95a44306c248623fb1d83f96e502f017f1e56d8de598eeed922636d3b3a5a78873e584edeab48e352b7deee0548116619c5f01b130b99a0cf234fbba21ccf47a8d8e3a539b8e646cd879578ae16f2bd728d9f0b30d27e899fa54cd328890ebf703d31c3ab4d023d3c3b8d5ea035d49ade53b2074e9804a6f71d599a3b2ed80126ac157d67510078c3deb16b952db900c5253d89f546e9203aa9db1ac3314aebed5a0f53367ec57010acb97edf16fe5ed9f853fa617cf971e688764a77468a30a0e15cd682acb30e56bf37098cc620cee27758f1c6c00206a81c3180a5cd8221a3b1c860d9fd12a4081c643c69627ee8b364649959f207d7664b1ec126146f782fe5451b03f2c3db6e5717966d747b021f885ffaa159051f5437dfb3fe319c874de074de720f006d73a8d536326e5101fdb813c60b3fa6ab6558a53c1e7d509e7f31019fd76dc080f5fc750679e29bfba55c4c4b6915975379452727bc64f33ec644a992ccf09608393410f89f99f5bb0a01b8f4e7fb09de014687c8e80b4a6a14ee2800da1f9680a9d84af0340b314e56af748a92575d070cfef98d799869f5cd79c8bb5784bf2e1c2bdaa0abdf91b1754e916271e409dd58ac3c0a710382fef72918303224f2eff97368f48d15029a8df4b420959c53ec491dc2a228ad49c64c62f1bd8f30cd33ed258a50c570696e62ce1d66b5ef16c74047fd740c6db436a6400cc33d9685954d411629e4cc1d5a5b0cb8eaff5c545c4fcf8655e57546466d3f183f188f07f8bfc38a2ef399efc052e06e0803dda631213b4e1123984aadb9de2f58f856a6a7b17985e5b60c78839cf91c2a722e9abcd5224eae99d85122f27275c89440b9d057e42e7f88628eb7aebfb1a2665a33a552178188f00c2d1249a833666ab71c55717b2186c26bc637f8aa62482cad2dd73535721634acc20e72305b537a4ff05ea6e4bf8f282e897d556d59ae3007647c797efd90199547d512a56118a0f9319d865542aca4db594c5381edf41955f6ca9515e2e84c8f2b2310f387e57f855e48e3962f6d385cf0853fb42a9b4040f23ecb7cb2ba740b1222febe085b2dcc12c1f2291799bc3714d877cb5789a80de6d2c343aa1a83aace71bbd03cfdd9b5cc4938f29e2e08e93bd8efbef7fe74969cc63fdace1152bea63af85e398c0ace28a25ea488c92dce54c2d694d0c3abd18e34646035d515369e5a9c693eb0e1730f838535be11a8e901f8fa619bbdb9f951f45c168c612ba3d055f053c8d6b4775d810bbee329872e72d13c7a52a896f2a01b809f081a044a782de740effe9bdbc940dc9affec45428ad18519a0a667dbcede8714922db27537e0e36489a93c8e4e6232960912a70d3d1865c66b19685b997499b46e41fa0d39a1b184e2cebfa0170a93eaac62d9eb12973709e820211eabc3a702d03a99f48ff8d9c88ffb2cc07866af217f2ebfd3d6ddcdd3436141a1757c84b215d56d6432fba157f763c40158ecdf94f8f867667a03c1dec9d9d5525df38890647e1789852e49dc4a8c0685df680068050edbdba045f5d2fd07659e6213ea5b459b42aa05ea1844308a2351df8bd3b634100b2fafc6e42a6c0233b657a862ba6466ebc1dffa30b90013fbc0f132c82a4b5085a305ef35ea665f3c68e8fd17152bae2e5c8b1cb7440600e466609a2e3466e93a8f313544d08c0be54589b8634d1830b3dcecadc069d334df7dd6be73d57808f2893072646e06bff46303f54aa84c34076c099920baa4ac7b62022258e7308eceb13b377665eacdd56a9dd139c1355aec55a8be26c7f11fca1684b49b1c1f0f89e585d461efa0351ef6153c9a210b5423f20f554cade88e2d068606475a33b09dcc602a0f3c38456a7126afcdf0500260756ff1a5bbad80b3ce1762d6bc167d94b7c3616d2ba42e07c72fc46aee74c2532776341688d0276070c3b1a26016944ca96dd9d9daefd959b2209a81838d86c315b434010a31aac4ce6089da8dacfc5b59a5ff978e04ff1a0635fe4de0afc1d198f85a4e12c3d3122d63dea1ae4114167034a0a374cc59da6a1e8064dbe20c3234552e76a42596229644ef5905a9836155b8c1d9ee7c0c92199be04311090f0398b8ecd5c443ec7931e246733f659f15c9225117a81682a58c29695103b83be5ce1343b7a84b2378bf6c7be76223b4227267c214884d41539cb672ec7bfdb4129c90fd3420498ea5d40c2266073d85ed614608d1e245541d83fdab529138d92fd469a5a8cb6e090ed55230500acca39c722e94754a68689fa8b8248de495b51dc1c4a59deb21a110c023af8b71f1b1a2cea129c3c3273d534b0c96e042c2030b3b0132a86126c1a22881382a35a66f9d2051854f75e3af4e2e171c7dd6b3d7908f39913d60c5ff730e82a4d5286701b4726dc265d6b867f89d32c6b1eaabe246df200adaa63fb0364ebf8544ff826aab2e74fd94dba1c900c85ff6db784623136c24adc862db27ebcab0b42c5be9aa64b18b9a40281e0bd36f86ab7135f1e750ffe5ec3dece23b6fb24beccef5bbfa74947b2e2e94f46f7a99c26636713be67b9035b3041f9219c3ad231fc2a655150ad473d510038749f5030ddf828e053b6d9bc9e87bc247da42ce709b6499b55f3e0008dd9d6a1c63c08f858652187e6d22d51e36af4b58e64a91a9d3fe24894860f5bc21fa0614e9010d227d58b2f2b56adcdf2137cb2461a2d89d4028a36ddb97e04c81301283253c5b20793352f4acb2651db70b1637881a2e77e1fb768730d19fccb6118a4377482f753441ffc08ac7ad765715711c53faba6fdcf9dddbfcf9056d871e63f22bd5bd79acc0569bbbb53f660b466eabcb8d68cf9c7c6e4627d7046a5a1d292c37c7f0be9a80daf2f7adfb712c92e871f941158bcaab55f716114fbf272d667b62320b1112e746e186f3d8400d632627801a34c5bf51e73276c95519d67f1ba462cd317475d0a41b8fd0945bd5dfcd8c6919377918ca931bfafcd6b7e14816a11f01c5e69e42b6372619442e2351aabe4e33172f0e04572dd377cd24b5bc0f2fb2a5391764446b8ecf7430eb463a34faec2dd95c905e60731439610098ecb00e3a9bdc6de4b8fb8c74e5aaa2559cf56b8e25f19090bf7e1f2edd30037846929cbeeae9d68a46b0a151646b289bfd3a8988f4648efb90d99b88985fef8c282fca52cf53619ccc9e42c55811f29bff53a1e7f34da1cab7a97fb9cc0f0c3cb51e6a07ac3b3856e1480e786ed321da706a4a15f758fa390414e44ed7808b26434245663ad4961896822b51b8d31c6c117679b7c4cb5aeffaee5f5370a917ac85ee255d228aab3fb18486bc8fe49eabab505fb5a023d8b12f60eaecb3c06aa4fc6c45842a6e6b556e0994378f1057dd9637fe7053aa9f1df8aaead32c40e197d118c72c061698968027af6bf82e154bbed990d7cf15c70dd29eede1edbf48fa8003819da6e5296b605278ade75e7f27822dd2caa0b9b5e49e4435f97b180d3afe9ebfe1464b1b410d8917f9726c4304ec5faccd85d7d51aa97b712e7250736a7e4f44ea8088b2040f07cd093c33f73c367c75ddbba1cf3f38345bb49f293b4293d3be1712474b6d8ed22e039dfa211e957d5f23cf1cc77a7aee4dd57aec16dad11d5cf3a232210228ac39754c089644bd458cfb2eda3f817c26d7376fa43445f52cd4fd7164fc163a6b05ad1ae03dc86a76dfecae55c81b19b5391209aa6fc9c4d917b61d94a35b89cd62322fc256944bb27617426ea1e35219253800067413ae071baa12be2c25be5ce66011b6b3ae30da698a4e077ae19176f4f2c989912eec4e9463f9f2fd62fa49696f509ee0786467f3738f0c49b5b3c8e777d25d18665061fa50a613ee98a8163c8700c5a8d03ab3c39741d6101c2db187892500a313fc5862f9f0adc4aed44ec4ccb06080657b09a59f50da998311bc841428061ff6b5efba586e0fc8bd680ba2eaa445b41cece59c358df2af7857c12edb486bc7d8419f8869c38556684e76fdcaa8ceed9e6650c9e74db8d4ddd6e17d160b2975b179191c15308671b75a0793ea693acc4c0a58e001cf827e6431da86d4b0c7838a8d7dce49d6a39b67d6ca62a85deec53ff4f47ff0c8a1664d768419090bce19f48cc847b05cd44076ab14d1fa7ee941aa2be1f0539ccb210779203265ace19deb2e075427a81f07c1608bd112098766ef64a7d697a40f148b25ab8571f192789106fda1f342a988ec3fbb3891dd6fadf6333df43b4e60f5b0a1b749e2722137d96552ce4a7379d02cd312a28c55514f65ee26b5d7963b9601bcde1cb48184398b23098aa0c6d2ea1bea92d2e4174c08ffb99ed57cebfe58d9080570909a9ba26aef5f191f9aba7c40fe3306b7e2f62cd9ea64bc40fc7cd56ae6df69f8c28165d16b9ca3ed8e3537b68b146fd982289807aacef24df83a8fe5a831c66e0371d88f26f4e18e8eaabbbbe3191d3847d32fdcc09d6c4e463cc4f0d4289ddbc74aed3a79873d23c1fbba467fbb39f7c16b3c9e023d765fc051650b56e2a66469b49d133ded133fd2534a0fa1af9d3a16a11441b0dfc6094c3397bb90d28093d89980c5d561b8ece5e77faf55e88827c1d442ad35cca17596f06abc376d100aa7ef91479e26c2c905b8aaff05c65267057cb3c585e10a6a3d877fd8f52711559599377a50849e69f18deb123140f772acc0e9709839f288c15d35efd89142d981b2b4728b997e586f1456383f091c72badbf1984d6869dfdae84e2a2313889137508d9511a52f790a0ae7778803391f0bfcc06a26c137a38e8575ee8d1230df1dca34d74032847f8c2319956a52d446deb18b92455c1087d686134fd54013a721565d77b5f5195f7956e71ad828e5e600cec8e057f8c64b8693be6999f9ee11d1b4148d9fd4eff48f1b978b229d0cf29bc36373b7e2c8065037207b4c98c0d6ad9a9c5d3bdbb28afceb555bbe6dfe8cdad61c10dbfba61aa29a7ae257374ef2c28babd20d0a1572953d110778a607ca8f24960fb6e24d83d006c7305de9010a1ba1f50a0f4eb6fa9d2fc3da550156cdb203781ffdd64475bf91e4ac2570c47d311c79cf090b30c848c6811af610a6f04a5de34cec9a518f25410da45a1f7d89ecf5c967c40b063f36972058ca40366ddc39df7614d69ae837135a145a744081251ef8bfa3630f4922b5e5e1624af963553f741c346151feea1c9cec7239af57ade8f3342e1d55d8956f34c239734164592d63ef436434510c00dd93b669dfab267472beb1384372afe910bac168f4adec540fd45321e9539d78605ede31065f17a6bfdfad85e1e4d10ce0ff5bee85295102bab3e48495edba5586f4c1604948e312a1b303da9a3ce60f4a4e0f4ef12548741aab69c31cb5b6798a746b414475308b743a0d6b8388570308644d8e97987f931824ae34ece36adbf7bb983b813928a0f30fa8aef72c365ee8a870f58e20a2b221903bcf055cf76455d60e8e5f76f59c17d2d7b27679f073e2e316d539fdccf25150a831c6efd772df4544c143a599fb2c34c782ef6f8aafde6b910b2a9d28e0937a7ff7ad01a48e93ec7085497de85b3fe3fe2e0976cd43adad8fce0f4ac27dddd8180691506e02f46f341bd2134e1d0b616895ec73df077c256e1be3f8a571f88bd613f53443bd4c5278b92d77105b400ae12229518ac70aa990e9973de05e0d4b5cc0097bef13bc6b12482b1c01be969e193afe3ff8613cd41179c22b050bed56e30474f2e49a4ea864fc41927174f1ce8131c130a9c47fe779531aa721def322b4953975036cf5672da7e819dc145e8d5fda5a3b0dc927eeae77315bd6d6b2d3f27a5e7b8145b26c5cadbb1e99f678dd45f398a074d6f6c240380371aeb830964ba15f43ee1986fbd1e7f138f4a7c946e98af67791470f895fc4d9fc2e91bdb739f96e6e2e64964b8272ddbd76e9f2a199d432147d7ae6a693273c40af0a545437a751529abed16623145a329e655c36ce685269d76575d7a06cb5e775cf219e72583071cefbd3aa43c03b069badfbc329c76dd184d397bf89e4b2ba43394aeff51ad874f49b5385b425bcf2e0cce95626641609a176bb3ebf675e7d23e17ad2cedbfbe29df07576bb3493e7022966119c0028afc657c3bddaa7634525821280ac5aa67eef6618b14e855c96efcba5b3b1e81bc6137ceef107c817179d5a9440db2d10ca4fab253cefd8305c402bc5a66a64761dd1335c797ad599009aa024d6f70d75faf449a39cc3fb7dfd69ab3875fba3c97aa792a75f40ffdf8eb5229d03d3cea5c3c252d528fbef580554d78e5442cde511877f00f8001f9247c89142cffa9c7061f7df91a68e7a77ba56d0d9cb87d43025e6006768725f063f40186cbbf9f7fca86b529f80b64a09decdf0c999891661b604daab5bd70d98805b17363e37b331fd87f94cebea9feaa222236c9e726c15a2ae727ba664b1d1565eca2c2c88e98f7c12e206fd023e2faeb26fafa4aeaf0f77b24154249704cbe3300829af5350f59ed9802f80abff2c76374ec0f0c4b5671a637cf4ac35ab4e729282855be3412116ee8352c50f9163f29489e2a3cd4d37f6740e1234434067a7f87ce519faf99b474251376dd664a9eac3d373bc9750876e96d99891736311087f4a26f3a30c26ae9f131be1db482e05129e6924d0539b03661b6f476b8202845e50f987c00d5da1e7d0a7282427b19ccbb3b0aae2136c8fe41779ffb3224f2e3e5eba6af9d379e540702a4a295350c3397ee1511f103ce4cd634c276f260d869e4171e7fd228b142ec31321c3bc07c8f7365a9b990bb6bdc791a5f8659ebb14bf596905c93c5e0046a5c3f1d8c24e7028b0c69531788c8d56484bd7c2a28b54527178f4fb9f9b0a3c543dcb66500919bc4b458b74c73d1133bc985858db02bd30a3f3262412e5fd37370dfa62a25f4c4edcf42a9ca6b0d79a01fa9bc9c951a24ee19352515c6651154828ad2e7d36ccb18e1b6142db6e34f3c43b7fc858a865581b2eb36b5a732550d49902d3ca137329e73634840eb4ed57ee442c1d2d187ee97c0950adaeafb995e12434b3fa5ada7d84686a9b6fd0f78e1f384326778fb0f513c70d6bb49e996bacb50eed2c81a0634cfe99b3bc48871c9541fd0e25134c2d1e3ae77214bacf172cfcffbfc9123384e1cba42fe3b0758a50a1e169e54ebb34f774f134e45b7a86fa3ccab142b46a0e593f6d0c1ad0fb53e410ee76cce7803fe07a7505ea71ee10f7b2095db5e52ecaed9bab8bbe6026b95f5300f759e629b9cba390175bff9a6c503850c5541bc46b67e10176e58250e9b4c4083712549113f6c533aff059684e08c1d659ba739bf7d1a9c60fd10ad2c5d28d50b71b08fd5989a7bffe17c39e094b57d7e8d7d762dfd1431e49ae33c5b46546df8241a33a818be06a958dbefe21d333d14e0ccdac4eaa374ff271ca71908830f454e718736453ecf6d408efd73a4b02d5829837f9d4a64769ea4d4d3eb11cf7b0fdefcb280b2e75ac02cb8db7edd6a3a42239e5d8ab28cf3246cb6658e5eab156173108fde78b77d355c738490735d41e2ba2e0b8aa3ff204f256d95fcfb34adf030b01ef72d6eaed33cfd4a528839daf49a91af5eb0966d87f5dda4addc79c6cbc527f90c02466f75142eb00d67c21190eb32e126b0e0c0048771ef36f6d78080ec0ffd046c03da4deb5aa3a59162d3c0fed459aff2c600f645d809c3a7528ed74efb554c31b38c88f6a0a696b122ceaf47a4a44d23d0c366d38ac3b8d667a4e14ccb906e592e9a1ac5cc5edc73156e36699efd5f5957231b20d5d221367c4afb4ba9eec664c4b225b0ed7f8740d4c3e54d9b57b658228a805817d35f9745cd1df8f01f807fc5e916f7b98ed4379a19820125d46143563a9190f963f7d421c7880a0725d6827ef4f99c97a0bbae669e5a8c4423f8a848ca1703aa9a73d1c65f9dc5900ae3df8cea31f4525f9a3ff18f0dc0fc946c1d17b732592d4b71f31d81229cb1c4ad74313cf1cf5cdf324c32b7274552b4b01ddcbc32bb4e2833b379f6de8b2f199d28d50a7c6fb69e56590a2345c981bbe6813182b8c0be471979765ed596ad61efda3865b8dde58693f7185b672a7d1a9ba4f9b7acfd0f67d81ca34ce0ccee9ed4d1f65ac75ed75e4aede985a7efe40fc788809fe1c37e9b19145923737f49f2823c079cb2912250a0b81ad6a3e4bd1f955544507176eceb4ed1236a17385f89d050566aac16ee52cc1aec2c9c1026a05f54aa34a9eaef73e816e3b8d416821006baa4bc1c79362fa315af409e80700b0d57f89079b0e471ac35f28306d8cad50da5a15de207320a46309278562d11f27725570b9e469b2da1900d91bc1326fb000f1a772ccc3448973252fabf17ae61a7b921f21df41b74d39e7aa4ccdde1cbce36f63e3ccab9cce20107acabe309eb814f4db3a93edf66e323be08eaef33b74927f7c740220d4861c34287ea1e337c4034b3051223193b247e000dca02848dcbf37ddd2f0ae1c15f02f7e9349c9dc5d4a2a5b59320db46b9765897b408c7f680eda0a9d144846e4962a4ae37e942591824cf311d297c655860073b1bd2692490aff4e1783fe2119701be500dcfee9b988ca52e2d521d8516f22ec1ea61f271a10534dfe1783416f118a3667c20c748b82b92287d3b6d33a34be5008afbbbdce47b4364b6b45c7c29752f9512503ea7be461b71df281a275d79223c5bf5aee4be1b7eb77c86ece56294ba69752c390d83704b2798f0bb42f8a237583b0dedb5c57ded1378efeb77793443581ab8e4b71061fc0f9000011458e8d5f4b5cc85726cb8dea869c5ef7bc7f359149a341778325b24314d5c492ed866649f279976fb2015bc65ed26eb31ea140fc80e3ff291e37939b2b64010536d9afe1ec273f86faa1c8907fbc3dd5a24f2e57325e93351ced57d6c8597b0b7dd4e89a8cc694202a9ff7ef763ffe5b594eba85642ae0b8027b7dda3f8cf37e883b48b5cd373ed789813dc89420d5e1b8959eddf940a424461e450cf014d4c0e6ae4769dd60234413ede40d79b7bbd806b66403e82ec33fe8aaefb3c9ad9fb91fb55af2e047f3b0512e647effd8bff9b561b5b4f5e9bce51bda1e680568d4bde25061f0830c201cc8be325e4c5aa60db86a3528545b6c2414c8fecfa3d040e49c76c8b95b4768b86a5fc3f73b2738b84683376c0973a873f8c19c7aaf4f67dd444ba267ea5f88f1c27d70ccde1ccce2aff9e206ad14cb132a56a0c414e2939c9474dae25c074bc01ee264a3daa32bb28b69368c3a7ff55d49955b0ca4a47bc223a11ff46c05a288356381ffb2d80e2d73ad61d78cbf3b183eed1abbe57c780cc62746a62843b6c13392718292bd8a0ebae9496443664665efe947904e03e984b4279dc93756c34b7743c3a9d88fe75701336dd15b5f8793a72f7bcd53a4e36d65d351f5901946106ecbdc7199452e948f57b561b1a3993845f453df139460f6ff3417d6e1fbc4c82aa4aada5bf8cbd19eeff640c6970a6cea75f5d907ca69135344c95673ae435d81118c95bbfb624d5419b89e49e9c8f3a855df90a11e09590e626d28c56cf369b233fb4f2a00b0b3114f1fa5ba20e59125ff3a1033bb88ebd7858443f5d62cf96cb9314581f630d7e13f59b1ac4eaa0d0de74f84ee047a3c8f654862d01ab87e2ec6b30fe451a37a2d8a96fb90f098f3d9559b2f02e60830aed1cff9591ae3f56189cbcef3fdcd1ed792023a8a03b05c2f25ad82e45fe16daddccc5cd69d695d3aa28e1507eff665b7c5872a748e15882deac006a594df8454b496063d94b0bedf9dda541d00ce55cffe5d1cff761ae5192964f8b3944aaaf343f325fb96d63c33bf5fe24751480d28996fafba1ba3d57e13f0efa5a0afe34adc1e6c1bc85965fabae33248a6b0c9251434f7b2b4e9930389385ef4c2f5a6ada8f9ada48aa456a4f911fb9df7ce513a64bac90d253179c4b5817b86242cbc4c181dd0b3f6ac57209f00959b71ac1b30bc6050259dd7c478d1c78d1d9b734c9854f18a34d958378d38f60d8082cdc98575eb1135a1e1fc660a1663b15bc89ae3184fffb1737e7baae2f900feedbd754657644b680c25b4c28f72e12e79b80e9d2ed9b836056c31bfb0ea7a40677add010d7ae81fff0fe62f21171c44a5dda505b142122bdf6b8331ec17d212fea6056c1472ba37c2d29176d3b64ae20478db8ed0a0cd44b83778e1d2ca6d7919f9ea610f175c9f6d48cb6ef8e69dfa90348b6efee545d22328c30109b5fadcb3c959dbbf7917532ccc8e93c74437420b9fd1782978393f9bf70ef6a1403ea41e8ccb9cdc8a9afaf78a3473e754b520410750798017ee3320cf4bb76e7b127abe9dfd166dd7ce62a01c5fb650e89d3ca649f6b326d264e23dd865ffabdadaadf4d9eb4c9a8e2d4483711448a6fd5a524e8205837166c2491ec262c62e7f024d2b6805b8cfca25b23fd45d21f4564b9115514425246b007b012059e3e20648d9d3d7aebf95dcb84e8577eb2badb8d296117bf7975dc996f159e51fcd096fdaf685d39d48875557566c21d8f952c368fe9aa4d297eed161340c1c84233954be6833e7fd3d20f2dde96615fe6e8b7541368eda65f5776ec7027fd8e9425bfbc6440afeedbc1ea6f9de0212ef495c0a54ffee55a0ff3c2fa30fa78d3491c6dfa03612c42e887ec4ac5b7cb2aecd640d12d63816981446e80125d9b383af60fe85095332974ef4388eca0442c47d1f489ee8e3a71487eea261116463505dcd418726452a8707ddbe6f4f5a3a7670eb3302d6103443fe1c14c29acc6c543c26f127f80da0291197162b017a76f4195e93a86ae8ee4f498026cd1efbc06c413eee7b3f4fae7a75a81636a469a5f44e4ef577707d1d3d8c525e57c32f603568a4504d9d70c24fcd21b9359da691585bed09a53071ec15ea1d3e2f2f385cf6bad24df0b9100f59c3418f34e98853968eaa474e1369297c63faafb57064e17cd93259225592217e41ca28a6b306e1b12e05911c03652375e2c490e3f7d3fa45b8ffbe5b5f01f41c36b4c61ce6024d340704b787450181a3f9eecd21bc13b189505f6b2210206631bb4d569c6aac9a7b481f2232a8104829e092963fe61060fdec384b9bfbbabe983634dfeaa59270636cd0c62d5f90ca67be6504706c039eaecd15942288525611d462e2ef7a0531f1b53ae8d28c5e72cb0e6aea17e644755dbd4d49a9598430432a1bea286eaf30c64ed278b01edc70f0389f8d553e777fb3d28bc08003aba58512f74c066fc3df454d6e3db93ffa3b68fb9cd4993cf2941a863b4d45409144c3a0eda5c773181e3a642bab855d87f4050313bb57de38a741261d36ba7ed7de75343ce5324f91bb33c070792acedf0daed4a53facbd1b9c44ef56aa6eb1573abf0580c1ea9e2fc0e99561022135d8b1d736ba5c4ba7b1e1e930bdfa91547bc71622b4bb2bc4686e34bbc3a03c7ccea6698c05cf9cc795349423ffd3d4eafdf5bcc7bb652b494e396580a7f89904946437776a371b812752a7f9e6b83ec1501a9d58b37464aa919dd030a2f7402f364bb581843d59dfeff86bcaa9fc5e8ca5f4070a17d3a05ea739dec4cee6604fe83423282a11baeb26f337ace41794307029494aa46e2ce961097b9992133f4c8b2946d3a79bb9e1c2d2dc0ba6ea88fc64cb743db885a5b7e689a6752d549299a38a128b9ca2ba827b6004847c34ad92f3070521cad7092a23891435c3baebbbce79978741e6d2d7126431510260236820254c930fc94c39677f847e9ba9729805f6d214d028a990b0fdb254ba9730cec78a06106dff774bdb33137eafa49183e50609b57db9fdb0c245f69b5315aebedfe367a261e19e3e45123d71dc87c5f6fd6586481b66dabce8c17a2dc5f8e5b5fb4b42721a7ac09c95cdbd384b8509a1c808fc23d2b168328247ac8f3904b9a125ffa838e924963a5dabc33beb2fc96df2221e8683f3328b849e06f8b037a30d24aaf7f92c80639fcf3e871e0c6a955b8791a781dede642e47a48efd87a288fcf6a92688a1c2f0234a32f7b284c6d588fb4ef07b50f5574b0a7b1efced4c3f19ff7462c22e69c7bc30528e4dff0b4d53b61333aa16ca4c17a4628e83bd5036108026586ca328b9ed4f91c28f4da0d5dea8e782b378fe33f6ce2c8d636579b7560eee4ea08c4c1333dfaae32becd53527c9712bc6ad3d34604c7dfbe4fe7131fa4d9d60c90777c16bb5acb544d75ff6abf4c9438234ffc6292b88231a08453743f06d236e86174dbc77c379a061eae507aa236c40a6d71c2a5e8e26110abdb1d9d2e14d32711b7cec50c9b7882a8035e231749794f234d89f70b730db7913a24015694ca423e19d0871a2a57b82514655e0fa0ceb12e9880f35d7d92a8109d33330cc4c1d20e7f07cf387343e07a18e284cdf2215a05e486da3617ffe49b5fd03bea9e3ac92ca58e3cf4013400b0b7cb31e2680a749b3ba78f36cf5127919473810f6432691a935c52c864b60ddbc76739e1be6eadce13ae7889ceef2b8f27b997e8768ebc4df4ed8712b740b1ede3603e9a2f0be1f98e9b79d3e603acc8ea942fbb79f77f83049ec5940a245ecc8a5aee63ca3fc1e6a80cd1da3d0cfb69736afb5b77887f2ca86393a69fb63ac43bc3b5b9564a42fa69699c5dd6db9a3f84b7f6876812d7d259527118490f9d4b9b1f5b18751c31d1eb499597c58dd937f015a25bccb7974bbf64e6c94d463ac7cc3b621a7294db2e61ed3601a540d4acf09425cf48cc1c71c87e8336bf463171606589f2ec8c0b1f83753dc81e43761f02492835c4897a98b3d08d311aa7c7fcb4f32b891b132a95355d9b0e5ced59e1bcf29b9abebff4466f2224e0e56e59b2c8e0f9d11887549b9c511620d058907da36927e7259c3308a97341a66da8512563c495ca40ddc244dcd79fbb3defce29619bbec5eba411b31a27f67d926b1955fe0eb8d6fb42aa0aec1a1a8394036282679540c86508c5ece3793e69440a4111e6ab233565395d09dd5d01490ca7d678c6ed71c8f4b1d7421f5b975afcba055a3bc0c14839565078b3561e78572e5561b05ffed14e1ff4e360da973eee83a786aff0594116dc119d0ecd81b3d258f05d7d33cb8fe3a8b624051816fbd98757615cca66ade2891d66858dc61df6351fc9899854d8ca007f0de8a0efe05938cbcdb5f949000c71f9b87e2729e05e82372ea8d17ca598671fd7f45b6f4b7738a02e538b35430147ac793e8444a90f4e2112c961ad799868434b786dfe2af547f2429624a45763bbd16a9d99402406bb31dd6f2dfec9cf1b51ffc4cbbd2192d63adac3c7f65ded0399b9deaf90025474bc0570f38c74a7469ba3bfd64cb29f776b8e3230b7abadb86a168a294ec11b7dca3a26d2574b93498396405cae2644cf3fda3344f7d5cff8280b4661e2062db7b8d5f89f55c85251d85b41bb0f71e3d72c7fd3d1f0b65af09a33daceb21718c90ba0c243962c2e52e9fe74d2cccad4e09456b553a0eed799c93b4fdb8922b38b3a5891fae54152a71c57045755e60d35f076e8f03d56060eda615d8b88daed5f615aa84ca2e2b5a25ca95070ef81ced096c66d9e1987584eafe48b4e3a9ecc96427a4f9fe2480598290682a5f345fcc073f3903aef011da38bc1b7b457d453dc34a4a5dc1443af3a5ec207f6fd2d56eccd4e92025287ea948938fc7e2e51cd2aad6425cdca1362e80a1ed2115bf51fd6ce6c641d0f335e6c3c7cf64a3d0aeec4795c6a77a01c4181d141c562bdeba695d016b1a1e5518c6cfaa2511b814473fac7c016fb3dbba0d3f7e59710f354869b13b33faefb9fde35beb7c43820a1f968d134fc87ce00e5be94bff53947e5a92ffd55a7bf8f8b249e49e058b6eecfcd7f0ed8bdb3fdd860bf14465d3e9620092df9f148ed212e644817b21091d159e61b0cede46ca9572853d6698b2514da7e0d49f1f97ddfbe75f740b9b130f948a61dc3d37e63c91b42fe3b3137f6e7b7b31569a6015f70de69b512b4f9820fa545a0e43c0f7f2619a783462dbfc327079c443ed7c9cbc74959d345092d6267bf9739c0e65b8a5568da101c01ba58be295dd75e7b04728b8e775717565b44291aefcd911b67382280b16345eb3f7bbb62d3ed5623e8d16d1d6a86dac12b5d272f27468ef371109b56895cb4cd5b1e51c657b0965c40b724d7492eb6bde3aa4b8ba4e984fcfed751d956325cfc4ed2a87c43f047a741a14b9653a5fe35497e0449387eac24b086ee77458c228a859af1203e5da9a520afb3b07487b83ac4a24433a555a6cf90290c09aa25ef8d0ee5576f02b69a9043442161eed1ac201ed47d8b7b8672a32937cf2d070acbe4be74e5ffec659f467db1d69bb91b574c40c6ead2e272653ecd3e7a68c45d81723ce740376c54d12746d21cf6d735db2b6a51504a1ead4a7d7791ee89fe816ce2596d11e7c4fbd78a6632c0807bad54cfaeda4cfd93ff51c9f61e9df089e2062ab6ae3289867f5afd0d4dcd423b237c3322586848dfd354f11f1d0748db73e832a0528571ad0bc5cbae7ba0c99d97b581b170fbad82cfe1cce7e3a48cda64bfe10cf1175172948c99e48b1b022d03713bd141fb02277895c5b670daca685befac89ea774202994e97ed513706f0099218f04c1bc11505483733f7e796784eb5224fdca9bf8320c8258dd525d146c4c7702f1cd70bc2dfb975a22ca4c4b3385749e486f4080cfed7f5965a6da5bb15ac05d36b5894ea8319043e354202d13c8d3fa712719f361390cb4bd803c4499f5ef4744b5782f03735e658d12dcbf58c5948fcb261e9810e3c64055f18a649f26d0b0ae0a8b49d334a597fecbe12d9daa96237a8fe25c8d0d7ff08aab471b05f328a89096409f607d865ba7d19395017b50a3fbcda4b71443478cd53b9bb2079595509b7472484298042f4400af5c0babee5a0712296d3e6bab25f77b6fefb2e1e4d2dd2de4dcf31c06aa7577bbcda4669f3d0ceca737d6877c6e5d14afd78b9cc634e739f99a79bed8173393a63e7aa3038384e9df2c6a80057e1948e569344a914a929971a154b62563b3703c53af6562c59d840dc81627251e9c081b9504d82b978331ade15a76bafd6b65387a6daa1bc9ff104c09f3e600f99d9dcb92b3cc341390c000356f5de13b41448c8bc2a247ef4373f014eb45359de786768af890a6d7007f549af2420b757ad0e0c6b91d03237366666ae08240a3a2ba0e4e2fa221ed4555326ee7ab5fd37c81d4e76e69e59388c2b972cbef2c4e54f0fc1ffcfea3cbd80b0a192ebd339ffe7f2082f6367826690220e449106be49d42d32f45db632d818eaeb05c523a28aff254578275fa51ca52073d3b926f8be828309c51e4d978cef1aa8431ac10f220eefd1528f208f3acbb7bf3db688875578aea877224ef0264378414a94f7eee77b6a3f5170e3e848bcd3a778cfbeb3d8ef48921207425d5e132770c0e7fd6b5c0fcfaad281efacc1d22e854d11c2029cccf88379c6f8a02490990a5277ead8f600d2a096a2a9ac210b3a08191dbe64a726b7de5183feafd66820b9d59d63295ac5437d5a424a11c7340165a97a1c68b5a22adacb42553c51c956b92f2b93a76d13e1a36d398659d931bdd37dfd4de691e52699e2da6cc8e4a8ead2e84f63ef994625361efba5e3bce9b65913f2f69c0e7454d2640119a86e9a0af8cfb2ce5657e123c768608425bb63c646a6297dea4d8af115f11aa9c9b94c21bb8bf1f1e0048793548df451d02fa363ab60458eece4acc86efac1ac0f266d619ad73f15c173997d6edc7b7c1a5523d7034ce419c1c8789f61e21af98fff5503d83b61e919854648cbd50d3d065e4721da9b14d2b38aeeff57663a4d8e70b2d14c49748e76631dbcede23746ca5e4ceed17ddb596da74317e6a7d5b45d8f95cbb1719307c589c2bdc41c084141a58fc8d27f109e32364a26bef90e65aba257ad421c258c7e3bf02eca42b9e80afccb3b63a6c072ca866594ced8efd984d98ee5e5fb3107b000b376d85d4c88d69f15808e382ccfcb3cb2863abf30f4ad718c8ebdfec0640b6d7e0a6ea14bbc3becd7aa60e695b191394d859969af5f8f0ff7fab029015ba7ebaf2bf190e3f632b72e9ed6148e901dae9fa8d8b69f79247ca460c7320eb89e786b139f17dc8665208108d16c54a9577c5862800f1d170c1452fbd14f650bcb1087965c3ad40db62892d0641d460693ee3ecaae09895b8acf2a876c1dfb9e954cd8625f637545cf188c8f99625224ee11e4b3339d01e36a100556fa41fec6643591b994fce7ae651d98dac7a37deda02b3f8b27222cf34b40139d8a9af17727d828e4b67f5c700a051230954b044592301cd87a713ff0ccd795a4e5073bc2b28c158763d226067fc96f0219b271259363aa041dcdc2e752f5a76e8ec047bdcd7c054529e9cae8e2259871cebac05ef144c6bebaee5ec22923a7e39eaa379c5b10abc152a47de857465e6703be53b930f765cdb15ee163854465173946cac7050f5015bc1a3a9e9313ef71740c43b68ab02240ecc069c1f485ef341d4e5d5aa378d838aeb20f1e5232c2ad6d5e8a13bb44fa72d66e5e3ee60bdb5879dba1a9ae8b5e070540a620d74b1150dd4caff69b84b5c8f0dcff0c05db23ce258b3f579cf09288b655b3ac74f0ca2dfa01393a5851e511d6e770e730c9cd22b91d0e142596d1d6ffa8b570eb1ba76602f708c0ae9c399e613bc04a0a06ae4bab67c6f3563693d83fc71dcf31c13606e1276201b52ec2394c9b13bfbea2c6867cd17ddeec5d7817c4bd2b00f502ecf8e2522aefce9a3cc416ad67bd4fe7671ded03e0fd7e420b683cb1e1def9253003f1f8a1e5a9b4d7f787a78a2db4f6d875acdcf3f98dcffdaa2d32f3ca9ec6a31d662d99d77df5399142aaad2782c6c2902b51d9d78f944f99f62d6ee10b48bb065525d063ca33bbc2f25ae46be7b793036fdf887a10b03f4eaf99d3b4ba33178df01dd599dc6a2e13e427310cc63de68627d452d982807b14a3ebe92906586d3fadcb7da1784559c3d219815bcda0b572dfa0ee6407def142e69c3861020de8addbbfb8a7543a823398ddb24fe6294ac75d31d4519d990a53f5de8559ad131206f355fa6316980ddcf1dd3a44b02bc250d648df317ebf7c4c57799049dfa07b5676999ccf451af12e375774c58d322989b849415d40a66b5820794b375440775480fe4d466fb7e5261edb40445ac211ac6cc5d7e2b1f70bd3b3c053d7eea49fb7ddb9ec639cdea14aadfea2f43de6901a0c68abe7b9b1f89f3eb27f35a9aa066a7a0c576f61fb20b48c295703a653fd8cfa95c056194627c346970a127774cb861fc25ce0636c8d959a140b8982a774719ca9b75be7d20a4e673df24fd1a6cf2a24ec99fe6e76e722febb60c73ca4e9af2e78650fdc3709143d467d8e5869da2b6a5123afb0d0adb865ce8ca58d74dcba4551686f411b439e501173d3b956be3efb31f969c61cc1e84c4eab47e97981f30c582272cc9256ac6fbb118c03cdad90380f5b14c2eae3c7cbaec30e5f5aadc950b1e135822cd2fb2d104479a43e2bf3f8ed4b3ddc16e8fc9912a72bec0993dac2939a1e1edeb5642f59f7f79b32b9e9b6eec392097f439b4b205532b813468c72c4110148a8d7198f14c085a4d499c5b60e8c05e89f01081ce4fbc15a1fc3905d61d7a035ed7098517315edc61d70d5063ad27f95037274ca28456c3aaf34272a5bcbd7dbc0e34179e81c2841c8328101d74b44019d5de21ee351e26cf5551276d53823600ecab1944c14d535b6ad985bed4842d9d186797257eb3cbd4efca3b5dee46e8b7acd8d73f03bb8484d4e7689cd2467df6bb2271e3e5d87f59369ab4742ca9f23685c616f58fa584c78fa488f6b4b5f5c216f976947b46ccde8f85ba5870cdaf313570e1ef85394c1f1542c89bcd8b4984eeec52d733ba0fac854563aa98b32666e6945a335f67a818d2bd42d7a66df51c3ede2201f6206f92d9b9a2521cef87f20d6da07807721b54ad731eff079ed4bc68921221e2e2d829c6d4aa188d5023a0a8f749163825ee10c08902e2b140aa7962acc6897b354652ad62c3ca6716e994e7351731d563ba7732b00f203523808b96168989a256a46a19a05d71be753b6f211660f0307d54ed07eb90b5ad3017bc493691ef8ccfbe5f8c820b86ae68ebc1e9d0ca870a0e3c711e84d0946046b7f638c6a5cf0e6779e77bc97750446b20f5c21c34a67aca395b509dc3dd82c2e96e9eea0f97a7237f0df2f9109ad80202ae2a38bdb6070c72b86188ba6cf27bca7b9a0ce1d8b22a52c4d789bb7db0c2b17ef2c9e20f98d016eccd4654a4b69848eb6c0ba4dfa620159dfb54d4e064204aea8432b9ea0ccbe2a315cfa071ed92bd1c4c1bed9deb14a7efdbcfd1a1116ba12a0e963a6be0d7e11a5601eea1c27ad6e6c19f75556e3f6788a0da2f6ea16b3fa92f9fd6b3c771ce066f88528e39abfd0daa32ce7e9b2ab57deded4fa8e53ff2386a45e915f0c27a1fe199dbee7c68e2363e576ad2899533a5939b9a811ebb4c505bf772785b60ececd59331f0b2b6188e50ee61965c6277cf2accd60520f8f452cb16893e55262887a1ae75d48b34d8d6eff703cac8a64e14806dff1812725af953b84c0857d2db16aee9e13419a43f48556433f745d1afc020f9e12e693018d53334fa57cb32e0656ef97a87f8e1f28cbe96fbcd97c9c7a437812946212f6ce49e801058541de37c837055d4a7bc2fa821b34f86e592f70a7a3a962c6546145ec0a4c8b8ea08d540e8cfdacfd83b4a422fe5a99c227f58216657b1d5f1d42b8482d84ce1b8dda6fb0423bc5aac91bc398a62149cb69a8da92fd632224ab4185cdea07735950da12ea36f70ef7ec19d3905a3188c3f0e33c5795d60bad7c1e396b631f0e918b6a6596edfa99bda468b320b9769fabc55d84c143f31ebe361f636258a610ab2fdd9bf214ba3a9957ff2ed9f7888052ecba65a74f53756adbfda965d1e7b7d9a2c906c2d5c6d68a606e7290b509d0976bc09ff66bb48775eced9bf3d8aa9e623e6d184c6bdc07fe93f1b2c95812b87380f969ce62068b7fa7aafaf971baa4bfb3b23964400768f59af359777f2ae86e66a85996185986f03e98c1d735ce3c7873832504e2d10676d8f7b9076703899793e70acb5143f3008a3a818011155d183380b13b805bdd57d148f3e6375b98a2a5a8caa86acd3ea807db9806598c866d82808b5c861f866cec3faa66ae3e1771cb6d6c8cf4a05f53d6e40c4e64b92dc56315609f7741e4e759686ead4d1885cf1a140f3f192c935645d54c8cdb15f0787f8673febb386159fd09baaf477db93646f3271fd9c93f32796814b3e9fc838ffd92591010deffe16ff57cf4fd1b664b0586b4f294ba914daa8012031e42062ebe15b8f0efd59c6b53eb309bfe95ce3dd22130232ba920a72eaa26438f0e524e28606ae6c2137ecc0e6d7343a7208a3e87de1c0c88430e09233758750f8b79a8d669115dccb2a24890ec3e028bc5b8cd39842fb8da1869f2804d74745bc58ab96b6f6e781ced70983f28b107951483d974a393e1bee30ac85b70cb34a89fa29309215f7613c6bd8e2ce14812441beb28bd27ecdf10c88b2cd5073399e32b032253bc58f2db87b6515c4fe65203b21f6124f9aaa56d93010e7a8b29fd536c850aef2e58f968e521f745ec510369c3dac3c823e80e61c12961fb2a4ea6e8d92e25f28c52d0b3ed805032f6964c0c38dd844b2658fb26e48b891e0fb084de57c4b252ff56ce903df63bb328077b3a73e9888ca572d4b92a49b761ccf82df60f6c2b97ef7e5421a97c4188563ba4eb842bf41c954e62cca256c15d37012c2285d88ecfdccc80ce1c2915b9c5d52b25fa51b0f36941fb5005f55a8f692d1e6495cd0830dcd17249b02c61ea328f8c667e9b054388a7162749cfd7b8124e448feac3c55251ceb7c7c45244165595f7fda5dc63eb384cfc27c6eee41676279ae0d8e52ef3ca5485d450c25d5d6932ae9c910830b2c6e3193ad19971b16dd4fb2b1354619d72d424880767ade990eb64c3722435302f4d3558132b9fc7b33aef9fdba68dba3783a28299c9eef5e110acb0c0163e4492330de43b8abd387ac41babae47851d985597adbaf7a20229e30b8ac4f0b097411b3b68c24509411d85120522a83294828306ba8ad42f6cf3dcb73f36a56fa52e47f32145fba9858e4f452e8e86ade4c5ab1343b45271adb7ae367ce0950842587aa528f87adf5e1da13740dd6fa11406df735a7ad0a5be4804fdf89ac95b619fd5f361810ee1c06d0baf48bd406313bb8b93294011256f9507bf5dfe9f679ec3421413ee44188224d03fa78ac90fcdbd9fde9589f2b0d8e0efc601c1b59a755c29d7a6411b80f84acb2001ffa0200a8f7283fc8d6713ea09409eeb2f3eef56f65e030e84450c076fb9afc21d4496cf97bc3bbd3bd1c43c7a8d9ad32121af4766be1e862afa1ce6a1804545ce0d98d48325cab9983742f176113ff364ce42a94a8efce10a31d79bc64520278f77a73377c894b4b0689f381f3dac6c4151e6e026ce2248a1da98f16a126f5023f847977e5aff58bcf7f9f2a31eed38370803746c75f5d7dc541a699897774f77e4011d1d8428eeb69fc73a55e822ae517507058de053efa079a58db294fcf80273115ceeb543f4410e8a48834e076e02f96b7c9efd1f0f9b12f1c48e49f877c6c8fbbfda3b193724bcfbf188f62fea87221b67b49e32ca2aa01308a67d0c6be46b189baf24896c270ada581935f36b688fa3947c02b91292887b50e57adddedd380ffa3b829e1e9373e2b8556bd18c2764978e76a1bd4062048ebe44395d9ad49427025adf262665befc5b697440ac4636065ee60247394cbc04b37f99bc3502522ee3cf61f25f42723da64411e84b4f32049e5938a34df194f5c9435585ab049e1e2273e6870769d4e9ef7938ad72c6e9418f1d8801d9e78a979c5351971730222044e4a7537a864a02ffdec5869cbd9b183292d89a21228f33f75c3b37cb85f4f9ec284f6a1421bf74d374783bff4f0becca4a31b168934fb04409682dba788601946c3c7d8514d67e2494c4e30e3fd8be6f6d745c5378e74585f2b35f30f9e846829cb0ef1a77745d5ec0ce9757cbbc9b34026baf78f1c246d9e9fc138613d8bb1eb5891dd7732937cdfcefbd163d659b87025d717fe18c9397d70747be6ef56077d72a26198fcf0da9f2eefa82dc766649994845facfd2787e6e20fa7c8b6cfb0fea9ca90153cc81f4ea7554d8e10e64ffb0487ea8f6b713f38828613751e9c5a2b8597fc66d7cca85edc8aba74649615ac2ab7a4d9c9558b243f0100c7744e6cbbf5fd681ca1a879cd67d135a850635f61331309dc1d07374558ba200fdafd9a6b9774eb6c3947d527286f9601a7a58da337f301f6c58f8e1eb4c2780b4dcbbc327a78ebecef1b6a5305ac0644d731212e0b1ed177e4d224f982a95511ffe9357d1b4b13c0125780132726c66d1fdf6dacb636e32fd1a6f5ae9275f5606eee8c586a543c364b8ff3b076c1b62c9a152bde5ba6a49a0cfbee72c65d66f4896213aef670e70d4ebd46b76afcdb1d4fb3680927a8b0ffd4088701af53c4b9687e7672b83b693c164497c4cedc038a588a56bf0f880cfa0158c5e68076a4076ad5964a50d60875885702c977aa04d4857382706d6303dccfc227c29534fcba3ddda64570e676d2331745b45c6fa1659aec12bd21a40bb21bc2b7166243785398f44fcf80e7b6d9537536b11036c17434a81bf63ee1d6062b660b9ec8a1b31c1dd641ee934425c6ee79cd687d93cb45ca090d740b439f7e1735288f8d47aa6249bdd83f9e73faefb762cc47216ddabdc907b51cd0e1799c9d09d0fa7fd32516aa7f8a6b17e0cacaab4a533eb001fe3e3f682ca3904051861dd13f2a9d5c2daf8b3e78f387dc5a7889eefcbdad0d087349fe05963387aa59c3478270b8e8e2d67065072bc79680ebf871952adb5e4f1b4f0debd3f67ec50026861123144559b314d00da6073e8b5903f426e3fa6938954ab80f2de525b2257743ef2a35b8acc80bb70274fc85bf9dcdb98389cf05104cd04fa4376da3b255f700fe100485a7fa90abe58bf2999fe7118909c585526801a40967d4cd76f29fa9568a65b558a146b59a262442830e941e75da6d96e9ff88c100eb12fbbb6973d033e321b0874a451364e9661ea9b122a16a11d152ea1f3eef6efb28fe1f2dacbbcc1d3896b8454042fe301b98af4012c3579f86790cd2368e1a0baecf89b40b85a5b21d567815a72b41ae0df1d5ad2cc24146f6b87e0f744d80870bc7ad8530beebd994c315e06137a2a4fe389f38a9575d17219dcd9ce43fc12d494be4c2d9077bb21efc795e39040721e89e823c9e5b3e7d7251847115d78ab5ef85b610d886972eef98d63f5f6eeec40079439ecd10008389b02728dfe3578e6e8e8e14b36c63ed5a63b87b335faba1450ed1e4833ba7c94f606fbef7580facbde6d4c261ec5dcfc70ff9ece2842396bc6621d1a928e340d13a1837607dcf38dc042fdc0ca55581b6f8b235b9dbce05a57496646b8aba9ea2bd5c64f99e980452802e9697e3bdf2d329bba0e4ee3bcd3715dba1253b5990366596d6e9884adb7e15eccce8467e8c5fc2c0e23ff220876cd0d7119307eca61779af31b0804dad087650b79a2440e176f85269b2a9f34139b18666b23d509e345363674cd8ad1108354c7fed8d071d673770cd285ac1564e1216cbe6181e0fff147673434a979f6024f46192bced24cd508a4ed6ba88ca3baef28177d550462718ef7b2e721512c915620f25c4b7a843dabb6eb6ad84cb6f8857afa7ea01d17905ac35c7cde11ad507df938f5ea1af8bccbae531a0bed1cb3bf4941d462912053526558d287abd47d3c2f7e4a32b48c830f201a43a725449115ff29bb3a42edca8480eb16de66abbf3e148e8aa27fe1f1935198b0327408dfb5e229bdfe9294b166ca48fa187fa95f088316d732791e6954dcba3c1d6c2f153df8d945e2c0fa8b31df1129170461f0e111d9ac42836f4fea65afe12a4e520f1ad47eab9bd13d6daa94733d81bb75041d93f298a3950f1742d91ec1e421f0d317ae3478951758a048a3203ea0ad21a25b34319c0eacc7bbbbc7e5311c674e3eadecb8629feb6b7f52788dc8bb45a3eee164d174d7b7ae6593355de8f844aa58c53313e4fa836b14ff5b1e59681b53e0bbb962758c39c04c91d47b292bf3ae94ec86494d5c529be52e88f106f40da028f28f6868cd54b5aeb3d958e1cbc639c9b017e9e3eb740d8ed02eb15175695547f4e3454d845b530c2551212055d98fc17454f8653f20a4b151711cefac30484a3cea585d72dcd26609dea1ff2d9906cc4ec9f58320f391e4b3a67793eecb8fb2b13b287ec94a7f0eba3ba68da8a719c4dc786445ab09429e4f9b327d87a2bae4d18b4d0061ee87cd7056ce5f4ddcaf90c4f4c0effc721c58801c3cb182dcb5e193a711b7cc97826e8827fdb49f3c97a01ecc0f65728b500f57601680b75187297b406b425a2bdb489f072006b1a3fbe14b864381a532f663a898922f7f4ed766b55bca53c99e3c4a1730496fd2482299170dab7b013ef328d30a8fc90083cdf8a5572aab937776e92cd7d86b1c443984fd80a7746a520f955bea6b0783c8a6e80ef0038b0cc50086da3d075042295d04da347c180f3f301ed1a9a93c6b6c30bcbd29dc4e52c383a63a43b0419e842e140eff356f9a14c1ff35b0eb5ad011b75531eec563232d87677f4c78e8246825ec3390e64b8a2d0cf89c6131aeabfd38d04d8805d68c3fe708aea98e61b2714e4967d4a6d7fb21e442bbf1b93601f9deae1638ad45b5f7a8b653fd83f2719ac48fe37ab48da3abe6e703bf53db8bbb77db2bbab903968d0ea45d4bff2e04c35059c59fdf76f5dbce7417247db2528f7b13fdb10c19fb7021e385d12592e2fc8b359255ca812bf2f275fe9a071ddc2963c51262e77059c1e522b9dbb343cb17225e0aebe0ee86a459abd4360b6a562c03bb72ade2deac2fb4199e9579e270325e7a2cc2bddd9d27fe3bc09a20c5dbcf3c0d9185cb3dd449600da7218a3e4b0ad8e325113df2dd5cde3ed005895b2c367a765ab30bda3865af3878426827449bb5d625e7bb565fef41a6e1cf44cf8cd27395f40dedae31af7864eea2bce291428305d43356bbc956e3cf5f13e5997ae8185898c0f4b08c6aa5c51bec62c997b783a49a910cededa1dcd1dcd9538171fe9f99f98334f46699e12dc0fbd5aea33a10f373b9c9bbfa323e7e0cb8e413b4be8e5aa2662566a4b248a27b0c4028d412612958dec62af6f0d7a5059d2ff617940387f01191d0648b7333f426f1a1b725049efba57a6bca26687ab2c39bd4306a9100fbebd8bdda33b7ac8d186bcec3a8c66eba12a30602e8ffe0a8540f9baf0ce0aa748e146a92370c3f24bb495337dde7a40f08de47ab103672aab1069272e24e0b4593607eed5db01d1208108ead8a2bf07a9387cd0cd696150c21ccd5801c4bf53a0b680cdc90bd12f06fbc898f3a6ba0c277e50bf2d6a28a347b1bd218e9a49e8dacf38a96e1eaa03dea8d520a72b181457df018687097d19270bf38ebb44f1a6a224cac7373765e71d1fbf1b749d9d2ff32dedefa52f59711d809ed05461bed12b4f40d1e830be73aba7ec6a6e77f9520d6f1ffed687ca2839346602d0cdf7e3a9b50f148982a0319eaf484c3d23e45fbd9aee2e484ccd3f4aee8877e77736421674ff38051d5053b026541827641434c171689131e6b1f37c8be5efae105c785d8d3ff66e1396920028a7a8c2f53d1e30928b7f9ae707563896d92bdf754615cdaa1902e2c33cb40cc1bf2d06650e670f087fd34259727004dde45e4ca34247f58fe7ec150f8c76c8116979d475da7babea058eaa3bcc0e82d3988baa4866a60ff0ca3eb66b7cac6de1a63c79a62d6d1bca097b7f707ebc72166911631872da8e185f6ea78a19220317a5303a91676c68c394b0d41c83e4adab57849bea7dbfdbe036071faffd9a7637b709b8b728e8cda949f7bd930ea2941693032039d5ee7eeb132209ab4174d3547e745e8b81cfdb8aa4ff4570359f9636c14ca1e042853a80d6a964ca3a222aa061c5701f1cec28170a188260fb9898e27a3440f3c4096cf09edfd8609170233306ef4fbb98e49ca734079b6ce51dc5ea39dca6f9237b24af2cd4a0731c2ccfa9b20f642493ff189d7fbc1008beba2e6fe8800840293dbb235118aa2faf45143f47a1acf6e69ab660dfe52ac6f0afc84b6a203d86f86aff3c512922ff32b3fd535e52072517e110897197e45117e2da1d97472f9cb6a3c4769adbb5ce709b4d0e04058d7e820041fa390cc4dd59469861105aa58e294d6e013bef5d032651ab0c160f0cc9a47df9732d8d1d64445861d9f49ea18db0daf6140f5e02631cd1da8f26e31536db8f24f9ce37118f55af1779d26ba4f4a94213b66ac131da695b079d1ae3f2b93486885a8ae93677ebd6724aba90fdbb624d07b6b0d4b542516c3e42ffb34d2e28f45a4ba0a18622c8d6e72a93f422db9313f5d909209e961d20368fb2af164b1380edc6e8a9030316fe2de6e9eb4b9bec52fca82b6840748bb5e78eadfe2d9a4c4a2888b5a5ad5bf20f8751ad9636dc6dc7fc6ab01896ff3a857475d72b113a4501eed9a71d8f4e702e759150f48e3050b5782986b444c4612ee8f69770d65e4b2539013e43aa53a6b0e83c6d05d9de8b9049936f8cb2f8e6361e064018f4ce610a1d508f314773bd0659259bb86fc00545097ba7f88e2277dfb5e3d4b9cfdb2858ab11a6bc8a3ded57067dcc0106f10466c6ecca984967cfb8ea41b23904735884b17d1a45c57185ea9452b65270e9e098f541247a0d461cbd36f262ca650c8bb52e6162cafce7594152790e4afd946bf7f24c6c37433476d8fd8e09eb383c2cbad27647a60e128b41c64fad8641e9301dcd356438d2bda7fccba1801aefb5a8f4280f969ae1d9549a94a93f3a0f63a97d5040f3fe7aeecc1cc94a0009c4e4dec087ac318fb68e5e8c812e1c5da19af01f8397e6537219c22b3b41768e10815dd1a8c313c5a5485477c7a19353eacad94008121c9d249d4d1b3ea6a291152b36ccc8bf5e8639bbd211e70f0b50bde8178e714d87ece2f5a42a0efcfac793c88d9f7c6d0a0b4180f89a863364aa14f051be5aca4d35b76b395d9d0a7d04b8b634596d9ad0bcdf5584e2e96e7a368eaac16a15e7173f27c3d28e43dcfd05788083d24a7b1194fceb471ccf5879e016de3691d3990e4c5d06501d2699d57505cf731f313f22de89eb53948e104fb65f29640696d7349ed27e0486aa1bcc0384604249c0b780e9f0c19736d9cf744906c519a1a8361aec02287e3c2c720c3f3eb8787e56c2e71ee9f26b0ebe6d9e61034ccf392b60f1b5491f2e4efeb48eb94bfd971744e1100e0b5b28ab1d56125c8225c71d624cca22e640e42599b5df1a234dd08512ddf4f8a8ea90c17e094acb9c21815d607c6afd0d21cc6f182ec1e07b4e83761897d4d9094a4dc55c0af1844bda3c895863254f5aceb43616a190f15c3592bc680c291d69f30f74249566cf866144a6a8406eb1a81b113cff1d45da022ce533217d8a309a17a3f010de99389ef2b83cd7c9d7c614e58b037a3cdc42f03bb6a33808cb72ca9c49bf40d8444439279679d4650cfe7f95ccacf352fcf405ce3b04a1b5443e82beabea1339b19782c4c16a4b6c84bf4e0572d6fd0b163ad4a74f25c90ff456fb405100fd0dea6c13b65a8f26e665f1a8d157c490fd58ca3a62e1cd72474d5fa4bc51c5e3a0b0870ce3139acd82b8ba961437bbb9d46c1f15f725eb33ebf8be77e1e242800d1b3a995f9f9c5e6ce451f2bc8cf273ce68258de62f741831571acc3f43f9611e28f7497caec08b25510d2d214a60b1800b1911863a6eead70b659e575c4b902a28f5cb2a2c3b8a2067468707f2052063679a2129d634d7849d39f5550f785b8b071d26c1f942fe629727801f0c0892b062d8995203c34a331d2b03adc38aca0b071f0ac94f017cd31cae753fa11c03536de8e2260680e791c03931927836d6aa567d0a182c2a7eee9ee211553df917ee77b266d696b9b269b2a1d1000cd03df21acd10a724cfbdbc34e73bb3a9fe567b2115d9cd6c6c62da587afddfae32bf2da819e52e5671ba2a9f0810b484c63ed96367d5dce84d8fc3c5a126ecb3df23b6c0eb685996aa7bc551b5f2257fb9a17563722fc59a22e2d38307ae6f4cd9bd4890655bce42b441ba4ba449122fc94b989071382eea897c0cde89395858ccdc860418b0c0e3cb5322538441daf064287cd1f2d9b08d2d10409b194e65ef2178e21da761c54084bff0ac2238109388943c47f3b84063a2f1b43940deeffa482334079b0539529b46f9931ef4eea4323dd4cabcf9e1246e49153bcfccfe953fb47f8ccebb06be7b0730fc8b77ece5f85bb1ac6db386e360189939b8a8087a3bf0a088797f25525efa021af8d64c51e7c575e0f57ba93bf44d9ba56bd7f43875b62d666cf5acf162aadde8d80fa04ce731f488ec31c2a7e62b1f4e58427cfc437872bf5d8f7f67b0144f491b8d40106c469df8bf51a2670d3fd04ae70c2a788ee35d1d888a488acf1789e3dbe5b692ea60fe392049eeebe48178f549273e86c2d2a814140af56c2acdbb4700634b85dfa664abb20885dfd60693f2f1f5b6748e4127e07c7c4f0071fc8ec114b10ecb072d07a4b3db44c9bdb1becdfa3c3170f5b20fc851966d5ea7ad17093a7e6e5efe7e884bdd1fd6bd64741276168bd2e754fcbb4fce200a22287b170ee533a64cc75a07dede50121dc386db49e4d0b7069384a007b8f59f63acca10e65c846b14f179ee268371581bb7cf0f72df8799fa8c0b116e843101373ce580cb5ca07d156eb14bd67353fc1f5103343e0b0ff8127d10593c4b530c3aaec21bbac1b5e76d0097166bd976d897ceccdbf4c98adcc1efc3fc92cb14b5b77a481fbf90484bd7d8db6d2c7fc51d5ceb8c8e694960013bfffec9db8d925780072c3cb98d7552e5ba94b80ae4cda1a59a9903922a2fd3551bc799e827211c78023813289bfd4d26a73c25d96f00db85deabb0ec2d43994bc66308b3ce291dd0ae026e60208cd9fdba67f3aabe61d2add044ff64fb92ddda67b43d61877a84a7b148ed3ba7581045b7ba61a0fbae6fd0d1c7ec951b16e08d623893c9c8930d65a4bea8cb69fd23f29a92692d26f55e566fc35b0d080f342bd4e839a9ad360d058cecdcd9f8edf83a5d12fa0e3ecaf80f4961e5177644f372fbbe2a6f75d7369db00da5fa4cf93f893dd3a1f4a6355cb04125ce59d764f2dba3bd2463bb21edcfcc3e805070889e98977f92cd857f37a0afc6b532ce3936bd0bb747b3f9bd24d714d9660883ea65d14c3fa8b983e9dad5492f916004d9f6d0d20e39ab3566e0f535166803a6701ebdf57ca011d4042dda21b8300be014bbe60059f009648a7f9ab6a29ce0bf8eb2bc2c5286b32d0cc83024c31a065f327ab5077630bba3f4e276891290d1bb370cda7fc80f4285de861d1bc24d2cb184b72df9660e72806f34e24eefcddc5ce06915633953adf181f6ffa0aa96e346972a229a5dbd83ef10e81c230a39147a5b296debceb3d5a83c3b408c413e147b86ef6cdcc3fe3fc334eed58921fe88e091b37110fdcf4d182460195ee77bc3098e89b127034c01ea1853e9d2f68d51bcff77d92c9f6c52b59ef0775f67ff64c707857ef685b2184d44137ae71a3f4f789cd64248d58733346ee5aea99b94e0bd37ad176d19483b81b2976d01fc1403717a3f113b29e8005425c14d02f817aee65f0fa3485022e8e196a165350e2aaaf093581a7747627e1e730e0f6a976566f0ce1a857943563f019a00b15c84b8bedce5b3ae6dbe0a5943c2a65ee56b79d023dc1b868e325b8ebb8f8640deea93ed27b8e1fadf6b230435641acd73555c8431eaf34c0d9a5bc74044d7f9a0bfb63f45f606b4c387224e10d7c1bdef20db69b8c0297012170f1b9fa783696d07c265871bbaa4a2dceaf016dea71002e87df7072395283ef511d7f7850d750be1f6105a8908f0141ec2c9c824c719f70a170b076e21984f2f071a5cf7665a6178c20e83589c3c312b9e1217473dbef52132472e227f0a0b9ba58fdd50264cb3383fb8acd61a45821d7e25eb922ad2ca464232da880a7e81ff1bad29be711c0704dd74010c2f72833042b1bdc3fc3f9f4a4f00a92577730c7e1f206964b0574aa598bef85f9a6d1bef99d903780ef242b230d4c55b2c9a506e3b6406a2e340e1f6a7c6af3194e04c5c619e647fad416628a386c60c5631ddeb4749af016a45c360d20ad70f4a896c12ef7e8e75e658fab6e9110368b2fe6c72f9aff99274fd4d65d8f834b87eb8f8dc354e1533996602ff65f7629164831010c4f2800cf866668396e5cd402980001b096611c1a832ecda690b2349556acaf376daae77b547f8e502a312b7c14caa726883adbb7c99bb9bea351b6c96893401fcac68fc8ad40af25e2f92414fe44e4683dd52617376bc835af86d32acfe672c2e203b7c3ebb05f42dba70bf27f23a63005f38d6744425dcbc9a751926fc1687c8238a621a117391ecd5a129b7abb5dcee5c8e537e77f3c7bdac626a8aa55eb175f1513d586833105db11d51997d283d65d0d8b46d952b95261c6b80dc791948e6083f14acf4308168baca40f470be9e0dca5ce57326733012ef32308b5f63447ebd37f8bf0884cafbcf20ed71a98e669a9e6bde2a99a4eedcdc32aa97ab0e271f94ca6965ee401db6b7657d8fd58fe73a8a4cd01054d15c19ce5b922fb9c2c50633de858848204431e2475350e9485f2f987cda73386cfd57d70028f3c8758bf93eb3394bda255960842eb3f6c370a4c40c30fd68b785a406bac6dac6566ba85b6987c0cf4d1ec3073202706707080a66004dbdb84e5d27ec7a194073138e98116ff1cf8d49d2b1ec80186f4bf54b810b9b9ff4730b2f7021df695c9996b0c2b1e09d185d80e6a4ff6361f70e204e0458d4cf7bde1164d2ad873583ff8d63fa53ad4e7a4ffbfd95d72c42515beb72ab7ac6561f2c3e17d02e93bd4038fd83239978d16d35ac4f08e530d6aacbeb04e39419b2b9e4200cd884ea1488c7e0cd809a689c2633672b521d01e4487b43f92c3c3051ae581e8fb618de4a29b93784afe3d0bc95d93659139abf2f8fce7aa075550874bb750f83db5cb586a37d3882b18e44137a3c411794501df861b1ad26819c861a6f8b95cdcecd2bce1efcb26b29e45261e5e8b0ac44c909334f3c681aaad9a4f66e9faa34308d63f73292b184b5087a4412a2b4d504e707467d9599e73098b2bd751d77fc145ebab272d416a9a5a4aebc7bd59faadd90cbd17ce02d6e2f6a6f734bbb7e62954f1b3ba851cb96d05ac5ca2a65a33abad941176e390b3a2639ed6bc5a454da34337cb58b7a9f96e6f54e5488650fe0b35fc1b16fd2c9b11d7cbafe9d9c42a596b614a060a1c1f152d9fd81cf1978a31a8dc2d071cc64585d7e60eadf9be37ef429169371312bd0f50926f5238d58dccd5b0c05ba5f24bb1cb831b3beed8077aa2fd186ecd46c66eb805e95e5b9ab75f1cc5a4847df0d924eaf93453a24b8615559ec0a2849c56770bf578f26d11cd25a035021339951313db75b8fe328451fccbb4ddb0cdd8e8716e578721ea72434aa4e92867bfd18db90f99f630a804788bb30817779a9e18f1fa0bcf2d5818c7dcc2b052d9ff43076fdab88aae9e55b0a34fe7f96002651a5acf813f815e4304828d3d7a4737b415cfc581ba9419c8c80e2079d19e59781291a2cbae4057d4507844d8515ee1db181f063ec09e980447565a9c4a333be5e604fbd158960551721be708aa4e84dae9139e1c040023f0991dc5ab6878de55154155614d308494e41adfa702e383113bfb038dc7b2c5a5d52c00cd3c90e73cafddd8191c4d5a99b535c428ac096b309b34e7c826a9c253275753daacb4ec2db52610061faa9232882997c72eb3457839afaffc2c56a9f93c88e46ca6a5116c71931e0c4ca3309dfb041a6c7214fb4df970ebda69c5fc6232e023fdc5a0eaf152020bfe9ab5d5e42c733f0f9b06685ae47a57f19b1377410f3a1bf7f86456b860df2cb6171fac166bbb9982f34b6fbcf284d1205bfe1cf573e6e7a46e6ad96caada1307da53ae428b8ed63b56eb2fb732195e911970cdeb2e6e8b88285a2c4af240bd41799104e1a3381a2ca1def395e63a96a4ec70fbd2cb8bc4d43b6e19230fe5d36ffe873f7a58e1601b6dc6c8abdc87616fcffe27aabfa9d99abe5d39b0898b70058e2692150e60f117b318e9c89a575197eb4f3b7a19a6be49a6831d119c43b359330c9d157aafdd14e55f35f7b137eea036b2f5bc08daf3b14d63a42bec59ee056daacdc956687de870ec33bebec66605cc8fa298c3bd8cf1148a37b623f06661e165a43cc03730d52675094677a9965e5f2f721fe1d6b53fea12a0deb1a76c62e7d7ea408f50b2b00d735aa07eb69dd9f7067b09932a581c5f3e34d5d1f30801961f6a39c784c2747e7ac3ea13ef0783989f763ba8a5ef0961c361c187512e7a649706425b6a7251df878f53b956ddb00dc1d4febd96b8abcb260e8e77525c93c91dfe256dbd93b340a12c586e357c08d0cbbc96f392725b39c045af7837360780cabf34c3994565dfa8e7a4496f897dc54692a2a9fb3e027f17fda23df3c3fda3622ead060c4c4e35104e52537e676585d9beddd32cbee4c010978d07ac5672e103270c2c6f01b122d3317bb293ae4ed88b9db7e859fd98ab67f94dec8ac7bc2a3db6db280b2f2721257ab8dedfb7b1b20343e2fb9cc6b5c7a3f1f139e9cbe4cd5260a53d8e3dda1a9ccc19b2f2e9fb3655370924f7519e6be5f7196f324b67fe3feced6be04ba51ba45bc2c891701703ae96294190eda22cecab7cd5cc578cf7dca177907fa0b9ee74cb355e826f7864623b4388c6dfe0870f1c0f561a7045d7d2e71e444a069400cab5c6e58a822ea0a239169e6d8984fe4912b0985ab9606848adbbc8bf82533dfea50c3d8666788d518c5b4da553cf2056bc8c095ddf825f13dd40e004ff7fcf38baa2dc2684d0974701d4606545e1252a86906135ca8476655d51bc3c879652c3bdf66d3297d10e9b45a3d8447b6dd1418165765e7411c7dd33ae608938ae23bd0ce1f0a3faba79a73a15705e63aa4ce9be3ae93c54d99191124d69d7ae9644068d83a5b088b3c6ae80fd63066809a14b00cdc5381a9cbc10acf66c331c13214bdea0f9665b10deb66cbdaff0e9ffd39a52a31f978a1b2270fc0c9917b86a754d0bc705863038ce1f191101637a4e9464774c64311b2182fd53a03e4cb857bb8741fb5128575efa044efbdf6464953cc37303fae28f5925e51da4355337cfed075fe34364651d2782d35f3f553b8931c9f040e60e758aa431b9a0f6e03bcb14e2ce019cd0fb174d7c81d978915e2b80b22452ffb372aa75e3f6b399dccedd1250e3896f98ce707e3dd5afeaf50301ba22985379e6a04a232351ecef8a04be7705c2138d9397fc8ab1604b33c171b46d792e3ec49af3607428800be485439030faf1cd5560484e5a6219b1f85dee6aab3543b26911a78446ec15da86f845608f75ef1f41212a087904b6f3f55e35ba4611b55aa4a7c23f215325cb3b160f5af8f0ff2822ac58c25cc984d763aef9a24db492c8552f1d1fd01dcb32abff6c443ceb75f74ce2fb4a8a4c68339f23012a677f4b85f0115020a666888bbda13361caa7ecefe320386eafa58952a333a6c45b10d828b2d45f1f72f3f1dd7ac32a811f05fad13d7dd7d19dcc2d0fb322f9a19de94f8e035abe4d85e165d873e219861a5fbf0b6da42babdd0ac946ce59fb3a749216b351534ffb04d3c40c5a952fe8c861a852af691f5fe3fe73037dc9c22984532420c40f1fe93ef76cbef1ff67a057a67dff0f26c6597e8acbbb611c3dee9ad017883922cf0c65a0480b0f8959b4d4ade07a940184a873b7ddee5f5aa79258b7e43236dd6588b9a788519e741ef31b33070bc699efb61527adaa239271ad2c7569288d24e9cc04545db690c278a0e0426e0c375769853f726d1fad5d9ab7dd8406467e85e41881482174511c5ca30b397b0529d872d5b2c6bd35bc59986ea18b83043e4b9ae20ac4587b3d85f7b957b0d0fa33ded8c517b44894b3d05add655f0eec726eee7055ab8975bdab65136add07cd3851dc232d13837961ea247ae079675708fa40ad161810bc730192d1d2df177e31a25cdb59118a2a257fd48f91fab2807bb234baea6b0989446e539a9f56bdc1f19bc2213a1bec664e18b35d66bb89aa1d64c5b7dccbb73f655a346148c21f2bb925a9ed67363baa0e32a1518677b659e0f1182ac353025071f53655120aacad45d9098e9da482dba10da62250aea7149b0c949521ea4f2caba8f84b917cac652a1a0f6c53bc2f86219cb937e16ea3ebf4946eb7598e852c9b995c0d2cb3acb216b14ec2907e7f973d905ad4212ae0a71b4883dcbc545a801091a6cf17c15ae98e48878717b51be4bf05a29028a6067a3fff6e47d50f9c48e6062038f88d7a3f7751766392339799e651b684e0c84b14c8766926062e5f28e2b99aa97ef59fc2ea77f6e44d29bf9735a1955ea16d7930ae1e30d5f403a50ad6c9701cf10995c130299ecf7ba6501bb397359bd37b36d56c30e49cb6a4701a903eaeda25edc6c0973d4c35b5f60fe8a421648ec2583ccfdb683462ab293fbd81ea20007556290c4f7d80c4ff58e6cc7a8f39aa16dfb7e903c5d6d96ecab77b59c7fd4da301dd6828bdb3d6ffceab6dc4ee31e810aaa7397d0671dba898622b0a252f3d09f032433d8b4116342f3377709ca4ab41ecc1fb6d73ac1afb97e16d979e01d7f42ff10bad83a5edd7040dfbfabbc195591489bd4e602d392fd71b20b8218b86494743bc0ea9571c5a0625ffd5d496fd2511bee54a1f2137c190a904f44af2746838e005b1c61db988217eae2d9e3ea22208148e3fd90d36a597b1afb193fc2f8582373614ee53920591b9df3e78607dffe855f1edfcdc6bc301939a0879ed7baa149a16ef94f0ca9a2e3152503b6b6a5c5d13a5e5608258506390a582254161cd44683b705f3d638c71844675be6219065f5bfd18edd32cc8c281c728ad4a3ce254654032b0b8317f949ed010667813c1661ba136ae14e4219771ab14f1799b2ff54673694a8623c6a42168b5241b705d942d81605a5cdda5308dae737a562a2332d9af3bbc146b9037cdba6c4da6a3b7d33b1b1c06e7f749c3f55e262fd320b97b226141de765c29f0d603cc3484f381896904a22c9e4809cccfe76a5518fdb2ed229608e59631d747828c3f894a2ab6890868c3aed1a3db634a3fcdabe28269324711f97fe644ca3f5c1323782e19f0da97848efc275f830635d7fa827da81c5ff86dce1466d834cd9577629c3413b19ebfaaf97e967beb369b06b6072cb01e07519018f4611a0815f57efd8596acf5dc060849a8c355854c55966c8c7b69a456ec9f4c74e7bf161a482bb558e05f180fbff36de87b7616f408edc39964b493878789ad3eae72308dd70b2f7fdca4061c96707542444843e9db8872d6cc25b7e374e798ee4bffedf6a68ff0f62144e33599e640e094b1eb98ee8c4c662e3a7effa7a32952f88d5281faaa3366b0af459eb420952bead708558f0dc7d2d1a5fdb15dbcdcad7d544bda5b8cf364263a02035a7f80fa5a33e7acbed8f14f8464a80a75748e5553c74b9016c492bf6e307407e715df76d4c82dea97eb90d58b75917c2f830c03292a6a0b788e5ea524abaffc69c1a99000ed82b23f4f18c1b2e2111186688b13744d4f19689922aba2d7d107bf0b6296072e88bcb8a3daaf244de55c858b45004756b2bcd93151b8c4051b4fa64350a5ea79c984990fb29f6ab680005e42805ad9abbfd46d66e8ef8ce2260b0412ebefb2431bdafe38973057104600685ee40916ccf3ffae5f5e32fc59f54ec7a67ee28505fdcbf564c07d0539021241ea10748a2b5d6496536e1ef1ee5637a11d5726840386e2d6775093ccfea5405caa2c1d02ab2c94d3564b59ec415a50b08e0edeafa70fd60f095fece4a88db3a4cb922e33d929738f0a76dcb27707f9732d32352d752c05e59e4f668f6779699c9aacd6d2e6fba0abfe82fe672153d4981956fb2d3a81fb88b24394eac1bd07044dd7a0807c2347dd873e7f2d7615e2ee8f7c0e00cde575333fb586c77a36093c4bbd2c6bd6be48475a0caa0fbbf49b063128f9fd54d1b4e0c5ee41836a619b71026af64f71012bc92a20a8b6d074dfdc5c8ff5960383f3a0eb37e20964b24cd415a7acfff93a8d64c5509a6c838aef71e98216e8c5abf0f83642b81d50134c69819b0da4b64d4209642b1994bd04d4ab8e445d09f92787f854f391413e799352f023530bda2cee41846483b228d187be0028ac81556ff9654f7ff26e400dc854121e939ef509ad96df5e333ddc21b6c228d6afcbe1698f570faebc69992dd95fea8425ab244ce9a90d4fffaf9f045a1e18b43ce33b84a02d33fa0ae09c29afa7d52fd17f2b11acbcba2af8f1adc34e26f5eaa07e18f6b703fbfa7e91b6b1dedcedb227e7d7d06674cabe9abab3675f0638bc8d477ab4775d01eb9dc3f3a454fc4479a3ce1b6eadbd7cea70b16a18a2a0e411395aee386cf228e1f5dca0335626439f01789b3e712dcaa04a3f8326d5015e6feaa3df352b0cfb7bbb2193275d1e2606c7dbcaf5824867b7e86f0f04a60ef4656269a25c9eac51888398357c8dcccae130468e9aed73aac0d9730b234b2a7459bc3841808f7f5e70c09fa596aa894601ca432e6f4cd1a0c3d31fae38394f80aeb98bbf43f823a95a1adcfef3d41b0129cc75dec2cc580cb0a5578fc4fa53c064d0ea2f33f55bcd5bb3eb12afb562e884b34dd37dfdefcffc31019881e8f3f8d7cdeaf69f07fd12472871bea6a2139e9145730b7888f125805b3b107b10aa10206f3b5324303f131f58daf2f95926190096f10805f605c7706e3abc62dc157a2a757195cbcdd99d9b756bb10a21627f12965bca5210dd386ed45b60f26f71c9ac1fd8f9a081b86c4ac6945c83ff15c0c2857be2e1aedbd7ba7f938b7b4c89034759a927a43069fbcc4bbbee54067182765a8eda6768c16c819269b39a95d89d73c801c7f9fa87469633f77944d7faedf37fa7f1a5c95703784e023e273e2a45f2b254c8584fe8dff860f6285ab3363076d0a9f23db2ea080cf5f4cf785ec0af54ce2a9061c9efac4f0840e976e2b08bc75346dd7833384fb9f8196c58d427685367cf69261b8f95de435de88916a2f5a4850bd2e272fa2d8fc5a338d500b184bd06559eaa324506985debcc145f58cf100c04a1736090d006716b9f7c5553e49427695e6e6927d3e02e1c3d30ff416b79f998964a5453cb9d3dfdec2570a1cf1a9eb620c3f514963832c9c9555ce058df5584509c1a8437d2afface6ef6cb8c15d2fa98491ee98a35f100a38caf20deceaaf5e8ac655921ab34f42d25a9793fdc04224d044319066ca68ec0272455e49f73ea2faee13f2516492d432891e7b8dd95256b4e31a7fe6128252601ece6b1322cc3519e335d33faf27673d12cdb3b5637bebff71a1da56593b86597d154f663360cda33e7c1b7ec2b30455bbb8f1e04441fe3962e2976c63b7a10ad49c5fa2347d9781824ac2cc4eed74b638a96123ea95baf89096de1e4fad27e5b0c46fd01c55d5082e5c86c0a99f206c9e225da013f2916a49458a76a493fbd468612d13b2ae1199d47117276ee795580f4f003ec8612d9432ae7e361ac39b878ca4551b9a252b67973bc45fa9bc25085bfa7da2956a19d3fb93b84235c897c9a651f7693879789670ed153a143145c7db90fa3ff43f4cae457b0f17117a05a8ce4b4f6daa2343d4ce5e0cf0854c3328d8d2cb62c5ff460e28d18dcf066770608c53a86fa64fc8eeeff18ce61030446b731005d2e7993c0de3c722dfe8f728cbb742c462f639b4071fe6190f37aa020e9346a64f1511f78d54c8c5086334182cbb326c01833f4295f44d0ca9c7f958ba827120cfb99cff2ecfd525f536fe10b150c565092d8cd1b1bc339ee5dbc9e6f5a28d45c8255d2509333cc313b4890a39924684537074a82a30a5e25f9db81fca924ac03c055b61a9179535d31de81c68f6291fb7e41108f158d55e2501b48b1eb992acabac5420eda9df5d1b38bb66cb869addc3fa4ab4922148ef11fd547bc2ab283c88f4c9157b7326c7b64858f891477882da621fee0c08a03d737ce1b295ab367bcc812d6af03fdba4547be2c0d38eb443eede162545c11b0574ab6eb1f8e4d4db5b94194cfd41d0cf6ef7e1d1babec712ef5b32ad8b79c2ed850cf66a36376a952f58c83c87c500b1034ddbd2220592ff687cdbe76daa494b8df826ffab93e3ea3c73605733742232d2fba0ce3c70a664177a9ef8598b04b2c57dd808b04ba83a2835c8dd6ef29b1b1574206d5ecc4bf4a227f8543e01f1e8706af3d98946d5162cebf7bdc4b2fbd907bf974974e2b82657a685f405ff5d07d96c3c0e723c44888a2a7fc044fd2035d1582e2fb94c8c6cb590a0be6a88f8e6629c28d7ac87c70d17dfbf397f40cf1d1518bcb0f2ba7dc2df8d6ef788cff71456839f44db335850123bf142440185b4a5533a6991b365771c5d6bfb397e1728aaf32457266fd6d08cd552c50f34010e9dd9ec9a9f5bdf297200557ef102c4dedc03886518b22c81f950b2f688af6e54a87dcdfd3487f02fdfe31a877c7e9ee29f7b56df889f7e62fa8f20c3f7502b4ed0e6dd8e26346b4c8521e88db6367e809ee1243eca052ab81d24592c3f7cb76e4d41fc10c8d794d3cd8728ef513af622608d7c23bea33fe9d048527c161d5b81f95575e09c95f14661c3ce60c1c3d66350efe751619a6b8e55feaa6f885f611ce82c96c70e414573ba04eec8cbf44c9713c1db89a12aebda3e91c24ac794aa57df87c2b36317a079326dafccb8f13840dc1eee41b902b682e6c7f067b62bfaf562159da111758d13567b3358b33221ec65760882da862f493ce857a30e571880d56d6ba87870779d5e412351e2468b301407cc606e8f402d84a2a020938191be6939fd38b0850300a0bec6494a3b8b132eb7a845521b16d09ea7990bb199614d9c993944d01cbfa2aa560f4340f59c0e2469f3eb7f9dc0f21565277c07768ac569d28be4bfa11887017737b92f463adcde48222d3256815dce851f331c1557f57c046b4705989936bd2cb2010ca5bcafed7399d98457577013f4978aa17dc1df8d6ddc9861182f87f0137d6d70c3909798bd07684b5243da61129ef7a332c1b2e696c80eb636b997885b5e17a45ba23638b51f534cad4c48408b855bf5455627654118d86b50666d8de56ebbf90440949869c2ce5261e61ec884b573103fefca3e89f00f6eb1d7a391e2349af3a81d36e0d2bbb946dbc2467c60319704e0830db5a48e1f119e765e5b2cc4187e1ba91cca1e4e785aba09f30766e4d7a004fa0bfb9f0ef2e9c3b5804fa9daaa2ffc8ce3b1b92b6655853568bab4b45fc9867da3fd7bff604d76093c6ebbb2e81ea29014732cb7c4ee1a71d59927f60eef67344eaf604d08e99d02bc2085fc3f239e8543222cf660d9581d78f2891adf5fde30769fea8d4d789b28cfa8f0bf53aab340bc58dcb67959760a0e9b05f486587c96db0fb72594b036e06bf210d4d6aee3c867c4e375678ad84754fdc7a8756cf6543766ce276c74a38cdbcadfda6a57968e1f05858e30a938f5fceb53f17ac290880242719ebc11ecb51867018c32594e1cca6bcc152bd8f08c0d23fd9cbb08708b292c8283a52d0313e510ef7cf2c0632f4c956bba8c8753206b4857788b94ee3d769b2c56c141e2d7aef696e350b1b4808bfb28b7c3aef55b43697b95a02a9739f0989cd7694859e582d556a93caa2b766febdd5ca77c7cfc769e703caaaf211ab49ff030c1673a002b02aeae7eac05c4fd74ad5e987906b7e2920c3ee29d6f6620490f0ffda409bd6df5df2e48f2d039310a539090199faba0350ef6f6d0cdce1369c76002ae8d7349a7f0c0964328ad80a4b59f06dd439a71ad416e22e89e97ab32cd2fc1f4e3417f9e371e88185aa5fdf8931b29985f5b56c6f1a3cffa31f25fca42efc099a20a3619e1d3e6a529ea6c8e2c0aa7beb50b971d5eb91f9ecf1ae68f534d4e4ce15fe0dd827faf9f3cdb54cbc5144bd565590a397fb797c9d7e2241c19ed0607c951d512116ab5bda42fa5c3c64eaf4e48c03037c321667c881eb8b16c4458f439959df962051917e5d9b2610ab142d202958e40e39fea47bfde886fc61089d3c2cdbc232501e21f144fab62f254ae60e8da6b9876ccb2d832cde85b1c7b20ca48d8c36b30d376ff1ac63cc1dd41715e64f26245589c3ec9476a8ed3007b878f51880a773ecd2923e0eecc7ee71f2ba5342cd1a6ae03f5fb14f3f4337b8b63964ee37bcfc05bbe7e5d02aa5894b3cf3c636463b74e0fbe9880124667d2aece24b7913ede5b4ac531e0e0a47eb3d7207c07e21c649d7af4f97a04f12ac6a8a82976ae1b603de23149e4d164578c515323868218272b2b4093c62af8fa6bbc148392be989b9d4e036a72d4ff39b4ff8d61bfbf240cdead2c9a170c867278095809f0b2d03eafc8fe17db049a7fcc92dc60a57f4f3c78b21e509f85c1798ccd5a4c23a3f294a4499b6a792636fd4dde9f68af38b93f14b6b191402ae0f4333ac2c25b0269bbce9abf88eaf326f17e8dccdeedb1bdc6f7c679e2d8950016f04c51e26b1e7f5bb7b87cc00425da54cb46a4f4ccb28fb8e4a53bac1de6a0990250d137aa1285948f6b70602c296d0d792173764f8da54b006b48a02640d03ba2e6b65e1954210f165f5438e5bc9e3309a485adbcfdd85fa53888783ccc8c341e441a0f19da9d88cc7d82a6058281e0ab4237ebabf1ac7a3c7c6f75bd6f95edd88946c9ea61a801f00d9e2d945c573a669ca8a1529f14c58c2415eb29274cf77a4e2192d22c6fb6dcd6bdae3d0a524c33ad2efa8277b845f0b2ea96ab8522ea530a01078e2e9c1d188a9a08774609c568be05dd821d695686d0c6c064386ae2b8009f6bea1737efa60ee88ac76abdb27d7318fbe49c5582aef7de04d7eea5789b08bcc5878c38367c8049a885bfc9e49b2a430ac3b55ed300e4a71f7912ba294e37797c948a16de8dd6d771326b1d971f74174c9ec63269ce4653969314b6a835c2cedaf5101a5adec02a63524476dc570ff5e4d7766616f39c02fbbc1004852142e265e3ecaf7b133d5dd7901caa5f4c36a405703135fbfce8d0628dcd436ec6ce9afe0bafbb7ef7cc738b4b8cc2a108dd036f8a6245875647614fe85aa206848ef4e3702e0f9259a94c5986ad5b08d2046ed155ee07401c36271d23b040014f6e2ed69c1f1efdc90fe2176f6f2c3da95f28a6b5d579a4a64119a8bbd1d390663e55ffaef6cf5c77616ee6849877800f48b069186e8e78c6642ace9e9a5b64f532bce6f727504828820e703f868117ff5c02bed834bbdb3202a9c43dcc1639294a951efad36b673458c98f08e4830af7301124f5318a737a45692506d1f1dfb47864165949ca08cd28e2cac9b3b7b1e7b34f463df9a2c1f8bbce8895361757f1ee2781aedd819b6be7d843448ed9c6e2386c3118eadf0871b7546297d2ef6514bb3b4cd33f1182593b02dfb5dc0db565f820933a9a3510ecac5a3ead6a1ab0b9dcaaf92b793228ef998d34a827ad8ff1154725f2a594f47ff37d3fc6c059a82e83e99cb6b610b2a31dfb37fcdea6a764e2d05af348f16f2cbe254eaa29422282077eadcbcf9e327f276f4c199de28204d0c69e2dd86efc839010a04d362f70d86d428185e5e57ed6f313a51b21dd856a9ddeb03f031009fc7c1abef266c7ce6c2b86153e3cf34a127bf7992c4fa2d4a41a3a3e60db99fa175b2fd3574175558ad849b85afda7f3855c4fb780062edee7c89d32e8259104f002ad9a7d0fabc478cd544c45d79e9ce056ea1a0434d3551bbd04370f33c21d96019f37a9e6f544b60d222b4741f959cc036024763551bde2e8be68db5c749a97e272e40ca1b655e7a6945dda0800121d50799e53dc6bef83f6196741156a3ed8d02ef95b7e67180fec797b84dd1c8d32adcc97753810a33a69c11836db731eabec11f7a05683734f3ea60fc94ce755ae64924961a4c9796ad76706943a9d1923cf4c0c4b87b5abbc9058b2c9dfdf51376260f7730dea62977dd5fb6f4f387d65305df287a6b63a813c7133ccc9ffebba8fdf1700849c8caf1124f323fcc8c2c478f468abcaa45516191944e9ad70638b9e4aae1a2ccc9b615d323b2db2b70087e84404e86baf2fe343422ca0d3fe01e8c56c89d276ecb1a0f4b5af20e1b531f6b7014761ef8e67e055c452d62956c540dc1614936463aa535d93ca212a6d59c67cfe2a11fe9e754a544b8eb867d289113ce39777135fa80710794a7e82c8ae2bed8d3c35d455eb246745901160cf558fc0cca2e588657ed5bbb6f08df7a3bf14ddfcdd36140dbd45a1c8ca82d87c0c2bd9a1a4afa1e043d583c8078af495d09f7fec02632120695cf59d54217b9edcfb58840c6a523ec171fd6a4d3a2b84fdb32d11a429e728203b0f88aaaa128032bfe3c0f7db5450674710c9cc935e253cdf650917cff15339f6337ec289dd7f32454d263e09ed4a66d311f24422cd3b161f8bf8d8e39c7532c7f7a1141375fa681586a6964538fe73cc78924e8cf28f82475cfc6c3204098fc3c3512301b77dcfce83fe45b1321b088dfeb11766f0c1acfe1bc9f3554e3a00111686ace2bf7a051d7c87f29e697f7b0ce0e0ba381203b5b0957ac0e9daada8d4a1e7ac4599f93b8e1e4d013d9299abc1e6448e7c41a4075ad8f1632edf3ca9e7a40b7a1f5aa26041c0289ef5e2cfba7203f95222604b550f2725714c42fc572e4aa5ba9c1e653555c374149d257dc776d7ec7586157f3b93750e0bc8b12244a4a5d036fa9d30cc5087230e8a17ed2d043136308d37464095ccd4ec416499022424f47e87f1494cdcc96c16fe407d93224425374e10f91d6f63fe61bfc9b8ef451c89d5445de22a6f196c0e3663d6c709d5cd9841180a605d82010416a64c807fd577d6830626c48afb23da0e895f7d0cdd542a61fe1a4ef72f8f9c80e0a8d95ffa2321ead0768ac312c7f0530cc2f45869cb9a90bbc5c1502569baf9b7592b1347048d8b3fab967fa8108d0936e548616957ce1c184071d8b14d120892f4baa530a16769315968749e4436afc82128971fa390f911760a869671e2e4d991c05edd3bb08e4d9585ffe0b9f5b6d8d6fd2f8e60001b8e669168889b4718d727dcb5d921d10a4c1231f6ff98f1db017a8cf382e6a42ede6862c41dae623177e92aba571bc2baaa18ccd9f1e738c39cc99c5e8345f462ae8cd7201aa172fa3d6bfcb218d32019ba0577777c03bfba8846239cb3b45c4e51c4c8596e54013c59fc2202d0a6fe41deeede3b71132738401cc8da45cc5cd846204aeb91d02db766985c73c1e4de25e550e5419e68644de9d89792e49c062157581338d7141574c807e3efc87f8b86bc171513d9410ae24ea07d6f1285141596f4e5954d36b4c40488d20d0b71be87154e8cd5231c16e40eebf8a614e871df4ea30b883bf34954724ba6a3969f05bdec9e3d6cf06176a0ea6de61aa947977837ae2a1c804a98ed6ea209e3095aba24ed02ed2b20528dcea08bde26aa870d1c30021a7141a5efebc8dbe41da4b4172728429e0847f847b386942b70cbb1579c439d3ad4d45abf3c9efeee165064fcb65c6e90739c84a929bd4b5348024b1e55d350b77fa254568da2337208c0d3914c54667fd86b7a1c69eb7c19c430420a4a3b61b7c66381a4f8f98a58225ecc3295413f22c069ccb10599e7e82efee267385a0f97b024a8a7dd0ef8446183d26d012ad033ec789f50662b236439f11d64245e096392b6997014c6de5b3451e9030758183421d024a0878ee4fa366c692bf22c36ffe3d2e8222f344b6cea37dc39f3c7c39b66b00ef0fd4b1cd94df8ab00fb94bc6c86809d238dbb310d954c0ff0849e72dfa3853ac6026ce5f3fd37c40028ed76c38c5db60759382eef59d54e4038b9ba98f4a6e18b09d633457e2f64de6210fe23505bcd292b5db23ef311a72925372078aecfa80f91a021fcc66f94ba4ac39f8a2911f04f8ecb77dd56a513048a31ea294c671c91bf2763a6e80c91eef534d8ff7841e831e6c10c99038af9605811eb5cf3b4c0998d271899e020b918924349d751ed597ef5220d79058d5f45c0f95321c6612026cf47d1e5581b33fd4f5d6f9339a71b83816ef4b9e88d97e1c20383a26d3f1813815ab2c9e851398ed3463e7f8eeb4040cba1f848de6c71f8ec320f292bea818cedaf119e441f1b37a0d25cd04aac8717284c563c1c3b43d529cda955624ed5130c320923c4d9f4d0a38072f04f7d5e12e04eaf9b6f26ce78a58dbb35eb6cdbb8f4366c761f51ec7fe91176f0c02b1b879ca4a28a8f8500932299ddf2ad468249405d619c3350a02344c00877303bedf40c8a41eeef0aba2b75582b84c5db210892f9b6265dd9f55b5c4b637f196eda9756a4f1f702453e16c2b68e89778ac96a7a6d6a3834867bb5c1b4546b8df866ad7228892f4f6cd8d0bdb737b380b384dd2db623eb80980fe0a1be8795950266b373e470d45b96e670dddfbf60652bbb7f49a00bef2cff4cbff7a7c9632c715ae6fd051919b8f951470594aa2ca3cf34f169e77827e69eb798e88f9b28fd2b76ea88bb13bbaca04836ef92d3fac3f09f11d6ab10900bf91e50b315f976b4591a1b1206494b400c9905edc19ea4bc5de374293c8ce8660adb40780edd5617e4353336e5a7f81cd24e6420b6a24d0775f46c871b4d4455a996c9df396305220cb50c3b410927e24c8fdc5b473c643ad65a5651caec72d41c58258e7a8410ab6dd5fabe795dbe504b7b1855141041f4d6471532b39fb331108b17010f583224dc48b66b7a3ecda2448bae94f81387d5b12476cd3d1bec4ab090e3a2e8a08f1356ea865c4f0b61a6287145f3bd2080864ce0a9ad25bc12056cf0d69c71a6b7817e55916e9bfcf582097d5125c9f4def95ea37587f11a8db4e5bc1bc31efe307ec4b1a5a7937969b3fa817bf92c") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_192s_test.go b/ref/params/tests/vector_sphincs_sha2_192s_test.go new file mode 100644 index 0000000..0f5f6b9 --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_192s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_192s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("7894d3acddbdc67eaf2320994ff21a9a38bccc1774955ed540e57c54431917deb11a8cd9df87856a8edaa96a27d4f044e6ffa87a964148a4ba38a19d15ce8d0d2a3b964e5bb6dd1552390abb350079d44aebee256aca81859b69063f9e909563") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("e6ffa87a964148a4ba38a19d15ce8d0d2a3b964e5bb6dd1552390abb350079d44aebee256aca81859b69063f9e909563") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("695e2abd42d4f57a5d6ae33e9db433fa95fb3820d397d1bc8512dcac09ba07a4a041d18593cb20b4553c50ac7458b0126f9300f20d66907478c1303d165a761b53469815f62f35cd87e88c07a47a9bbc141fdc8e76ecd82c80ca59dba5ef95a6e51995ed8d442f00de86daa27805876b64b192ceb912166c6ce9b6806b935e292095f63cc252fd293399ed17b1e2e128f07f8dd7c2c114ac9a0f4f1537bd72918b1920363057608aeec570173b364702fcd7035699b244150134aa10fb9ca750f12b7db6be172e584b4ca6bf8d56de10fdc3b14bd99bdd9c67ec5466e2c8ddd1ae6c34baabb2e221e053c13455f97707b1edd0572c0d173ec5cccab1531441ff6ed36cd7184500d878f579ee47d2845c1930c0b395fe968af35fd7b98f64b7e2e27384da9b92e07e7af6398e611c4374d57a9e068d429dd0abd81cfd1d394d672bc010d413d0925de0986c7fd933b91b85613ddf0b7d1935da82a07c6d4c3e2d61e47d38eb089e356db817d71f2f6fbeb078734ab937bc7785693efefcdb8fea336b23f7c69b490836184494eb98cbb346524c9185da14b8b8a0e6fe0c87f779998423d8e912023c822f2fb8084d9507264aec9b3f12d72e784cfaab2043953482117bc02ceee8e57bc79d1f1748edbec7d376fb6bc0e7a7b6b4eb87c3d82d6116c40e8651ffad3715cf7cbfef2f2a8ee0e69f330647dd7d38eb918beaae100abb22682be5d61f21b5e484e85bb25bbd02abea7bcb6cdb4a535455998b5ca70b644d35568313cdbdc95f418ceed73c01628eb69d1ffb4c9dc37d0e5d0cefa8ce1d3e1fc23e44a805d82c6016c47428c9f3bf141a22acab1095697a376a70704004a37f164a707412e04d3dd79e9318fcc43ac16540085d897df36f20f6552b609297e1cb4b2bce6ecf00b67ca3ef836b8681792b0fa59a274a802ef05d8e32a92e418c65634706761c0094eac4a77eb80323f5d6d71d01053fdf3e1313f6bc15cb46c6738fdc3baab6ae73a06ccb53956e470eb67b8c64522f124d4c2361830f5e7c797f78c2ab5c2cce27419b474611113a96d3b21835482934fbaa4d89b466b2d5479e012d6017296decc8edd408e1ecd0d319fc154aa726f70a01bee3bce5ff0f6d6d4dac52777567a298c92ca7baa91aef9e72511cbd9beee9ac1c224e85d302f4934b4c090a58132b4792eb103e3ca02da73c5231e088ca6e4af3e2f224735d8c69a9e4fc3db7fecf475a3fd228f95dd2fb8cf7d8a07e2b5d024653ec7b59e3950b31eac8a2f8ef66be19eaf5245d1e019dbebf30051b16cd5c061a551f68d834fb807759481af95009735b9314c0ec1874134abe11fe373677c22bd569780f893d10071b3fbfa3280b9b96a550efb7598c80dd6507d405934d78aae0dde261aee300d3e43679c7abc7d5a68abd4122bd9b84fb68de63050452bf5bc2519219745e7b275ff5d90f3547cabfd4e472155d3b58f0dc578a39d1629b856d09c502e3b435d352d13810c23cd1fc5dbf78aec44c36a818eab5a8e07ab135c30569c1f99d6a12c48cb37d36ef1276502d9b51b57cf0d3b1d0661716a714cd0ad167ad21916da27fa5327362ee543261bc5101936b7997ccc74fed544beb709d180f59a026acc649f9bd8a7593c1a9ee3a0c9b23d3dbc2405a7209e20c94c6affe29051cf40cf4ed6240f848dc59c29eb8429760c889b3770c3d4d5f248270d7a7fe9e1c16c240e43eea4b7869dabd54bd1b2898473eedefe092a5446b4151327f4b3121f20b5beb47c60b8f5ce5abbcdfb5444b1e2bfbec2e96db2dcb7f0f305aa57756db89f44fb8ef6385769765783b89b96708416dd9700168b2d3cbc5216aa41d0e0444294a6c44758cc7f05ea813eac0dc5845ae6353645a89d261b094e1c519531d0e9736786d8876d0e8a3fc06aacba94e55a1c513ad721ec62a6165fd7ff704814c71728a83d783ea1879ef3b8e6265591481db74d7e0394043874a204a55b7428cc1d867b28706d98144ca0c047e8b4b289edad869470415586957cb38698deafac80942c0f1f74454f871d19480a2837c11130daa22e26a587a2b59a45e1e1cdd2a90283bcad39417c2c16efa841295b4c368c326f6b7b0d6b32323036fd598ce0aca02765b289d80c37cb76ecc85f703c5479e3ade949de3ed554468612bdbbedf4e8301037afe2efced2afcb7ff1dd3b0bb0d15faadf7d4c9adff58e8f5fa000041d91ab7874c0b1b2b6e3e300bd316e08daa51a115740e3056907b2d8de176e9ac26289e58aca49ac2139388c4632dccaa50ed53ca3b92b7591e72b5059ce546a76dcf7b79a3de9b96576f63a63774f2b20f0a6e3dca5c46072322daf691d18927b5218112c8e1cc656449ff3ca87611086a7b10c7681c6d9c22c403cfd2f0518d324dfe27ca752183b379a4de566a42a265c3c4423dd4c4c2b7628ce7cfb9bea2d512254114d98d3646e72ebd93990dd1d58e25b2fae43be0de767327136789ca0118947164b896d245ec0c306bb05d1959c51eb2f2769201d584271ea50c0adf14142573821a26606479019f69597c2e8198a184bef99f2c4a605418f01939e75a19c3c15959878f88b85aab957e668a155b9e3110ea786937a2dd8f81c103edda9450f08ad65fd16ab7f7a56185d768c1175b88c5adaf3152f12dd8393bc6f7b50ced365480d9788b2229fe5e214cfd785d25a6eba3ffb46b36d6e702cc9480365b3072d11409e533e89a99c943d7ba798ea3283c578467a2062aca12713e9ee351af22241cc32645c0e784688fd70bda6478dcc229fe210edb596caefa8d8648b6957622787d00dbf29a62f3b1254cbecf64fe9517d3a30507b313ff27278c416d83a825472d5397b1970372b7ab90b82751b98accd13df948f0e9c68223dc791a98c31b55bd2755234ccff4fc8fdffd58a211a52cd98235111be7da9702b1e4609ac019c80a7381da47a041fe1abd8c84c56f99409246ed7c26f9da56959878cc1bb8e641cb5f6dba11749c1a082add454464cad329682848e6798c07383133d4b0523367ea48a5b75ebb6a3572c0b08ade84b945444601864882fc00a190430291b2339cd732733a8a15d2b5045e2bf445dbdb37aa32edda1c0338c6ad6c0b0f72d410817f88e8172d2f184f107da2888e060a41dff9d8ced2d9ee526af88c54e9385626b83673edd7caebf359402c4e86bd0556528023501fbe8b3b34f4579280c87a0c685a151d2810ca1e03035557a14097f182f9150e16cd228a0579b39454555ae4dcf0b0d4bdb5dd367fa2d347a4673a06be4e4d49f7b130cde3fcaf8cfabd785a5c0f16810fd26cab4793e25bb6b96b823bb02bec18ebef0e1feeb2fca206b1fa8fcbdca6f75e99517c3dfa1b69c85ac6d0e5d41c68bd923ecbe107cd3d09b4ce688972eaab92fba0a98e98b86073aac66a56c9f770b54a8def223ea7fbd7135f190efe2dbaa5b2603e9bebdb3fc956f57dd545f618c4be60526aefc2495935a48f094986ea9f7956780c1b61d5230bdb2acdbe49556944bbfce25a8c0a951be43791297119ddb3b69ab5348859d43a282ce27b34fcbb6cabb70e1afb6d4dfa2d46bc909fb34c5ac5dfcb7c1664f63f1ce7202ae1d0907157ad4b774994e843513d8f044330790707d700baf3b04a9f324097236ed82bcbf5e9461215795bec50bf3ab6d751af279c837ca33b1719ccf0910bef0e4eeac039e7449674008b320a531a74d28e3dfb7829b757e62caedfadb81ca37ab36575b3e5a417c41aba806c658f2d4a877700d1a70e3f88d2778a5a76859d9eb6e2f2ff22e033b2b8b7fd666ece2afd5fad3b6e52b176ca6d81c4602832a9c29ccb518fe8efeaeac6989662e67c75bbd8323a384a1e1f76921c7bdd12d6dfe8778f509c3ff9b2b9fa1e51dd70ccd132e5723227acc7a9625021770abd482246a8662ea23c1c911087fa398f5e33dd50c45312f5cf1867d25bb7f9129e5cee6bd1b25a95dce6a166868cf642ccb0e30ee3fcb025c7e70dbe01bbc07f1c33705426c7e3affca53fff7c2ba66d3988fea017daddc1879a2faf21c4148089c0888782b0f42a3f5b76f3939626ab94e5d3b710685e464e02d9a5113e3b254a28516e252eed0d9e0cf28ba06ba8c00ecbc05d9dc6a9ee3ffac966488f9ad5eb95d7b0fd5e36c89de40f7b62ec3bd98e1d517da12f5c876766d2e8ae54afcb19e1f1d57f334c76b4e7b62e562ac3deb3e5c811ffb8dbf7cb5ac8c0adb2da9be431a0a0776b4a0a9e98530a2fecc606c89bab2b04b9e71664d0bdaf0569aab80a84df931d574983dc3ecc2ada552e8c65137a0c85d5793c542193e2d2e0c649535593fa8e86bd05f3737e4da1c40d466d9e349bb5b13cf17e86abecf8c2e522d4ccd3b409288243db337042beee17cf714b4e29136d7dea8576ebb29c72af7f28d2290f04b921a29ee38a0845b351e1caf5b80020188de43fbc8eb062f42593dc44cfb26d6111e67e65e8cd2440c89e8b75087daf457e1ece97100de4810350dbba57c7014add81f94325b47f7367a0ce533683bb97cf689ebb20920fc4265317feb24d467f9193adc4856987e0481d365c8e03a3d6fa42b2c37b0c8d8d60b394d59a6a6c86768f6885708afaa18b82b045a464c95fe4b8b9221a4974aa9c1a54cd68cf0e9953dd742936ddbffe78482c924a31128a5daaa02ce0d8ef26827ba1b2758437f73a6f366e4d9a25458047a94e9ea5a1274831e2ddf24fc51a907fac8e7356c52ac5da90df88ca42715837e747faabee14e48b2508d54da7ec5f2ee16e6ebbcf7dcbad13cfbdb76024d7bc1c5daea8afe5ce88023d5bfee52a2dd76d77e2dd5f7ebab4b158fdc227efcf1707b715ae7200b1e8125e0caa64ef7bc824ef74c44fb1e071f4a72020472a17b9c7babe9944bc19b7932533cc7bd143babef0bb42be5d34ed7a8748e5671153534b48caccd89ccff5f97be1919a9e2cb1daa1b873d9458d74e9d5b7d87753a0d3881e0e338e25cbf380a21862183b188e0c8ee67e1eae297d780f8a9e9882206add88fb6a56f21699b01837874410fc60368ad3b23026a4856e081fa5b554ec7b4abb3e0536c1fac0aa67603d1b5219fec60c3d4c9714102de568f76315d78b74ad5a39e71682337fcc3ba0ffab45c1255f6a8fffc39012ac56d951a09ceffec9c51278aa40202609c0008c6da41ae3570e800022f9188e4f4a94253b1d2f750d40e8bacc377af305cc17cdb330202875dd35d92fa8c714706f1821b14c4be98635181831787067f3199e480b9b087075f25dbac98548d461073d31b71460a2f6978b3435bef5d359f48f201931b653fd5b4d10b136cc76470a302cb711488a243ec0bdc3dd11a2ae26750cbd3b52f8b9086fd5ae110b1209d09e149028194a9a7a4d7fb26050527c495c3fbee9f44314d75232271b40bbea25650465f24ace75ac17a15b6f0772f88d39937bf77c23c65edbdbe86d7bd64f74f4fe0ffaee2841afaf0dcfa55d2e3abdf947092a164b31b8f2eb90a069fd457fd99c53bfd135fd6b1e359be02c9b1f382d4ac3d343e6386c446839cd5e110b09da4b459f83e4f95e97a950761be9254174f5af748318f84fd9b7b313d8ee0ab3faf817c26b200332d5733b9553e3b498c05cbaa524fbb6604796873ca0e2ce40b0747dc6a445f38078d47705da53986b67320a7015a8b5d3f6853b9f1bd5db89af81305874446d3682f50c42a2a9d643e39c9bec311a1b949934294b52d9533e96293b4be67920116b6c581ceb44a10469ca910c96c9f79c1984a53c6f365e46c743ef1ff31ded06c1d818d94f930cfe1d4810623a62454c9988a427efba4cecf556961f6db1b50a5260dc96055dbee9e6bad55b9ffa67d43d819fd471d0412c850df5d0a8db32e16b6089375595705f955dbc9597ad52ed492168b97cc811bde2eff5721e438c7ce15d45a6daed137cdaafb27b4171619204d8a9a85e577bddabdfb6b4e4506b84b4748df0c3e2e3fe2cb68b748be4d08e7c0eedc961c00f2ca15c004f927c23771b50ea2fb846e41a68ee33be946dad2f0c9744eba85a894793d95270d8406035df48001db757a52ecc1f3cf643d5ae37d0cb34aa2314008ff150f607789722697d9f22bffd6fd5c65b4250358065185652edc7e2198228b72d871b4d1820affdf0219ca60b739ad50fb37d3da0ae86c7ff6425955180647b64114fb7a9aeb73b5b51b7f0e0d110d61cb0af3c8d9d996d6af4081d9075244833ec3e76f19b91f29ae7b5e95dde3e464356204d33fd5815db3d01ca825b612e79c81a4bd530f16c4146bd774b137c67b5168904668bfcd6e54c3b4bb65f0989010983de544b3c73df0cdef17fdd5d6c1a7abc653234915394243021f96687c196c26a2d5acc7e683d76c685fc83f7dc2fb67e6d2208a290472dee1d03dc800bdb311fcee4e3b5cb9fa071af7f8f8170035e2b3ba773b8fa238f82a6653ed9e511557c228d7bfe667716f4c149f754bfae36e4bbac17e357d4ff0c86f4d4a89979d89e171fded88b95dccb24ff524c6aa88ecc082e587c612c457d0110c803df353b51f4ba6efe7c37041a20391cde8d4e60ac3cc96c4efd083c749baf38dd386261bea4deb3afd6b634fee480e831c1f8e7f25286dd139d90bde26438f33aff0745a7a8819ae1ecadefda7a8861f53bf7b54fab95ecaf16700cda0ad5b45dc5860fc50fc6b62ad898ed343ce0b7bbe341fd9d66a7a9b674483a0287bec26f8e24e0f90a2146978a2202f3556a966ddbbe281a55f1ff7e9a384c2bae75934eead2f4bfe0c5e27a118ce2e0c391f15486b4eba6c76a47c93d383e6358b6dd3289a7d37926c59c58a520edbda60b66c46a38657986a8aa057a78b488eb633f50083a1e9e883f6a0a0312fc81cdab82fe08162a537cd317edca87f181844bf51d1d936115d7e80e97c670eb3da21babd6f3bcc1c9e5ae6855729dfff2b3d6090075b741416903a722c1cdc1ee635f6a6e1c53a1c17f54e38ede69fc1b0b663790628862b461835084bd3a47253cb5739e1d77d874a67b53fca0e1866f06adb69ac70718b1118521e7c2d5337dffc7f6c448e01e56c85a4623b67a120840c2d98d0d117cf814ea88fde64aaf0ef5d887b1ba875ffd1ad14c46dbb04116a0a0e12c67ea2d89f61df867f2ace4e93c552903ecee5492891eed8a4583e168a6a2818f4774bee77e8d80059a5c6a9417b6b08b80e0499ee9e915bfb76bc799dbe65e9ab75f45e29adf041f5c12322f319f118d564d008f669a52ca331884a4561e0d37809e168c803db820bbb8f074455210796eee1d9eef745563a84a85a82ea4bb2b140a8285387f6086e04ef7ec66bb84eeb012c1430080c5c0917abf69880351a78540ad57e5859e8984811985bef1bd91f82d84992ecfcf7ef6bd0e709f992fce5cd7e58d789e683b2a1a0d1828b55c03481959d38a35e7c5f2a643c348a8b84df6cf9b8d09db3783a9d46a49cbc442a915a227cbb0afee9b110baf1fa9ba1f46a24cd73f5221268fef55723d8a52a950e2799701f73f9cdaf54a42ccf1a5d14b4be4eba531d273561515a56f0b18eda56d97ae114e48bf2a1ba8ab90bf84303a0f40a083f68e05c9cdf485ead8f7f631ca821f336128fb3891eadb020cbda572c2763c13b392b2e223e25b7e6886a2f84e0d217028875fd275df41003f8c337a532cdd5a32335f8e17dc68d66c225ebeadd128a730e2fc8305f1ce1f2d833db15563abcaf84f6483cea1e7fd8081e59b16d2895cad8deb79d02eca2d5cd37ffb063e391af24cec3a173664dd378bee11a4615564abc17f94af1c52e1fb32aea3fe079c4ed78916ded0dba651b6892cfccc4b1db9cc9d85e0a1006a0fb0ea7e65572e365640af43b8b0409d0077498ccfb8d53c9de8f052af7ddba8a7fefd4707656cd4784245103d84e0c267d5198dbd890e0813e7a63f5a44eb7d8e6da774daea7d7664ed0c35deb27fe2f8802493586862bfc5cf5a0dc85e9b9b9056281949cf092ebc53e17c10f82ba1a29508036145beea977b2a641857418944bf12eea2c5d192995ea444d751819307a91aa81760e41fa52d639005a89c7201ce29009940db3769540fc19882642a207aebbd7199b511a93ad677a3ca16451aed91a32d6ad64aae785b8577d9ae1ffd97f1bff09f534f591d6efe099ce64eb085fc11c3e5ef597ca78c9e174c6f3715416443c7921eb29772e60be0180b13724c383a6dc285336004f9dcf30350cb87b7cd0df335bc831f5cca35ba6d565a1a616fe367ee8ed0bc45500f55355b05367e7d5eef509fd416949969dfd75a3904c93235d690a7e01ada19a7fc5f0dc09b5e67d696b0060d22c075c1c001e394bc7b2452f6ef4e1f336e414c7a4c4f889b5b8594b9a7394e8cd80619b2d53a13b620da4342fe98cf6bc139583821c8bd9684e3a3d9a64ed3528de901bdfd14bbfd72723ee1222a64ab6ee88e0a380b25bd8eb65dd885d463ee6f0fa6870795a761ec21009733c83f1bf4c3bc1b9402577b591dd7779bd41dd817d4b893139861cb216b09d03cb23181813c7fd3fcbe071de91a0e652e9e3c6958722e861b69cebe5f253aa02279d223bdf20e14f9a86ee1d7549a4688c340e7ffbbce629d17b7782d8f3bf8a6d5430102a9c9761eaa3951eaa1d178c97c2fd403199cbacf3c3ad294ab5f65aaf561c32cc20974a71138d5c84f677714925219f39d081166f8b375f9821692e92c0da9ee48729c6c8ed66ea88c081b7bdd40d11ef15adc49ec28c63009ead01c1d7f48cb726d91ed16f91db7540df9f8f2cf9151c7d6a614419bee76700f546681a754b3a64a497e4c26fd42148a4548c03a219e8143bf33eecaf16bd6a75f442b37dc1609e2032731e51ff45fec0e49ffdc5be7f3494cbf1c9bc7e1d92f6a1b9a3c83d9c10579851711e330b0cfa439ce28cda73fe3d709a880291cbfc3b2a8e4173cf8674ac92889c26039b332c6c530448e48911971505a7aeb328360bd2d8a6343e16caf677c095a15792a0e8146ff12934bd143c36d501fe52e1f18c3133df512e425d90428ef6daa4f847217f1b3c5e07e8314ed5e043ac0cbae3dfdcc7d97769293168500158855c61e86ff6e90c942794e2100a29a90cec89b58760ec8c4467d952eb53c9f3e63ebb89017fe2bb69627c0b8fb28032979d5428b1115ab455707521b4ee74c0c30d0a8942c0f7461b3cb17dcb2ded7e8a94360b22d2c12d3b0f675d5bb4b02c78386b000fb9d7e5d691b44e50a9e4d90a58ca6b134fc23d1fa83b432f10300f7f00370146d4a94a1ccc34d5ccd8ef85a5ee63c313890d6c39a35a75e6e595cddabe19cecdc9bd4662b32f3547ae1589ed9af5deb8ba43cb58a7408e47104ada8432c94a16d63ad63b542a947b654884d586136a2007c7497634be4a45d6fa1846842be377eda7ec8d871b61070a7fe62994be3da6f6c81740a5d179cd4b2f095dfb653f3900714692bccd691637fe8e22bce103823c6ef9f349cab979154b9db740ba0e8bc5d21d4bba68bd94e0d23bb8c0d378e2cdbe013f73ddd95430778497ca9a0fe822c8cf4ff80afa8dc711cc617e781144cf59989a057be91f9cab5df16d66979b532f8628bb4e27934fa648ecd28cf51ff720072187bbdebc2cc32d0e303f31ce0d6f24ab8a11b21b043e73646ce3baec23c6e42efbde51220848af10c3b65b672a673e0004a24ce9317e0b33dc9d5d102698a94de5265dbbdce62f9582ff0349cc82c317093080b877876279c17724c07ec48cad56b1d4e19460becaafaabc05ca684af974c098b5131a22a8e65f199d3cc6549dd6fee8dd7eccc64e28719f7819dc6f45f9eb8236d238ee04a8ed030f462b62753f8c519310cbc1b673f7189f82ff1d87c4d0afe128866426b3ab903205da396f9e263e99ec93d7d1b5e273535ce8658400e402fc6a4bdac7d4a38f7a122805f041c9607717696762c58cd132f7006f8c2d6b1f9d1d4a80cb3811b0ff8d205d46b17bf96c2e9d4b346587dbcf31d25768fcc48e67c82ab58a779b6f6f5adf69b6195ed5e9f5c9e3a0de0adb727f5a6b32468ea156eae71c3eb9d6012383d17e4e0412e499f9fc407afd3dc2119e9ce567f4edb2ec69c0b65617189f9656319e1911e8e1cd3ff864ceab20e567de7ad8e82b0c2193a56127b53717a0378b6d11a940026dc5bd5c56af1221577597d33012816c30cf1a172e5803128e6fb715fc401d4448eb842d2f2aa064d3bccde97640c56e3238030c30b7dccca1e96922302138e9390c03b72330d3741b75efc142c59269f1526ee70732bc84c033b1b56ae801cb93233453ac22d1523868a57742b1cbb3fbed303e2e9b8cfef182d89b8f8a7af4798f4389610dccbf0725286c5f3caf9e74c512917483e9b8a60d5ec67edded1e78564218f6033dabff4147e2b17ddb84de0ce57dababc669af1de7d311411da36032dd3be8b6ad83126382aad271ca3b26159722dcfc0ea029383629444bf4c789b36d4e9a1003437199005bb63cb87bae2f3ae2c23e9888fd7f098b8b33a2f01f294ceea8b3162f73e5854d751b5b2b00cccfb3a4918a1e8ec89268ce04955775009265dc94b60663863a6f44051bbb89976b13b4e33e42f4817ebe95dcdcd0b7b6c4518e0476e5e9a3699bdbf3cdd38c073bcec13e4d57e91ed50d21a7695d1ac1dbe6b475fa9fcb1f86eff83613dc796389200aaf1692a509f6cd0428aae90ab50d9745b5b6ce16b6b8a25e143d02ed0cb90e9bbc6917b00f635698a4151f1e039c06661600b6fb4ea662786e834064cc86ebaa7e16145e8cc35da1635829308a339fb4f93e15e0bcc7a55e5883141f633f5c9c3b72c04a759d28d16e14c10beaca942fe0896951cc5e33ba74f856363fcfc69927d139fcf8300e23e5602a24425cef674557d8c77d2f86d2a6b68bbab9209f4f9b7cd5e2720ab4aa0086c5c7219744fc52330fd0064d558cdc2d6daa7908a12c016ab93b4c39c2f49db04906f4b21483d7f7b5ccd0cc3574ff2fac6dee2cef4c9e8c5e12d8675fbe4df116460c371fd824aee40d5cb7c754705c52aff952f3264175b36e0d0a92b29b6389c4312dc9d1daa318abbcf69a17c96c54ef724edd5e3c831d25240747910bc07f8f89e907377d41194e8434aa3eec237d81f0b81181f2eba289e5684bb98f773fa3cc3ef55de7b21161e19cefd2f514c7fc1700f6bffc9d4b9547cbb592baf99a60c7039cbe2ae5be3b6394115cc846eb29e7f15ce318d03e46949e4703f36b6caf8e96d5cc381f4dece230fa5eca683114816014b0052ef5c6ecc267c1b7e69facb6547127f38cc6ab8d5e1e043aa6c7ac35fca66797d9255c0769894c237c7fc8eb68324fea9b1f2a665528ccbf7c862ee384f5ab41acb50911499cdd53f7b68d61dcf050a195b0a11f6769b31d73a49e2fb8aeb1c0fa4895353443ff9cf34c8a78e6e8dc8a1e0620a4a8950db0a48dfdd34f3058df6fb6d5757fe3643b9003cd86b5e903ede7e00c3038515ba54b5c20736cad5f68c5fa48d95cc67dfdf12a704c8af5be9bca907086c9185b5be79e071b643f039e908898d122b30317ffa8de9e9d0d8ce200930e26652a8e43493af9238f529f42696dbe2624d6cd76f4db2a913b41880da4f2108a26b9c00ccef7931d2a5662ae48b0d5ffe8714d86f1112a65486b1768b078492c8df0091d317be1c367b30e0577b5bc349888da90c8b84f1726fdfb6b0e765ec12ac491102ba07f3e13324426cc59e70685e8c7a641285346f99c81a9a05953c0b9324b0ce5977e5d8db68c694e892bbed15aa9aa21a4d45322580cc48028ff85c581b99aa2747f7eb7ff0403882918071c4a71ed25d076c983eef52f30705cc5e1cfe08c2f1181f2d0b922bb03f9958fa81a2bf8eeb816d86a79ee668cc1b42f0b391d90bce53b185c4f912787c954ccddf89e50dc93dfed4e315af6895dbe575f9c4712ddb83e30300eb37317c842118e4a4c2a6d6ba23cfecff8d6019d1fa635dcafb8b9b52110ee61590143cccc65bdf73ad0adb6dfce69e744063d5c3049a9791aa5d6d1e83f29b84e38d599fa9743f6210d96cb841056fd1e11fc5c5b1c90d3fd2b304663d0ab6fd14ae200d874e1f36ccdb29aa49726c21f3d49379800d20a50511166d2bf33089107fab2a0461d75539042021a6d379b50d771685b02e7e0dca88a55e205433ad841cdc334d641710eeeb06d253d4c2d94d3789cce8dd52739e7e89558b943145677e4005ea4c7ce5bc72dcd3da36b1bfc4d4ec2b6ac583d8a18d8c3850ab5caa7f4684ab1ce854f281716df4e271083cea5969464f2b7fc0f8f2743b86c4b739ac847ca4bf8a985efc3287b057ffcb76cb314a5544b13771aab163538fad39789112e9ded835600c337bbc9db74b02275731f4017d563c9571ce981d575f8d855ffa1a455e564a40b43971b2a5b1efd9068332f5c25d3de5740a9b9a88917ca183c3e357dc7a28df103b1d36d57c65864e1693c0f5fafb5e60333e14cfc50585c9405475079ab4ba217772982da305da7b564960bb6441d1054254e533e06c215dbb367bae77516bbcf8ef45e7a46cf97d8d84b8d8fe748174ffd60227673ac028e06f1fec8453ef80840a3bb55653cb78b43be587ac852fd7b1519ddc88daaa867042adccffc9a34cb17bfe90c6847f101b705d4b773cb56f3be5e326300a762073d148fb1468b1ef1b582f34a9a10902effc851a074dacf4b1eab1635d408c571369e8202bffe84d0b9c40ea3fdcf1fd0f388f193435fa48c4e232f1768b6722aca39396e988b312cd6cf3ca8b7a055555fa05a277afbae7edadae8e43042f825d8416770aba14ce5dca782fb05e57013b3c4a5af3fb0b8bb8258465649b3ae621de137cdcd0eba82999b2e01457cc010912edded5e178e18a91b66369c06c1de61a8778a7743c8d07091c31ded8f7d76c1e1cee7bbbff8ccf5ac168db05c845911aec1358b8f8a741cb78bf5f721f5978d30ed8ac950623a9ac140bdceb18d9ac3f587a6e8b9c4b82f9fa1fcf11b5fd27610a00a8996666ee4b6fab7d969bb2617da6e6e498701bf2a601e229f45c0d30558ecc620fa8cb257bf629a970fa6fa31acd79aa534bda2ce1cbad3ffc3c289a4aa68b5c98534dc2cac21d2ebfd6515a27e93cd29ae537b75f51401ed273933336bafceac9a5dfa2110a274fb9bb82f1733800ed036de76934d8ad3383f710078bb3ef34bce4e9cc7a6849bd3d8dbac9a1f6f55c2ff31925852860607f8fbc4451cedc79b61200e25d5a51a0417d8b04f25d4208343c4e5b49942ddab7cdc563f0bcf2baa575aea33370228a168da4f5d88828c573d9cc580d5b4aadf9e099a66c5ae7a427103e00449ac5833e048661f10f6926c2332b3f74fc5eab76924138a6c96ccc32b0c692db4c3cbcd9e11d9b4918ccbebda5ea567c3f6efb77ec77f799f4d6c5ecdcaff851b23c6cf4c6e602cbb0d3f4f9aefd397214da7efaff7382cb2fea89d6cf6750f871907e0ddc26508271c506cc71d8852113a7934ea688b01af6e5a2731556d775c024c9aa1b747859da8b7e9252412d553da4b0039e2a3df7d32f3271a9db28050d28780fdf81a9a03cf3007b85696c64a5e297d005edb0cef204322ec767c68b2f2dd68201cc1398a4321aae12eb241aaa9d3400a1fa155b5eea4a592b5635830c8177f377d0cd971d89ac868cbd89258abb5e828adda9aa678d53dd144125e76f592518cf3457b07b2d7e69128e61c1dbc0914010b66a91bb46dc9fcc43b4caec07103e817ee521d7ddeb8d90ae40ab7e805c31119934093b140c7ead2161c8e32e4074b2c7a852ce9ea55a88fbfe7418ecfaa586d723d5a3d99186b4a93a2967890d3d24f6d2934bef70211d4cf32be9c82f7e68843c72ecea766316ce87fa837a3846013e17190e61fbe70cb0d0c3d565086ee6dbb184055f65b8be2ff461da6bed78c259fe5c7c5791241fa78d33116c76a50bd2013f9011295b0cd8e93b6113b09a7c893f8fda3673a4160ee9ad05e22a0e580b70892869e838da6d58dfd674d39bd90ed5309cb1ca208d0f977693f604be86ff85cf4c4c33c0d8acd001f4e74f459e8c0fd9734680947fb248d8792897cd49e3de9e4816f1ed49f9e50bb592eb1aab4fe4db712ecb64f236dee73aefa81d6fdafd06f5b4af36945858046b9ae02ea769e2cf1826a41612a2c33c1f1d2629fe3e990e9a967edf3756ad940941084b62b3328f1988960d8c394db56438815d19a4cdfb949ed30f12eb03a2e4faf0965e2498090a6b3e51fa49e15525dbcc4b455af263c5f52d453aae8254928c0a144a2e4235482ccaf1807cf66bf8982fdad66a945d04e30bc3ec35268ebf4bb21d245baa183cc7c76553ca4bfbd903fa0eeeed9dd8d7ef5eb7aef68afabeadbe7a386c59a9b573db60bd3c19438b69b7033c33ef85bc228c59a9b5d0957725f3769538b51d1dc3506e845b4b693809cb75716f70209cd0af3bb42ce1e197a1b7a7c75cb82009a3650a996f3affd5c0bef0a974d5b24ab6a31f999028df900dce1cc4c07654cbe9eccf2cff3f9d4f9294e3bbdd59187767159bb9409c00b198f9daa6b8fef063eab77f0986ba8b9fc46ee44b58290546144c3df877bef7e9568e589a13e60fa8be44886548472023fbcf372c1c22c31fc74ba232322c2ae9bed4b12a58010189bbb9a2e727caf0fb641bc2ec1fd494ee0c18b0f16fd05bac9dbe758653848dd3eef72886b4fc33cbf2ecc867065f9207c3e39057417284ff8ef0c87abb13f52176902fe3f12a3cb7cc8ae20eceb05fc857b52b9a28b7ed2ca16fc012f474e8034be56e33fc4a0f573a7af73f5f2b4ce1ad5f45b3269a021ffe44abd759c4cbe2b4081565a86c4cbd83a0e92916bc98634e81f1b983871229e14ddc7b336f6f9fa0abe013d70195d6979ed13ca3cee44062e6354b04ae2bf51d3716db6e2e2db79767d2e9447d9e257125fd429be30363f33fe77adb3421661161c44d2d89f7f72fd97356cd3dd2e5444852bd3a7076053363665e9586e267591f40bd61ab03438a99a61483d601b83431e44d78e0611c49db2465aa3302b160a33c31001461eb02e4550108a04a9660dbd38e7233c0b6d00103b722828da2bcbde0b83b38c5b04c436820c3ce2f1f0b70c358586895126e0e0d07888dedddb5f7e6d5517873c4d451b41f9265b257c7f44dca6ca5539b53cc9b674a7656668e60239ac21bd92a42800553f6f3dbd6c478c33654d243b3146325bb4a4a6bcf4512908c850a3ebd7d78cbb39f7c80e909f9ba8048c466307a70ba63d8dcc2b9518f9b09de0a24e64dff8bf73ab85348b6b570150fadc89f0586970ee18f57d7b44632bc125d48c0ef379c93c20a11910745a3e6c3c4e63a9e9abe938f90193ccfcdc592733b527534b58d2e41ced9cc8741d3cc52bd6a2cf64e0cca66d6904fdaf9cae214f588152848e5a629b2bc580bc2e9fd9cc41e45a50e5711fa74fe603a5a0aa1a38aae9255f17f44260bcce1535f401477bfd331616cfbda23baca010924a7417bd3da1c31d03136781745edc0fef932429c71d1fd778184501f6d6d06370bcba33b9f8b63275dcea671b38a7a87378b9e7cbdb3e4a40d42a0d228fb640cf56ec712f8f20ad12023eefe83c7a0c6e7eb65e69d64422bbb682e395aaef8f2fad14da06e88c255294c965f68b8c7c257a7d4ff3760c20603da355485f119cf5b495bdfcd576d628f5dd58c814ee0884d1fe15a34b3368c45a9caa7cb8debc2a3559d54430a1a106420036e7812d5e8dbe25988709d0de21e56322ba3fd6303771f72039420f2f441d77e1f61ca93da852638faa3129508fcf54adc33c1dacbe063b9e8491f2a13cab4e00a743ccc59adadc5099f9d0dbdc856a1f8ed50e1bd7f877ec8c8e5c8c36e19daa787c89e9533332e26b27cf57cfd634f5ba40fc7bb6222bf0d57d334d3c599fab2e0114c8d89e15c4fe5d6fa13d6053dabfae286eb777b7dafc7ea30027c597092ddfc584bd5c7992b729f0aa22b7d1d69abd44b8f300105841b8a204e6ea76243503c8428366e55168cf875c63beb68114390a433c531340bc4e9c860c8316a3012d9b98e6d0046dce7c45e80c9cf93e261a62a4d939636e5125e76c465c2a30d439508689a89de31c085823bf4eb7225478c951388e4b0556aadc7db9938b4d8b6e7505c9f115623b21e6901d1e37aea1e4c8b0e687ed31112856211c5bc4e24fe274d86ffb65146188eb7bc7cd24f13510529ac52e4ac8816e00cd287f2c51d1c2ac394ff53fd1944225ab426b8ab95d326b08ba53dc94ff3897a703225edff4ce281f2f9ad1e99c84defcf57b6153d5ffb8cc742398f876dd8133f4f86472ecda5e67c5849687d2bf3614fe85e49c3d75474954980aeca4a8d050d169988ddaf42baa41ec4fe01990a8eea8c7319620f09d6ae34c2c956f369173e30fb30f84d563a668eed12caac6b2a5b12ebbb144978e35948a95dc987a53fc008fd8bfcc001dfea60231e3fba75cd8b2fcd8efea787f4f0dedfd8d6867d2dc24cdbcf820842dff041027dabe6a81d4bfaa40786a9e868748d94650c0db4a053ef499145c6b427c7cdac31c9ccfc4c5be11fdcbb450f4b4b72fe40373692c9964181aff085d2a584a0e29543b7e99f0cc9319560da89032d38da5f492467b3abddf852040d1a177db1635770e5ca8266cbd82141200cf9f86026c86b44e0c851c7785d5598a3fa580a19eac6fef98f6dc1f34f3b81e12fb559bb26d553187dc7580b68430b8e40f592a1d4c7488a14cd4aa850b1f8b4100581d5a0bbec94c0ea225dea58e2c782758b3dd1dc66029a871b82b5f3f540b97280b4f26fdee5b11ad7da90b8585f90e541e46a548d9462a0d8526caabd1a705438ef7cc0ab79df1234c0f5df34188824da1aba09352e295d6beda82ed820ec5da9b0671897c7cf58be9996f96bdaea8881e108c5f49198c1179a9156166333cf388473c1e7d157f14ff81d68f19946c9aa775e93534e83a77173f0441b7042e4e28fab8f29c928407dc9017a3c1280dfadcb9db48ab1c6495644dc76015d92936e508c48cfd46c18903ba1d46ddddb8579a255721cc2ec08d4b771c55f438d4177d5df93e59a77f665a14f80f85e2c6cfb74c7b8940413be3bdfd85f8b4a22a3c8e54be415492f76fb412a1af6420cf500fabe8a05a285904be3bb4916fe82cc96b8b0f6a38aa88f6884261ba90e2838bbc835adacc985e639f471e46f71f083f9652b20aa0480d0dc2359e80a353017cd9bb9db1c58402db7652c39fe8e95dfba6caad85d1029e58d81af1ec07a1dded68d0275241ff9b1da740fc588ad4dbd87346759163b4ce774fbcbca364e8ed3f72e7e9c5bd618773cc512ad671f54af835a53a293bdbce761c62b1f0f4f4ce7bbdf1f741c30411f053cbe77071029d034d213f5517af503c89112a0394c2efbca77760925bce4f42dcad45e53524d04f9396c455f41943b0b54223f3ad1aa09644e94104fc01e8a18d104baa973e9db4f48cf89d63718f58e2b0c50ce942e37ade89b5b1979c2a9ec6cd575b32870ef4ff143db615a8898374a3d0ee75224cf10b8a3525657f8631907068cb5c1201eb8e3ab1e85c1109cd27dae1fc2e0dc7d03fa751408ed83f79b96a83aecc51abe57320e37849ad69e7fec4d500357e6ceed0a3ef99f0b347c7be90400d80318f10a6fff3b32becf107558de3908fe2f5bb768bc0384fe2bcaf625cec7c29e0e498ebbe0fa20c400aa1488d38c15eb9fd6d720870c53ba61edb1e37e47fb5e8488cd3f042892287e1b0e6c817bd4e5e6934b704a5e7f9ae0e0323fee2ddc235c5ff4dba95a3d3100714c97a5c51db97240b65a2fed8404dccad67ee536769a636a279227cbb7981c5563bb175526f2d3ab6651e4022226478bcb054ffbd66d55c7d5a875a8f0a9887f76dec013cc86cb05c5bdcfb781bf9eeb6c77068abc6901b4b1811e1cf672073012fb1d1f10b89933e6e624d5edcf537abb514c04d1cb5d32443a6a1aab6bb93dacef15342932fdcc6d327e487503fce1772ee0a4db0389aa28b86d09b5ab5139b92f46105f410d30b79cdc4c34edf342c7251e304c2083a65f551ba287e8de97fccaf7ed5a1dff74193509398f2d33f88a757c302fe75b13dfc7f73436f7121b5382f9bdf551edb8bc0f10c5008628269c778705c8c50c46571f99466298952c78e11cb0da4bbc2a906c112172b680a27727022145967ac8e759f586aa9114c0ab51187a3f09ff5597a88bfbd76c3c328fa2d896ae226c473861b3f62b21ff6be4fe6e062e7e7d4010bad7a58e300f145e8382414f8e64ddfe297488bc9ffa06604984406e5ac5ab1230976c6c099a12972f299f2cedb738504951c07f219a7f88a62ab27322272c182f4e961709554e50114931ed2fc57b3807f950d49a9dad482d56caabd8c15f8bbf96483c43351291fcd416713de107095cc8f559a5b5121ca22cfb08272916061b5a873de03d7da748d1556f6e3dac3d67daf91fc71833a4f07739c458c1088d563335d51f25f169479be35684d9ead62e4ac43ddfa4b87c1caccfe0b9c1c9569b914623314a121b14863f64c150a07a56beb67e0edef268b3952884481a83a6c756bac845ae171020d91ba189beeb5aa3b1477c6b69c4bc41f4e7ad504c0ed75abaf67c7a228868ce751b2fb40b0aa4f092c696f83f06cf79013a03f18d521f265caaa0a1ea4b9f5ebabc771d2d8ac6070c27b7c7d6b8d8fbe922a63de4e38363022534b1876a8aea9bdddc3db46317ada5b8277d35fde33f86a1c571bbc99aed64c2819e8e944c410ed8dcaf4252070ba9e368daa9d3a7f7505b6e37c89f62fb2fae77422ccfef61aad75b6a7215023639266c22b70c88abf191e7dc2491e313f91a3714a685c2cbd530e63db36dc94ab0740e7f93f6c3471db96563ff693a70b35c1d2e33f44dc70ac8f031b2e1d54c22ebef38e76988a8a95c5762416c42d1c2d6467716f67156f813c308e142be1c54ec087d030f9d336990d2c534695b3b7e3e1660895cd504597e22944d4337d3cc5b97ea4b5dbeccdb4bb7b763da5748f307f36b6c03950a4fdfdbff6cb524b1ceab5c47104b4a2e30b854bb3f339823c7afe949b0324aaaa41cbdf333939e4c494f67d1b460655de5e0ae88fa0d94fb59f73f280d792791ed2a640a1ed0a520f974c2ca7f7c96e6f3106079125027aa5c2c42a14e7b8140dd5ac1bac84875d4349376839ce046fe96c813b04ae426e69d7f2f28291a7dde117de32a6d17b5d06ffabc8ad30ae6bbd16af2a1d6f8c445daeebf8fc411705efb16ab08ce80d480bcc0b5797549343ae6d7f37043571e684cb7a8543a07e7afd2d5ccef29d312db2524f2cb881f172f1d5ae860238a2b76b3b7960a8a6f77de891c8f456ae27a57e6d5d3e853e3abc5edebe281fdfe3e71b8ac19354856d17169fd50e4a6b456790f65e3e40afba8380b901de67540328e72820bc0e98ee5257871212e03f78724dc58abb889eb169d2926f0521e3056aeb0921c31122e205765461c112f50d02006978ecff5fa5433854cfa1e3f3af02f92505ae8d81e845bd6e2b404b1264fdde9f5db687bcb81a7e37aa3783352984237d74a262747ed2a38c0b654f77b3fe2044434b5c53ff486f156510254fa97e809cbc5471629e034e0256ef6f87dc043f07e6026a4780bb0a254e644cd9c951cfd3fa0066e78bae2cde51c4e39b10f904aa8d8838e785b69ef96adf7fdd7d1c997f608805f031cd3f665b8d2b715f066dd62ec010a59b4a86944a7d82674aaab5d3e16f8e7228cf1ae80a7b3bc9f2abc8326ad0550ca4dea1a4055f083de39f6f484de6c0be5638aa901cae562f304ee23836adf199d11a633ca7e3ae19d758aeb78c1b376b0fd4b58e6b461abf117261f448d1da375e670621db90661da164699213c01406c32e68764a564ff5f941d6e6b9587c1e9b05219ee8f7eedaa81b5810172f685c34ac5417eb34fe7f75fa6ebf66a6fa7ff373c3eeb982cf1a3044bbc5d3f1078a2ef7807c8b5079918c950b5b476c80edd0a5b4f5bf788046308cf1e43c3bfce641989030e96960f9bba6c53dfe7dc39e0e4095edb0f3f9bf123c29ba7192ab69155260f2fbe9c715bdf6e98d3f099e12db70f92e6a460fb52936afb784cc0a762ff5960e576f58cb09dc1ad75fe8d861bd132ffbe40b9961de55be7f5c451f01ff100105c74a2aaf9d9f96cde45024bbee97a59a5fe85e2d6dcf8a7e466101761cabf5b8e7ede83ef01a38f9894b478bc8ca5ee84a0d0d3e0ccddb3ca408de72f25809e73f5613f47a3d475a511c5daf4d2049454efb265d6910ffd2377e3dc248c59cc81ae312d36c49328706a1b55f16af52263bdff7620e97e2b83ee9d871818aa47b748a319ee6fea0e60b79cf57ea1bb4f190d3cdfbb0638532e41df0e405c0376b6cd80aaa6fc8b952bb14d2b34256d02b274e9149de87c79625b3ee4bbf8b71a42f2318b813913be309e8830b50fe33ef1576601c238292dd665ffe64c39f5c344b57e41c21705d1a35fe42250ed34c69fcc6afb204a18207ab1505c0f7634164b9cc684adc2fc48b9db1c8d29dd9255a52a8bfae6f7937d0c2c944fdb804c2714dfae871449bf602e8a6e3bcaaa3f3d3a98e50a0b1c62918ac162d75901cc6079f6250ca0960dc59959bbc1d5fc765f19f5d774ee5033818936f92d91b0406d89aab92b5b4772d8031a08935cc12a92ace2c304bb34dbbff1d777762e70a98fb3f7b4009b21a2816abf13ecac827578bbe39e9c571abead574e3055b89cbeffe47cd1954a815b9d0303164d9fe52d92f558b11a8131522014d681d68bbd91ce8ee0e1130c2d7a53eb81c46aa1768f11410049761858d702377f56a7e129c48218e4d2b6c744186617b6e574c635b5038158e8e449194f7a7b3f40fa15b6d5c1aeec5c7313773302243c4d78e90c13e5ae4a8ac80d05e9c3d2797478bcc84ae14cecefe7c6c094a6bab03272be5b79df937d5aa279f0886829af55fab1fe8dd9c959acd082dffadb227eedcb0f51ad3900666dc5f46d909cb0c1a5fd81e9b25fa26a96a42a164c118617646d3b0b0373ffe619cc4129ded90d28cf924e753fd9b908aa9745b731efbd46dd8202d9faf9b452ee3f648afc8c4d74d41e4e930bf858ced68669a16ae30de0826ee9e7972f1712669f8b095277c7f77377f73a8ebed9b1545726710805f6dd6ce5319aa65210c489321979f4eacdf4ab59af1f253a83107051c6049708553b22bfc1a1fc4f294b1ec1054e34bc31b27825f2793874cc4dca34e869bbf2d40710f1bf78059848d9e34b44a5d227dc39b97118d5476d6034135cea38b293fcd292ddaf4f8597e6f597393a292d1879dd390c382c24ddb405d0a8fbe6970963622757e060c345519dae5eb81051684b9159c74f710839cfc837675d9e77e70a63bd24fb8e557e3f19f89cb9322eddfdbdd5ad3edec8ed1ef99388aa8ad842725163b0f06f3c1628e660fea7def99da4a6f3ca509456ef0e099d5a705abfff2cf589debf99d12a7b718112dfea7e37b97dbaac0eb7a3dfd9cf495ca0d7b2f69f439b393c0528836c739f525c109050c61fc4577026d7575b6ebf32685b8ff730021a18e0333ab64d369493ef42886cbf1528127e2e3ec695dae05d76187d346e5df46cea02786478ee387a85978e8bb4f0bb50057ca5edf341b79437a71ee0c62dc1d8e55e59d66b431e29450fca2c18837ca0dfdbc892694c2e5e5c71497536e250484eb4947603a40fa697292e2b3191105446b000e7ec2359bf85bbf3f46508d2046456d55b49855d96cae99f4b887e2c4d3914f4fb1cf8d40767bce0bd9a9a8a4a6be9ba3d144ef7eab56ccd62dbfec9c2535f05600579e55b83570d98242508ce6e5d24eb84fabc6d2bb3b5191d622e7aa6cb35383a715103b55849ebcf59b15b69f727e96f710326304319c2b5420fa14b4afc8d668ddd646a48d46f8f997bfd4985bfc525c93ccab2dbc3b093e12047cf09ead285c8c16ba156eb70dcb6190f6048ef79b928d02e99f7c302767f67566279af7fef4c2f33e3abf13bea5911073bd0843a3a1156f0f2cedf6adf3fe1d3b201a56e6023e9a2d85933d101818485c44c3462d01cdbc74c8cb738289ba697a77fea9279a56b1a2a1c80205faab2476184a318cb755bbd301f8f9e3a53aec72b4232bf205980935bc6be1e75be855aee364e01bffd9a5b2891d98d7bd0216d996a1ad9e04229a3499aba053c7def192fd195e78fe5ae2edde301699a78dd2020d3d9a1b980a8f3971857d9731ae7dcf4e857f9c123b11af3953291112b00dc7826bfd3604cb54f37e7f5b8fc579b8448fcda674548fd80c4fdda3136a711e05bb30c9225779cf7288a9fae2e965cdadee424c67c4965f06f9b98d74da305c2a852642df7930b08b6b7fd353c1780c896b506cf45f8819eca608e3da8b9c6f86b516824479df1fa63730541b4a61d3949a94b7d2853b224e9e4f89b5216c14ff06fe54d061ec94fb247cbc8a9cb9ff3fbeb76203918438043018290ebf09708be8e0e39b8ac45cb74cdf092a60f84faa04ec25d5dae6e0fb1d52071cc1a84c3a0b957370b4a6e292baec91db66a6cef5582a8df125869eeb6cc4d9a0553dd75d5910e3891035928cddb2bee6b00bfde57d78e91478db1cdffbf2bb5c135d4135990577e6edf122f99f25b7ec4180d8b3458c6591ee3f0c8f8d4459757c8ccbf6d5f8595c3337695d20496f83f9b8c8845a50a905ce1cdebbe6e5c029c1ac5408ff4a20205785993c79de7335de90076367213183bbe29389a85c6498a5d1603cb5a9b2c9136c4b65c5702693c4943c632907e48fb230f7634bb80ba4c7469e7ef89b78381d157509ad29be6") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_256f_test.go b/ref/params/tests/vector_sphincs_sha2_256f_test.go new file mode 100644 index 0000000..5e3fd91 --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_256f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_256f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("93d8d7aff683728c175300103dfe1cf98042820b3f77fad93bd6c54eb430c935b49b651bc12a267293dee932c62f1aa96bd75daed339c8e554ae9e090e71ee75e0900c256c5ce2ec0112df5b5a861cbdf44fc1c53f042e5a2add246c22cc306a3ccb3d02de04d6c69ece144e6874976890cf50aaf50a967f4f77fc5e90947a5f") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("e0900c256c5ce2ec0112df5b5a861cbdf44fc1c53f042e5a2add246c22cc306a3ccb3d02de04d6c69ece144e6874976890cf50aaf50a967f4f77fc5e90947a5f") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("146a26b7d66104d824b3ed2caad5aa508d62d1780d1d8c99119487eadfa4acf1849d999640c070cd4801e34c9710cf72bf3444b9617f8de7b002f08d17118399b8dfdc2a4fcd14f6806276f20ee8095263e8d54c2f717c756a023224c281661070295992333c2c979b3ca9803f243eed56969c17b8ebd61679407aaf90ff040b872f56c7f8b419edb765fedfd401f0d1591da6133154845df2498e9f5fc2583e1b245db6d81cdfd7d0e988e4ce2dc4c98427b830326439e93313ba7a8f74fe0550e2dc189500b2a260f2432dd16d2cba80ab345c91ae44c9f49a9b452708fe6b157bd5f46850e297706834a3bc68bf935c1b07f567e22cda0e8e62c79b8c6f7736ac2b8bccf550fbe318b5c93616622256d1353417c90cda3f032a2c3d24cd28fb7fed19a61c436de7928de66083b32bfa6cef918188e923f36af21a5f283a458562f05271ccae1977e28cc0f8ab4a75e86e354e9af84bc09c3b9ae82e335a0a9d11b93faef157030dfe186f3d79da93e9e01caed4d7cc66736c254831d6033b5d0c60aa069f5d3f39d56ce332f1697fd0fcf4b8f6f6c3a099d12b74ba767c1f2fdf34e3d6b6abf4063162623b77b5ce564d6d38553252761afcacbc2be98781d259ad7eff3fc1d73c972fd8c88ccdcc858247db7ba7f3da02d45337acd31f08b719565b6b43acf27d577bc993fdd5ff0b20fb8d0c0dc313c501060b68b03f8f6e174cab7dee4a90ccbae95abafb05ec6e98637e1a863385b4227d29e39deb78065fb33e62e7a75991b86652b0426a458054a647a9185b02c729151358b8787c4c8c8f72d0a7297cf288a591651116b5d1af146cad4364cf9b10a1cb2fcdbf51ef03447effb8d7f07e557ae5c47d08100bb0336bfbb70c7456c07953d1aefdfd71f2a0c43c7cbf6a8c95e85b7a08609fc986b8dca5a3ee95286b7529e60b95bf2d046a6601ab1359a340d0e332f70e16b3688d12c2eb028529decc512fb29ad3ecd5b776ae1748d4b45b3c666003076a4254bb648a17ae639cc71e75819f5ded5e5a18c567946ef6fc3a0e910976f1583b6f62c0cd566285be26ecbaa52adf3b9ccfaaee75d54ca1ea8d7d6d8c5c6e167f61bbb0595aef02da83ff52f584b1b536ab45bcffb80ae22f01e6bcaa21471f18b06c3024eb1eed277a5bf52335688f2333cba19e9ae94232e3a894620bb986334a31715da00141a6fc2a1da2ec43dbcc0e79a7b187bf6767778621d4baa2674985b200f88701079cdb3cd652baf49fa592beaf9b7264a8a23d283e85faa38bc15d7d1afc6fd743830f869bdb27a09fa399e0d37a72bd355437e8af7653b2b26c9ed10e58b2deb56948825d4881bfa24007d7e81925896bfc621fa22750c181e4654dd4a248567525d61872826a1da7fd015069fe161e9fdb235d1581ff2fc5d48cc652f58a88a5b8518f0733b1f08ab5fd3709d00569f09cfeabf2315cc532e5183adadb2e25e2c3487f34330a5da8a4a10b24afb17443ffc239c65711a6984ce0ddff912ee63ec7987dee50270c458cef6ca63f49267368aa7dd5ecbe7db343f9a3ebdd3d5c1625499a369de939e8a54068ec120dc611649e2397bb138e84140b717912bc8c3a21163cfbc4049b5f71afe694f0ff784b0efa458a4f29644479911a23977175357f772b58f42863841445c9f72945aa84585d49f9678611fca21ba7ef97ca9178d515b4b9464c188315e4fe580fc52f16168666ff75b0d3fb6ecf2e2f17d6b28807c98854a6a9f716af927aca585a87292b057433b332ce4e7b8b420f58cf10e9fa2f4a67b33f68928c9522371cda30f6ce2255981f5f4544ae5be17270590a92555382b18923d74881363529a1880ed68494b755f425dc2184ede9f0a6d168e1d4231077a6ab5894f73402ea07ac19e1bdb1691529cdc68f74fe4b68aa284230b350b813351a1b5d37af140a6aee40c154bac37000678041995415f95f6e2df9f2e247603032b9a4c47e65401d9768ec58546e6bad82211c24fe59f5a93d0add76715ae4192efceb8c9ebeb080597c9812aa4da22159197d0ca5969cdd9dcbcfd03ceb2d186ea453a9223bf1456050d0154e890171f9cb508b935a0f0dcd851864948162c29f40c585bb2da323771931161d114fd184251f5ae879b851da808ec9ebaebbbeb1fc071a79d5c787d4118e0fd7864bc0811c87243c88f6c5e97d1daa1f06c3b8470413ff2134f888356999af3a5b9604acb34efe068297925dd05d337eb2f37ed1b7c943b2e012cebcfd63344b945866732ca51aac0786a3595ce2d80d869d7bd3d4bf2a26a716fd8eff044905a242bf9cab27242d154a061c40414f2caf1951a33a0a76d2e6358d9aabae910ca4f4c5a4ee3c47eff513e08fa2e992a82c472f7c9bec36921fa9001a9cf3237359b7e929eb82a6f9579f698fa83662c1653424805e1d1c176ee2f65c6679d074816824609a3715e9794fb7ec22a88261deeb33847644e2c668f2b9ba9662c556ee185ff7f18e3b76b473f1c74ea6af9f3087ce43006bc0f230f3b2bde81a8fb83455508d48f10f4cf06af49121b7e515d8e159edc5b14c6bee266b536650a1fb5c824c81d88220da7382b39299e02a5feb897c7236e3431512daade48ec606adb0c767637d2c7e59cad75362bff6150bc079366b3788a41b9626ad79f366077e9aa65bfddc9a96cf6bef7dda43c448fe8742736349e1305962b420ec99335a5c22565c2f5ff80b392cf21680d7eaabf01659b74824fee491e2ef9f116737a973955209fbce127823025796a5f78205504e432a52295460881c4f101c59f10fcba2f2ebaaea161abf97acac0b86db7eac304e78604785752a561102fcc4787ca4b8116cc92ff7415394237fcc5e4372da56148c6c7ffd8ee21d6593a7a3f4d98edd972069b580028a847598b8d957359cc7bcfe15e86d89fe66d033152ce42e8a1e91164faddaddc8a64077ac02dc919e5a95a9ef30d4ff4f274a5ea1d973bb2cf27ca3830bda3c0079911a4dca7124c793bf9c10a2fca31cf928672eb93a404bb0f6dd46eed25727ca3796756cca77cc00806d3889b6b73df1b407b4639b0ca5119ca3fa507b12cb7fcce35cd2138ee89aafa19ed75d2f745985c29b472eb7118311fb5f1ef674026a356607839fdf38ab57129ebac94cb63a2ee9e97f49e392954eaf2d04c1f066dbc623e67baaef2ad1db04da1092578fac19aab2b4535139d08ab1c11bdf9ec1faa3ba797ad9abe4ddabdd1b257cba4638abf3023851fd3f2e2db5db367e0b9c883492efe081167fec114ee4120b8dc8a92ff6e04782d08ee6f1223b32e6aa1de1e78efb50bf219343739fabbe6af524282e178290a279831e23cba74c67f8cf13ad728096253a773808cf44c89bf78a0b55b7e1a4542c096944382dbd49582d04f57785db902a524e33cbf81e9d45fa33e4dbc961ed4fccdea316734e348ab3f3d1df094508b4162f1eeb68a0d265c1585997fb0471513737c2075a81c702127b4cc69f0e5448735eab26255780ca6f3caa3bcda41ebc230249b084fb6fb78d36c3312424098217d32d6d9a16fa1804896955cd4c109964efb74263b7379d7b077724dd1b15fff950c8a4e7a7d115c73a2f0e25b9fef1086f628c5911ebb4ff90654636baf44ce3b737b692ea7a3172afa154b02e68007ca516fb7f2b615abafa11ccdd118cf3ec392121b9516f7093a5bc026e9ee4ab1b15a438d0ad3f0562aeedaa915dc59822c38f50d951be90042f0d7d4295d2e86986ffc4f8aa4ce645bc520c2fed7c2d6c1a267504d55cde2409a3d89ebf189589792ed9e8e1f50960082277a88c1c9d6b3c13222ae1d84286a005cb82e8bb16d4bd84fe7131a2f2fc2a3828b17002548407e8ae6fb7be3111e021f313a4cb5b58725a7ae29acb030d2351e550e15d7acca3c970abdbdd441f0596dfc359844fa43cfe5b49e9c0b40dc5bf93288680e54af4e4fa6fda7a1b6fa793e572912168478cd3ad7e3ef55ff06b8f59edf0feee271142fe1d6443785d79ea672b079836077ed73416fbae4a8cd6075e1763ff04a574acf9ffa38df0ffcf6ecfa893be565b3b20e443c35fedcf3f42905270939a18118e0774cacb2893db79c716e9d643cf39d93ab1bad29850a2fdf388591e46064565731459f480f92829fcb621477e8f0a2765407c55bfaea969b8e4f0c4632994632aa806a1668c9979058036de4115627f5d2f09d76a0720eac800b0cc787b6788ffb38c8cd45f093e7f3f9fc87573083e74ba14d27f82a8a65e3dca2acae768d2f770dd1972863dbf249247ef548bb60862fc4e397871e6e0b30cac138deb076d7c5a358d87b22c76a44833c12890209cecd293796f1d52da0d5d90dc6cb6c067b8e79dc7beea911ba3266c575cf1e65449bacd273cfc4209d2759727784daae67a41c2412df872023bd98f540d670fc5bcff9a594f3004756c6b42160fdafe0556ec7bf0c5c2ae12deb5a4680c9f485746c1f5588aaf4da6ee6d544c009f873ca53ad8a4317f5945bf07c7b3799101e7306c74d8407a7f65d4dec7db1a2a309b2d40b0d546f0e77264000811e9322d810fef117b01d5dfc76a996fc142a7eb79d92a88bc2dbff2fd203ff35706b78a1ec4a2a9dee6f6ef78350106eafcf399978279bbe068b0560131afeaa4555f763c593948149691d84d7b03f4d2f9145d6f2fd4af12eb6ee7eccad73347114ea34d9b9a152f52c1f6317486e886077cb0d599a5cc4f0b6e144d7e3baa53efe282208466d4a47048302ac016437a0b662294f1cf0123b1ed5929c4757b07eea73d3f06d8a2cfebbadd847d0e1f9a31598e191030990d5920e35c639ec5f25db954bc786d17e0d2c05f0ce1d92a18bd9d1ee1b680a6c5eee05f122ca2126c9a64bbc514720bc71951284ecb7f464a33e2637c5e15064f849adb56ac8ba96c496164370cd0d73f22e3ae6744577850c459411a07b3da954aaae98c327209a54ba8eb37b435660a7ea0165d30e0695f0457e63c52bee509163d2ec1dfe5da823bb6f2718019248a28f3e630f92396ae81e6db279cbcdec621c4dc38b292dd916e5c55625c2c773fe3375e59c72db4a2da30fdd5e19deb64170c986468bb7c02a82f126af11fe74933d5e9304af09dbd123e41ca6e722b205d26428275528e5ed70a41b2f208039a50febaaffbc21d562136a2b005e8f21ba8c5acd93c19878c04870e2287a43b85b63c71b4fe30f6de1cc98f6effee2546312daa9f3ca6927de1def4802345be6756118bc5bbe7b0dc909b71807db72639c312bc7566c577807e6200c915ce264c8d573ac61313751f4b22a0addc7640f3db35b44d07f0bfebd08f7c53e529903eff67abc989c605dfe606757d5113ae1ae5a7ca19020a8bd3b6c6b28fc23fd1258444efb89e273e51b54f39ec0788e825b3b16440690a80cc26d8ca25ba7632ac63fb4ce31911730b2af5b329408f0e494855993b04ef500d085837caf449e7bfb3099b4d6c9496148c14705741aa5e4c47da29b4636fd4bfbf8185565575abc54ab2350607126281a5a77eb5045b775fecbc09e61cd4cd77848c17bc0241af417763c9d5b97357f240234a48bc6024f092d13f67a133b43c3d6694e2a6df6d0897951387d0ed3dac5e5006fd43c8dde068f121d92db94669253d3fce0563f40ae8d995ec4f560f1b7cc051409034f3df2a425a5227d50bd29730e0d7b6509a6ae95b4d169e71a49d3f3e9ed5e6e3dbcb5fcdf6ad96b3908c94bb07c61db6f35cc06870c3ec69f6d8d272dddcd994b54a955e69b673f78b648681af50475ec5b1c51fc5df86f278d262950c24357c57d551bc6add22db7a6cdd358ac49cd8aaba71ad14e698f611990aee5b5d3b5b0aab3f5c27edc87ebda818dbacfc6d0144686f3a6d1a496ed830f799480facf9d43ef930fc45874e99f2f4fe5b8735cc770b228710e94851445c4c1e8a3b6fd381f7c5e7d1bc3a75fbd1496ff9e8a79ca0627e9c667941363bc3f96c3526c1bfb2a428b94f74e40f04d1c47e499aeb4dae4841ca16c1f6f49728f9e731b5db4f861ea6dd66811d37171206daf6e1500a71b62ce68b6fe890ed212ec063f938ead477a46d820d4b47a8475566519b8340ab0a7f8006d635b51013935852c802722d452562164949cd82811eab81896c9a1ec51d671803826792027fca75cdde71b9f9e28cad881cd57a40dd5159990b353d2c3dbac1d729eede480b48cd5e6d84824fd457f7dcd7613865e2d7ee473520ea74c4bb93eca3f0c415a060d007f90a5de2d8e74f9748bf0f2b06953db8eed2aedaf8ed306ad53bf934967f52d98966629809202325e0e25c1cfd5994b54e382a474338ec17ac93f5927208fcfcebd76747a48a746ec8d6553a17c54134c4470b2b3e12fc05827bb5ac840aecb7a37db2eb5805f3f245b6732c3479df1b1693dba29bacfbf7aa31b9ea134c78c2678bef4d671ed496dc03bd850ff8c75defa09e438afb47dd612313ca5281de93ba50b98859fbcf51601d69212a04b1dcda7913086171276a2d72ab9b942c38384640c9095b195dcf61d84abcdade6c71922c4d3107ac56844e516cb474500c1c1019404967cdcb759199145ae7e0415d99c29350074a2d2a5ffd497ac3880f0b99cde847905e23374389c14d5ba2c4d7e3ae22ccc2ed11b35ae9376dd191daf4c1c3ab7672a401f4dc7ec181fb842089eee50161cc0a94b5114fbe3ac82fd7b6947b694e08fbfda8a0ea0a353191ad0df82fc1c9dd539ebacfa42640369c431a3a1202cbd1316caa3ebf9534bc87d9483365a251ad2f5b62a1d454f472cd47f5a53a4e182c7f4e6d0270b44a4194795fd43d6d1513eac3969dd6c96dde1c822aa835f1159a20583abe2b6c85588796f8560db56afebe9231f8c1511641435f3c81f588cefbbaf302b29408d431cd857c9c8cc82a92b7a3edf443d7391c57387e64e7f0118b07f4a7505a9b97feef510878e88cfff7f0081d70b9818b021e8e693563329e5693296de219b916979701ec8357efd242c55d789ef40a3559f2132f899a0d55dd03313b1034940b9c81f3190a6b6ca68d793791980e061889f5be17ded3ed1fa06f5509ce8e0001b43121033589954c53fbb99f175ec152b789bbdb9a8e9fedda78d09255c17c804e597f9465fde0dbf98e032d581320860a4c9871ebbb6ea034050e932bc2a6b48a1742877f259e4ed7b3ec6b2b2a2adf39b34807795855fa53dcda8c560eb0248e851dde542ab8f40c67a2650abb61da04bc203aa2bc8e60dc592f08ea272c8f2df096667fc8b68d1e50d461dc67e2840012f10aec4eab7f486a6c795e74362755b335b5a4584027ec00a442d3bc635c55a54e8ed18df8a0c75b562936ac793e4219764724a51ea00eb3032a4e12bb01be8a987730622b65daec5f3d74f3cc4284aca8bf2e0b32e6ed5ed0380a50176c0480a25fe38bc30b062ad2a61e5c287c5852215266f413258541f8b7d6f1ac289dabb1621de89a353be3657f526823d7d3279b31488a927c91e572ec01a4b6905b1be956940ccc0a4280368844a8511d599ae6be4dcff9084d2f0f93bd4d5c4b8f93e8530fab6f1caf0483189059a6ed814b27faa618beb66c97f515f42aa5b2efa98fb46b85b93b984b00651e8bfc4ebe15cc48fb9b3c29a7545597e492365de5af3fc2d3dd2c74811972731bf517861ca19117d12f4ffe300e973002824892f488e8f2b0c29621bb2b0907e346ae4b87028afcd87c80e66ff72ebb7ac9edba336c47dc443e07118c14ef83a1070839600a9af3616497e173d9e01046ea62cfd7d150f4c049680c47f0497b2c4d74419bbc0bbe93520b6473bfaba75e9a3b4cb39cc15b79525c046e3b35a0626690930714e0a186bb90c346a6a1e970882e7529eda0302e5b417a739a0a44f36f53f001947f5ec0a9d00bc3d6fe1a97b345f2dc742da55f2bddd9097c940d280a315b524d6ebdf8b2c9ae60fe5444855d41391d32d0998b357dbf6f84f783095687f893df0247ce15ede7bf5cda82ceb0d19a2cdef4b2179c85903c2c79a10e3e0f5f5763301b0d917f16fe0721d1ccd5953d8ae6252fbbecc98d855352be2b26e5d4c0f146505634a98d68b26dcd2176a2df60a679672ecc9d4994eff4db64f4e1fc68fb79fa9a173bbb477fea52ac8424b2264a301824e5a30e283fa4558471a68114d812eb50ad6636003a0aa5f206af4e577985ca6916cdcd9c409a7697ba0913827129a8404f2bb51abbd2be60dd350290a47e442a228cf6f349a11b123df61bd8ab7ac8c879a1e3ffbd62e18d63a2a506e2dde1279dedb14225556d878301f09631091d7ddbc22a4ef580e37f01d1a9f9046765636f8cedd815c4922b55f1bdbb89d252a59365d12bacd3576864834daed455c32e5e38d98de6931fc9692244d11bc00ae67433074de5f29684f55f6fc124608461ac0577a0b9aac6474efae0eadaf3734c705e01fb2e85c1f4686e69dac0159ed0ac6fab6f9c1da08d0ef5d3d8d4cce8fd78b0af4c94eb4024b1e6bdbf852da921790206a4b381e313e0d25744d1853d3c3bb7033faf7cf14ac10dd6a8869fe22ca6040ca8f5905ab7530b021841aaddc47e7d7d5387ef3fcebeced64953d387a374849a01b316721686b120d749a02dec74bbd3105997990c31167ad58ded5d9f7f041d5a8740e0665336296ad1016e7313b74847446e359e4586d17e1ae9e0479abcbab505879e3373bc3271052c06354e9adda448dba6c39fa172bd0d2a9f56847d4ef5adb254b38268d4b9b5d9ad9c6657b0f926f986c0767bf9a7bb0bca1af90be4e8cf35992552e461d00880a6014c937f48ddad5e1fef704c5c7fb0ff45eea825a451b91b3ad0254c29c5f97dbf3ad1a041b1dacfaa01b317da10c52f714a74470f90fee106004891f22e2704c738efb010c6dc22c55c87d8f768c9233ca024afea3256bac5b53f439f3f0e7fe1dbccad731ac153a73d56f7fafec07a881a8e5cc2208c1b1140c67847a9e3df8796475318b56865a91195a2405277820bf068ad0352bbffd1718b456c3d2b228f9ab048a79f5499423fac20260a7bf44e16c2248149c79d7283b213d0a96ebcc0eabde4ef70c8a86042220e1569c5e22a53d55e6920b11f9f6dad5ff38c3c48b25a85dbf59ef91f86572df1d4d7e6d1e2416cb33edde4bab9edc0fccc45fd61b0188a971e4fb49cc8da62b871316ccfc7f07f84263ede2d6acf5e0dab7c6fb4624e722420614593e164e0cd6a53492118b4b9ac64f91386fe858bfc1608e2e885d87ac303bda9753f6a85dea3641c925baf11bf8c19ef50e7193ff1c51ce6382cf8f526bfe25765aa2ef2c6437773b69b586b9853aa8dafbadad343078328be341d6b668fe9a78f250bae1b5ddfd5cc3d90da75c77a3c5e4ab370f30bea8cac05e67959a34e3ac2263836dbaf780d5a270fd519c50d5992615efa92a3073734a5f2e20a0f039e3d08c32401d3f12f6998cf17273050f40d0d0bfbca7370539ca96f8f5238ac18cfa937ba1b8d63c54c99fbc02684a23507d4093c106b19c6e7ee1e8f7b64e9aec0090f287af67006eb98767156b52c2cef840a3b079d6250efe0a1ea9a90b9c47a719f851963249866bc54825dab2b632137c1a09d16949bba060f6dbd6675bbbcb9239ccc3da3a401f78d471b0f98efa9d71ff0b96c0495039a18acc16feb004d6f8401996fb68ab1f64cbddf3d1072b284914cd89344a9c5e6a158cfd9b823c3ec03acfe1ca206d7f46476c296dec8289670780969e16e2c26f3d03a7a25da542584f8742c74202e1a2055a3ed770979ced1c714e848ba1fb0e307a12f098aaaac636f62cb0683875862dfbcfc35d7ea72f6e9ac9427aff11afc6e85379c7c2ae5d658a0d28e34b13797e8585c43ddb2eda89eeb757f500a21be0e68953a0a44d2f3cb0a45da30171d3fe00f82643158267c1ebf25f5e55643b9ba3f3d384fee1a2370f1ebb702786d0cd0835f155f6cc2d6b8dead94d3eeeed76626d81ba92c2882dfcb5c6ad41f4139d6f98449cfd2ff5b1729978dd668e3714aaec35d5cfd0bb5c7f872ad78fdc5e6eee7425732fada1ddbdc45bd7389403f2dbac85afffadf2254a8976995439db3ac760937023a3ef4f9e79076ebf479f54ba366d332e8de6166e62f519ea19b4a7ba22611e231cdb1a68b8c2311edaf9f76be85503ee409e35aee934ed80b5c97fdce7c8fd82c9f219058e8986e995cdf30338e3e17e9df7584d7d0fd015b2a35a636ffaa1a78a517949a0825728105fdee334d6b829770069a0aefde2051705632a3f5b326ab46c4db64641e08c4749181a5a2c2f94faa7977be0caedad9746768d5d1eb9326a0ed507519543a57d783ba4713dc77de49c4ad284d4e5db186f9cd967f3bd2ad6b1bcbed93c91211574c8fef68d494172dcd6282155b559e1a04bd327546cf2669dff4afdcbbaee2565b6b1da19dbe60d11f8ab27384cf52530705d078a498f80e027feaf5ae0b44aa5d960c53b7201ba1aa0572f4dc06fd5edee1334662c7b5c848f3e8c114aca9b3a5de6aee9339e2db4d38d9014d1e25790dbf176d4f4ec14f5928ca6537252a20e36dda16d467706bc4eb2f4a6256a2936908389aba413b3f2bdc8e97edd57fb332b264113f39a80c19c067eb6139988c9bc33087fce219ba3f33cb147db734261568b23528367c9152c759568db6b12bdcdb6b00d3b0db6fdf5605f9a1cbe8d2d901fa3308f108b9ca37e8739de10724dc3fe672fa0d1ae1d7e56f15d1244f582f35365b29f436d4849b0324b7cb2e6ce3a1b86951d78de561d467a643dbffe58dede15aa8db308e5f81417b22dabefb09690b21a98a1f0a14d844733fdfb42ab8392b2d59056569b9e869427e5b1bfa331f93b1e5bfb6172feaad6a95663bdb7b7de40a9a1967e8f7e7cda7db427afb98bfe192662f1c00acf04423d83c7ce5d247523ce33d1a5f559691b0236c6232e0c26f1e0e2bef0c3cbc8c163f6141704ef71db73fca7c17afa5608f38431f855f88dda6dbeb832c39f96295666b3e26d29962180796aee3f8ffe2587b1f0dc5f97d960e81b7a35d614afa506032c0d78e25a98ec866f206924e86363a37551427622a93fcb3a3b0b99f3d5f211463c4701d3d36ecb32ba0d9c7440c89d12387f84c681822592ab0a6684fa2797c655fb8949c9e4a53ab8a2f2a1c113723c81e3c35a27575df417db0405374488ab1568b73adb8d8c7868027aea8a6b7819cb34b7eb14985145ccb8bea3f389e0b64a4f0111ae41980248c02ba112ae014700d9bb73943b5134923c14b250e905f6608a6bac87410ad2e0157f95678910efe9bb469e228d2d83a906fa7ce54786c95757aa71a45c1edfdce5bfd5316db59674a0ef1de95d5f207785fe4a96a59acddae3e73ffc67c4383a389ca91c439ba9b6ac4182dcffcdcff60ea1daa9fb5a4a7f6b4b84eaf343edb314e2759fb7f7dd0036f770fa77bc6e6ca5b4b50165567e7102dd8ff68b723f28192b21a68c1a54c7a302883bbc3d6bc2c7f37ee68ae23c2efc6c44e3759d152147c5c2edafeb30081dab479e3842fd5ae366a72c07ddb181e54baf138aa13d71af786e713a4c4d59ac6e4bdda3b60e9816b705217b5be92ec6f9272b5cc28ac6f8a5cb9ea892f4d9c431aab5db5520258f6ff54fee2ea88f8c6be91de56cf6cd019b02be94b4a8bf918b03e5cfa1dfc8c316124b32ea6ccda87b464fe665253e05260772e9af8c1864adb13eca2f17e83c482da1af19148b58815bd0e07cc014b972ebfc0abd658c7b918bf191b8e92765940193e8e1c960ae1ef6aa975e8cb9681abbdbf5748586551b91eb8296375bbfe5f6e6ec699f826e06b682c2cf81fb65cc397a726147d43effb7b9d8b9923e56fccc560a6d1028eaec54afda7336280cefcdd06a7ae3daacfd5e8144384eba78648589e9d3118f2444a86a8533a11e0b42b1b2b3134c8377729da90f8d321a4731556d2e78fde3d95a5d9981680f2ff61be4e37f282535c35d95910e9fc6f298845447745d9277ae2737d5471a91c0aa82234e78f691cd588b1cbd3a67859853868610d20e260cb00b629f3ea9eb46f5d244dae435097025f7f804f8dc9b9b29b43351834131509b7f6a9a3df1923f94a57fa62938ad99096082a6cfb6553b315fab99f5a7fce765e6dfc58cefab3c82bf06d7e3d26a0126749c9425be160f14ba0a06c4967f3887a2a1de7d22f1b8ad6e5ba195590359103a4bec50a624283274702b1035eb1a5b4929dfab2743f16c73381208ebbf1a5c80d7b3e709f9a99508c32be1a1b26e55904f17bfd8658bc183375231bb381520acda9e9548f51aa9b27e04ba4cc6d2d40131c6f0bc918706b5d86658eee0389c91c68848c610ea9f9b81589fd6356e5d1644c65a1ae08f9499737e71bb248a9d4de0ae8e96dd559994864f79851abb6b1a1394ed0602231076103c745cc79c3f445c5128556cf45782baa7ab531a6a75a44cc99f0481e397accba13251b2008b096eef8745f1a2ea399ebbe8c06b128fd5f41a2b485eb462eb29c8e286bd3a8e753e085ebe6de5119f7efdfff74039d8942673482cc416cd32eb4faacf244ebed8a0c72f6334dc9de14d8fc59faf8126449863b329215a4a2388c1e3c70c4f764b4e21fc38812c9f292a81b2b647044063a64567392e45fae2c24eba7662fd7bb28a25b5725cf75c3a6829700eb80b0ea675f55f8607883ad9bd3b512092a481cfa4e50231e621743bbb79b9505295a9dd90f153bfa191901c4e7476fdf9080561e000af7046b7a6510e3932942761cce14def336b733521f2779499e96c6b8d8c3bd1c645f3b419af044426f564def464e09d042596738244b8cffb15455c1ad5ccf5f99d72c9de934465e9958c2ca2dcf8e7f9c110c82cee8d8eeef4c56b25f186e2d24e885452c0df192d7eaa875b9b54cc8db49f27eb86bf09a6a663566da9131ff0c0ba14d0b7f854e2a91b6577ae7d6036a4a3e6ce8cbd3d3527150a1a8ca5b96984e0d847d3d2671f9e37e58731c4b1886cee7c7959152ef4963061c49a099b3ae369ed01887de631a84010be39e349aff7ecd2edcf27a92c99f6f22d5ed4fbb741d1292f5642d768db46afd642aa7ac58b3bb0f556aad61574811583d33d72c40711262f3546378135baff6ceab999595661bd3add4cccba54c1022e00dee1f3ce2a3e3f44f115bf5c7a5b0534d2843573c01c51662036c2f0e4ecdac1477f5f1ec0c99c5af5fbadaa90c4ff20feb3342f8b1b99db075e20fa7d6f2c57ea3b7357e5c853bac149df165a4196ea0271cb11dfe38f93bd57ac27b5dbfb35658daa19a8aa8058f5efde59150ad512d89763373c009c4512657d49ef3767617d415be26bf58e2ddf811a4028a03ab60f84f52ff89fd13de912736d5dd49dea1c49d6ea21e3c8b23d94e93a3c29e15620b166867e4e1c2880a4a2a23c425f088695a84b633508c5c09f24df979a3b8115c04a0cc5587c5a840f794d2581ce78afc9c8993b90ebcaa7d32438570944c9ebb536ffbbbdc8f87f898a79ad3b23dba369c32d909bb198d6e33ced3098625c60e67918093f364a03a95ef1b14fcaf62d207f6c40a4e12e9bc9ea802c7933a62ac023def456b0871eb115cf100c1244165eca88910deea8e40c7971f28119e38fd76576bdc3515c436aa8695d39ef894e711451744887921839b6dfa258d85e80b9cd3494af3f6026bc42f4f61b11cf866bfc27a68f89e25fcd241baa72ab780d73b3ce92615d1ee0f93fb7726bf160003339f9458a5acf72220ac605a62e05dc06d6dd831bcc127f0c6769d5c07f4f4394a2c58dd1bcea11a7c2a99667a16ea6e2766483458846042242a6ccc8450a044587a85e135e3bf84736aa13c6914ebe132260b68ab259dd6ad67198b7cab313961d33e8d366f2c2a94f1f10194ee2f2d5b3ba17a1a7b4630981bdbb1cf7c3140af4bb4315a7f220e20621e3e1408e0545ebf28c661557224409659f0d1ad3b49fe36ba2fce33e5f9e42379e768838ac105209cef8e7d7d0ee6383c8f6fd29086a6693799df3d8a52779530a4d068c386962dc7dad4f4a2b46b377c9de830b81cee92d8ad68f81fc6807515aa0a482662d8d25c598c4d67849a315170fe32f5263b958e28eb85f8d13d30d8daf2904b04b3b91e2068f3abc0643b19c82f1522cc5db8a2d4098fdbc2d51ac3c3607cb238259b356cd7b79e838d52eee72c6649ab3e045d314ad01d76a004f81ce93e4832a87b2a9add21f78488c8ef60eaf570eec9ffbbbe0bf5fd40df13a46aa887999d6d93211fa4cb19427f5b65520d18c5b29d293d33fa92c280c202a0bd0d010202eec46de3246a2e26b0e8bd0307135cf8ea3a1a492f50e0216e5ef7bac46aaa8bbc97343968fad0fc3f1bd1aea4052288c3b76097ffb8746d51f8bcf44ac0e7403a99da930dde11f49001f7b75f9b207bf9b329d0ffe84702914556527f175d01fe0bae8ee03615703b3b1c7fa5e9dd10e5c1ebaf6d153ada15eee1f0cfedadc2f189f96ce9a72c4b22d974afdcdb7a5df37dbf2c8fd4b580168ba8d348a9bddcb47a9d64b85d456e684241662e82e89a02e2dc801a46453e5341cb59307eead0b3d18dddc335cce4b4d924abdbdf37053c50475dadb8feb984d4b8df7c72fc099bac1b0afd22242e82e48d42b0e2d57092844584fa1412ffb330842f7e93029f06ab94c4cf0331179c28d9e4a4af47b4647273552d2a0594de118f024c3e958f36c11a5bf23837145a513eeef7e428cefdc76fbf1feb02036f56e9579a2f276024f2997bf2e0527969f7285e9e5bfa5b54f1127b6defe81f38b5dd9ccfb51a18c0c35d70fe68852974b4631faf35dae845d4bc1562a03d90ae726d21e2b933f74518a806d00f519d56c7cfa22f0df99d932bacd106ea1dd7c7c9c31e4d116e4593ad3e761aa60ab7d709950bf9bd30875d80efdaf1ab9b80064a44b40dffcca0340bbbe016b634c4c9694985bcad62c6cf8e652f714427bdb918804d75fe1895146236383f315b39af4b6c24f2bc0c88ca1b24a07b69344f43e70b0a793010752244726a771d04d1d93bf3654c4d03d67a488ff51da288de2f2dab6d126e47238e716b0c7257871088bdd0bd5432600a94e7aab7dd88f8989858442da627a6ff37cf673832fe23bdfede137a84eb1254edf87aad08e49024a88680ac3aece1deae017966a48680b087d9972b2de8b7a52666f3a0e89f76d4b4d7bc7bd4b82c08c44f6b2e5b568546c2836ba1c03e356f053041dbf9227032c9bb7815d40127e7953cbfbc79b9285fa7cc1fc6b7fad78604382bfea60f9be7435ae2ad12a1b1c3b13bea0dc61d403c84e7d48927f5baf7853b3bb663e74a5ea6873ecda869dffe95ededfedf19f4b08c97cde7b227e4baf83204dea06d5f6eb4b14abf2ca0c8dfde7397a41f4416a27a1fb7b780404d75326d8d18466b2408131860c975c1711a1775589942c6f16c33f1dac9cffaf4ac71b504f333e88b5b605a7f7d4be69dc2654dd74ec6f450fb66205355ca53d6a91cd1328a84ac15cf2f00eba61d8db09bb10b1167406a071d6dc28dd1013a5a7e48c6ced3c7b2cf0c6986d343d7ab0b306f39362666e6b563ac4801e411639435d3e7eaa736d3d4d40c97a46cdd2afe52ff1f99aa533e03f7acfcc219522e72c1684406432bde1cc9b6e5d173aed4f9f7669e16e1b7c760d886a109ccd5601c0450b26a67ba86abadd28a82a5b558deb7ba8711faed2c939f3720849aeb31d9fe0b9762a52aa833621be9bba6c131f00d2ae00e073450085da0513b0c0abf718fd9dd95ca541a70917c2210c4aae3d579620e7549a68158612c444783beb2ad716b19b8a3fba7631ded0e8bc23637abb1d7adbf47ee9bd34d26741fd8cfd249ef16c9124fa33230604352793de815d9a06ec3abf48b9b302043dac874a19428a49c6a653cb2d6ef52c206be383e4a861c8a9c1126e2a8dbc0824b23e6a8bee49a1dcc4f9d1d9f1fe2eb4bf92ae4c6b001142ac9d7deb7e56fb213e62931d2d74e2265bbea274c436b14270b75df26dd266e9f29de16de0cb9c14431d36fa00c9a585e22c6046421da91e0c8b9e812754c82390c6628dafbbf35e5e0f105ed4fede34761c729faa2ec4184c41d488eb74ff9077fb89b74db2961c6e5aa27c2bf343afe2d7d7b1844a148a892e8e56849a48b2472f37906527df6f6ac1f9f1a53a43b0de9080c0811391251678e37997f094bedc2a2f9e5893c404820424f53dd64f04a59280b03084dace19a3c8be60549d617d51511bd6303e503a44463c131806e7e8c6f546545a1df3174ea4e872244555c4754b1b30bd65a5746939daa271f37c55734116e8946f6f65abc755e1c1abcd3e6ba978703a1bd3ccc406228324500acb1c9afad3207f6af85e83b8d524b1469da2e115637dacc6e416f4c930a43fa32bd2cc4896717f964cafa1b04348cbb7a3ac67a10212397e0c4191fff608b4fb048a11479fa8cc320ca6128a01434eeed9cd06a832ccc42642a0a12c1ab7c58d5ec724ae3c4d1ffa05007ee3824608d1c71fac77c745464f8982f1f82395fcbb150d080e540893a97b405c92cc4a2b4f43e9585f417cde996ffa065633fce720997a4a47755998c267aa59bb3705fea0a7b53e14d11227cd2fbff0565d33e9405961045f172a479fcd9c61c28473ddb01782c56b1d765e940f35f06c569c2e5b33368eec98866f7477f27d119045ab8c4e5e4ebcbbeba11b4c76921a13e0dd789d09eb05dbd0f0166566b175e1f2e1318441322bf92e11fab853351c1ab0dbff311d8ffe0941a444883d8bcee5b6666e40cb54b4168794e624a4bbaf51827e9e1464e7d291e997d421e1de59d9489731be9de390b801832cf8085977624c90912fc234d8aa43085af61cbf5b209afb24b1775c9ecca477202fd157a3391da4cb69e93291b43c7d32b86f906a1d45b9018962a31e21c5fb38602c1de7f98cdf3948ab8e0c49c83b5a15ce77f0f8ba89d7b7d7fd22ff35b7e98da4257948c833c95c5e45d7957b7d08ce8956c8de9c0621b58a5a88dd03ec0315f2cd46ede97df5f12a755a79f0728d032b5852a408968665d7229fb4f3bbd052ef61b0c8a3f0de564ed7371c28dbb40c0fc29edaf35b83f70e6771f76f83fc37e03e4a804a9160a8fc243143c6f69a870767a449883438c8a8e72f38f3d4b377f23ee2c6142a40e2290c77f92cc9895ab5d4af0c74439b2d2f9385923ae0abaacddca8e574485ea9303d043404c88804ec09062824a0ff1da30e331e3b21ac1a8e01fca587a793fb6bdb1e7e3a8a19b36db3425e05ecfd9be72661994fdd952a4ccb782b28bba693b334df911c2d06f722f9a872993cad69dd3162e5137581843d300a44f07cd11ffaa8ada5d3c0f61613f90b9bb100b5743f355c5bf29b7fe52dfc27e5cb62d000faef0be23ad5b67082f9ecc9f5ad04b82d9fb4602fb9eea1c0062ff9a24289f4a1a313facbb6c2e537f0024ebe0a3ff869e3e0752b098ff32ba1a321e7151bee769199e42cc5b1ec71ecb6b1e45759116c78cb65bb8238b638508c1f95c4eefe825821c010150a52eb1f8531c77c1c2d5aa9d48b2cded434ffe0b481a12a0b68fe31b18ebf837c0548ba3770cd5c8d5e678e65f4e091baa7edcedc4ad80657c13bb853032636589ac9ceb300360a9382e7e29cd685a1b347dacea21895d7a8476d40405e5fb22dd0b1d7fa20ae70140e4825aca420f278bae91f663135f1a46f05349a509879de10c33c1a0b94139cc9298a15b4419c67fd63dc21d4ad39c03e1b01d3c11a9fadee7f0f96016c5298e064132efcb03629b9733d872cef361970c389315f26ed9411b7f5d7a74c6346e7ab796ba69e9376cec4be0de3739a46a37d7e15f793d6933299d0f2edc0f9fc572e0e9e4d38f800ced22098d3574f7a27e176494365daf2f8dbf512d7e443664840aae82849f75a78015010a2ff1342ed1f4215328b414f7c8511f2009de4fc07c21a047a7094aa6402fb79b021003b63f4e9ea2d09a19b602b231456f5ea7657394cf401ccf24510146d7b913325196f07e3467b3df83ad0a811ad40f0c8f27d4226d7f6d700672299893141c1894fabda061effb0009a346da544e85b0db9d2a25db4eb8c75cb17d2157bcef2a9b044a9f36f865e494febf9011f202870b8610858ab473937d6827376692bc303a5fe808ddf629ec182c9b1ef129b5762dfc70d2acfb4f1215deeb54183cdba014f3dd3424267ecc0ae482aa9dab68c7699d897ee4fb8681c2f265a9d8b879838c415bb41d61e9998fa192847b1fb8013e0bafc1a0b9add159d39e69f2f6a154dc1a4bb929449a0b0a509fd8742d826ee7172603f003a9b8152e7a1e5b26411444a233c66a1ee1789850ea1a82bc7bdae003a4bf578271ec82cdba5e7d06dc922144858e79be72e7099c8ada70049dd0b20103c7ab514e33204512e22c147f4d22f64b5e4277debf03ccf0e426e63fc9809f5c4f3f20b200d95418ef280d4b782a53d96ee99f099a4e79655b23941c0c7db5a9050093fc96351af3f693b03b8c1f382e1c5d6f22b74522d4c8f6b236aa05d872b6b15620484e4b98a31ad5241971496f1759b7e429989020ff444087f56ecaf435099698ec67380db1c91ca4ec76fcea67cdc82265d3a08572044ce913815b443846da56a48b413fa62758d0c0fd99b13d80d011ed868c919b84cd5521b6bcddba77e1a419c5151724a57a3d7d9a6ea163d4f6179b0db316e7473655caf9480a878a3ff9580c20c33484dd379c9fae851f520937e9f428f0c8219b8ed7e95fddb7291f83139230ce43eacdadce403eec4f2492af9962aa16c956d7b3398416956f2056cec2d1c7f48e01984be29c6883637ae8a168dcd0845163aa137938d8821a958ada901510c9969957c9f6ad07d22dc3d0a3c3f7985b7f0a2e29a2270b6300fa1c79d58eb5f573b70817110ba37e94ec5491504c5179a7881244a7e3aea047065dd0326f097baa8304b217840a08becfca84fe751d805a7d4257c991dccd10328d0ce2d71dc59bb7c3a16fbf692a7023a63f542320267bbc5f663e722dac9b133af00190dcdeaca44fe81e944f7deaa88cdc4826fb8bc750b27372d321c6e2f5b215b5a84abd632c3c895d86d265168241519752472fc3dd55610cd9369a67f6eeddf98ba558474b7111a150a684c86baff62c5833e6970bd6e2d25d441d918ac642c04836e78ec01d77fa884d5c654949173faa47298b8bc1136f152f6f243f3eebefb1d863e3960af8081dde9616dc456e2803c62f10c6642112ff9327ed47b26406c9c68bf9ff76f7764984a2e40f2d2b9ad50dbcfacef6dd5f8fc97af9c0643a71518395cc614a3529c29af5d4a6febd6aad49b640f10caa75882a8390660b57aee1b619eb6060a034b7c21448eb702a2f546c4ee42c1ebd3701059d93596edc160f8bc0aa9575b19bcfc27bfe6fd74fefe167d5fe674c0a2abbc2bef0be9e85525f0e75fd84c0a6b3d6db7ba45def182fbd55ac199db4607b015cf3d6612e3b7f24c888e95f6f9431cc60069b3519a3994be68c12fb84e7fefe119b11f786ee66cd94383129e7c9eac6aadcd6d450ad2ea74afd1cb443f9ee22930c251fb5538c435e62ea9575020f4367aca2868d825a4544f88cd8353b87bb6da63c9b2b31be690608e9afc18ba63499a70e5f14c08ed91c8b370ce0ff6f2a6cf6bd121c83bcccfbab8a6f1e611144b0be05c57ec14332910ca96f3d887283a520e8544103bce2c97ed7bc7b681ef17a06ad35efe5bfd7f9cd96d9678c3da6e8fde45caba3c71b92c7b0e86cfe836d457b168a29be74f03ede960eeac69559c867b2729c8db7a0e67bddef8d8303db97369a6072a89ac9d705e47bc2a2d0daef5a8e136729d89988c8a380a61f9c93b2a790ca2b23c74a7fb9905adb77a20176d969c5e89f623d82dd7c37e58c8e3c2a96ab95831a2bdc06c165080612a22b202c7ca4b5bbb9f9d4b7da37377e0738efb55916ed45538c5c436c2363548bc554d1b193fa67f5b80c1688a49d83cb78952ab024e5cea8aaa4ae8ebdf0fb9c4938b14701d98ad177133e831597e513338d792ff0eed3024ff7c9c3eb97a20dc8d02e40771c1642f90471484727da49c2deb828f61a0354c76e94e1a927e19db6d172031f322203c8879222dbc84a6207fe34a8dae04162027b0c125811d3db5476526a2a83518bb8bbcfb8dff6b9453ba63c8463c8c1706c8e9d47e153792682288e6501bf3490cfc746ee8fefbf58952b8ebf79ac51fb13d6b03a0a48e3483f2deba791fe35782a2b245c8ea44dd40ee04eeaab2e3d9c9e73f724733f4abddb5962a8965e223e83492f3e7ff2479dac45fc45bbb7f95ee8d568b2b1fd18d67be200f7bab1fe14c86b3f9e579c8762b65f0e24014c58737438ba8f200214fcb448abb8691bb912a4073922d0cae52e6335b2104640b30838764e00af271dc6e06aa6352b4bfa47a943e36162f074117c1c0eee4d88c5c682e2620fa11485dd61d9a0a5c820d008a24b9399b85e37c49358e32f5a3a06b67b7d1e224ec0b342da10019ff15ef63eb44dad94f718d908c71bb9ef7f455d7bbbd591b52e9d35ae90d96155ef70cc7d7ef0d185911781a185402531cadaa9a4f450740ecfdc521891df328f197d88eaa2e24f13c07e3d3adc1b1f28206e25f43c3808ac2f9e834962661eaff52f7e4d4cb3cfa9342e7f100fe571fdd2765d0b71fe078023d68d3b5e943e03b4739250ffb5e77faa7bccd1dbf60332aba4efce9e2daba64bcc9f511fb361d37d411e06dc968a5bc42fc233b9fd434ce7d5c9f12cdfe29701c238f90a747dc9e84f50450e67e59cafe6bc44b818de193e2436ddf817c1b52b317f885e568b5d4fd6a4d1b7426b4e628244a574ee236acf7afca5a2571d2df439fffedd88978bd2170db6bee66877312d8e34d89a05959e81178d222a767bb399f423d41cfd0a6ca3b2bce6c2b6df83768e5d2309f1a6ea11538edad8295130c81354aec13d7a2fa79845412ee882d7233e7d011f75aece1147ce30d6ddd0827d863b569c4d6bc8d11ba5f9a67df9d87b49f1ce29d0a5b0bc5a99406cc875a1e0f9799e969081334e75766f8e09c6d63bb5a750409334c244bb91a8df3e5ca90c7ebdf7ce4ad9a252b7715f7486fa8b2c61dd0f4737bc5909683fc7cd817a2b833d31e4ded684da8db3e0549ddd19a767a61def2c950aec115363bdf90350b69c7329f4147b155e6ba83b1e7a4e4e68935c66d2909ae0639dddea5d8036b0ca58d932e2480a0a4c728c2756519e2f38d7c7072cf40f08e3c206aedaffecb0bf2fad64ea3869f30fa2dd80aaa23da89c5247c2a7027ae5dd3d1abeebf300ded35e67006facaa1697b29d9f79d4bd9f3c1983abdd68aa950fe206ad19d3a0c50e9354ec210501333dd102f41438a1719c9bd7888a8e84b2544557ece23c6a1777dac7dbf856398af6e63ae40ec1da692a833c9175a85100dc9a5e48688e99a8a948d8431e50e6234da9d5dafb01087c68d4807da4459f22ef20bca96a74cee920d7e4d85607126cab4e5be6f7069cdcf5624857ce85daf98030c7fe80682f517d8c5f43c469336bcea83c37f7175b25f4106c4136e511240ef628fc74678670369fddb263aba2c27cc66c1b6ee5a521a6f799f6639463744d2aac7520e7399c84fb182980241ec8c211b2aee034f105f69e11e7af1f93f9f1c0b28277d839e75e66ebbb68294bb2b1e38535a11a369369d11234850cbc80f924b0af77357446479775547c8e476bd4b8e25029e7f74cbac44ad62dc573658fc3144aa5a2459f61a6e6758ddfec7999f16c9cd675bdfe0cf153dfaf05119d2a33883b54bdd8bbd401d2c317ac88e70e2f8b8c9227a7180a4352c5435c23693e03a7525a6413d3183758ae2858a69c9ca07751faf611f7744645923c412d640eb99aa81cdf355c3591817d974ff211556720ca74927a8c587ee6f32a951a52c20bf0603fc13a0795ecdece3d1f9de4566c5d9e34f35debe887f35c2cc4fdd22c99bdd359858150e8d5b245c3b22ac197092ed44b339e2cd0685ed5d0d2c2a4f92725726c9ed5c8fc08acd184c1b7dcb133379b63a7f8ad328b410c1a7346d0b9b00f5e7452756f1f20346dfa322838a4c234e1353752b3968c813bbf781f4ee96267f8b81dc6c56b31a84a800c3f9701f4262ecff4aaced4406b3d28ac4427a6e8c91815df368e571a686cad7a1e0fb0cb112f54b9ce6755951ba0b227401c0b1c9568f1eeb405a315b3122ea0c8f0747bbff107a4d88d326dc5b536c4c70df06711214fce83e35b6a73814cb53fbdc4ec98764a040423249bc76c15d9427af4f461264ca51967ff00e0140e2984b0fb1133cbc2f377bd001ae27406eb9c627cc91ea80f7002c1b3f662d31001e04f747232f554be2b88e05f7e3879c72d45bd31ca496a4c0f9a1f78c17b0265463d5085caa96035e1f265960ac3fd83071fb983dc98f28578b631d1b51a9d21f14c71b76e8c387ea86d2036102e353478f1f4d9b0a40308ef2f3bfa696eff9f92a3e106aa663d3304759ab3d3e07a9df6ef11fd03d415baeef71dc08b200896df533da34feaa4565a64d611a4f572c45e1c0443956f2688a6e4b6fcafea66182f2f336e6537fbe3803e17a295925a57ed9dc2b0eb384199a2fde7f7907cfb108c225c792e663506d0dca393a5657dc691a235699291f9de4e695694f2e35b17b06960e77b7012def7ea3678192e05280e502f819eec844f113501e0c99f7f02a2acf1dfe4d5fb888849809e7e0160b39be4738fd7b47cf132a53bdd97bd772da9983d46b0739da258b6acd74eb0b2b7fac8617bd577c9a6e8e03046cae73602777d97730ff6f37e27ffd81bf4790092f2b26e0101a570530b5dbf0da3a8dc486625cbb9fd95ebcc36430cb8ea828004a7b6c46f4566e5fe4735f5a0e0ef3e11f544ca3f55190bdef57d0e553e10dfec7d5035ac198abc6bb9dbf389e37972bfbfff963034c4c578ea72a71a9ba5a74eabf1e361ccf407df5d7f8c25940de010569f5f1a2c9d45141b1fefc1b0fd7a5f5a1355ec6df35048f1c6edf722883456f91208260aea6536a3f941ca0a5c5db8471bc14c5ba53968a0b1810ab315d371bfed29fd39f5a7ec660587979fc77f234f1c9a3ab074fb1f7d7a40e23d47f68c5d2e833d0d643b207ac7f71a3b4cdb183f9472fd8ce8bfee694e6f7930dc9c77aea2266a0e3da72d335b171dbb7485885e06e5b390fe6946f58db94898d48720dcd011fa96c2f9a6bb828ee785a52cdcaf969779ad7e129bfac3b4177759fb1c3cceac2ae6a89cf96e3ebdb5211a5df5f173e342cabec6fed0f6858053e0bab77bd3a5794dad8a59ef654256395f13b25cfbec16d5838511b529f1e12bc67973502c2c54c7bd5aae494d5a2c40801bad34dc30c03a1f36781e69eee5f797748b7cca8c1a20c757ffdbc0c84f158e6f5741f68be59b5ead9459542bc7469cbfc94e97629800049a627897dfd72001f46da84164dd1536cb5a5003eab7732041a98cf3d79f00d3d0a9cdb8a1b3b6d39905de02b86f5cb51f104015d784b83912e04424f2fe57b1d2236822c4b13334bddbec4e74ce25d25f638785b3e929a13c1133c30174b05ac0b15c4081346b6dc879265dac69c177c66661a738e3369021cac047d4afba9b1b09d2934fab9d89f238d71c019611439090b7eab83463a165760bde28a67f93891777569637a8ad7ef383270707fcbc1516fc09cc2bcc1933503ae938546dc6837a7dfe1eeccf0b0bd57281a529a6f4bdefce9eac154d72945a132fad2279abf2ac68f299f60852c6043c7014ecdabc5d09839d4b16d1f380c94afaaedcdd754764f70428009f6b56d4903f25b06004f1eadeb4301246d3d64d759f4e85beb9a9713003bd072998fd28cd1757e67d6294b5d2a6f3e5d226d169397117003f43e8fb9bb8ec6f0332738147f6f4d40288f40df9f294933dddf79186f331aeb69eec008c2eb032b79d0d4e655c4a92741e9acf50ed878866e522c49ae6e51536a82b912fbc66e94b96fb84b8246a39b36cbbd8536860a38c992eb18860c521d7e67c617f5fbf5d1e5d3ae8342d32590cc1ca6c205c13f3238381f2ac2e2dad3be8d68544d6e96101e9c49048f404284b26d1d9b86287445ca24ef170b88f569dfd9acce4911175792ac40a0639ef67813388c8366b975cc3dac47292ad631ae61b8e5604f859fb0cee333b86ec260f1404ed18b20518a2433b492ddb5d40f1d7468d4bc2b05a0083ceee0f3a15bdfa9078785b863765f197a6ef370b46fbf112e77ea68fe972ca7d82f9706badb4ec7e0667d5f3973895dbc629e2f2f24c0e790b54386e4e590a6ae39f6be093598540a34f6bb399e6cf189a4fec9292884b4effbe245fa20e59f4c597d0f49e08cd7b771bff0c2824917355faa2e60f9a294b894eb5271c4334052d1dc948bdc6cf494dcbce6f4d55fb7ff3f58d1deb3d5be2b2091fdf0e43f804e9453ae6f56a6a04191ba35e972cac41619e3c8dd674f019788791dc47e255ede24f5c47daf9347965b03cf8ee2ff7695ab512fda78b1f34d67d9df8cf8559b4e2b9eaaf3effd4a253d93d69ac74c7a03c98547052c8441efbfacd4216117264f173d048ceaa74dbf2abd37e6d8e290a6949a2c18e222a9779155d0047b92fbe5c0b827d47d82a7498bd5a79739ad883ae68ddfb8de939ab6347166091b62ebff085c2125d0024f8ecf78dae1315b306b3d7461ebcb328874d531f10a9579e040de4a0d223d1639280d9a5d3253d4dae7b25d65b73ea25729ed7a72f67221757cda6a9a615d7b09dd3cf7160dc891a3a4cde65ab6326c340d613dff45723c3b5e66b12b6487a87cdf0034fdb81f006eefc4f4985c378f14eeba35762b7bd372840e7ef84ad5f5961bae41f44e98457956f87aa7ea7e831c3083d6606fc8c058ed71113fee4f00da25002081a0b7538077addec0ee52d4c2118d94514f3d75226d64221774919d4e1e0b3f924409d1c74d480fbd2de797a5e33a6bb189d50214e487260f3f1d9d830d840536c8b9e59d0acb94b4513cb7e23408700380705ee9fee65020146ee27321557c6706507a89f3a3c0802ab6657734326261ba2f64d50377545c834eb699b43198f00e7e0e28ed4cca68f6689fda33817aa3235eefb66915b5867debcc2616e85ce7a25dd52a77b535d9d38d3892c57250a4239bdfc763923df5f180a5fb7e4de8a4bad09c6efb4951082b12ab76a717148ac1fad0b4d2074fd3d7a37c177f7c45f948be6ec7f626b75377b23d1fa5d65e379f87a9fe434637c589847e3b534763d95656f9cb7e7701ff2da26a5e545be2f82d7825b2e920a0e38614c5b5a7442cf1e6245c48b67f92a5478b51916157ba26a36bf473c50850c4560ecc3473758c3b60f0b52b8e05f021711b47e0a2f1993581f4cbe8cfa5bfe36544078b3ef9ec52c3423e0875073314990a75804aa773bc39f475bd128687752714728680d23efb5e97247ae988e07885fa8fcb7bbd81bf860431055a1308b11d307858bca566a9b466e428860c4dda60d0682255e9789cee867c8e4e3ac83b26fcfadf38cbedf344b858ec93d536945e2a3ab0aab946b4f34ceb27d4c33c0410ac99b71b19d5b9dad1d6f5322914272296c2c43010897be5210ad2f3652b8cd9475085fc964a72806919bb2e59830cc14a11b5ed2532fa3760ac2337a09e50354c8ff8fc77ef7a6adddf9e1f57caf8174df34891ecdc6e284724b4a6266dc8a3b9dc1c9f5eae0e4d98b046e4ec69b161f77fda0a8b5c9a1dd6137c588fc8bcba863d106afbf3cfbcc605f3a704b2e2997a200cf3e31406714dce4f3c0c06718dd65764effbab53474de99bc352e0de29487ed277568c3f2703e1b5dd360c58434ff000d80bc5b1e276096e768c0d4ba2377e4bd68bf9675af2745c3c7c119472b18d9a6318030bfa6596874362f34a1b4677cf66d54e6940c002ace66e7906eeaab6fa1ffe0c18f12b0ec37426572c48b205c926ea7e5597d71255a09fdc89808bad61c95486f22f0e0d0839fac11dd9fa32d46bcb1809a4430a941653397846db7d4eee5e858ccd3ca3f41524d421bd1e147213adb56113260b3748fe3938f5c0f55b13c9a0c01f19ffe7eb6bbc7f6d188c443f8310269c4b7ef1a76a4e15ad09ef5715804d3c6aa8abb2d8dd895b1a9f1d295b029d0f3fecd00f57b724141907f163faff6759f56996ef5ec1401fc80f0e01713631372414ecf184c3d3c5b9e2c898542ba0b0301150938a379fc8954ab056bc70548c5217f998a97dc5a8990ede0f2988587c9fbcb62946b758c42278d43f2a40f6d9d8c6494ccde5af3167ed18845b402c3f7b57ff9e071e9b09aa714fffbffb4cd0e6d65428d9fb0876fb3677b6010f4eb6fd53f25826288fc43f348deac69e50b000172703181af74a2ab574a80fe0f4c72a5af71206286b70c9dd1f3f4f99a287d52148b01d7c69b1d62311b39ffcc9c44b909c7a57ad8a7794f930551c0fd9ae194a66d418d8986e586c64ef842e60c81fc1ad2fb2f93e8e30fd65bd624f42cd9683d974a570835ce2e93e03a37c44af083be9a8844152080f48b8df12ffec5fd2631d27de581421647de3f5788ce42be43c9fd81fd8fb451a64399b5f443be938ac9af823843ebe7a1b9e916193c1e1b95c1ddb84f59c40bb0ff2cc45f27b84376d9f4a0b215e8692243b689bbe803c6056c8977fdb73869fde90325f1888e085beaac1d12a7a4448eb2f257ce439fdcb8a79e021a154814e057e0157eab791b8d1605af81162fd9c423f3bd1d1e12b8b1b495d57fd479b233693bec80752f09ee7f43df03d140789a77f3209038b18c4a7dde6645060fb1ca81c7e12664828c791a4998cf9a13e65892e621d00f0867066515ad8f0996aa5587c59e3c5f21e5af9dc7edef4d27a18d147c4d1a412b7dd77eff9b8ece8cbbb8c8cad6e0832bffd41e7eed6449627a1345b8d34a744cdcecc5041168f5880ab7c923bdda710455139df330902ecc4d519aaf821055443e51be9d3f443dc42c60657200e4c21e0159e5c1d4163f9525604e243f50d206801a00aed9d026fd27137b4067bfe7d11f8ac328808fef12b01637591c764fe23f1d09e31650bc42d2a83c60e0a3b6c0905a69ef388d129872d4bd39372bc3dae13b3bb47388c197d71dec10428fcad636e6fc1d5f7cc9619b13c3c67f3ee6a13dfcfb3ea5b6e0b5a7c703aed2279c080a65e021f6fb15036b74ea20c420e9b7156d8b4a5e7335d6c6b4b0c7bd17030162a08ad71de95c61f1334069c8cb7d9712e6d4faace4d354eed72fec6feb8012d1b66e5e928735cf67cdba815fb82e27207260e003710eea1918359eaff6e051db2ef8c14e0a10e0b76ca0b96a698ce6e325042ae62816d212911af2f7020121c70385f28e6eaad1e7735373fb88c02235dd059226f023979e13fe0669a9c34048aefd33a44fab198f6e7aef52e9a9f12c116c05d64d009de5a5cb3422d2a3dde85fd8e5131d49d89d21e032f037537da716c4b36afd5e98335c82dcb4d39974890cb2cfcaa1b3db935d2f12c9fee2017eb73c12489219ed04e9fcdf8d1915cb0a336979f94fdedd49d20ebca5fb6b876fdf9e075339f9b37a513a60e766cc32aa25d593c018cf750f13a3398d8917186d0194adf4aa1a74ca0255f797877734837fa17e12ea178d3d9f5ac1de435c942fa7ad7cb65cd33936608b70fb8f33d1f62452ffa7e5306037107e60b30d8c371681b542be213bab059302e68400f430eb94b6bdfcbf94ee0e26b19442912838f6fd39ddc1aaa6a8f50c7a654ec5d6279d6106f49a186f878102c7624efb5f807bc6002a0a50e0ebc5451ad8f7a68718e3d14330d9aad5146983cd0d0c840ba1a30f6a34828a64409293f4cb1ee866a9f637b37bbb2f9c93756b36d604074bc644073dcf244f6668cce4d3a04370f6fc8ecfc2df9976487c98ed36c9d8252f941675a27bc0dd7979494c7eb1a50d4625650ab05ac8a92adf71d15c4324e301d074e55cca6b856b31ecd769e3446ee32d1d579a45e514efa9fd21f903ef8713388b05a76d269f61fedaaf85cf38fe6c118df8d8ef940de83617d733465426388d18a89f42335eb1c20391d7ace3a0a0def7a72e5522da35de5444027c281862749ddbfe0f0f1df9c15339b94c4a2c561589126e5267f11c03616e2e6fabf3018a5c3b8e590a1251946a32f19e6736c8793b30938d54cd0ae0072eae54af8330b33ec40722b46b3e088e37862a30d1e5f428adb96ad65f2bf1af4a487b65f380beed8ad20ac62a28b57456502280dbd7a6730584fdcdf959d1e16d3fa711591d2cf915bd4f9c6b13ccacf43644155005435785af40bebc90c51e6d7f70d2e1586cc5c3a69fe667c01c90c99bf53782b370b8fb5978d76978fa9a5cc3769d10d0ff7663ef0f0d2d7d71e0f38bf6961cc46066045f50a835bd9c921f52853030284127612a3db54d6e1989f345151644cfdad20219b8a0fb4a19b59335384ef1e7ba80fcab7763998c2c8494744637a03c0168dae1e0922659d2cdc5e233a087b07ac2f794e819e2f8b864a990e48faa6fd0a25c34e47948069b16c89d943cf0ff0b170b2d6652b24c3ab82c05ab3348d2c8debc9fd0262da14d20c5aa47f19bc65efca37a997445bca465adac4f7e4a39f45b7a6d1bbfa1a05c4ef9111a7e31cd93654258f7ed58755300b1a43877b9ff91c0f52bc35902e99cc31c6f1b02c7f30527d36269bbaced3d39c25678f7aeabc9b9b8514b08b364eda4e49d15fc3cf57e3a9e67496484e669a2dd8e736541e8cc4b99c3737e2ca91f893658dec27e5e8f13e7ab9a9ccb55b4df08c071ac2207bfc575a6dfae39fbf52cac7162c785cb39f2162f0ad280d54d271e4a293ca0323770d474c02fd8731ae9f387cb1410ab017b0b28401f6c0b28ce007a88fb5a4c1549eb3469e8e869f246ff39188b1956b4a759db68d7acc13e182205299d84684759de3572e5f1563b6037738ee1628fda41d935d7bdbd49c0c7eca46c9991c6ff1a53d7e696bec412ea28c6699b385ade2dcfa0e93660ee06b2358fbef460c396a28200b33c667f0d3749cf1edf3eee6a3eeb35f5423dd8fe1955cf8d04990e542b47c9c34a3d7787b3b53d5da43bfe4fd025fbdc36dd6d2d0161c82c34056a3acd7c3a33135cc3e14c174f1d5f1d8526d439ef1b581b731896695a5ce339d5704e9a6c8cb7529d981e69e5e3b5000df1c57a1b8fb58ebcdcc4b4cc080955c0055de0f14ee19787f2df8bd49ab324e308879e0e85d2ab515b65421d8b260fa3dc6626de849448946c9aeb7bf72545ca3c261df503cdf859a4842a40e014008c72cc2eb9bdce7a91e132d397670b15b062aac24ff7e5374a9faf065dd1b54046bd3f7d6bfa54d9348cd1f9249b73f9f5cb18a7f09a3b438f77f93c4a780016af422d8785f8f892f20ffc16c39e9a0dac76bf8bf936df2c03e9b7888a53ffdca865728b757330db9e12877dc7254d9e949692747e00c5f664e0cc0c41629f0b0b94eeaef5732be35949f417cdf847a45fd3be9cdb926021bfb555be7f7c217a84775a3f35a021e45cfb1954d888b7d6baaac37e95de4e3f8c8400923b8118a8fc5baaabbadd20138bc7aab0c983248a6d8dae6d8e6df6e8be5281b16a825c97277c4199c32aae9c0e88fb456fe65bd47c6ef439c465b28a19497caabd482d6036d1278ed1e9138d57431270ff4f306c99436cc6d02bfd55892b3cf3bae9dd0bb2533767e5e610a3387a7ec77f7c16d1169a537aca1f05afa700e3dd568d864f3dae87b1ddc8091a91bddcfbb6ac4fcade544e3e4cf38fe0594af20712144b3ccdcd5e94fe77ccabfbafb4b4ae014b40f6196688aa73ccddca199f22b9c818c9f3c7ef6c3572d4c76d8aecdaf9e49b55f72d78f9c270ba6cb6d60e528409202e3779bb1e31ecd34f108fff2384d62a7b443e05dac03fedeb5c8b3363f895c6a59ec044e4b3933b23a8b8600944a9a3d115191ed28dcd7936111ff7ae415d7eb7a1b3177e3515fb65df2498ffbe4374786149f46f06ae67331e577d2b61a922d4058a1fd77b8558f5076000702ab9def57505508ef081109d59ee6ff25ea845eb5be1217c4f57b4d2110aa84acf2c90b46943f3f9810221c26115abbf6d7a8b221a6c5c907c05ab1238acc869ede763e4d2f4a4e76d109d5d2b17bb51f9aa437045f77cd92ce2ff22773c816301d5f9f3a55eab747d285e528e05b3bfc52e8ecf80b8176cbda0d3391c9f10b8ea6a3377738ae755dc448d14ca15fdeaa9c8e4cbcde6c6b57eb85094e25691cb087012102b854246ff13dede2aecad3ef3c0678da1f0d34522ee87b39ddb02b59eee696221c02f561decfcf4dce8de375a31855f5ca09c7e0571a75302e32c6b2ac8729b4ae3c2fc184df192b9538fd504274c12b38da603bcc86e96f7f64bafafd0a77d1f84d695f3e8ac67477c3e7546b00176ecfe2292a697c402b2d4953339adca9ed4a1f3fc72f35ee80825cf4fa541d8cd05c2804637c2f860b6c013b1e96eebe83f9ad05f07202b48bd72c00e3bc2f05431be18f8998c7eea60cc78f4a9ec5bfcc1e5b4118d429397bb9146764c43e6995d793805fd8f5e75f6eb019ec4a8b5cfe3a82ece8e43a412ca68380cf0c53dd9c5f550b5686467a69a0a6db4a4c01c7225482bdb776d6f0f9ae6a4d613cbd402f62b570eee546efaebed596e034e74949adbcd25c9379d01eba9c58857f7e35ffbf75a49955e0665625b3209801dc7c0cb26eaa86f0afb2e93cc53a44536cbef3de91ffc438691b90b91cb0e73207e51f6a7950c5c42a14bb00f53320b493940207c6b4a2ba33db7985cb1f83c99bb855a9c2c76c20c19f48bb7f5d1fb737d9ea6c71bfb79a7dd14dd7190529bc12813a61eb4cac1432814b88744015345ef9a1668f0598a63c2561a3566b3fcd07f845182661ae44bcde1c100fbe8d61e7b8b5740dfa3f96ac81b4767356a67f4e316d816086dd9e3785633bad5274ed2823379be78eb44e5e53a403d6e254f7b0259229d9ff59cfd2f4e59634b8d0f78eb31a85e2ff5800e3c781f6c3d68b98582f74b718a93d839629faa5629e07c5afa02537027fa246101ee3cb4528cc6ded9eec272664cf3ed5055d32ea4bd43f447c659ad8e116acfc55fbba96fb43e50f233bb416973cb48353ca59ebd190f0e6fe51968d2695be4fa7ae9d280530d2335f7a69db5d5f98d8a03973bbf0dac99fbc7f4e345b62cf0aa1bab77b8e55452b82ec591380a4c3fccd03de8d20c747742d0570c4692b8918c499c3e2e588604e6882ce4cbd2154bcdc481c4857f15d00208e700cb27ce76135c960b4a0e75845fe790eb470e4949b0bb4a2bc3e246a03de7d89b245dc0b24bc6de6b3ddce2789641b7cdde8e037fe6b85848a2c18ea613f27668b223209496240acdb270d16ffb4c84ce58bf0ef5a4c2557746bfc72e928d8acf55ae4efc38be0125061762dea20f53c9eb6a517815de8e35d719f5e51e57ed163b0c3f38a5ca25b6e84bc9bd79590c31b20e0b62f326c49a703cae4d358805a607d13044d71963677bd87b3c6fd1b6c02601b42db66ff40e3f6425969429137a760d9f664a0b05efa34cdeacccb438193349754f2bdafb6c2f77ebd856440024ae2f5103490bac4ab5f14d3a88d3b8604d0317930e63eaa70c3ce0c5860f60e2633795552837cf91a35d17d1285a8d4f0297fb0a1b5346119850466033d7befb1e010a5e8cd50c2e3b3749a085761c3d87e0c4f9f81860c4ab299d254c4dfa628fa8de20521d0a4c69fd89703c5b555bb0823b9d9b5a5062054d6d3389f54fdbedef5830bbae7b464e6e783e85c71165f6c300c8ceca2d5c8027bd0c80d1f2bc1e8036bcc1141bf2c315464ee97605d8fabbeb0fcf2562717237e1d525f9af24152f455964c6e1ed65de376a6cd8f2ff001b54cf62b3ac21c04d6e8342a45218adf24b39712fc37761f0f995321bd6c5f9338b837fd8730dbb823d1cedcb52280837525ebcaa531a85c995b7ac593d1c2eeb93edf3705c5a00d4fd0aab9a0201d14381c939b8ec1d7188652437a690cb8eb06ddd8cbe48200387e9df89fbfd02676a25f189cdaacfcc9054729cb6091ea17055688e1ffacd22d5e41a66aa7f16754ed710a6e34cc2015925b971de1f52d642fe6389511e1e485b797a04ade98b93714e1af43ce17b5c66e35a808d0f725032763c28b6a17d3405782a79b42db3924689a8912f8ea17de28e8948327e0cfdf271198e5c29edaf035d439c8b6a68026174ef64f41af9255ac7be4c2c2690f9dbde5d17d57d57fb12c6eff3a9c765a74014e162cb378afbbadb8cea7eb1e546f1adb4dc020972344443cdb13debcf7953a8a8b7a3b7ce0ff5033e636a1cfd598092db5e3e58e6a79db89da475b7444a9022218ac39a41f8a27ebd0c1a60d3ab827f56d4295f2671ba6e16904a58a39cf9fb5b8617b76aa4ae096f1955c6487e85da93c556c9198a78ed8d17e6a31f4c64f4c0365d4be15e396041ee6a6f3ffe7d215f5419d77dba4405a0a5c34e44b7e61e82e2223722f862096d4cfd8ee3d14738d96177ade8ef6fde07a26601b2afcedb85b311563ca0252750edd8a0df80abd8c9cc1a9108ca74ecdac15c5f3118b541a469b1080fd0592f6556f71669bbcd2fe89fbae505cf7b4fe282d7d9de2990af14934616a7dde3602b66c668a95a72dfa1f70031d57fc3c1f4b7ac4a60a0429f3c6e37e265a4c5dc5dc4068d3583773e9977efcf95d2a3f930ad250d9506a4cd5b4b2070ff4d440da45e7e7bd79fc7c68e31bb8945f3696052efaf2349b9e2b743f9b80b863087214be38d97a4c71a11ed962439028f589d00c5976d009417742a8c79123f86788dd356b43006982b8bc5256759b4aaf5ac27ecfe072c205cb833205400c82fc99d199b4782c1f114d2ffc432e9afa169ed4b77e08f4706dd3e173f0878d7f2f348890b1a73858f556a6a8d22e6bbe2456aa04657605939ca2bdfa8ea9bd8b25d2691d96588431212878d0aeb0e8883179096bd46163fed98de8922e8678bcf7eddfa5f7b5bb7c0fc1aef7307652756fc3a1ae5b981e99fd1b67dfa3544a9cf5a5a47252fe1d7c473e9977242cc65a7a3ab4cd626af84c195d3f03b278ae6f9daa2b4caa7248a79f52edf21bf9f64d394323ee2ceddc033e7702c9cc775ead665628b777f2683241891be0b15f0700a66da4dd932cf78e26fc89ff33a8cbb812d258b4dccb500f4862ec59f46c4fb47551c6e4d2e80dd7fdc143ab30a923659438e1637a40e815bcfbb3ddc23f27a1fe481107b6e2420116f0cde889c5411384068067b9f49d1c1758d63cdfbb4d4ef26cd360a423ab1d3547e761f7b644d95f0ec23073af8ff4a827b367b49edee5326b0c0bc6bf5d2a52eff77f8367ef54245d577e103a0576b58ab10230fa4a397a996fc47ba5c3741534c355e1d29ca6ce52a3d4998128a91ff7ce0fe2465259cdcd0755b93baa8f432f2f5887b780070fcdfb4330b7da24d5e174214e301eae4ef039bf05f4736999693e491dfd8e2428e973c4555f5da423bbc8860a8c85aa04dafbaeffa08a9c40dcb3f7534b74d27313e4ebfc691ca0c903192b124c0103850dca84dccfc9f8da43007aab4fafa3a08a115e5843f7a7c191424051f084541c85334ee7f69695aec93c3fee2e015ea0c39130b73a91e87010bbade670cb4d00c3b244ce9dc5d78243769183a1bf8d66a29a35979a2f5c30344a0e2f4f937acb4ac3269300edf7a2286c2595e03252af4165ac6fdcea61adc7b344a47d5f1d9cf63bb209dece388144f5ed0aec3d0a63f6303d6c60561ce38a7bb504cbaae6bb1cb50188788553e157b4906e223434f8b46bf3cebda2c0e841715ffd86450923f6ae3e922af4f1e89efa119b20e251967db3f32001504639e7638a2137c4bf0a3eb1dac87b9186c1cafbf27512292c2866927c1383fa04d3f2af0b46ec171f9cc25c449b44b017932279d2989d59776e4a1953001b28f7289696eb19ab306011db83698e42fd014678c543d582eec511e6703dfca1d706fb6d5dc2a44f23204c9a84c897db6b1421dcf82242cbb8cdf5f603ba76e048be83d6fd8f4f4318e7a27190daa42ca309327c928ae6b15efb1c6d60a857b086b25f836864ce1b4372b818c597d5756edb4a9871200f74dde1220bfe7a319eab9214a6abfd89c2e809ac82f8dc7e61dd66c8358397144e52e618cae7a443eb9744ba7b84c4ba07d2b3a83ca9b9f0e0bdf7aa8144fbe1c2c09aaddb9286938fee77ae8f5a1bc01f7625c940111719b59f62745f874596f55c43aca87fa26daa65dfff385789f0d28048bfb85a353f48209e5c3b28dc482933f0782d3f94bcda7c6f431183d9adde1a791f2171962fbed1f7371ae1ea3b8e707da6a961d0fda0a930fcb893db489235bf66a8e960399464375389144ef0fae96083e9d68b6b8fc7524f04bbeddb6f3e8595298f5b9008f346095e50cf4e5b829e78d4af730a1d1814ea0b1544cf227205246e2cf3579a39a658da88e52a2a25ade05607e40698cd2558af718da8828bf8db106dd56f5cb9bc015d79f37755bb9ad6a216a4052a5570a614a1f0a1fff7bea3e663fee086864a08ac161f93a15278c453ef81d4c864903fb425d1a428b3d108bbfafc546e4adfdfdf36c97c81f1aa3ac4c764f05bae255327d2b664dd3adfa095e344e3e2dacdebc1b43a37cfc00ef4985b66eb989b114114b895867e02b10cd7350f4d91c024560ed1b6bb2841242d6ad94bb70ea2b0b8b0af4b55d19c091b98b19a9fc786127793d2777323087003e02b4a98a980a90919fd652045de6395c8a837b7d8b7a2d9376930941e5e0e9a70d044066aba2a43bb3b159703e12fa12023d1481a1e28ad59486c009ea729fa61a442a45f4acc623af2d12437f32902b1a8ce7f1a198283de7b8ce12c723cfbcd2e401f53f9651da504dd6989dcdb7c2906e5f1e4fc7b90930afc42cb7ae93797737c0a397674aebe5dcff6b453148998f20b6f6e0e54d8d6b6233d27cf2b8eccd6c821175365068154e0f277f744b3de216bb7da62af05c347dcfe2fe1671d7f94c4651cab9d4ad2dad3c7003b21c9e61737a239ab4244c8cfb361b2aebb032e3e226b01ef7a107ff86c24fc25fa47bb1fac7f382b38e317cff9719834b4f69487c0707d1d7a2532b6b522568f9d3b4a4fda29c4a0c46ca5073e7e6497293a23440e10dec9c485a6f03ea4341738a435e44d7622310f1d834a14d3c829f957362d884d63f92041cfc2055dd722dd05b4d2475b1e15a1225633ab67d819a832611394e35e61f78a263268cb8c7a0debaec2567fcb577fd36918f6b25f11f6e12f38615cec1f749d8e8c090a4d421b52c8a53e9d2781141232ee82da31b80ecc68cdc71a92a4f158e46f8ec09a2456385906ad5fd628d60fb6be2de3f5043b9dc9a91a3668098b4c6c0b17e1a09a25c8ca8659456c661d1f30daebf618990685deba0b26595cc010ca098e5a8862537a149d6b38987182ca0e074255d583c79d7ae65349716c559d8c9038dee45600c275cf98526e71d379731e11ec21a764af6120f05b7f1af186988322efe13f72f7840d9538069cd367945b3a216cc7a71bf48a7b148727a321ba34c7acaa8e8878f2f4ab8597bedf3b3fbe10e504964ea0953bed9e9db48761111fb5e7d7b8b67dce1e7715fbbbafe986a461aa57b3c1afb866b42be8394e1427296404dae5886e72ce43c49e8f4f4f184fb24aea84fc505bcbefffbb54e04a5bae95fa81e4de86ae98c468e02e2ae3d77a04fc21b2a15eab04536489cbfd2f4bfc38224f8768a7e1d400a72a268a1934365ec3f422260bd2105b00334bf54947171d8042799c97d17c36116cffb7f76d63e4b0cf55515f7d46d2a63f0133b75c453d4a5c8e9aa7fccc671a9b32164dfc5df9f0a772f469b14dc0800aa393df881536206946b7c9da38a4f693f52736e9dcf2ba06d4a79b28e13b6e0c00308acf04e14980b76fb49b1d1659cfa360f7098b32ba250d59551e57f3d1af39e87b4491c32444a4d5ff067d6d341cce5ab6518a4b9193d1064ee1595b1a41f675bc8ada2da1e5c1ee8779b3f1ee4fe47065822a50f199ab3672f390ca027e84b5f611f712286c28be20b21380da8b922641bb83a5f8876e1670652c3d648b4ad2979f34be94c7faa8d35ebb582e19ee0ad3bbbfa024179c8cacb6ca56172516d4fb630df08d68505be0694473a622370ab9d862fac475a5307f817101dfcb626a11c7a58ba4a87ae4212b9e0401cac4c389abd13f72ff9ac7181c3458f8b48fb988062850c2ddf794dbc55c9f88d035d899aeae9f0b1d976377867a73c2e11d694b41cd4f9d65a9d88870be69512172f98287c9d9d92c426c4fecdffc46769d0d805565ed381daf4b7c3ad0f60b102f97c0c72cea83e4b2a719204200644ea8cb2a2127bfe32532d50d7cc8f0a9744fdbb2179bc6918dd17d4b54836f644d7f8b6617a59084820e14b88ce5923aa78f3d204bc0f00ce2d47bf3f1745333c9887f1befbb5255e6c6db9a10234116325639fc0ec9b00858cff0b85eed75ead045c38284c37bb083d093c195a454531125da45e76381dcb97a5cfc70d05d3d8b81e82ae605507c12329eef66de78b07d1852fef386a2ddaec966d1d4a7fd25c0455575c058f83a040a01c329c39168b6451d03157440fd7186ffc47ad411e3db0cfc2f499cf4ed4822d1300403c73904ef683871f70a4a60d1906526029bbf76ba95ad46abf40677e66b3457260d98762b329eef53c0327eb84bfbdd92f31bb76c12c30be5fd06bd9347146d2e68b583066c5770b294cea43b689be136fb19b2d5e348576d6f476c9e5b8c0d9725f8b208a21cad68a990e1bcbba8457cda5e58bae39a03460f0064ae62790b2accdd15d46dd9836bd1d21d2006826e3400fbb27c454eb7f8ce0afd99ca899cac84dc8194b0ff100d0028fbe90c5b8c1db65611d78e95ff06c59b085af1018bb34bcfe87975be2b7505adc72f53af4c2c813149631ae40dbccdbb0e94b3db27a95ea756a4710d8e638d9526361cd8c9efeece58c1fe5ae4c6bebf6ff6df6c68969b775226001233dd5ce3bfaa43a0af1a669f43a7c45eb107985084d542b5b80d3a4f1732c7a76d770c0ec34d61e9c75b5bdfdb4568145a6231080c4abaf57cdaafc4ed0b55f521ec892b3b5646c6583f8f8bc200904a3b011e3436e9f941a574555faa2114009adfd633c98801b5d6a62afeae02394a537606d611a555766466cd39fc97133153ae122979e730626252672bb3d4a24a49bb93b1704d666da6a6c89610b0a9d5fee91a2930e76eb4ca241eff5b9bdd9de03b9c7ebc6341cb7eca86b08c8f5cc1366f29df486450183809c27965643b9635e581698e445340102cc7a5fdceecdce7c286b32957b25fed8ac418c75130be4aed2cf09e6d3b537f90fb988b8e9c02d6ccaf83b9182b69ed40009ff7b855847355bbaf7dd502fe86106d8883e613804ea27168282936ce82bc61f2089f21b23148effae0f8782de62fcaa799edabea89b5fd0c61006256089d9290c9488994cdfb54afaf07a3dabc5049475dd76f1f0a6459df7d3f5f0ee55e0d4f53d6fc93d9b0221deb8aae8b4bbb94472cf33b051bf2ac5f271bd5877b7c1b5f6c05abe66d0751e086fd7af99a91fcbe25821dbd7bc8c08a44fdc615d37c3506036d8a8ab65322e27d3cabaea5b09e9413567a697fa6b657ff11615bd29686615a1a9fe763c2c2d69913b76a00ce7bdf48a311a53ea90a6cafb230c7bc42d98243d8e38005a5e4f7222b91824cf71363252f5fb03a948f6cdd5fd7260d00745868a7456330064ad8c79f3227b5069ea38dbba56faffe842cf1c0c3871cdf53d3f6978492adbd2cbc82206ffa94b586ac4eab09e4fa60bf2068c42810948148bf9903a3523babc60a5a3f773466d6251be418813a435cc69ef92ca15f4012c16e4fe68502b9fe3882c1c2e1a9706b02ba3c167881ef07989ad9d19893b20c7d999ca2b9c0e55642cfcb09e6db738f560ea60ca064fb7c53628d14d70f38b638332a8e397ebba7df782d60da1ba84cd26c65e8acc689ae7f888039f972a13363cabe8e67b17e76a63be4cc36e35bce93e8530068f5e671155ba9d2bc911bbd82172186c4f6a9d49a664826fdcdeaabf2d62bbfb5763b10a4698e3d745bba528bf1ccb15a2e9326c5ca97f24601850e05b21baa359b22a09aef22c071a35e912a3851fa9dd9db4265345a36904a4f211039c74a38c45e5b2447a20bdc0ab16e976aa1dd522ccd9da92a5f75916197dfa361fc02d42eb5b7ab7d2967401874b0bcebc4cc39a23fa26741dfcae42c0b580ef77b9eaa9d2c244a62920f8a02644e3cd251779c81325635f7a453241e845b397947d4f1551afd09ff671daf9116b970477f099f2bf2290c12e05ef545414baf493d2bd3083bfbcab361f6caf171bfc8d64ed8ece6367df0ad4030779752b4e0724fde166095f8eb42edab283cd741fa0fbb3b73ac4b971419f0642ea0b65d2b5a1764b593b8e5768592d506c63cf62dfa9c6e148c1a70dc447ae9a7d4d15186b65849b886138397a905df1289070348978d2258f1560ab8c029c31a468cbfeed58cc9e515b271ccd6756f0999bb74dbb3fb6d40c334d161d093b6731bd444d6995068e646cddd4e86e7d82909f9c0d99c3f65f7de4f1cd07eac99a4501c2802eb1b2abad2b4ada27be4e6ab04683e67d9aff46bd5e3ba7b311d76514d325a1104e9c2bde6fb0dd81abb30a78155a69eb8a736448b5861a6f7a152fbd6d16af6e6735c244058efd2465a1fa2efd1ea213a561c26959fbeeba3e6be85f9409cfe1e46222823d0654f282eddf8e162da81022ecb9ccaee04d92668cbe7441ed686083b0d7585aa3e8a75e6c098486ff722c5fd9e5cbcc59ea5af89bab27e0835f861284e59b37c3f00c51424b16fefc3ad27d7948c26b612e95225f5a26457f1c3273b8e64601830558bf58aad3d27f2b09c66efe5860075aeea3c6a169dec47be6de6dd0734fb75330940f645da04c479c1adaf2a7367a649b78016cbe1a2420a8da9b7c03c311f5d5d86daa4b092530f43e1e985e5fad2bc8a1f3885a67c2799b4181bbc8a60a06427033b67a72d65e1534ee9f3486d838a6ac58a5c5b99f38082e40dd854de38922eb59f1b977d2413ed728190bef07770da6fa7db91ebe1ab6cb68975c8978db3016238adac5548b70cbfc6edd7e59810deca9fb3d18e09ff20c9b2de0e13952c8b3d33935f3d2bab80011e44eb1452b6115e2293fe08752290e2494fe47f863b85769138c23289c373829fc7d7b32f0be42786b044263e859aec3f6e279722735b654c0eaedb38fb838b1fb3adf7653dc5bdf00f35c7bf25b907f59315207295b70fb36903e0b01d252a70faae9ad506e89ebbae9cf1a61c2818e8a6686c4d407e56329ccd10becce9481581b605c77e93f13172534a752606b4176a917649b60d992d2ac8bfdb2f435e49c1232774c2b18ea8ccb14098ba431d8fa0b9000309156ed6e68c82837815e6507ff896f5456e2686a1d3da84fdf7b3e4062bf9c6f722c628e7b445d96b8466badb6b801b0ef3d446a189e3188590c91cae523743d03b88e292820f8462c910a9288221f79538812114744183b9b4eedab523a6762f30fd4fe8e249afa0138ca09c1bb0a44c957a1f1ae14c831ee94ea41088b401963171e4d593443aafc9806fec02de6e3cd6eb64205f9e9ff7ec8f278f855949dad133c22dd18975257357a9427f79bfebea1238b2c0cac5435f99472855f446ddb01b0edb6787e6a5a6f79724099e786409b26d1eeb93c9139e862e0192de39c47d047c8a635aaa7e526311cc7a2acf7fdac4df69693188dcfe9583aaf7f580cf0ca3262b3ab2095f1cc47ed3a1a451701a13066fcd1fed5fe9eede337ae43ad4750d564c0777f26cef8b3c0925844fb90b12e6655a24392ef47226581bf79cf5a552597059373591832e17f7b8e590222204dcc10db3ef297648b68e4a6417e75f0505e804b4b56f6ddbfa2b25ee57a81e7d37563149c116dba8f383e1f3c2b1aa49960f62d6e111f6f39433c02347d2c2449cce7afed8fc3492f2469f96df5d34256606a8b4e2d296529bd8964a1df567da2e4c208e140b8c34798d84645276d6e421134df62eb6e5eafb84c44107ed29ddea7778e2981f1a67198303ef6da5efced0db10ef29db2143b51fa7af04b13163f0dbb757ea4da95befdf02c1ceff59512a5e726a53f48c73231d163f23958ac9cbdb9c77d4f38ae5939331ec1e55f8c9d95e51a0c481244d2e09ca877d3dca8cbc3de69c171a0f1272b12cd45e2ac9a372f6a9158ae5ea14e8316a9fa9256d78c6aeabc7aba14b2c1c181d1c63c73e7f4e878fa54cacee82bdd5c3780a8fadc0f3722726521d5b156283c5090ac3b2472d72dd83766d7dae991691c14354402170582085300ea1f91e6f1833a196a5c2aa2aee6429d9ab40305cc7ea43e54f7527334ca6c817a13d9c5cd3485f1b3a54c66eab63e6bdb29abb86702251444a691069e253e13a494f8bb9c033829c776f4c9207486a2367c68dc9556136504377ea232ee42eeedd6970b8c371632a17d679d1742bf36a4d4c7ac57dd151799793a1c6aab75a64021141b0119db70a29f96ef450824886c54d70a33c05ba2bc90b517a8c03c37a28ae520ccd0a18b0833dfeebcd471697a3c8b314f1695debb8864f8ff266901dbfadf7182b60041a8f8c965b3625a3ab0e653dbd63292d912ff492989a7aedf5d9db7da974116a88056aa4c4d30bc27d018d542166eeb12164deb57a02b85a826554137b5c51eb35dc768e8fe4c29463dfe17b0dbcc88c9b904b9628af642b99884e8f40b1932cbeed8599f06ad589d2e70aeafb2334d62cabd9f66c80397a19eab83d7342410bf7d026e1ccba875fa51d24809744ef6a1cdb33d33bdd0acc321265d442d5381b05494a4ff242e281df98f2f5b0dc61aeab03296a2739d239a53a99515ae4ebba837bac924cab1ee45663be61916da34254fcb800ddd09a5a413bbb993ec52550e45dc91b232037bcfe29c40b94876ad64d95574e2f788fbd87b0ae7dea50620a25755af185e684b3dc559ac3c2584298719d1ada916e899964704c05354b60dda3a85dc3543527bdc3c491ed7f5c3f0fd147627533cb646dd299d10e3d427b7d79b68726632876559336ee3758d94720186e022b9c1ee254758c6f944f1853b1b9426ded63453710ef85cfeae891b289999abe731d26fa1306ee1af74889bf9c5e35c0a9b6910fa4f737ae0613fd06503feaed14e746e551716ed094095e14619d3abbf943da90a5e0e4c5521d6fceabb00e6dd527f7c56db19c290ced675a3a0c00767b513a0c59a8821576939247104ad51af1415c9d069e3fd3844e35400a46b175d8130e665e43f405fc94dc5f311ffc3af3bc5b9d86d8c674be12bdf67810f8d91d9fbbd9dcbc134642072e24066d06d21331558202d1a6becb4a05b99d389e35a1205fc5f824b6451d15d6e6430ea6404eff9764c9a3327d7e6bf5c8a05972fe973d6f3f0e351e803741b69d59230d8646ecadb825805c1201ff3d82e4b52ba2cc008372343bba95d939d11b82d945a2f672e7615f5d319a4a5c88d5ef56b8361e6b18e34207b2296892cf5194562abf730e0c91201645f005e8cc396d181aefecdabcc7437e4f700eca4896b658053ddf107439dc2948207d0937ff421ce4f5da11f7605b3c9730b74201f769f417da5d965b3a9c105076fa890c6cdb2776fc149663469e3b18ba60d03d7addf1b556c67f1c93866b9a21ed365f8c896876e9c60c48e8a86a12f32a03618abd4f3c1a7df65fe0939793c8cda57cf4a1b3f0846cab34a3b16caf2b0d386dea10d85f6ca10fda4adabf28091b6f6f4ce112503b382179a116ca352c6b02005f5d611997c033bc3e85fe11e1a97b57c200b568f2c796b4cb0d9a4db889d236ad3cf31bfea0fff1a646253899fb86dd3b49e1f0df5393b76631d6446afae5a21c9f691f66cecef5709bce24df38af5c6ea869fa60fe68acb88fef1bd84e74e6ff8d297b09f53beebfdf9e064032d5c0dd9e40ece9a3f699dd1f22fcca34d0b5ad82f2044255d76f3dfd4dfe1ffa2a0bd54386cda35ef4f3f438cee23f0d769fe507d67d78935983bd3ebc1e99f680c981890ff2c535a6e3a1479bcd9559e70983be9d073d61c35c3ac6649cc9983ddac1aaa0bb7119b9f6dbd9d62053ad3c4a18a3a2895cc3d7b8304abeea8979968d44be3634393f3c373f3c6879db275763c1f1dc3a3dbd146c5565a1d25f0dab7da64bdedcf5bfe03fdf35ff1d1810e17f3eac144760eb6c815149d9d4864d4da6a7bd232fad9b21cf8332226e3c669ef4fe0c2317d8791ea0be02f0554bdb745ad552f5ee422a0bc8d35c8c7d4a70931bd470a9b624a351274ebc620792b3ef5b6ca44bf5654100ae1dcc57d40fddc9524654193e710d6f29336e49ccb09fc6ea48890bce82b9696103b4f9249643518505db3fcd85962a5b1789d1908052bf6d65cb3ab29b4576a9eaf99d70c3e4a0fdc962e3d637915fd59c59ce51b7ca1f432b457343068b8fcc2a250289a5a8704b2c4886d23f5b0033d6890b15cd1a26f55781edf76ab3ead9cbe53b3760d31faef75b682e9591117c032b164618f5fd154454090c889053aba8290e21a9d28e9fc68ba2b9f5726ea1f35c33d3f9cff4dcd7fcf63dd2c260b406b39ee1a1fd46ee640550848b59bb38343fa838ab5eae8e199e9d39ff403a6aef20c969c512a2b2d2bdae4d95c30850a8ae1d4332df2d7f84780c8bbb50dd755982fa42ef349ffb1af71777760bbe6bb91bdfcc00de5f00a13b8fdad2fb2185f49a3c8f6c7c0fb0753f73f8e09c8e99e648630a51eef3a85b7a014ec5adc49cf5025e719f329e58c8c84d71ac366167f9a4570ecfa6625c97f041b23ae784d25d891b590ad2ec94cd7e42df00f8144aa2b9537c2c469de193437daec80739625fc779e197e9fc3b06b94fb63e9a06d6eac9389d0d09770d5bcee628f92187527791d22790bad70e298cb6a7f5f61901cd85dc47c117e3ca7b64b9c9e0c51d605d58f679894e2fd5d3b770d7401a97317831b7abd76d13de88b0404d0b2a47f5fe6d492d8bbb89fda7f595109fe7a98e92695a8f4933b2db0cd643bb06ae4b6d1f90df2c570c119a643791090ad3b4e48d80286001b5c8ba306d2e7f1cdaf63a5fd4ad60118ead049800c5460c35f74cf072929e3d4f208930e274040d8486836615990996943fbfd1e96e36e62b365330a6f7e0faa47fbd5db42d3168dfa03e4d9601cd70d478bd79b63fe418bf814c6f6f954145cc8342374484933a4d6c7905eea9219f728e5a16409b880b9372d048cda44aa5f9e93d9fbf05311fc0e49cb948109e36e982b3f7018b6b17b4b70b16deaa6f96570ad25c114e2a82d7801abfbd40acce8764041a9928e21264b9dc0da7a8a2259ee293ec0438e0a68bd9f92a4b182f74a17cce6bbbeac83e9d9c4f344efba502de4b6b4eba3c6acb05d32017a246a3a8329febb0ddf33ad08e31a8b43407af1d212ff32447a739589a13c77c72a6c8f2fc7c9bdd8b2f05f1ba5d18272efed23d1de8616daf576c5cb5f28da3fd74d060229641d436c97fe8a5047261492e2a04f4adc5e40c202331eafe22e2c5a92ba5433b8b200e8872b02de5ff2ee04ec8274cb5041dc82bca995f63a9fdb1ce3b60c3445536c6ce317818e70c52652a75c4e9cc0334d823ab4c31c4317c1e9d1398e38cb59795e7f53ff1d4e28c7efd54bb69cdd34d2ee13b4492cc5853dac193000f7a18da2ff4810eaab8393787db61ea3732279cd5588eeabb3b71b8cf7abab496838aba1a900ff766df4d803362a0b43bfbe6fa0a535c7d9b2011e267483b348c68790fa9757f4d46dd92af0b03e5f1eb1cb05602cc72a95c5bec4445ced4cab4abca6c6e7046ab5aa5026568dcbab0763ca952a9b4f7deced8dacb06f27ef585a3f57af9ebe32be24ce858513be3ddd538501e3760fedbfc4edb83c0ddc2755ba7bf144c8608f2be17ad003820c5751ecbfbb76fb62f2505093070cd1a41f3fc7e54ac1ad3b260dc891ff1813f1244af526557b525b46ce049c5a15d0da5b82dbd571ac44af50300acf0835a62f91c1a1b8fa7ed76c7456a0252cd27971b2fdcca4bd1f46e56a5b3dd84149772b1f439114da9d02827e268c71c3f50695de40c6b65cce3ee3e4ed7fbdeb550d9fa0d4bb5a8a4493ec75e5d2c293b37310de3e6b297e77f696ffa6b561b971c63bfff2d54fe0325f0188d5695c8dd47b6572e8f16449d69a679360a82c651dfcf04b31d3a195c251661003c8878b0869b120aa53b861efca54b6abd562c56cf34dae3cfcd9112f253b12a5d9e24262e31b6b560444fdad4e7e0f032eb2176f932a7f38c743c0ed8ccdf0424a4030117ca14160fe8a5d6fcbf8ef32e5307979b504fbac064ce5f1c8c5433e1e9426cb76223c38bc2bb4ff2e06879e06c4974a26f52e02a3ceba67db08acf773d0478f459dfc5e6888c6867bf77b9e93e0f43688169e5f59eced7914d2d1923a445ca3524235deb093d504a1bac4f95ecaaf68896553e0fb897005cf158745d7e1410c881cf1d5a926e12c2d52f4c95da7b1e027761adcce247768805e72c4548d001d97fb67962db5f0c57d6a59e315220334e3ec368ccae8f928ec775674ace3f654ed38541fcd9d3bc9dd8ee56f5773ac2f1ad95a0526ad8acdc91fd624cce2e2ee930840d4d003c5ab98af72d1ed60107c09193fc87085310f1b9815580adbd979370aa465b50a3ae7191a3eeadb6ebfdb85428853e2a8e04f9c0f7bbccc40ba23af04200c58a5fad6cfaedfac5c626b31960a55ee87dcb98f07d0cb5930b1e4222befd17eda6184c4c62125fcdfc9cf7ab29b7bc92014f39633156875b36dadb935f2340484697a47db32ba3ff7c574c823d076e0f9a577e8574ab63fa7c54f31ae8c8e80b41948af13d9acc93ded01811b6efa262deece356ed0e0a5f80fb39bd4c9989c26e72349febe1733c7999696d430f003221ecd23371ed3582054d59b09fce1301b0877fd2c23f13dac9b126c8b0151a7ef8ca780974c9fd662b80e4e3cf0e7ca50e63b7ae71f10201a26e83e09ad39dc04aee112ecb8bbd4d94aef9d9cb09fbee88d4d1491ef241afd770f6889c522ced71861ef5dfc2633c19398004bc5d39f918ffcff179c64bd202290ac1444498667715a093f66eb0cd5e4571210a3108fbe7987ecd6340e0ca7c6d4530eb5a10c9c39b0a97a05d78ae740ecca0f1a1e68a1ec861a15afd20fca67bb335d81b514d6d7b985aec1df696eaaf6dcc0b0eb249462b24da5f57b4dcd6c867fa456edb358cbcb9a57edb9401b8a29b9eb65f32580947c960411719c8effbd1f2936c130b88326b846a69c1920c56346ca83b4fce8a1189b79e243fb3155c156aaa16ae0601c07d5bb19bec838f8c114d63113c6034b41c06660fe76ee1d9d583221ea0c236bbb556e7e9efc9f2a245956b73c2e46e4373563f188912e42ee9af52d0b3ecf8a9cae1e86ac6ea55bcf296735d4f77f7e799f6f9036a3d71b6b78f2a2bbb5a6aab4c78f5c917a17d914f51a45525243ac56217ee75899121e78342a56465a3bbb54fd0263af5d89561ba3dbfc1721e3b0ec3cc6f8fd89f8c557f0812b1cf0aec1fa38adfca62c64fa589b21b83fd19e8c006d0f32dad077d0bcbca088351f65bbd0c1536a7b5b356bae8a3611549a60c0d9bd5a9e8de39d7a39452933f23885b2f808e652895f0f8a31f005bbd335f053c2f1041030963c628730cfe7a451c09d27402a518797da36bbbfa1fe578734451ba89cb5488599cd74f30b8fea8b24fc67c4c181a57d39d7ac8423fd15bb1ddd640fc1dcf7f1d6df96adbb52dc7ed2a764143d2c1bb475cd4212bba928e9e8a83c62beaf0838d8fc5eb4dc953d5b8ebaaf63827d96185177e99a0306e9bc389e99b9b0ccd24829b837a6540ee95bc7c79558df2dc0f01d965ba5923eaf25e9bad4a0248187a52d1042ac71684ec5cbd3e5b3064f230459793efae82f4012bdd248e1f350a00419067ec76465539d3ae6091b6002b8e8d1999f7c7659ecdb61af3677d2848f293312a1ac41fb0f9fcf28a7bf259b4fb2d34b071df25a5d4c4286bf412eb0661b6408ef7e14376b4acd97b29c65f7f68ca958d3778bdf15e1eb44d9a6e533543ec2cf25e2586bcec3e39aa5a0bb293fb9f79adcd10b457a38e300cdf27496b22f6fd0bb1e91f9f6dac63a6e3e175d782ec8234d839e60fa9c314d24061e3322c15ea5f61c92d8dbde7f3b311678bcf2de3ae70247ebbe2a7372d64cdf892e314a3c03fd3e7fa23500603b8c4c7d4a8ea5cde8f73604ca8d9a20ebfab4ec262056aa2fb231a1b6990783c2e2bc7f85bd9831261fda6be357eb830a9cc6757fb00bef2eb8e14f1aeee3a831fb2cb09cbc618ef8be6b2714ca1ca043608372c54c9cb8bfacaf368fe6c2a30e18498287266ad2e3f9abe5e717c95d6a1353d7dd62729c005a476a2103c01a2f3073626bf3873eacbe82d5e121d1753285888f8d322cd7e87b680a5a1e02fb2e39d6bd3a607a695ce1b6d57761abdf1be2e038a6472e3c44910b51fe4489b3577cddf327189943e70901b63f78205e5ab41b360f6779c16ebae676005bfd254deaec67f360ccadfb2a4361b834a105b115c31b384fa29e3e9699ec2101f1a3f16f11a2fd908c0ebb38c5031f1726e36840a71df649f16d0f4a78d7c8d5c5904b8c314d31e589bcf50ef76557f1d13dbb9928534029ac69c45be3b2934d949119ddd0fc04000a72b5ce33303f38131713dcb66a245557cd80a2c8ace332db1140513ebf1dfa115c4ab337b897e928908cd134c1c94b67d3cc415dbd3203780028ca259e79d50ea7c0f18d04bcc7a576daa7f24f2e6b55c25ea30da5a19cf405f59bbbab760da7b9e85fced0d5e3e45baf6173c2876c7d79ca4865bd42a376cd9875b370c10e6d0d72881add6a4280507dd9fbf17e3142f7cc503266b2c60830e027788b924accfaee5915582d99711a38acd67b3839c044bc9f57e1c8129db81c00ccfb681db6a637b6e715eac45b7571bd40024c4f153662696df6475bb21ff588804718b47757f2cb15c276b2b537858c574ecf3b58d89e1123a5e50d910ae225f4ccf731526e7122a70c79e5514a11d6d2957f2bc876c13a508dc936908212daefc2759f4791705de7fad6890adf88e4d7fd17231f7ec9e296608b64d6a9898bf18d324c2699b8f11100dc2887e8bf9bb24589965539d97ce4c07223d89f946b415eb11df2065ac2e19fb03829adaed96aaa8d65c719d87e002dd77a3cc68b18d605867c52a25c286a021104026e3014cf744882315a8025498df2506fb9b67a4492cb82c2909b548d7ff93fcc4a2e1509ffbcfa4a47a8ce9818c3f260efe1d39b8d3d082ab586dd469883653391aa39d8b01f698acf4815f1f431e8738d4848a28b6a3565426a4934c4726c98282397f37de0a02d91b3930eeca08d0a055fb45dac97087c8f8b5a085b3b17d09357b670ed0dcd68c8b9a161addf66676d169880bc9a020c3718ed71fab2f0a1f0b3b8e9962d680aed0a355033cd6c1be48a251e7129c6371c8bb05aee78308103478f70b25126d7644b5da4f03568acd08da8f8fb36015818e3ec240e3f22dbe4ff6b196def473671d85cbac5ddd60aa015a7fd3ded5a0ff52c6602ede273643f8fde13c1162d23a7b18ed7dbb259654986644861ef2519ad2dfa8f2cc30e6b11ab93b2630f8922a0b69b8a34a8c1a3c287a15b50e8c53d6cf5f8fee24c8662017f8760f285a8d0edab5123aa792cf258877ba534f1c2a83257e63df88a59d4b3784f4b99e5a568b07a851f23a8dfb1c192bb556d4d0ab3fc21e0852665605d047b8b5c6da99332bee4a5fb67a7b9d8cd888c5bc68a320e23f82526a035dd04b2e16184f105358e88db965c394d30697d3c101e1a57a83c70e2019935e5a4e94b135d438dd8a7474aa96ecdc0a44162e637d4579db6e0d1b98bb9647347551e87b4534f27e0d50e1a52a4e6c806a33667c75c979b2f9c8d814d83c2a3dc317837ed95ddf44972d4b57e6945cd7277874cd46d625ee5d0bfa1dca65f6de2e4630eafd5957123b19992fdd1b3ad550c150e2da77dd1bb0cfd2ab51183576ffedbeebe02dffd298feb9b80f3665112b064e79163fdf088c2966810c04ad305320e53e5c04b6c8493a9c76f117f9eb2fef5ec160447fe41931960d9a8373ae7a76ad1b4dc23f68eaa904814544f85dca484e7519b5e266ab4d61ed443eb62ce29822ec182c3c4bb0c824ebfdaad6f98ed35d9485877adb5eec6800dee7c8244bf35360bf49a2befe913d1eb494e18306c6f44f2ca7cc0415ba3996a8b4e2f4a0938cd297b784a47f896081d87924ebbe7120c32fe705193a4d9176065be8fd83626fedfc1759df722be00f55a4130bffb461d2f5c13b7c7e35c0056078132310668bad7d2374be896a793a8572b84131674a51ceee1d3b2e5fea23998c18fde4d9318472c18dfa6b418581e56efbb215b02c44d374e766e4dc3070fb8473682ba158955c540cf37f73d35592894c27318cdc0c2dd670f34698a4bb27ae69b197688cebda3873c53f6f8850cf413ae64defd6a43dac1d205b70db2c6f30cb710c934335f79bf875c937e06ec306764a3dbec4b21b220c533e533651a98c90a52a2be5cf360a6eb13bae2e77ac11ec874999617b991e9935a94189252a5bfed9b3fff0cd52a0da6b102391e3c636ced991951adbf85b797e7ec7e8ad261577fbd2bc61bc5c94e6bbc66f8b01d23c357e3312884f4242ac06b10cedbf442aec75b15ec1877177b913a4d12c4669343298d0f2b4ff60d7c1970cf925a4af8b4d7d558563ca3030529b13a5019a0d0d06ced7cee26c6d8c3451af84c27574f1812007a5ccfacadb47d9f72e63a3800db910ce71d72fa4c8402700d71a36a4da238d12665fd3a2702f71170ddc6f635dd498b1c3b4b453cc48a76b326bb7eaa5fdbd674e840d035e8b71d31b92cde3b26adfb52cd1d2a14c6c7ff929f990d9f5e3b837713c4554b5c7f298626431aeeb3d3d18a383c75a0d15f23ab8359287705868b45b8f10a16ced75c50e46466a724bdcf91fb850b32880265771dcd595e846017778d91c4731eabc2833e7c5c0171656638e44e432fde1e0c544910d034161495e841ced090868918212f09b2152258e9567f0902e23784fc6fa97995c29dcced36c78b2316dc139e666d0b9e5ac389caf87634fdde6848e7d8eccc34d98f7bb4c1b63d99e818d6a0f7ebf1cc96cdea811a26dddbba788c901843ea6ae7bddbc087ba0e586260150f043511b5e06eda8f6895411404770d8391247cb26e89cd13f1e5b91445a233c46aa2c2bb3b3f99990e1752c8473ad5a27c355cf137dde1305e5a02fbbf6ab94de4d69099189e848fa0f6e5109422b114d156e702820dec093ac8d82f912d30f5fdec6d9709dc9c2b4eeeab9e127a53c9bd2d39965dc03d1d8911864e1e1de9adb880b6cf0c625e88114cb8eaade8f9e4919277a72f457de05d7376171bccae44c0ff554398b1fe95dcd0e725cb3894f968e6ce898ad9e60abb490d07e7e1fe947e7d65cc3b414e6824bf7d5e9d865bf0f86f7b46718d832b70989c154464fb8ce1b28cc48324c64878b5c7f23e32dcbbd6224414ae0bed8ecad561a808da4b8ce68885b41e541874ff36e1216fe0552dee34b35d8f4fd6505e06a2f289b6cf642ad4fda753b089bf53df46aac01c1a9f607161856b778618327ce90aad83c72936de238f979c12b00a971a9a5c0877c4ecb7770f4df38f7a4b0129ee55a7bc36dc49856a60340445147bf0786e6ba053ee3fcd7f828f9ab0855edce0283f5fa6c3a1e163d25a77b0aa1afacd2475c4fbb4251c18027fb80a71ad1fceeb591511f4d4275fdd2f4bd67fc7e9f842b2824bd66500300de56c9cc0e62350cff529714dc4d40201dc564dc6e26ae08bd9fbdace6caf40a912616b1f9a71ade590ec46ad641e71b531569df07a602f0901ae9838cfd0b1731920f425db137f72b74287e57c74516a71abf4626f972efe182b3116b5415e3afc5e4953ed90e8b2f55ef9744ee5e8f781f70a7b578464b95524f2cc5213207e0b1bf87db82fc97893ad65f74708bfc4fe3a7143bb01a0bc559febb4d948093afb8989ec67e733cf24d4873955355c91ded60b474db8ec462aadd74d1d4b37ab38950d4d56672ea35fa272ed9262b3f6f412f28f0072a109811690516edafb32bd215e32e1ff5026799291fcac2b348fbce283b8d0b9d9626623040f8463784d065727e72d822520ce9f54b96e2f332c0c4f8a031e1de49aed4b1b7208cc1771154af30a069f5f4a62a5f93f4ade7a479cc97d0fadb8f835d8e84d9eb9099150aaafec1be8fb5983e1fd0986b4f5ff3a5f7672734b47c22b7fc939a334803a1868eb71d93c60bbe8684107126f1076b9545e01dd451799a8f49a3243f614298842fa51b02116cd10732225bc714e79d58223fd40f747867891885252bd348ea8ca7d02db96848e24dda40fefe95dca01e423a4e570893c6e1ef4a367ee37be4d286800fefe5e25609b46eac3d0424c1a79dd73f67a0ab6490b5988eedc3b0d98d747656869c87d1fb4de624ae05d3a49ba26593af198d7206c6df7ad9c300a8342909ad904a60d6355d21e0954082002040a57390f2dd313328a634a97607ec8386f30e5abad68db7c69d4ecc2ec8b84ab9b629b4a7d3cf483477931f30afe06ed12aeb0357ba539f387cba11369e6b8efea309ea5d262d05684069c2ee8bacb0a4b37584685ab7195285860067e0cdf21023befeb6d6aea2a53c8875beea15cf66b94b5c6e8f9ab8eefcda236cb66c9b1dc7d810b37178fc06f116983f8b72e5ed15aa55e5c30a3115c7459c045de8c9ab31bec2df7208450754938ada49112451750cbb83bef07816027af875adb13fdedc8c3f2d77ee9b299439cb605a83aadbdc1aa9b6e12b124c1346c6765d9453ace3213be01727ec120c4e99e5190bc5ec5a383b22c3f6dec5eff1c427fefc1990e35f78db1271360eae369b9d1e0ef391cf211805942ae4daa8a4796f4e74d6514dbe19a200296d7b93b3cd59e36262ff0196080c0716f2065166cb5fe85f4d1ae3dfcfcb13f07ab911163bbb5fe7242e9dbea838c52a1f3257c57adadf583e6497dd8400f5f9d5121c7e1e093786e377f67e91f160b956b11b97ce14713b43399cd245359583300a8102d1680da05f210bc5e4e9ae4f1bc59b44694375cb05785452897d75bd2dc31b57c467e0c3bf2da02499bad121fa1e191a363b0295eee0e4ca0386f16c32e696c5452e2e547047307a5e85b7be736fb3a36105e9b1219176e4b4074a25d44d1a30a6c16f712251b172f8df0ae3762cfcd0fa9ca87979afdf7787171bf6ef42818fbba269c9ecf9dcb95053f84c19240ec6fb39ba56e70da46270b3c0e2dc66e2b71f0a212b8d1a0dc7dd380a4f741bf8df52d7de10fd5a965d17e0b6e25f92c16fc5b5f14deed3fbe8016a798d32a65379b7bc858afe0a3995463eb44f70647fd0c964ce9ac38547d8bfece15e82884cb0975e79fecf9487afd25e813ecc66553b98163f067527499cec6652c80560c9323baa29cc6438091860eb6669da4df2a84dd1cd380131d68828cd1eb4287abad53b9c58dd938c18c15469ec4f165e562911d4249dad0709d887b37312522ab1c634511f073bcdedd0185b13b855efd414630428f23f70f509560d4dc14b897c4a5e9c91d5e2c2653840fd03498d23b0c645687a43fa4dcbacb1bbc6489fd794371b43bae9ee48a68a83aebf7f19ed1963d2c1804917d96d43f5d97c22e45904c83bb0b0a07274765c6311ca4876a7289876970ea125b0c02f1bdfc50673828b321a616c3f000ca88a1bbce755892e4a555e14bcbb2826849a6295e25bba160e06d0f9b0adafe5d1755c4bcddd2eb866be097d24becc58b1ef38dd0e46056aa7dadaf9ea99cdd8b7d967a014ef97f3ed39431e30bc347b914852920905d17b3e4dd710103c0956e3761f712f562840b83a7582cf9e4cc16db445a79522785e9006faf9fc9efd1ea88bf7f3b5abe12ecff8dadf87d4b9be3b82f10ea921eb6c1fcebf2a66bf3da7529a850a7df11cd67ff792f4e8060e7f4d500eb5c397dc5b7c7cf49cca304bc8fef6c3de0cd468656b9b46c9ced31e6fdc6019817ee34148c1e4a30ad15ddacda8652c139459d5d10453b2dbf054538ed30a6c5141939175619387d5e7d594470a16cab08b5e890db7646dc7720f882edb73e69ae90a1ccebfafbbb24bd59dcd28deaf4bf38569e8372db22748f743afa4738ffe67dfb8659e8c3f2fd503d03a9387377cf0038f08d4df881697f59fe00f5e91a325d00585dfb5f39f3bdfa2c8e36a0fee4f5824d009523a784507a5683f5d18dac4ba763863964e4cdb7137ae9e342377933e7de04b7344357a0f2753dae4eb2ca8068006964baba4123194c5afcaa528ed29401f7b91d4fddb26eadeab2355410040f264bb6b31a6dd15eb550e864e19192c6cf83c05f839cdb26fea7b96dd2dc0a59fb6abd2fb8d7f23414f8ed69301f3e04ab7b8b46099d2862f4dadc096c0d2fb969ec86b0dd5e0f0a6f5ac82f2d1f6c86ad949b6189dc3e5c19d4ab707ad9c69554a403dabcba13290a0127527812e1f6e6582eb50c743433ce537d5b24a1710adacb99bd9ce5f7daaf3b26977704afe7617c118cfe3ee8fc23387569b598432ae5aa2871881f431a63a95a151ad75f41f2496f49a4378b177885ced4d71b1f88502c148efb939b9ed63519c575717fb4778ba9e0b71fcf4b010766ce79f64f32169fbd5e194a0dc0363778992a1e0cbc203a4831bdf806ffb58b27e3b20d5fa4a0c9d78767e09d807dc831ec12c64e4209af1f0d6b5a792770b48ce2dc31bf9a05a1acb7b679f887e231e605eafd7a6345067083d285d091cee33a553524c9e0f2890694d6b545bdbb31bcd3ebcd679881fc4fe35baf0f978b0c7e2c53f1f1259915af293c58e805ad5b78f3190bd61f701ee7ad0a863df6e8cf5fa0bbb5549134016ba8f7c92d24561fc581c1c3efee32935fd1014d1fc5139f293fbefff3dd997cb3ce35e8f41816129a7435082bfaffc5246516b6982c464e8c481a91a6e695ce12e4aef1b92886419d47efb65ea5afd21bf899501f9bc4d86f91a2d1b3a5b21eb122f6d4d2539baae0f65e5dd4b2dc1f8dd66e28aff3e2e7669317bb7618795f43053aac14a6340243ea1e75f77b872440bbee090fc761314841f12a36080f602ad7f1550fe1415efcc53e366660ada1346acc946128a725ae175b597bd84e8f5cdeeb5f23b9787fafb8511b5ca0bcf1edd80ce10b412346afbd03b1d0443373174501ac2e4cf11588fb41ae5689b857bc27bacd52451073983a46af812ff1c0b3f61c047cf604acab993e28a4219074f2da43bcfeb4b018a68d7fb30329582fad2a77de9dfbf9ba8941919b06aee43712322b08e1e65c79e053c3f859f10037270fc12456b06f1ddbeb6874a204f71a87e10e5c238c666b894c0a5381060608b6d7388f54afe389851303fe7af2486de8d61331ece0ba2b7958d3a756b7f72c8bd4143af9b36e6141f7a23a085874f0c6680a20e16df5733a6d37053f02760fbbc3d2e1b6dc29320b551e1042be38ce96f2a4562898ddc61caee8eb5dd5449917f89577e863cee7c42eba35231970125d150ad431f0ec163941c28e8ff2016b4b5729255c680bbad12af2a6ea3efc0ecf8b18f59912520b0a67e4e15114a9b5fdaf924f3d2fe75fee2c4141e8f957326789e13a2b47bc1722dad7bb2ad7b963d3cdaf535c76dee55d7157e0d21e2257eb5dd732f77397e3ed00e000e584a781e2d17206e444014fb8cbebfb6269f674fb4e19c5c1134353e38adc758c2b5e58523398df83381fc8d27a22472fe25846aaf8ec974bd1cbb7badf17f7b59583d6339c51b49e90dfd477ad1528a59245b293a15598a9cbcefb1e533cfd22eaf7ccb9fd520e5b72dca9049da10d30eb6d63c820a0db0ffca86d753db5702419607c2e316d0d3c44ac17ace2d98f0394076fb8c4a74c5f01e97f669e1937a4dec8a4522006747fd548012854f156fe402381a1e7f71aa3db689e239b4b2ab0968642fc9da4f9371028f52744e2710fc631c9ee62cced8860460357579e7ac72c76004951b2cd3373fbe3b6846a2caa5dba07307a41cf334cad12d3ee344f82708e0f30f2c39cfd30f07b88ee3a1997a460c1314e27cdc5ac599c5b48132a4e6e698c872fa4d539563385c2402c579279e8fbc44a6b73ea434ca40f0e43268605fe3d9c740b5a19a2147504c6503b67afb2fd12da859ce36e25f986679f20eece697ce7b57ec43f64288e3a6947483dbc68c87fb1ce98643ea9b162a0b834ee53d5543bb4e2923d1ecb9e00348845a926c7a1823e57b82f60bac64d555d1a7e21b96d629ab6d319f4d434573ee1e2e0c27807f7ffb104e1d8c9e15bffd99c8c04bfc1e5c34589a451ddfb7a44e7353c2c501094e1e524fab36725f4b280813a1c9ac617c6cc29251d7262ee4b73d46fe3d477232f59f1fa144fce50c62f1bd206a352e7de73345cbc339d74fae84c74180febdc3e29a4a0d0c24d3836a03889b8e80f4ca05c05cf12850f912ecc9ff3e99d97f8800634a03cb9be9774f08ff36a034a978dc6ed2901caf4611c08af75a92a54819444273d0908c689b45e4183654ae2b8dee967b7be2c93d2ece8f7e42e8e94cd203274f9a1c93f583c8c7366b017302ccb14c0386a164e91c9e0e39f07600f572e434180aa3e5d389b4dfc2b908da269a8350896ac6f2f6df9779578af4e92326aa5fbca475d5be1adb6c64ed75d2507a641e142b557e609c02c0b25826b67e2bc166a1e18a71372dd31c2aef85649f2963de0be39ad54fb12a20500b3e5da6ac4a69bc1b69d2f10c133a4008c76bb421134699089691a16da04ea681081072eebde4a0a2d33686cc1629ab4995ed2bb1bb230b8ea56a13274313b4fa33d191d68a831e92ce312739722cbea1a2f55e97782977459cab5bcaffbb4d291d63814ca328e40d4f36c44b527ae43d43236359696ae7f037817fb66adaa5bfae5d9ef7e5994ffb17021f704091de897beb6d76de48d0c9f39369874b16b1d38dfa32ecf3387592c28bf3783d76bd26055c9a7df4d262ebaa016f7348849c95089dd30b237bb8177fdcd669bdb01a563fc082b0240723f4d97e6e26d8f9503fe3d629788fdbbd0777af46b994ddea6d1a4acc0245690c8ab7b13003be9c52e1978850e100bd38a33ff3c523298eaf42c586d744961ea27f8665769efe9ead9f606fd40ae18232e1a96a207415c5e9b51b9a10adbf38708cb952fb05ac054e22a388aef2754ba8b9e20339da5f3188df3ff0796c2e7da7f93d6ce2ee35f7266d6e4b8c54a0fb3166c2b158d565880ce51304bcef4ff0e4bd00551c5b7ff1295f9d5840de286d24007ca2d36dcdb2354ea3445a0407ec4d8a4b0e72358e5d958d3167ebe9ea2bd8c15eda4299f92d0964822e2ac0781d9d9764378cab95614560dbd65bbbcc88803bfc6b0dd3929145b552f054c383907686dbff001ba7dce0ce4fe5ec2d210a184fc17e3eed2d7b527d7dbd3da26b521ce2d35f74db606f2af9b04378bd92ae6f189403e18cf574111e56a557005fa278a2365a386be4b6243bd784dca401583d91525e4a25f3082eeb1689bb98464476d626870e9bda1b639049fb106124c5f47b60b81a9b87b8a5fc9c6aa7fa6c573a4149f525d78ebb9ad706d731abed6afbf852aee4efd0e695fa7d8e67a746bce812bf0085bd71da392e2207275c801a29a7430110196647d68d0cfbec431916f67a479f8c7c560d1603f0b62e6dddd1c5be7a165e6056ef5b5652abde9bb8f843b0b3d24cfa2cdfd718a606e5c3601d14f3e846882e6a31e7efbb3eed57779dd41ca41cdf73250e9bfb1c8e326461d68ed564552beb1277444a52a71be096aecad30ab51943a057e8cf2208c6aa96c60686d989bd75faa4cad6b47d25e5816fd806ad4f0c26d075644c4ed33e2450007d249dd24f543c1208b8da99486e144ecf27a937d062eabc8e1680736bba7c7f328b851138d471aa7095bf7983afe4dcdb5e40ccabec53c095848be838747e96d96dc36b762eaea79c0e5e04439350ab02be281e195491eecd40dbbba9f9c5cbb23f93fd6274f3343d3cb3e752750742f8d2b266101f9c4d2f6fe9e7c5c3db027e4f99ac257458de4a83a376f1a945157c7bf4ac3b1a32d95322c0ae3eaf8bfedf4773a0eb51d6a5605ac7c5538967ad67e34000047007bc78dbfddf2da9a2ff9d468769834810201145f526afbbe0782ec26a9e26275ef36a8f26db9d7ab3458c595dd85c67a2a92271caade6651295bd25ba59f0558ea1f2046fa4b368dfabf7dda9a47e3f3532fcd1e46cd34b7ceb7841927e95053da9791e308c149e610209b8c45d2d0564308bde3aa00ebb9729638b2a512bbfdfe03637fd0ef8dc13f556a05f5f73d2327f3e7246a57a22ce76da892d620c82125f771588f2c751ff452d36af53a3905c8886de6b2952a16443453ae9211fc26322909ee019cbfdaeb8b3dbd4995b8201f09e94a54055a39ce12b22f819dd7181a59e68ad66c6c7d04ec9f888ae4812535ab917a8d8eb91cb5f0585387d31e4ad10e8d119b74995d3906d8ed0d5476fd0276e1ee1d8f459709b2e259a086f10299b1270c9099a6ae2ec6c754f13ffa35c5a0b0f96515a89439982171c8336b143d6acb1f4e233f64ea4728be24d95e1e884e3216483c4afc93da03d691103d1b34deb110d53ad4bc30e29c61ad1f37fd21ce6b46d5f70f9725852603913837e922da848fff877ddba64ca5850da5dd369ab86888a339e7b07c3d75b59f3e6bc31f492f912d2812880c1996b7018029b389bb00db3e1a200bea4b3886094be232cd707ec461cc63bf1ba6dc047235626a226d40c63632baf73879f280027a19af09c84e767d4628cee6518055e04714718477c4011b729b3eb6677bc54e78680cc29072641ae2ba25b5d643c609fa1d448d1edf043203ba20decc22f4956f46a6b5f0b4a7ccd42d1576107f424a50e9c0d1f940dad60a7876a9077fdfa2836aea4c0ced971885dce55ed6f0aa0e6d387a26e5fda630617708ba22f286bee27a72748c35f886e214195507afe6c4b954e12c4595052ec61284a37acd35e62f95bd13c896dd74458ef78f132fa8470cef32db8166c19798db2bc94f18355e205ece7dc3381e2828caac5ae97f3877e68b62858f75c7042240972ffbee65575dc7bafeb3d1dd4878fe12effd1202298a2d2de1d799f1310cd4100ef0b4096acc411db194273373fa72a9cda4e27b739c7fd3af2236769f53a221a2b70d65067fea6a46a924dce8d6654eb73d44f35de425d51f7b35c82b494f51b11f517a9eaacf1a53ff8a62dd8259a4a35b0981e170f9616e9db27fe0260aa7ecbe29b9d727ae8b0ff5ec10d451994d25febd7f9feeb1a9a0c0d360a5d3f969d0f35da3bd7f55759e8bba7f3ca9b741a74693e9fe0dd1514686ae0fa2dc5ed8add6f7f3ce5cb53497c692f80a07666c67c4e217d8e7e422a95ca15bc840c9733fcdb9d2cf3d4fdbb420b92ae3699cbb921e13aeab90368ac01f0280a508d86a33070cd8b5fffed1c29bcfc0585156b8fa7783f1ba8ba8a358c0c9e72f8df6f3979bce74964c357dfd96a93c0829e910178b31a2f4b6dbbf5b2624d038ec657933b31881546bf8f7b518817857ca96354461a5e1ccf46f2574eb5d4cc9847f24e30546772bea97dae450d4d14eabd0361b5966ae98cbd40a2fb970b17aba57e3191c746e7323f13e61468f606f07f6ce0aba0b9e3a4fec79a9c6ec915a2b91deab9f04eb95340dea066e5377a9e7c578346be53ab5c0b7af8da94490a59d33204ae56f3da4824ebb7df2bcde15a3566af808f45c46e7165f5fb1a60cfdefa1aaff6bde3a794836040c34474d1c153b1f3108063b01342e1f396d6abc1c950ae3706ea2fc17b06cf17aaa67c0955d07bbfaf11e9e720f0612a5e718c24e0c62e6809a689439325b748e6f59290263fbd840996a931eb532010cf440d42e6cd2d8c77fc39822b857b0980ae606bdb471132327ea035d0decee6eb4013a58c66990759077a17760c3ca03ce480a45987eeb6f1e27f5169f1dd8cf8c7d5809a68db31bd1626df13be264a0f39a07da82583930a1fa5028e320cc910a523936fa96b4b8d0a6c17893a8e6eb2d5452ac102d4b8ec820bbd26ac0878a4d50c06bd9ed84c53676e1bccc4b22fffdcc3f37c5772461259b0b5997e41c1759973378e71f389f89e0aba57abfc8c27074b9357d81756db81f05555f29fa339e1d019ad9f89590e26586a3aef1dce010c575456b33c80e8a096916cb0e408c8ae1006948a71babf7f35a49493f90e4b762656aa55ce212899770cca98b6026fa77a74b86066e71bd09d82c6d2febb99dcab8efc0ecb96262875a41df02e58b908056b9c5965976188ef6d69f9fedaa1d8cce0b8f3598b1337ed72a2ec540e158a16b9add31fa47e57fea8c1314ba0bbdcea8019fca286e2ba7d87c887a14cda63feb2a40c0178cabc638ee9cc83ec7a6a8d027d9c83ca2c4743afeb739ff93ac1a1145a7552d34e17bc130cd456cde7f34aa132208a890a9789f8341c7499bd02d4a05224174fc81a24746f7fb144bb5c0207ad7a74e39bd09730d8aef91d867e305f7ffdd39ec029cd4a379b0208dec53d20b99deb1c73a27de1ebb8e6ee34087e6310dbb5061a1fc4b70fc0709be28f335571279de995dd1c323452bc585c79d884f1502852187a73fd44942061728ebfd54d0420bb7f732ebc4bcb3b476d9e0653933a8630d7672ef27f16a46983e4d5879e4bc99d400d267bd22a6d810fe665391bae866b45549b4fbfd7d0074a5639678ff25f439910fe192d73a7f0769cde84c30ec9f0f37f1ca7067d37c9290df28cfdaf2d2fde5789b13375ab151c9faf0a694253573053ca862cfc6c55c192d8391f9a181c5c4124153e7889e485408392002259fba3fdbb1a3152742bd70baa0818135a38a0e4168f3012b1793799c3dd9343e9341726490cfba9062b3121073cfbcfbc6623774df91fec4a589ae70ed1fc909d6cb83f11f27ea772f8ebcaa060ba889491fabb1e5da9cf44341278553e4e853b5d08ed854c94b0fc457fda670a553decc086ea361985d21e52c5e5ecb86345f02893ae10ea26ec2b1bf40ab3dbf1af37095d000dfa8e3b83bd088f269df5808cbfdb5fad5600e374c1431cd130b10a7854460bf37c6a86e23c11b009de8fdddc8500d1b12d233001d9c1a1cff7e6a0325b62e29ab49cc04b89b0eefc413e615fdecf778ef6305637a395d237edaa26c881eb4e4bbed98954d757b8a27aca08a78a412e5e4bde947279aa59a87ec45b98f1f682fb1b864b67ecbb19c63abe89385c603c6147ac6f2ad56570e356c7bd1f267bf1ac7f4d4ce688d1a18a68b327b928581eef5e711bd9b2bba215df445bf6ba8c0521e25acda12005cebfc3135a88874827e751213e7ec0fc6dacede86658f6ca15f71fc7c33bb689d93ced1bbbabd91d12c14f9ee5b92d88107978feffd079b6bcccfcef8bcdc5430aef62cfc4be3e7c311f21f33f05fe396946e1175298aed0696428504164c57b43f92be02086020449352b607e89353b1cb84880d132459760b412362571567a2d95e7277ea115773dea5ccc38ea3d52f2567923a502160d171ca19104cc4a6201c6da600d7106f02193b5446d77c4036ab805410bb53024e37b4c418a1af690370001ea9086f63be6b54c900cf0bfa358c26001b7abcead675071f7edb6ea9b3759469b45f65436f6b5e264ecaaa541de30281db87190f4fccd388e19d216beb4cc0857666a96f857fadb043c9d9cf2556dd318b0891d34d2a626c0d660b41e54e139d63a7bc31a59d76159806dea3d7d5229f1db7fe1274b7bf4ca6384839978874f93613ed95c50895e1e80a5f074edfe77a5fa8f070cb2624b75ec0195db1aa9f7f7f05cd5c26403d8aaed4b77ab77e94f808013df5a37af93ea2b36c5def5ad51ade90e99932d3542ffff60811457a9161e1710b59bc3b715675b7705f5732cabf6332050c56a8256f5e700d148a9253ca8806d29a0bc8b03fe03b303d9e054750a2667cdd561aac41be1d762b1eaa8ef9fd337903fe86321924404d5152ab9d963205e1b7eb1c667b64c7a34807afcdb18db02751fdda00676aea06b36bad4b657065c45fc38f517c1f54cd38d3812e0f544ae5f00cd767a2859d392e427e095c9e79d266fe5f8e319af25ddcf673a1ecbd302e69b35d337d6c0910679710102f800adb36aa69a7571d01a161e0533b776901ac9e8bf235d50263c17be5a725b5818c80fabec3702f01ddc9954ae551ef3e1a801779e2f1a228a5038aa06a96f7b8dac6e8066ae4ba0bed433fb9b518a59e855c042a10a1704a3f735aee4b90e051f7e9f5b5021b71fdaf8d3df440cabf5f656f948074d44ef352876875ba9f5616ab81e47b2bba748b5b43b5bd8e0b3fb164560c19f41178eb998e4c9ea33748461c7012a44b668ea676e90f086dae25b3804897dbac092e14bc8eabb01023d6c5a2235053290fbb49ab489baf00bb5d861dd3224c1d65e56c74fac5b6831eff7230721c1dd85f3310b69194f061d6328c9443312ec0d99f9a2a370fc145b5dabc90cf92c618bc1beadad7bce755cadf073c57694d489b605167b458bb44fd1b131da3bd2b0e668cb541e7f596ecb0862eb90dff30318e531cc0dba607e185765305fb60dc98d83553be455573d1ee29ae4eb63bfb8f6d387123b811dbe0fd3108b8713d0c1a1116e907da6cbfe3c3cca710a16e44c96ba6e18245c03e20c93976349ef3722d0d2b7b8a00b135ff0510e645c44faf3e41a2678928e6f1e317d5d7030320d028e73d26783cdb040828042e53419f1573b5975ca36d06a10714276da5ca0a4ccdf7db4f9890ea6aeabed5538c3cf00762eefd27b0bd01fe8a18dc1effa9a6a3f4428b475b59c5d66da9e53f790a971dedc026f74f835a7635283b6f080f11b6e14188543108e2865c3828d173ab7ae2151ac284bb43814ae3cd815fc93f7b9de839aff8634469ccea0c7f7436e313bb96ac5db736f60657a2ec89fea8c4587a77bc56d6250fa95dd4be2099211972a0f6c4752be83d20e171efe0f83affcf9d67887af049393b83e0d1317105e51df9e53f981fc74638f805ab35cb873c7f73f4c20089adf50b54027d5f3df9fdf2247c570602c9586eed3c22be8d7989ce5f002445dcf84cdf0ed3ce0029d90573faf74a99320f563cc5d6ef433c5bbdcf03ade1c50a1e19edace1082720cf577b2466b62858e7d96433fc3b4ff22ceaf6fa760844c8ccbeba2e3fe1a0d1517c419bf38e0cad502e5b033b0097bdddcb1d4ccd9b129c0db4b23226d6a945bb5b457133fe0e5e2f0d8187d40a53a6952aa4c5fed6520f5c7f21d56f441794ce8c4383a71a49d72bfa72ec12e7489530ca3ff3da370f50ce86d88ab96d14781e1521422edfe594b0e6980e1092cbfa213cc1b368bef8e718bec8599f8d79d0fc081f4a7a579c53e30fa510b2822ece26b88917b6283eaf81f7a3e8b86226521746f70dd8dfdb9fc0cc441ae08f4c020da588afe468d16fa9c6d7b26bae6fa09781b49e3c6804c91e3a2ed7be9f8fd14953f679ba5688468230f09e1385b7f033a95d240ad1756c68859a07d05ec1655d11b7def71dc7b7f012caf5db38b8622616845ca103cb85048366abeb344c69112232c76931f513ad6fc3af91ff6e11010cb7f7d479a7b9e99a0d468ad893a92797d4a84a871c4bfb32748c5a8fc4d421a2da62c7d37c7447162b9794ba2cdb1766adf60ea4f44f40b60418849fb66af53ecde8770b322fbf3c97d4033924685aeb53a7816e83d3cfa0933612779a228e7cb609e800ba3b21d68c35cfb0f2132865ac7985f7338778d146f10f063071d94b51ef761080e6bf0fa6809e60b8ed8414f6fdfbbbcd6d85ae5fee78116eab4df194f5a1b7a1ed0dfab01fb6611d2d1d12ce4b0b5519398d9a4c2cfc5eff8db1942bcb7c23bc05f068cf07ee4db8e9d17c3695c26f1c2057c39663f64942c64e920c195639469dafeaf89cb05f612ad0170159123ea18d74c0189ced2e06a2a16d15ebe1e26a1663cdcd239114afd958d65249c234cc7a75ca4d9c01ab908e46918074f45af3b745d980be0aa6f16872cda289a95fe6a5e8cdae760337000b72a6938f5464f313baee9a873c90a82e50f8ddcb557922fa6989800752ce32209ccfb5f25faaf48cd50c8ee8cfe2ea9262ee647ca674cd901e9edc27fc652cf7f169d9efa6cfebe8349abb3a328a36e46e02720cccc9ff7cac9fc7ffb05876b14667729b538dba4d5491a3dc889409d8d527b4c74aba07ceac7cab3cfa322f68dbf2fd9c66397daf125aa2fcffda6d73f5e87be98d9c8160031f9bd8ff7c2bdb505f753c72bdef780956f28ffc53608d873f9de11ef5a65cde20781f640450084d169e200f9dfd81829d50d3d1f3a5987b0d8f332bec2038fe0755bc814a229ea24b5507eccf3a1fbe7183e3b504c6cb7c6aece48d0a2c0d52fa43d77941d00acd34d8194750362b297603591e4a2486420c221165d0081841228bf195647a7e766575fb707df17f31954f6d8af1f26cabc38bce2c5ee07e381b7ce86fe094a23a6f4289567d976bd7f9083d4fb914b4e86e66cc754fd8df61d895ec7b4a82f19bca8eeb938ec86893dacf7670ca1dbd5ec43da4af67fe406bdb9364491f95557bcc0a8bd00cc7866326e728d00ac05bee61b6c39b7fef4ddfe84793897908f152915bd2699c4693e964c81469004329355d850359da942110231403b81032d574fd0ddb627a16f8b84dfa309b2ccfa65b8102236366146f8badacdaa436c970aca7ef6a8c05495031f587d395542ee525fe3791adb68debe1d8ba884751be1b9ca7b3e425e1e269e719547dcd0541334edaf111ce2e0af5ea36808edd887a9680442c356160735999ecadab8dfb44dd6f586502e2de530e8434b42d3f0d300e2ddd56d31e5e6b56b9127714276cea8f1cfb32c840c771eee943d083d531905fa9545dc1684fe730c2776c2a7989b549e6e7d80c9388cfe51ae68fde9f623e152850ccb92380ae44271de26cce05add9232cd631ba7aa96afcb05515347773a92a8ebefea7a0b128ab4997cce8182c53769a277782138e549c2669d9073dd89833ab80d2cd21c7608f65133e8e4ebc37d0c2901ce2ef527f6ea64370d9213c88154458cd93320d66757dd59ba9d0acf41484d0b6982aeb415ab52adf07fcbd11cf25480cdbfe3a8580d392eac15d59bcc9ad16628bdef121e06974c9954b60c17f54a5035968f893bb383a41c88e5ce8a357f1212547c528d277ce5de1a049a4fbbbb592ddef9246d5c406e038c3bcebd394d6fa431c5b907de9403134f456e87b629eecb61d4c56a8c7c43c927209d92a1dfc7caf24b6ba0e7ce6a8d81b659553bfe63f4032b6745a6c374858f41cb20076d2bbf6b3566a5b5f70eb884183e7cc37d1bb751568dc2ee50cae418587b1543c65902f7489b590ab9b73a9f1b5ca11130b02f28b783743248077b9656c73df7304b124367b36691cb67a4c55e2d7ddfb9843ba9ac16174d78f18474e04186680a073cc53365613f9c2c43848974f9f906a48c42ff0c5653c95bdc60119d48cd253492a692299330a138ffa93355c263de12e0cbf5046e9286ade84f06866f40db465cef4e311340e7e6981916706934f7a93aeae74fcb0f1597733aebe7692f121e3eb6a01c9ec94775e77502bcddc03c6446206b324bd3283f90bdffa2f2f95a7e42a2447e0f49861eb8d3a1b029410fd60eea1c9893721a98aaefb431011560979af8fc4dbe1297aef335bfe5103e489a28739c352b7e564288748912106b749f2d78d2e6fc544c7b1c6fdc588667a3019eb5977af49bab4ae37cf60f4ee23916538c429059783c083a81f1d7c4e7b511e939a5c6537d146bc499db1b841789fb8d21653c742352d45b1ed9de73643d49e4679a599aec54312758feccef375990b8994bfc1b8c2c200f9228440fc001ba69efb8e5377e4025345f1375373a0494133362c19f59b57c4c3bb563e3e44669e123c24183425a1c9033037cfa67b7d0310f6b6604c5a931b3a946fb11f4da3f7b1f5144b7ae106f8161b5adba5684a0fec2c5ed51f32720a46840d6f83bdc6b62eb167dff6bc2923d24c94ff67eba11317f467ffacc18ec3c26b42996501b8d4bcc1480da7b988d82e27336018c5841b6bbbc119147be78c42e76cf1e4a124e922c46b5da3e92c43dea180a2b4816bf76bc4efb3dd2cb80f9a5e096cd1e219377f6a22675ab35085ccace103e18afb7e0c942ab87e91523d24e795823261ebbc4564f319790b789e058d3ab667e55d0b2f65bb4f9ff482d9e1c9f449c9b8a9b98f58a06dbf5091e1735e9182b86e2d9dec27ca1a1db7b9c1963af6bde7023d7cb2b9f0382ca0c77cdb281e2d2b2ced0fb5709e672ac8305283217244a3c2f1b0f71b08b16b57e713b98a90eb5a44e961d50db45bb68caad6155d56d4284a72c337b0f7a996a313d4f06653d0e7e737d2fd9cea1d0255bd817dafbe04b65821590558a30e1e68d2eb0a65aa3fb873368eb83eb4bae70cda9b630d2e0dbba3978ca6fee1be24baf4488b832be8a87ad02420534d16d729d36fe3d8a57fc04f8ebc94c5e3e4dc8730a302346269614bf9252bb84e24d58bc905496f0b131a0695708a6d169e88cf6abe08d478690a3f50410727dfacd19788ee6770275e97179b383c78526ea0e53e13f780c47cfaa99b45bd1101f2f4240b881e946eaec0abab2aad335085b7b4bd504fe89d78b4e8510f65cd4f87205cfb89d4f8aa450b8840befa514818213f226f1b44b975ed3eaee02f48c7667d3fd0ce13ee71b21c2031a6c8a59ec51de793b7dbf938782b8b320b2ebab95f74ec085a09a95497267e59ba334038637bee1e259ef64edfd11725154457899d22cead25cc48a75532bb226d39f900fbb190f1b9a5768c4e10aaa9e0a729d62e5f1bf9cda2bc9bd11068de733a5a565a99c547513c8bd83ab3982636e349db959c3a35f7485af777dcc7a46cd46ebdbcab56d0a01f6213566c656df6ac5d1d87f15c74237f879c7e0c55c4934dde098b9d125fd0315ae839d5c84e005a8e9d71afb8fd529bd7c7040ac5385bd809bf04aa6004962e4e921a45bc1306b5cd63217275265093d67a4ec7af2c1053d6882197304ed37eca0d7b3adc2888aadd89f9d9a5f2672300904456d3f8b12d0fd7269d85f6ab803db96bfa4cf50ec5336b2592229abbdd5098f3e5e3245992fbd24526a568337853757f5c5ec5f46b41c87773701fcd965843651dd85163ea253820e40e3cf775d1f58ad40a080db0dc1a44f89d0fc17056dfe1692097b4aaad4bc787b6c89564e0bed989aca0eca25866d2241024e8814b1f0a640bdb5342f7d799ead647eafe6659a00389e00a5a8650cacf124d8ef5a0f1ee3d401a353f522485ed37b43e88e51c67a28e6b7ce9e1d57729395baa84bee4ca08d0af41796c3a081cdd026c5e6d56b624c552c4d30cdfe6ecfd526f7003248719eec165f638fc2488d6fd5b4e866fcb2d584c605c8c378d518d3f7e643e805e4dc00efb60e7382c35f3822fb4f0d69afd17d25a2c387ed4f34310da98f94ab68567ce676123e3b7234dc117882ebe870471972e083080fe5cfe354af7e4b73a526bebb62b3262d2e63c795a7b37b40c9fc437b4ac0dee26416ea5e7b64f2f6a19d57f15616394df17bc506b7b49cd8a4fdb20aae4a34e3bd30cf87fdf60b3f591361642b11d82c6a87f4049ed877a1ad477975cbf601876e33ca9f343f995dfa54b2638410b5121b96f9709d1355dad5e5590d51e37b15ba911d5b05c153018327643c90cd77bebaf2e7d9cd63881da2405f970042cfc7edb376a49078ee96be5124408e33dce9c5db4e7e1489655c1a248f266d9109ee451210d9300f7a8bae61e6be53b4a22596c0d16bc329ed6933a76d913834fb3b6c8994857e7a2a423916c58aff3bc9adfe2024b2da591e00d6e97c6c073c6a8ea8b16303a359cd5fd4d3a4e100236638138f3b6fbe6908326a392d799f718ab8680fa6102bdd1825cb411fb32b3897763f7d14787724c397773c54a05607237675cf8a24156eca450c9fa6a1a0ffb45b326296538aa138cb49241f93f5ae63935ccf6e28b2468e84bc2483c9af1fb48ef25ac06104a1e17cc0023ebe060e36cc966e9c2a511d80937676393fdc727fe8c93cf110ebf3b962662e013eaa7abf335f7d784295988566cb32be0fc5107e1d997a4ca9fdbbf617587f1b18edd51095431cafdfb2efc71315734a11f6f699c25b1815d3e31414838d5ee21ae2f298d24c3937207031d20b7ebce22adde2d531726287fc3a4d17335aa8a4b93415b4324f77e3859caacc000ac3fa6664dc6629192090579de487293eea5c91d859f8dcb9005cdcad1fbe769547588643bb7d4419efcf62ddf231b8503a537d13f48a4d8a71e5f96ccb3a833ea4f0c61b77a450e414cf27432cb84e0d77b4099bbe60c178506b5a6daa05255aa487dfef4fb0173029f20ef095bb85fc83ee0d9d9ec2c85630e6f3182df3a09737fd8438ed97794651cc0ee99a5f04e35f61de1a0d4d56dd1aa2618dfeb8fcf639ad991e290a1de80a2474f47cb5572f9c9a990227482642bf4d4a179bfbde19ec436ed1777e5a53c2ded5b80e1a935524c95d3d95c7ee4644e3cace6eefc99353b8a1f75918d7e2610007e2ac125b4cdf8ecc4d52c452c557184cb58dd625f48bc0f4b76bb99dce49f176896b4dc719bd3fb87d714736f2b80128943aa94601a87cfc5374a5827d52c08f737848457ef02e2d6d0186b17e0c908d409e288bc5ae101a79b44f2082285455782c73823a2355ed9f6459cdef4aea1d0bec8ef50313733531ed67b6a2ff964fff84ea638dae8b0a3ac72786324fed3edc62632b07564c2c45bf3fb297b7445d33db04e90063b95e124682336b824ea22d1f911572757bb34d4a733969d0bfcda9ffd2c4316d14196219a7e043b97c911216f74c8e6c23a7e69a5aa0c403a8137534ca43164272f4f9f5bc76efd4564b30b4f879a907a19338f63fb63345bf983f53ed0628b53dc748f42c7c2e1f9422e69b8ff6625c94d4ae1fb435ccd27686f9ff71ce5e9610d5258488276154bb6376a38b6947542dcceec74719e8b52735ff7351ea41cd4efdd36d8db338c2fdfc11b31c0450dd231b20d1d861a3aef440cca55b24f6e0c99a74d679a7dd1b21a23977ebeb436325ae14a15b1ca709c7615fd45e451898b5d5b4095078f4bcd8a208eae5fb07289ef3ee68fbd6cd1d7b09619ad14ffa3573558fa24c1b0118fb0af2630a64eb0ee8a1099481842f445daa2b7b5933e0fac0ac8d02029da1cd5f02ade9f9dee0e4614fe17c8f1065cbe9f7a3557b52cc6f408ba344ecf871eafbf42ae77a8026ad18c4810a96dade79c0a9db1eceabfe094001affa91269fc5f51d78a36d8ed32a2694f08a9e0555df123e7c054eeac8aedcb78f1b5de738ca3e55a96c2fbeec30a2389886634c66a651fc40057578f903a92b237f8372ce5aff61d323773a2d4d0508f762568ae27954d7f025639a45ac2c9bd363a60fb9c7e5ff67aa7b0e2450087873e0afd341de841789a1301e94e02833dbce6b747af89c08c07e76668fb894b70482b20cfa8a2574dff2e9f631774293ed1eb031c4967b08ea09b1fdcf4c37faa22cdbc9e432ce0094c9430d102ad0825e517bb1111bdbee18c607519972ed2d084499e317321c2f8255231edab0a9544bb4fc64a7679bba76eddd2aa874357f0450556a3acae8a52756e6fea26f8f899fcfd5be6c3008845f85939aa928c7e893a219b4798fb814c112a5d2ae3250155af4947edeb590cf43ccf2bbc12542d493ef1be3d3d5ca3e7e1e7e0d165a10147d27c0d3bc2c56da5363c66b6da71b0ca301d53af47d9c452e95d8cafa19d664e44f7426c14e6f26590f2f7f16f69f1ac99e13fcc3f69ba396eeac713f9dd095aac4d1b4369ccec499a6c7d62faefc89861969fa7a653098f216fee0721b415fe149483aea677c3cb41f130fbdc81dfb928642ec50ddb3148a4fd5db3b83e7ada094217577caf94578c8012a79613dd3c754f207b73798f9493adebe4ccc46d5d466bc4d03dbd242ef6007a787b0f902b46964d5a03a6d7dac78ef93813353739a9c0d863d555aa36beb9d7af649002a6cfeddd7ec645cf501605a431900089cf3faa71d4cd33b181cf11a65af92881b2d7714dea6715bef83f52d2077637dd2dce9201f861dde598ce90facf5c2e64d99b81bc8c0bb1cbe623083e8d78f796945201b4e95d65668e9b3aed682f2de7c28de62b9ba6dbec18167ffe5805389fe815cc3e6ccce1c7afe45b81362ba0a923d5ab44493593cc0d2f54a79122f31f1ba1dd821d3e448dd82f6294abdcda7ca6d62903e54f0a75cc1b0c296d8449c893adcad012ee1ae4403ef04d0f22a83f27a498cf48c495c021ba5a5cc08b28eddd4d63d8c940d1df71bcd18dfa3d008e7e93c43064a1f4215dac53197c114b5eda05de53dbde4238ea4a580d4104d7aeff3f760102f196df7f438705e3beafd02991d5a01aed4d4610420c31d74ce517a6cd9ca063da1b870f7e28e12f0b8e50258b93eb8ddd668f445469a3124fbf9018ac89a6722c57c17c89b796bbe05d6a38fb81ef2dca3511f4ad8c3dc84c32beed4f8ea669666bbdf183ebbca05993794f52ae2f0b5d5bc7b649bdd25f0686a7f470ed05f8b9b3725363a5a790f2c3a86f31c6b09eda4736293ab648c64072be51097ece42a40885ecbee18673c63052ec3558cedf39d4501f7a47ba7f93e96fd546beafd91084c41f1648d4b0df8e3536995e341da8ae431649ffdb48225bbc2470be417c5450bb402f1960bc652d3015aba919f85d28959478ddc4dd9b8a438404b60582cdaba10354039064140d9783dbf13cdbcc90405d2c33002f5b644e7e7337fa73de5f3e4b4fc63367e788fe17141ae9b44b73ad1518c7ceb5667300e806811bff9890cfa1d19bbb394143e14cc1d8bd94954e39406a81745d55088d1705e58de8fe7192221f2ae4441f1c1b7772dc5903959b5a52ee65180e9ee24481075652d79ec9238c3c3aa7db467c924176d2b0261eec19a79b9285e9214d81392d49648a60c321af98f8f8e4158a147fbf211aa895246bb710718b0f0a4a5a41df5e5a8f199fff6752270907a255abd0bde96cb797b15afdbcab661dc1289d0ec21b130637abc258cda73af85df8897f25140995ed7ace7f0e838447badbb91d958fcdb509c0b70640af95b8e1bee762a7dea3514a26cb6bcec35d746b47220d05180f5516acd56dbdd6a862bf69276921bcf50213f720769800e03d9e4fb34a3cb6b7c3ec793409a09bb842ea7101946c9f70357df5e583fa01ed856b146abcff19c88c79101ee0b098dd6192208470fb63ea62bb628974a7ddff39eeec9960e8b46a5573cbf8615723d2dcd9e3fe753e6dfe3d49bc1a14e8d5e7e85de0a851893fcbcb07f3c32d5cab82e8d297f77b617e003fb5dbf49326ed520b6207089dd536e8dbc60baa579b1e1a6a19ef0b0d0ccf8437fe4ed3cd7ec68ce9fdd47db924291957b29eeb74829d0f4c7800deff84fe9d12e673957c089ba55e34cfa7a436fc66f93efd6ae2a54b4b0657175587d7df6c9726809e9a0ae38f1041f3a8397acf3dbeaefd8ba5276c29d82b2325d2b0074db013f41549dbc800cf47f43c2225f76e48f845620afb342023aad4c00041176d9d805ae819535d530a0897f7698e711db973f3123bb0c860270b494ce8b6f0836ecc9fbe073687b342550b8f991ceca067d8d4ac742e5ac299a2ad12b5e9525b8236a2ab27f18d22119259ebba7336eb3ef6fc6cf2c10a592343fd9520c4afce982f5927bea0d1a214faf4e90f1b553488e3250f67d5fc8cc4e584c64509bf1197c8c20c77d2f68e2d2e1514c460ab42ce5c508e928a2ca51cb279c1d5c5bb556cef3ae741ea42c38c2e020de8593d6d448ecfa402c0d0b181c870380fda7eb4bad010abe472671513e139") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_sha2_256s_test.go b/ref/params/tests/vector_sphincs_sha2_256s_test.go new file mode 100644 index 0000000..79a6e6b --- /dev/null +++ b/ref/params/tests/vector_sphincs_sha2_256s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_sha2_256s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("11e32155ed90a5665b3a34eb5e45b85b980f874539c701430d21787a56a543f6fa27de5668cdd86dcc570e3a5f14cc92200cc2e6ccc104115892bee2c79d0531f5dffa8a6c09c4516dd21cb4d6ea8596bc2ed6fca7aed573da78b8e3b3a3907d0a13486d30b773c4a57565e3183c1243bff4f7ab136329127b8b3e1e5492f024") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("f5dffa8a6c09c4516dd21cb4d6ea8596bc2ed6fca7aed573da78b8e3b3a3907d0a13486d30b773c4a57565e3183c1243bff4f7ab136329127b8b3e1e5492f024") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("0d887e60117474989ae5c8aba3f801e74b586d3b711cb75509d0a91cec2dc7f8a8f8bf5df91bd2c5f87f2bc0807496a5db7387f350d8fb581ab180f465186d38dd7009be19f2ebfced9ab022f99d6ff098c702989f4bde5dd1a3687ab3211c388946e295995b30ba4914a5abd9ce06b97ff3136f624d861350f73b19616f6e4aee5a21b358cc045cfef608a23a2619d4d7aaa397e8c6650767ac9ff894a58badc9496771a54b51705843dd031dfbd50705626f7cf7a23c6165520ac3cfc8ef0bb5fff711368d25db959c1f45b362110b3ffed125677a3801c21b1987f041c25a784ef2452fca226742319f40c3645b43fc76fede0fa3ad2636734e967dfd36cc1df95ab2ec173d0cce49bbeb98eeb27175fb52ac597519046e93665c518386b2ebf4cfed544df24ccc0066b6c0d3d5196e5df4ab7209732afc51e3eca665e16b0772b134efebf6749523db4311062c5e08e24639c013125d9c9a37ab8e96d0fba9a27300dc377cec30ca56a30f8a54a57b2e53f82bae86c4c97de239b33eaf0d39d89ea042c3c25397ed5022d8c8f2241dd60d58171519ee55b68d98a566bfdb1c4c8e1946aaf6dbd0da74e70c1590b69d029e07f35764250d0dfd63f9443abedbfb681ad7d1891b9f7d6ca4069bcd0a4bf27d5f65aaad1c4902e6ae5ff5978a9d81f97a9eaabde2ce394767ba4b7921f8e6e3c62e8961e87427006a171de780848ce06583910a8c3dee1f2942e6f2402208742d3a4c7331736c48f829e4a0d8d680731f0f5db7d4d7c71e99fa954b44c060563d8f160da42f725b2f070a647df26c614cda2eacb6ef21217090c3d4f5a34318ddca8a0193c58596aea6e92111a73e8a8b2081ff844759811d4b02ccba260c26a6a85e99f7c8168e3f8d67fb8d604d06d5895efcd986b4355e2dc899769ffc18c37d669ad177204fb104e97d126f21920bbb727f4f816c3d1ca9dac4dca5ae34f1331ac84e691746d11a88c728bfa2509195e1fbc6a8dd9bc914a2fa19ab2c63631b6e2747076bbc140afbf4e49b0f37dbf18da4a4fd618ad12bbde1e3b9c95d85c19c1ea80dc614c66598fb2e669205e9d364a66ac381c57e59d089feffefff4d2a8eccee037c1ece59491ab3645386f32276cc72f6dee37286f6ce8d9f0e18dd5f981d1ed3d5ddf8d7cd4cee49d2ad25d2ee98e095d9f93330d14682c64c498db566edfe17f83fa25ef1ab17c10704104d7625f1b41bbfba8f59bc59459caea84f89a7a29b9fb2f8bee2804aa7d7793f22e3419d38fbbb198dcb76853e56689ca78cb35ccde95dd191f3f8900cef2d33b839f63fcdf60f84636c2c7005543f4369e7f4560e25b62cb4d61b1c9439c4735aa404419709929de955531f7943e05d977b86f3f6bac15d3471f04db947230e89727baa918f8c40fe82771ad13034a30e38506877e68fe176ad16204fdb8d2efa81d0448021288adaf7296f79ddf6ed8bcd0213667e96f25e71b546ebb5480b8ff23da0240d697ef5cc48772c6aae8153734423154683024045ee633920c90c6ac6806cf20bd6faa6bab6ef679c982dabcb13f1a4be0b21bf655594b8eff543a5d067fe00a6df5b9f9e94effc42e4d22c7ea0a5818d586d2e94780f76bf647cbb0d8d175a80fb3062bcc3160144a9b53cb01a172f23f5835f769688c7abe1816eec202ff565f93d6539cf414620b407de35bf7987d5cfcf6feb50ebf28d300d3d857eb4b2c65593c8b29d38f810cf768ebf16d895736b922190d92de86beb955a843b537a5578170b33808fd309881e8d37b6c9a236c1db8533ffa64289288c59cdd010401115bac7a9a44b9e6072bef12e17cf58a358c11e49f350055032ac1ef7e79e4b2624055114cff0ba5093ec4a9d53619e30f00777cd3541dd79122fde97bbc3d41a95f2493093a3be22beba07d58d4ccebd54c5c9ed62e2fecb87e907f02c058fdef65e28580728d8d60bcd76a3db9759500d909404b0d7c020618f82c4203cfc77055ef8d1f80639290585df203e911b4967afff4f1a5210aed75869a5acbc9a10bfbe40d0997daeb87a7caaeee5ffd42ed00d6177044a0aa91a6a8d64f93eea02f9712ba4f6118a6eec4083a2616c2f135c774dcdb2889bc3d10a2a0b248f4f949fa5c20b398ef830a5f98aad20bb62664cae605b11eeff86700dcefab8eba3aa6b853aec2cc5d44f818aa278e3b17d83e1f40d25b33cd895970727e17db1e9e9aeeb0fcaebabd9a3422384365fb06497187f8d0818f6e6609c0c8601a9abfe358bb6e1998252c7e9c2a88e3753188e818a5f7add7f581ac8e5289bc0db664c0a5fb1167204da7df90c6bc3de6eda481cb5f537fadcd8b2d48584bd0495f6a63ad376237704cdc8f03a7cce63d651c545bd779dde130d163253ceab01464a3f470f8dc9431b1c12ddfdf55eb57223481489be5c1247c0a964daf635fc89b39b3e6e3a82fcd5f7f70e2b6a2680177892a4a43eca70962f792e4fb6cbf564eb807a1bc961518fa0a1a5b195278edb25aed6a2554ce91aaba5f3c1c529bd02b90a338d26e8068857ca22993d2aeda5461b63518393aa7f07aa7a9a1af3b4581f6dcd3e55aa79ee99dd907f6ac3204b8a679d00a96ecdbf79bab5075644aa61940c4584c85bd2e43432a8bc0f818f745db4dc189c8314eb75061e0756d84b5d1ce084724e7e469f2fa848d807d0429a9e0cf143c0e7a17a1d22f61a3acf34792a4915fa0ff95b6992ebadbe9a40ba67adaf2fe838cd3736c81ac411352ea78e0eb7ec209bd129dec31fa3cfa2bb11235bd7bf9e2703ae7e970d641f9df010f53649d567cc399684fb3e375075cf75ab5521afdf28c5c25f84124a5e83541d540e4ddc32f3bf9b7bbc94c61271e7b31deab6ad6bc15c3a3460109555d8ab2aa30af2dcb652e18da20a090f51af9f0d02d55224d66c96c6e64935e9181c21577761390dacaa9f67a255217ad2f68e1c826f2da9011d5a4feefd647b65eb9b0eda6483f60e2fd5c20a5707f510205b05592d0263e65011ddf9d2145f9be189eb2eb12a177cd1659ef5ed0a2b8716ba570b95aa03254817d7f97fffcf9b212f8652cba87427d181062f0165cc1593d896a357e14bb8734173c47919f97dfe92f932abe2b48f0e6421314ace53a1cd21ecbace24007be3aed53a44a212ef2cf1e212923b98872a383e280f7709984c81999d781cb768ba16dc858147a19c8e9abe7e47d3d2f738e3a4bdf0bb56ab6e10d30f2e11d4294e4d8e4b98eb54bd573aa53a956d6e6063b4e21716172934d8a1d74a2a3fb7d0aa9ebcf0c5fcfd944a704e782695f74e593bd5b75c728739d20ce5f9c23710af559767b8ab5144bda57751cb2bf77818fbbcb1e68304555f06c50dda1991630c30fd4b6e171cadc9f9d1c2ec8c55f3a24936958dd77630429da19cf524f3761695144815f791078bb5b560ad6857f4d346720f66c3a3af04b50e35022b69c1b31317cd234e1545c319a8cc74fec95230c4731b5761b4c743045894fc7c9bd3be9190e7910a56eae2b222f1a10d2ae37bb90ed3d67afdd9c7a817061e09940e4464240b0257a54bd791694d80ae83a9c694930c274f01d22f0d36330e95636b8df2e5a2d116b95b1fd0b881f165821ede551a13336329cc404650ccd8e83846d90643fc5f4689db7d17186392fb0a607db54348205fc26b74315d860857c6a759a8dd6337e63e55381ccea8579cf7f4822c8f16592d694e0d613d2be46298ae2fdf5a3e75f2e1d4974fa386cb2263f9d165cb90dd18e71d173abf77270217b5ace600221c459c56a9782f4f6d791ce396b2751dd835df817e838ff50476aab66330aca2ca2da3999cef37befbbb12a3bc01cde4056e60fa22771cc07878bcd48f00bbb65297c3865185f43a9340efeba8950de64fc012fb1d0ad76b28611bddb34912e02e89c962b9bc2731c4ea646da8d93f9b07eac2ad0e048aa84f264b657ae0c002675e90d1d1d19580c19bc9d60c3b6e6f9b4a3497b938e6cb195de2ff2abc6e056d863ad027d87494877ca9394ee3f9e7d6b10e964d15fddfbe38cb8cf1a7323bccbff0a0f48038a133b18f7a45b1011c4a02a45fec8243b235a6a6ff1be0e1c396db5b610e54361f56b78e0b4317e3153fc083c98381cda2c705904d262c6c47fa2942f9a4cc0d298114e6c43e87ed4312d6fb7307433eca2d80df59935dc81c294a58624db0c96a1ca6dae2685a0bd286c3114bb93e3705bee6cc4e8f8d837caf5ae0d9d2969cd8603bb280d05fde31f2aed785cff1c774fbffc325334a949160a85a74e93f67465d446952f74f8ceb0160d993db5b1e4ceca99f615e0031b50f97b6d119823fece546536e99ec8771373051540faa1d67d536350acd3b7912ba7a18ffb5b47545b8c52bbde2f93dade71b67fa2ca43469d5b5993555fa9ab7e1b0565c0bd3db39f8cbed5ce063d18cf8a1a82b3f202de53aa9d3b5b6d851e0ccb83afff96fd1ed42e3acc8e058d685c2c7138f15084c32e4cd95eb880a964848cba0e88cb65625d09eee6ea0be9872d01fcac52252d04566600cde2c52b8b4a148b485a1da6d3e01569b98a6c70bf922a61f0a0945ee6f50c47044e412b6a734837f27360d0177cc578889a6897b0caf0fbecb5441414684efca98bc6faa0255dbcb694f6f83a36d7513eaa19dafe41d25f1372511b07ba9f88d289c6f8ad6090bc0436894729af961a4402dce8b3b808b9051baa59f974511a4fcfd2a68af7193e21f743c3bc9fb34440ba641a4a80d2dba51f311d8321d14620dc21b5d5c9dc02e5cf84ba1b231fd7af71131be89e5335cfb7e360efc88cfb2a3ae401e58fca68e6bdaab89b34233674bfc0a401b87c5f7691f26900c7cb7a0f2ca426fe6dedceb457c6fdc8335974149a0009fa4fc8ba57cfe3373fc2efe9e1ec596480e4ea2c79ec470ce821116cf29b0d1a3614f8cf1261ced4e41ee24b55011149e5bc5323bacf898c38bdffd79611fe69e6b5a967b02c7910ae8c50dac1371a63a5efcbdc01f83e2331e7102299cbf49b3a6a41b1145d9bcb7ae3ea878766c5c262a5b6b1ddab8440a8b173c9e8a5b9db7f8735ce10dbeb0cd0bef60e704ddea6b4404255bc9d498c8040322143b3adf399ff44b005bde3746933791c9307cfaeaa72d685ba74a65e3bf7eada595baa68c2c6b733a4f5114f6bee8ad08e4732a4e8eb3aa2960d2056bd576d03114ddd52fc458fd183cea5578ba46b090c08a335a25c2b73df9d75af5270979ce545805042d94754fbb4e2d7c29404d48ff3fc93b9253e570f9c989ba49b76f81aba3f32e2801e86c96f30136a13e3a0121fb686920caca032f1a566ca05fddb7704d47864030a159a93e021d3fc430e8b52d23a3456b23798322e1eb8aa8276dbae19abb087645896e637610e1a03d933a4a5f914025256f0e93f5449e685ef988961fe141a8f729a3ce1f01d310b373b2d26afe8b903358eb7ca3deedb72d5e2faa190d370a6eab5a3453e9bc870215ad2f049a6208512d3608831f81bb0f4906bbb4f63c8905df002510fba9dcf8b343320de252fb5714ff51951091fddf7e7bf0ac0e8e846928939c80a06358735000c23f62d8b8052751619868f1a6b942cb079c830001f63cb3d5dfb6f1d5345cf5beb775d3eaba747820df72d4a860ca8a67e528c44c2f240fd38392a06fe75a31a31597c209f951465a9a127e8039087e214fb21530fbcd261f6ad0e477c3bc21ce3bd2a9861548d65e35664787821c125f46d84619f0bb5a83a7482b6beed34eb72ecb49aa013fbfde39eac743d9a88acb8f9172ab4a0971b9d49c15b0385323f507b550d362670dd219ccbeeed96cfd96bcadb5a41b9f97d9b28b315ad657f51a076f8c40773992699764dac6402b9110a5ce1a14912214eaf51a54fb6526af47d04a56cc81803cd7188e4b83752dfbcc449b0ff232db74defcccca3279077e652471d62224dfb93141e9c0b0fc77cf7012af5409a90055802faa858af395a4fd1ecd1face98967f8526a1dd1f839d5df0b0555b9dcdd48a6f1c4983cda5d12c7f3686f82e3dbe80e2eb9978db9afaa8ffb176c8896876954fe354925f534a038fa2d1a68ae315a2702aa1e6aa4e952e7d536828ed53edc8c70f30e837f1e34b48aa44c952c3d1dd16dfa2d9a8f13be1c5e1ff159bd2227302b677f45609a440358b6f5f8caaba9a9513538a6b49caf6313826d2d87d21a42beeb3e2267e74334ada4d29e290ed939cdbbdfccbcbde10a98fa70bfe519fc2e32d4948a5bfde811780e7592ca5c492e9f324330199fb13f9f9f0db56a2307297dd4a21f5c0245233815cf9280e3a117b605e843b356bf2f8bd36ff9ee38fa8c6921ea1de8b7b6a63114ae2ee7c7a1e3552aaec4ed9656ae9cfe6d15e42437c93106747cfb5602e7c4a591ba6cbba7e6d42be86033227a6b4c4758864b6421b1d7cebafdb2fdf33e2bf51add43d82336a574a49f93d5276ba1357938c6d6ea7290937a8a06aea6cb428df620430e344246bd4712807bb07691f58334337d21a2db0eda51fec7d3fb47be461e56555ed02d080c1c668b1b8d9de07f02564cd07083967fbbb7dcffe0e763e21ff2aca29e16dd19dba6d3cf002ec1c4b89cf46ab5ffd4fb315f1ab165ae3cab0e40061cf431366331b5a7d004b9cfc4389ca8bcd7c92216724abd7c03222cf810e9429adbfbf1b8a54f3112ec1fbd27d3843a704f9539062a0e684034c426dc26cd5ff27770854eeaaeb5391b36bb05a432a91fd359ee289739bf5c8c40cf11767b0add57e8c1964a96b69e0c9f12896f7971dc4654915df9369f7e33b104caa8f548eac9c786424f083738e62c632d871f2cd1252adba7f0bceef175f08effcdafae018ce7a7aba2746698054d51925a6709e535dfc19e269f3b20d03902a52db68ee0c2819c1d6e2c9ad2daf2a7d500d8ecb8e8dbaece7841a0e774ae9fcbbf9429f02e0a825258a88540986196518b33a7a60df761f98d3634c77f104b07175a22b0c4e1e070b7736d9024c74f901b54df5789d70f64a7a7aa50c26d0e95d648f1c53286666209ac774f420d9e69a95ab4b0bd2a8e6ae40a8db05968ac1712d405b966e839692e4b582980430e7ea51f4f488ebd198d43c74785273a0ee557601877721429c8a2f4679766680eeec32c2c94cacf941b9c73af5ce70f2498cf8f7bad9c00f21c27481a90bca3de92d662cb07cf8c2140f82c47c736129665abd2578d877f0981a972456cf4434f03a573c72f1a75d3bdb7b951749472dc0e55a1022d75e413b50d40780a8ae8cac601f5facc33d5bce521fdf310cb11386a4da4f5b1a9249d8f523996aa4ab6d247c478858cea640513a5589524b8ff99653814aff46a2cc9a6a4919f5b55ade82e8b6ee42b4c0a0dbfcca161ac3a4d4df4901d9336f936ac8ef283e9a64f9f16775f05ea094c9b569c88a2d65ae44713d580f74532281394e28a326878a897b0a548f4d32e12ec877d1e5b0b253b3d738a5f05abcdc20b339324d776b785d591949e188efbe59d26344389680a5a8f08accda663e71f3fed9e0f2f045c1f947777f74cd5f0f30b08312cc0e2a33edf6d969aaf352ce90b846fe19fa0bf55ad69d98f8c4f89879b1d7e2868d269d9e32228c96b9876eed28d579f577b6e85cc5cda7b0efad30271d142149a098dbb572b3ac6a9570ec85ea3eeac28ac874d5de758790664470e782465a75f6fc75dee5c8b25b574a3899819b1834a352054bbd6caa714328c37ebd386c0e1242a0ac0a9b88e8981322d83483afd3c9ca69115f9463abb8d4fd70bd865d0f70692e8375cea114fc1cde3d2bdaccf445992b91d605a91e98094bd199c92951bf4339cb2624926476ca54943b84936c2ef7c67390da14825514c92986caf47e67b257dfc27728b2fcc5fbd89469ca314bee45c4a927a27740f94aad3268cf11d506555bedcd500ee1acdda87605c3a80f55aa44e05558566d6703dc82875436cfe39ed43538e495a6690db2e7511f6a04f0279fcc6d2f74194989f90f1f175a1140032636f2ffc459f8dc1311379a3c1fe7b0e09610fa854e0c20f9d63c274e23ce35eb03655f7b68630368b45d34281d4f4059ff44c5d27b2df66d52da4db219c361d2f672406aca9a23735a39509461064c6e0b2f758fd478a3c28cdaa1ab7108c4ca72c457b2b6d77cb0bac82a7fdede2401ddda755ecbd31a03b624e8f794e8272f1a8066cab40b59aa40d0823d18c1724174f461974487cab543cee4dea549346cbb2e332751d5476d86b5ea15f6d8680678de74b9be229e589a5e082baf2c0331021e3c547ebba45d111bc21086b31cbabd1e2d6bad5c15001e416ba95cfe709b60bd3ffb04346c54b4630e423dd3d70e9ced59252c3f34b2ddb054a4ff9f4d7f7da03b2fbb00d86ce2bdd39f4a3be6a232e182ffcf1c8b9c056f4bb9acc58062b7a6b1e9ae59a18da171df020ec68087d90937a89b838631f71dd0d9a518c59129cf6363ae62fb92ae1357a61913371cebdbe559be28f9fb818c70ac1cc118385e5741513b9efe72a237bcf4d9e4cddda67261cae2a2f54931c56c55a30fdc363e7a969822280f670297496bf5de40a1f87bfac560419fdb80d1b0e3e8c565e25e619fb4fcc932ef2d484313aed0a304f5fe250ec9d20748a9558198a3c0abecdb0b64ec025e7fb29ed692baeb7e52269d13a5070cbc9dde37ee6fdf6a739bf712bcb5980465c421857f73d851b1bac09dcd83f7bb109c34a834ca1efd90a5d25cd2a0a86c8785dede1c3ee61c0213be05cc69a08ba0beaac0ea6704d72252dfcc66e9feeca5f704bc0bf0843ef7e28980278a669392dde875fb09df2e446b5c7eb4c6b20524ef40714b54e3d460d2428d54efd2652b5a84a930315fb55d31dbecb647599a2aaae4aa773242ef0358057fc97f6e991d93820a546b4a7f1e645f6b45149e30b0e4e9e329b5556770ab4a48d46d87aa2246d3901187cf60bdd0004e028df0c2e98c930278fc3da14ab87d13414a478cb85b7b88d3830ae4c831832633cb4a8cf0414f6c610cb0305137fbacc9991ce2807e1e8f64af53377924c395c5f870fbab684986a350dc0b730a3d713a7815ce0664a2e57d60a7e0d41b6b950f117a62d856e2c42e2f06f85bb0b7878d4ebc8df6df7a0c15020568d943d04aa356e4425c5511357f3bd5b5c66931eec03271886e4326f22a9ee0196b763a157d16169eb5f527998a3eb293de3340a87357ee23b9bf900e63d9083229fe76020de7f5e906dceb7811795af81443ea54aaf0ffbbefe4b0e05daf1f70305661d43a192ab8745b87f99077cab53316ab75a43271f3099a49a81c903fa4433fb3a0a0c96bf7296ee892bba6e7f5b2bae63292b9247d3195d0ce3bbf4c19d972f491a4e1548e958551ee44b70db1808e547c13012be9240ae1203378e7339c79c5f44d37bd90605557972ba1ce5c8171b8aef4e567971cff3ab69532839954add0e202d3df03631d20abc31befcdb5416271cfeddf32f72a33486ec387610e341d2541a3da78e87303529eb4450f96fc94b076e6376b2666450c7345b30e509c56d8df9fa0febc9e3976485f271c2374007cbab6f0d5ab400c1b4c58f75d0927515c28cc22895b3438f023d504f2e7801b50c32300d64bb2a8f484ab9db45ca25ecf736f7244eaca463e0508f63ff7d9cf11554b34527802be865245d67478a22f53c2949730acd28f4618efd6e38ab1f1a2b27f5147e484aa8bc5fa55c2f8417ad2d0dc8c05d6cbffd44944660f08eb5a0f0b02a15ec7d924893a82014e5f0cc994c5704522879a405d4a159d1da7d76c787c0cb137ba0ab1ab015be47fdfb8d7dbac72bc2dbead494b94de82ce6796d0ec4610619f908bd41f42485ca9937db73467e5f85377356bfa02fa7dd61aedee68a587405865bd174fc27507143c63a373bad7d0bca844db3cca403356d11f19b43b4b2bf42979d607b374d05eaf65a4738706e35f8c0910d10f925e4ebe2e7aa904f1b53477133118ad0175f145850356392ac780842986e0eddcf81f07d21c195ccaf346c68110b632e5573df3086d1caf167f6bee3999862df8982bbede2bb608341c07a5604ae02809968396f0344baa3b982388200da4cc4c4a200dd6a4bfbde89a27dbe924bd90962e2ff2656cdb2d8905337681027de2609d0ebdea94b0444079d9432332545b2ee56460b59f23da1cd7c79bf217280511cd5427c8d4be6b4fbe96951f05397bf2fd2c31bbcaa9cc81514efecc6dc0fec87075b5919d973ff0496a7d8f9c998e9233ebb2805e535e65337f69ac4c96efadd0604e8486ba62b61c1cf2ae8ebe1bbded8dabda0191c9968d6527fc3529d1d99dea05f71b6f202671939faf41fa3c705a11e2b398f1165e62d8c57c4e81ee7f33ceee5b3ee65e2f209f1ca9c60acd254f53f4d5744fc65a2a6c50f86c1017c8d9dd6d8d3552c98b8f27acd0e321a64ffe0437955d3c4f7f7575b29b05ff91ee53150d138057bab54fe8d4ae44fbd4fc56a288a3ac90c740fb9219dc1a480f358dfad583803d725988973b686c7f001093a1f47a372f7973d43a30af235e39417722d86e7988eaef95fd05e4d2d15c0f5e36c77e927d62a1181ae462c9583ae2b809af321ed2344529f448ec7f810b79028700b09746b3746793afedf6b6e2902de7ec04f5394ccee506342affa8fc43cfeeb63499237ea36bb17a8a5e0f602706a01461364f31d62f124cb09ca6426f1feca41b6a590b17330d70e6aa243dc7542bdbda3db46139e54ea726c00393f9134d2ab9650a20696036c35821fc2e91a46b04ff6b18c9106c8122eb59e9b4c7243d72d3bceb7349f66ad74a737210344df2d6b50eb43b22eb3df5dade3076373b3c56b7ce1c9b1a0603f8b4e31dbfb56798b9951de0fb5d4f21095ac2e8c01600d3c79421681877c48dab7104c1e101af03d22ab1238614c28a9b2eac62f5c4ff02730f81d4dacc064caae51d26c01cba71ecf32ebff0d1ad80bd2db71a54d75eb62dcc0daa73f54617a73ae0fe02eed337689ed352e548709df7ff11149e3344ffe7c1f285647a9b0a1fbc8553804a90575901945c9466d1e74ad0a6314d5135074141efcce832f41de979700d14ef324ec41cd3b28a8733d4efedf78e0cbcfb177b372c3dde7d729ee37edf009906e0c5a3989199bf018afc5ad6946546171c6c31c288801c2ca30f5e2a4885a9d2c703cbf030a4b96f4e026ecb0af0f8825d42c70d07d178733e04347a80013f5a1b0aee0eea20d06a4907f0fa32b48d4ed1da61569e92f20353b30cb9de898d25a1997f425cea56b6f6e04f5793f0b512dc85a7114d0ad8c520561d7f5b5cae852478eb32da5145b864980d4c34578166fdd758a9b3b234f7fb5ce9da246f5abda0afcb47e5e7ed2f3b0fc97820979bd73f072b0a2449e66ddf4fdea62bfdde26f22f3bd5910bf29a6d748d78825ea601a312ec193663427731734b3e89cc8bbf7752637a717182d3c2a556806cedef4b56e1203a2be8bdc4a2c4f1c84d56e3e70f9f9839e89d591c03e40f86c77b55d573b13497618b34c9fd6bebee72f4f70d5e48b48314d8ba09c1964912664f8597f9eeadb39ac6445cf7da6ee976502c6369eed8ef1c1a35ce0b7fa25f4ce5db49c467725890a6a413e757b193fc55d3b9e89ed82e564785859fcd74093d071156e64953925299194dcbbe6d70f2d2773cf5b82737ec548a9d34967d18898c4bf9e2c6605f955c8537138eb3cc3e22b3f33596a6e9e01b0480c39840e42390628fb8f0dda13cd03e7ac7cb555edc5b61e964706e5a4829d552e55f0ad816beabf81df250c85023dd5a9b36f25953641c9bd4600d936cc192608570191f2b624c6aa4d21e43b2dccbbeb10a17cc158e97b1db979004397bfc8960b6acc8c6e26be6777adb2008bc3ccf9be6ca3bb8659fd5aa46d990431634d3f19562db5c28ddead8179580292c6b51dc460671e695d8f778ae60863fc7ebed3ba4f0035d638fb9d0b48e140c52517867ac18620628aef37d6312848de3fafb6e279c274383fd2c478690deb2b4bbbfc9c8f467edf45508aac6a1f83392385bd8a88c3f5af7b38cc3cf1e47834bc5e3a92c5cd661cf8161012506944d924449014a3b8c38e2476b98003bd25360800b843c0f72ba362a0f1c75eec33fcb9d65d4c59d55a62b9e274ea2e2fd78c7c20e4435f8a927a48a03a38df45caca071e4c3de2fad46939fbd8878c625da6698330b3cc363dc6bf8281bcdda7f52cff7de6fb6c6615936fbdd4ff220dffb10bde2d9a411e7e3a150bbbdfd8b5907daeaa28196ee583f9af1bc4ac74e2f13a78a1366e5516dc7e38ddf7755ef61c879281fd42c907c6b69a6caaf759f432db0164c304b030de521d87d8b637baf6394b09d1dc3e5876640248f255422f0734bc6a6674d0efb03656afd99a6481f64ef66b47382ce9e6b439285ca7124f5027bcd6acffebe54dfae1989c142f73e178cb7a7df645442ee8759304153924ab8c35b81b915384120c64441be03655f426b2666e0caff905156971a2720558d5350df6a08175e2f4f76525f9c1921f4a98f6d93955c252a129638bcc8d331119d09f95ad14f7c56ed688e0a0484cbd7729df598fc280713b5507d4ce2aa89458755a13b4fa8113c17d4c8c62025f5f718292b0a2daeaebb195fa3d1edd66c1e7a6fdce3bcfd63fd04d4ef553bdf02e628fe0781b380adcadcee6768a0cf08ed4a499525fb93000022e2ac863353e395bea52633043a3db6a2dc877810cc952414ee8f1155c66cbd8ae513b939492cd323159159a0bb1305b31e6df0ef9381acfba6425c8999a26fa5fe1263688227b7777fce2b6cf09e18205ddd1303d5e96909702ec399900a0101a4a5b8b9fd8578f7d8b5d3d9547ee10db3c9f668bc2311f41f8818eb6fed79660f54ac794b122dec3c66002a5f5c114c2025861bb34ae5467565d69cfbfd808f953f825261db07d63b4ac39c1a82845aa1edae319b299e04ca71a4c7a6a0849bc1a0de69c67ca959b1b2493d682db931989a25b90aae5d491cf4ccdf2969027edc30eb2d5fa3809ed59444c07b2f70c9f2fd0e96c7adb3078500f8557a438e5d48de41c148aa18106c3926c4dc743dedd105b1d2469381adafe88855788265597b5d2b9c54f55fed89e4f84782f92c28e061f4bb03bb2847acaec5903b81d0cfefaa9f8b4cb6810db9c5038ede17b084d5e8da3cdf5dbd7e503f87d53b1471307e6fbe0baeb19b3ca7b71e9edd420f852218ca1c5323f84b6c5934f1be769ebda9466d6b88793c2a225cbfc40fb293d85e646471abe8488b11699d1da15d88a798edeafa0f09bb9032a7a754c2af5b97572fe4af383bd3b729540ad1721dffad8dc38e37f0acf66d530148d0586f770db1aeee7a37372e25d5373fb10a776640e7e9fad3bf1c6e6af0c746d515f00661e9000958f000df5994f9e2d7fad48f86c121fe371c84e1e02f5846eff1a789f91dfb380b0bc66ba860ba52a5a0416bee2dc2f1d50b07d495bace7c9f3db6a38fe1d341e64891090a56fed145c7ca4fa2b2c5fc5e70bb957b72d7f23b29db0e937a5023e18361ab2c65dc954da9e6c0f6b235d6f465376f88813a5c83a9b1a805410e261577608e2eb024cdb17d8a1840ce8e3e1dc2f888133cff3ac4660968a3e46510ac3400e034ff72a1e75a22a731f3ae6620f88d3a096a0847140b7aed0be6c9262b8de27bee1d8fe62187b5e5a22fd282c62047b67e8d57b83ec1c85d87f6937a6bb9c61bfdeb8bf415e6f7b8912ca59c116a6a0bb508707cb549754a7fe74e35652f913d68259614c0c490e93c510c0504edc6e89dd10f121181c8eb092da3feae81a945a5b2b5245170fa05087ec62dc1263ef02700d5c7be1197fe136b062b0e5326d861938704c765fd3e73ee90a62f4457b2f54b7fb0c0c14c2659fef91a07125539abb7187fcc42147f4ec1f1666697044f80be195d9c620df929cb6bd4c704d8871ffc4be8f105cb7534083d8646f29499c88bff24009714a1f6fb48f578149350d11d39a6e7f7bafd07b46718af08d191a496393b82d186420b6087302a346551d944256926387256d5565d72872b7abe4177dc9ada1eaaeddcfce67a8bdffd793fbaae77a60d5ac7762db0de2187f6f56fc0022c2548ccdaa7aa007a8452157a37aeb004850393bdfcc9643cb3581b73d9b5bdfdf3218d8ca02a803273b3c27214c9c7e75e3bfe480e156403f51555d03d8d7f54ce3fda647e17ee4cdc688e7dd8efb239ba0083034407cb500fa646b3bdb319b49d123cbb1cdce11f41f63bf21380308eb5eee045decbadb48cbbd3a6363e1eff451974401056fc20c04232b52f7261c4b7559812b130af2f222115aa4678128af05bb27dae89477a734ff09c740054451d9893c001aaf56178831dd3a297a758fbb66a31b0e1ab7fbbeab51fa2fdb641a5b810496d384b279cc395f7922cab347d0123c396420b64e33521ed42b17d1ad36ec9788df90d42ce6ab2c28e7c3487d0ebadd42cc29646c5c7ad44d2f473d0b909580208b4bba49c0896d8f07f1767568f5e1bd6fd21b38a5d57fb39ab445f513fbf8da8be11a166ddc12c8c52b374c9eeb1fae072845de27b20ecbd43156bdab5e608b56660a93ddd88864ca04b663340da14ac899bf876b0eb737b8d4cf0b14305eb2ac5f6233e39360af7df3ea0fa92d80c6d923cb9b261a14a14d8e9d60c0a25e858e37a5b8062d4e5b5bd9d7b475e7bc34af3638880b07a9ea9f1f334d09c8aec8a2ff1d78d537d6c73dae1d3a4da49dcb533d0cfe5da85bc11de1fb0412972162b8ec1b7241692ed7af7b16bee5fe66f548f6518713214a3138ad74cfb44bb8441c79f373324f12eeb472e16e08a54c69fcdc08fbb05a3d4dfbb69e6bd30d48f72d1c710d68ca35d44f74d8a955c425f9b3f79bb7b1fd399aeb7654361c55301c67e9b234cdd63f7a867ee8f09cd0efc491425040d262a5b9d51ab08a0c5d86c2442a26369c7594869f19d29179aad95ea5458355de84f0fbb91062fe79131a342711be64a0eee599e20d4cc7c5dfcd7cc2f82d4391d37a03e5f6295de0bd6eed0600a878194a8c89f2a8998d4a21bae1f5c8efbb2144d32c1c5364fb821bc2802e57d9b9ea048179b5f785e5630b5b95f0e142d501889ae59a82295ed47be55406c55189a3563ff3bdc41c74b26e61290d4c175f097931329a8de51555e3a8f5d80c091d28edda6bd280226bc6a2d122f5eb0e99424ed9ee9a3a15e266a777bc1a51fc3f80f014c589b379690a79de02b116a49da666de94447f7610648ae03f96ba619902f66875b3e66c1d14c9bc6b228fb652323d9ee7852c687855b0f84758fc3715580dce9ba23af528a2d4d067beddbe6486b4737a9648e0594a1386492e61406b6f1badf65ad7acff5bc8120f2d6d669290fa175e5c31a030a04aa9d2cf695c214cb3c70f4515e79cb9cba7a51b3e020129d05a1be2971cdc0231cb80e23f7488647030c0e3304b81c30d013d43856f3e7ec3f8d72e278f665978f131109d3d8dd28f1ab139da2d5f3491f3a950923e29e8c6384318c86ed55583b1fa6ae9f79b75d240f708c57bd376852e1815f895e938f9298d344b88dedb02444f2fe75bcb7e2becd06c177de8b258131c6486b7677fd4f472959a78843e2e8a7a80e44fdade71cc4fd42072eb0126d2ce4e3cb2a485f61c6440c513de4adfb9fff1c50a11fc600c47c8c18c1ca9686ce814e06abfaff1ee71048f143d50f67b42d02e69578b1e6c2c982c659319d89e023a9c14a63c0aa6246de5d57311cf0cc84948c6ad9afe2674976282b2d9d7e331047da44568dddae4d7f942c1eb2fa2a177d65a10edef81f8a4887491af055f3b3ee42268a4130f8b87d4588957b34253d5e3aca4b13cc4c398369f423ca8ae6288e896a86ea52fe179906018c931fa255493dd6544bf0d1d495e0fbd4d33a2bc248a5b0db9241c3a09c6a11f8a05fe0cb2cb65ac2fa124ad3ec9c1e388cab325550538cc7183c1c499f0907989b2ed59ea983224e83367b381b52d3dae0fb7a11b1271f30294e142d1decb8f74b805d06fe9933b0659ee634bbe356bb8cc797313a24e7ac83f1640c9d2321f3bcfd7d018c0bf4cdf72b8b327785bedf267c949e62621158001945e6eeee470c95b017266ca5cb54317b95b11646c3b570d80ea3987789d2cbe868e7477f3ecd59fd5362df86d96ab19428d31d62ee1d7d6f0ca4433a81ef4e3acd76627576d452a2d3bdf69476de3482da92a9582f0ee5af6bb4cbca1ecdc4c474f72f752399a5b6a1e45d5085f7dd5166ba74ca65597d691065e1d408e170968fa6388acc85f339908d25e952ca0ca0aee0be3f502b92306106b30b7b11c99bc6c9e779213920726353411da88ab3d863d6aa9618cb760fd707a6be85b912902cee6e52995fb5ac16f3a55e18c339d0455c54dba19516465c4b1bf9b05ad9021ae3c9e322418f04a5fd852735e316ad09397e412e1708c11f75b541f539e2b037bddc6f026eff2808d308b9981df030f44c4fd661df733696692e7151a631cc0e161c503652be833e6151062bb7a5466d7f21dd16e771f2e40bd7677c0cba7585b6e537c266645891b567da36c77180a631d37237026fa3927f1e2ed392b3a876462a5ad6f3da30711bd83ba3ba927a5321ca6d8a9023604278d3e2ac2274569c8f620f7a6ac19af3d8088ce416835b6edcd22f8ba1bbe1d9b974230d511a91bc51df7e6e3c6e4e62b7cf1005b7cb6441b59c9bcc0527a71ff4a27f751798edd7142e01bac7ffb1fd6ae52796a9f6fa05375cb430559b9899207477819469b4c39bd633555c2d49f87fb6c4192a97ebe87570ed70f6b868535251b4c77cfb076ac16f0c43aa5d7e9d30f529df2a00bc4253202a81d1f6c74deef7e9f2bce58091a8f538d66b281b9daaa4f14f341776835181763155831fcdb646eb861c658915e5ea760a4881e9421ff0f59f2bc9e02194cb08b67fdf2c2cde09afdce683ee3149fecbc4a3c7ee443300f7448ed67ce1b46ea66415caef5bda632e66074e41e0635864c303e4550c0a4527db5ae471a44ca04168286f2601f33eca305b83b1fd678bbd6da6d6811877a11af58fa4381c91003b3d03dc6977ac150c8bbd3482dc6922f941e157ba1a75fde71cb1caed86f0956689743a0c3549e1d7a2e5d57cee06401675d9fcbd2259abc2d54cc5ac11498b2d7685bd7e21a58b5c25b3f31288a2021e118ef13eed163587fb00dc94c48316ca48aa9b74b41b396ad363ba42882b02c2b318ae142522eb0cade255e5ddfbf03ddd79cf70fc0a8a1724f51e63e976a4049ee756ea68358be8ca25861e3603283a3c55d27a87c5ab85ca0c291b7ff69dc3c98e33e9fd8c6d20c3cb25a0b9655b6da6c0be85a40addfc2d7d543f75ad86e4eaf4a27f665f346451b2792c7fcb954ca48fd1716cc8322bd8eaeafef73d0424ecee5dc6db62cf421ab2644f35e87bd1b8ae22dcf3cb342f56164980cd129e1d3d1a89ab6416bb7071be60182261601e1fd3af43a8af46c4c9b798474cf67b8745ead170e3f9fb9a293b57907177fbc0994f68f2b0fd5c30e66022ab52be5bcbc35e03dd91bd77ef2dc4c98f81b42cb6781ed1a79242c24e5a6bf2d35d9aa674b8c977f3bf085e97c8d40f9cc242a84f32692b6b95b6d5adc1319ca3215552df00bda477ced5bb5273b0d19e69d7e9d6310d1d97cd4a570098cfae9af0bd0cbebebc7e37ab7fa4fd585a8f1e1fe862eb052a5b6a680869f097f0a102e24201da5e110f114fde65a95eba501df4bec30d48642145249b8346a880917e4c7738e6ae07fed2146198cdb6976335991868a10874d2b4af4959c81f42b78c452e9015e1435ee02be0ef7d6b17c479424f0aac79dae2a1f80e5e3f5e0dbb7c4594e01b39f2449f7d0211a7842889215430c4994f17af2eab72af59db8bd0e51f0d60f0c800aa9b1c4795d6867ac62cc559ba154b3cd68292f26a36f6690cd20c62568505e2bf8558991166a06ccc18efdc3c9fdadd8f17d353f363ad15d420fb3182fe78e56940243060e41bec1130009bae5c23760c8472c366648d63d103d162b09f450712debc99afba8b58d7b550943f8a2022b64162c01c685aa0ff856ea32577c4da3083c5ac15756c77d2e68b1a991adaf9c8bc6c3cc2b0c1ee9da4a058f8e440b0e3dbfb5ad7b73ce094ac99249648b84711a4ec0167600a732d3aecc68d5c09075a9736cc7a2e8021f1733ddb035513ca1bd8da2d325ef3b69016008e3df32dd7c37da0818352d6f3fa2e0d70b5d2b106be024c3e8e8f987c7638198e62faa564cdd284404459536843fc0a9b3f5ccf909da4a4f1df180239a30fa3be035ddef7a2644ee566b339711dd6be8321108b23ec1e959ff242983a2a153583d033f90df9bed233c0228579f92d8ab78bbb4ef980b9b628af7534d95664ba496a4deb6affe8d4798d2cea68f295fd8a0a2d477b78650fed842d7e48207409432927ba7faf51076ffadaae7f0c3e913fa68b8821074dcbe66a4abcc223a08246cf9d4a66ce303b21793d2a51bdb4f78bfc78246deada0c8eb8538d186816cb97d8702086bedcb978e7d2e5c84fa7add854e3a6da7261e2b9d9c5a27d679fcb0c6e6dfd09082d673b88943c5c51ec9b65d65e96e83163146682b5a0ee532389d2bcf2e9d81adfd355b42a0a5b0445413a427409b1282d407ec591ffdc5c07599893ece4fe6fcb86e7b97ce99a4e0f888c056d002365268c90e0d8aa9e2a190f87de85f111c01d237ec99178d52132369bd8b3fdb5c88066254380dddbaf0af7b0032aa44572a6192fd2f93860ce96d7d669558387bf2a9e92cce979c8bfd8495714a03c8924199790cdc98a04bdddd8cbd370f0124085158a4cf840898b8015552696948bbe493ef2fe02939bea44fcede0d7af5c0bbf9193165c317ad9df39ac56305ad8f06d0d0dd11d467928843606a2b2267bd98a8a0b036675f4b34be8aa887de3f5f3708918f01376ecf24505df036f0119cfedb91787af3c1912ffe49dd5d3457306f0b66929c36a6b456ea972fac3e226bb6eea7cce6a73583568210f5fba6cf6fed4961dec1ab2f1129726de5f0287de718627f4dd03664c9932d68fc6442488fdf2deba2f53f7c51ddb4c172533d0a3138b63d0770ad05e23eee4eb36bad9bf1c18466804214c4a91f4938438933274410827ab7b0dbc72f8eb4e9b40a02d15881f84f6d5587ad4bca49fe2f1b96674af39f9c24f6b343e4d84d30082b73a4c86e88a6e6777d551034dafb6ff0c8a6fcfeb25745cb97a566283382e2b55b1c2b0a711d9d3de37c1727daa43fb0c9005948e944a99b8c04cdec91e7c9abe0bd88370bba64c03a7992f5bfc106a84a5c5b7a1335d64a8fcf777522e823346f5742213a300ac013d6b51a6c0365401bafec8fa851acbbd8dee1abee51bceb7137279cb6c2df1d066787ba8bef8ec227653f23018058aba261e2880923514c64110db33cf7f3a2a60bb6864975fb15095df616baa3fbcf4d18bdf05ccbb6aad16ae257360bb3d87cd7c064d7924cf5f1c33ffe10d7745b4422393efb888020d06fd0a70577ae07a0c86c4b2da52a40c066e741a584b5aca972b26951bf5457c2ecd8446b1f3f924467ea2de887667ec331637c693de6b55bf4741c6aa9b0e530534bd16220e1acb39f05eda97a791329d476b3e984f12d60456566a9f491e911c9f2e2845cd55f77d4b5d288ef7ff1fafa118eac8c99f8334d14f9a8b72b378f264b70904153caed3185a4973b75a214f38fea59be93d80a12f5ddc045b872b8bd8e56d71943af91e38991b3c79584cf5de9af145a420620c4ef8cf2a0877b3f4ffeeea7226ebc030cd369b02d1d16398cbc6e3d914bb020fafb63fdde1afeb9e0d5282350be26ed87354d2dea524f061fec18a7eff10f1c05fa2fb594110131e7a2d3b6983c84058c255c7295e9373290b97ffdd81085d202feb1ddd5a3a2203383967f6ac7e319710403d74146b3f22975995d2df4fb3d7bfdf0120fcf0d22b9bfe699d23dc433cb37ffc3abd4035a8e73dcfffe73f66bab14c1285a0de05a0ba8414a80c1c2be353e2b02ee250ed3c66358a467678571ee971560c3a579760a135cf1c98273e412f0cbe6d37f5da560d0d35b5c972f5ec0b5370168f1ea460e1a51b01ef61fcb419fce04e585ddf03c4bd63a9ffcd12964b47a7bdbb07438107e4987b6fe2bca32a789e221a1a583157a12c837cdb73f2d454289faa8125097cf6bc21b59aa9380334d658787ed997f57a284196a8cb6445e9fcb3a05b471ad61594f2d3f02e706a52c7d6cc21d8693ec3059d9f9a7b94e5ef096bb68243ba19bdbd2928998cbeb9592982116319d9f95d2dc8e29868a3f75b05fd44875d1bcf310c12f50f7169d39babe990da2785a068f875af2259d6662b667cf7ce101077abe1d49fd810bf53ae4947fbd6fec9dc7a490aa0285b2ca7671d6ef039f7f5b0be352509e749b44bfc831160f24bfd35468d9050ae409cd6322691c35ec282dc54df5c08993ca12a6c9c73774bace7e26927106740ed7607fe0e3220a55c2a381dd16e5713306b437dcbcaa97cfd8544bcc7c5146b9337ebd7c0648899a9737f3e0a3200faac4116bad640fbcf48791a541006e5cfbbed507a3fb81f2b962a8521d6e840d323887b7394e04bc5c585333e629ed3ec18b83dc74024c93a006877f829391d1a572565034634aa6f54b78427f6828899a6481612f0056e1eb92be9297a6720bd11e9a9fd116009052c53ec19594b89561d8bb5781c8e3ca5a3f891195ec26204c49981eb38dcf3391a67647d789c6f1aa2df61aa4b991e0a7546df6e7a0bb366c5a476cd7a8c4e9b3dd8298671b9d256872c3f8791225e2f29a240ed9a53ebb071327bbcd164f966b3e27fd443f18d665e480d25207f3f364c31bb760c94cebdc8cb234893bcd2eec1c99e4847f3250122f90393eb26a6f3edd9edeb8f01fccd1df2799e41568ce77a5bfc9f1efd2b1f7dfb2549baa7e33c49a1962db61597cc1d8c752fd10d30b560c0dffe1bc1e3c266d25a583364490fc9155ce67f14e0e163b58c59c3e6a2101beb1c421337810798d1e62fb3e008087ede0b29c404e9f61ebeaa0975cd5f2119d1fd4c433ad94755aa0feccf554133c396d14276893fccb747fb4314fe3c5123f387f43bd20ac4ae5d9dd06454f7e6584829fce600597c27e47be5b61089d059eebd4725e5e7a899728c5d21c40f41e6707d56b7c4c77f7706a025d98554229aa7331ece720f85ad834e97f2ea33e005393d48952920a049423df8d05fc107b10102310ccf78a309393b65303591fb5c6f345a3fc0d9b7f2369b7c40f09e15bd634b0a528ce75edff3ec0604bd2125ae403359738e9b6600c024a9fbc70f205a69e6e4b1f8e45d75dfbee2d5f5623d41c30f19215cac294f6b0b5886b539bd0034d6bbbb7ad6731262d79fb573efb6d160f6ab4cf37f37e959fc7b942d22127313310260b0d87bd7c65e4edf80af6b4b2e0fb31075ca4ed0e48c0e440733f7a1d630bd237efd318d0223ae337c665da748ce86216db6c076291831b0cc438bc8a3b53ea8686abbe9846e45833617334e1cf63046880b0351b0453e1a6eb56011cfac517db32a64b970b1cc0aa77d1f3eeb9d3d054b6ea18f57210be588137e32ae3fa11c0296d16bc7dbd53fd3c8f977335d6bc2b2dbf472209dcfb366e1d38c126e9b25fd2da71ee02a5a604cb50b542207b875faa8ff6ef5e5bf8a5660073b1abc9f6dec97f9e06c2fd367943770c77b6b999b18a020dd77f8c1143595794a1763d4d6a14e90652a8ee8755426841c78ad6a489b2ca4aef370b16a6015bada17d8ac1334e5dd462893b34f041d172122898583977ff65c6a7e50bb75b1f40e9c184c1249790de4c356f843a501b862ce308df9ea8eca11664bf59eb76d283cd0f9f995a48566e3dc9665c2cd2c310be7fcc6d2fddcd2ebb4ba4c4720fe645a56503f4eec50ac0972a52da9380d4a18946fab58c03dd90d1427b66e8625a8928d58d0e71b1d6663b30a4718f561d0f3bc62f340c6fb42f83c86fa3f41b7d1503c49d9a52d3622fa1505a38c6dba9e389485aee1b1ec85ca578e69f35fec6ad464701df7f67a7933c98b50c084af71ce3cdd9bc4f25d8ce46c59f7139103c577ce751182366607e12d4e0c5c1fee9eee46c17f0b80d7c55568a1cc1f51e3ade098e02c79573d06290dfe2dc4c9165c3d301772149618a9af53250d4d275aa8d9db05d5ff99961c1763a4f831f754cc10a4c1e6959e1c2fa5f5c0e662a1ef1118cecfbee4a370e64f2dfc74f0475cf14b59afe049493ddfab20de2bb9c2ed138942b902ba2beda62e96da97cf9c0485e85fde64d987395bbe1418725170988cbc7767ccc26146c5e1c6e85b64fc10f389dfbd6bd0609bd92aa98ce1458a82762120afbcd3bf774bfb0ba432a3d5bcf6594cd3cade2ebb07bbea652a8854d606299b796039d6eb94561ea6477c33d4c2d5868fd7708a85256a59aecc73da2117c7153bfb20410e58d13cc183697edc8834bd430d9b9b64989b2b749f11831502e8e108e95e9b22cd6a9da094e51395b686faea9911a6183f2a049dcff25bcf480905a137ecce2cc01f4d63026e21f2fff462578eacfd95e26a7bc36df28d89ae1472ef4f01c9f3a0fd5fdf1fbc4792da0140919ccb53235b4f8cea148e95df7939fa260ee7b1a9538079f3acc3b71f5abd1fe2ca6984df849334c978d8989bc5cc7db0d2d581e11355dc7f95eb5f6b6fa7127b6487077e1f46ec77ed2f60038da53146ac42cb6e44bcd54865298f0b31179f9e96f3f655740e99a034c6fec93cc9e66f6c28a52e29c2e16403a7848ca9ce9b4b3a2a7f78d069e213d81f2b6e1f3bc4f33add337560352e5f54be7fa773d306693bfd5b129058a17ed7ff53d670f88bf90ba60245d0c38b0e049143201481a8bd89f83bc385a6677d7fc8a92bc32bce7f2c6a9637b7519492be32446e8ae2126d6489b3582f8fe6e8069ffe09ccbd196e44e8f83b35d354f3c7f7ed73f60cb171e364d6ae617bd1a97388b1dcf7bcb0233d1a1aaca87add471273864bb060291e82a264c7291a95c46e091fa40c6f5f63c444b7e02be70a229a82d82a97094499c689aa5a14faa7a8e65b5b7478c69ced89cdae40d85396601d6452bb08597072782e6bf69dc45041f62e51efdc3c0d26566d7312a24110b6c21bb1870a8056f3ac5dc0d5d9574309697122d194d84ebe3abb4f1cd8c7c752aee4364dad2979a97e768449fa62c0adc919e93c5e8e64db73d23c393355386d3e4e8ba38f3dd443fee0a371c02a7ccbfd89a0ab92aae8c13490d605c8e46d83c5c562b8eb35f32885975a77aa780a4094bb59e9ef917b76930c0c259993231288b0a3269d4978e4436cbbcea5cf42586d6a5e521659c45221c081ddc026c1317c2a000d1cfce611cea625574e7920530e29f34f625209124837ea0ed50f54b392b107de8bd39b2845405276f2416387e63bf1f78f9562799e11a9e987fc64d512b275486e31d820b4186e42072bb23767e9328456381cf80c3f42e14294da648cd57d6d0ffaeb37f81f0d06b234f9ef3afec473be4c53167382982010e41354e49f07f5cd87e7df837ab3d2cbfb0950b57158d45e796e71029dfc700fa3a242c6db45ea1ec4d4b117c5f9a4d774fc58dc0507c8bbfec7015b33d6fc4eb609ffe952c68a8cb14e78fa0f88919897b83be3e30eaeb515fc59984da62f0e65a49e46b512cff53998baad795c71192ff324a8917e69ee3a52480047237ddfcb22b283c3d995451b52348db48b6469d207267c5c3a9ddb60f1b912c5bf7de9349766b70604e0305a121213304a5c1bf3076b684a359a74c6281ee6837f24db4333c24e33e96650519dbb54017e5b1d5da3c41a292a81013af098b2eb72997a6865ce635ce01fa31ba2041cdfe02eed4291c5a3192bce19873139e9d71241e9a130eb2fd954f57dcf2e2cac9c456d28a4b27aa2a5d4cd35d1aceff3a8041bd574cb51cf3d4258c49d83f4c7627b22fdac481a7187f691997c3b9a9237879b2799a0dabd140aa9037b823ddae91da5248a9456c9f8174daa6a95677402af9af696494cbeb355f04a4cde72904161a06fafb98454e5ae6bb58a2936e2a25f86c67135baa3a655060d2a103eb617505cee031f901fc921f76399989e90a3e6aaed5f3fa437f181312a6140fe8850427837e9f93af172c5e733a435799e8176ea3740f05093d9ff582dcdb74f90f89c1a991f9bf6cdae5a1da8d3c5333d204d88b1ce45db7d681bb5f4e30d7b1a131bc01960d412c2b78d19ef1eae5aa045a94549f6169677a5759d95ecede6160e60c4bacd513a30fdbde1841d87abc08d36ea2e1aa18ead1ab00be05fa3fd77c92bb1e9ce3f6f11a302f36785df6d7bcc19b19ad195a017295069c56b696289bf80e2a717bb6baa1f14e9a39c2251cbd939baebbfbf926c8ea3920eefe9602d5ff366d7c7b61c4033d020a7b5ca075f766b3ffaaed95b8316555389e1e95d3b3ed51e067f849111c46fbb2346a4861af9ee71907bb23f363bde0006aaaa863cd9e06d42d2645202022cff0cbaa1b0571f2babe849a193b6e22c0d7ca3b9716c7734f6ae74f8d3b5f91eabebc72f7f157fae2e00d1b603ceab7c3ed7676f98d1d380625bcb880c04b7043fb6ac23ddd20c96de83e08b43a0ee7b8831f7e51ca88723c51baa20fbfad4f5222e2e2bbedc168a0d2aec6867c3199036adc6c93aeecb2117304633f43bee044b1e39fb25a78fe5c4c8e9b4c78ebb2353eb981d49492c3a7b31fe16476bc0568b4f4d590c54289e3c18ac0f17c4fa181e6bf84049c72f097f7598d7113af794e0cd8f66d2eefdc1d4c80bb9871626f45c291f09441b7e7507287d84c350e35963d9049393f354a0a35c365c1dfbf29fcd1e6324be12151148267b8eaab5a949f23a5f3b738e81e02d6317641bb9cf4ba1c6cabd52d4b81b9b3d00091718c5b8e7fb6405da6ad87724a4a23e5e24b2f653d764a1c108c6982afb1c4df465b2abd2021b68f6e65acf5989ab36178f99ed04e8d4e550875fb1b17fdd2b2e0d7be4bec23b37851d859bb2bf5196c6b313952ef8f6e6cb8042a6d5a02060caca8467b84a6224e4028af75b193de246de58d66a4bb4beb586e3705cdb7c635dbac9553241d3d7e644d529b3778b29ecef18e176604f51fee799a4e2850cc15abe6c6d0e227ef2aa68498f4023cd13dd1ef1e5bbc7ecbd6576b742b956df7418bea228e4561de125782eba606c8668819028bf5d410ce57f4346329fd614850ae14d485c3e28a47450ddc987876f4db53d5e8309594561c548e7a1ec8e27a86266f3c1a793a9d05c9b693b511ab26975d9c17017b36505c726650431f7267739423a6109910a8de9ea15076c7ccfc76eaf61f301de4897c9f697f0b5c9a83ddf90048ead3f3faadcf6bc799074a8de035d469455baa0927ecea688934be2a72fb2ad93842e8ec5173c45cffff4a5a9513b4760778f4eca2409f1226eb138bcf46f59ab5490ca07bf862f0ec896f025be5132e3038d998b95750c4c7863d2bd46d27c2e273385df22b853951d5a02b70b20afcb0b169d6f080123d848068e5c752db6e8478ae30372fe5251f745c10b9ac499887db69b4cdb2c77eee4fd4635d7bd777e9aefe22442a5e02acb0c8301093e76cdd9c5fc3db096cb0543caed3dd64099722112206be40bed5df6dc651b72e21d36a70c09085acdecda91adf8d2b49dcb6b39ce9e6d41fa1c4b6d4d0db2319d2dab8ac5329c921bca667112f20876bb97ea42515faf3e59e52378975cc24e8f14cbaf2ee2217429d97150ceb11710550b460f13e3a514c3c3a73e8d015ff2ad2c66ba3cfa56ec7e2fac11fc67831b7935972331e88dec6ae08757856964bb0c53505678fed83ec911d27ab711828dade4f2eb8f6bbc9491d9f6af1ff7ef5d974a87804274e232356bb274c70d98b1dc8c3e7db36bfb7b4d187cfb39d4ca56295229499d6270ba2ff6c876b78b61116aa43ead5b36d62af445502b42b722056877b43de9e36d1680b9150edcd7645ad8ba43b72a4168658ed89491a3d57e965f33fe1dc51380304bf5aa42339845b5caf77b110e0458a64358bb767116ec135c3e6e703401e4abb60f7a1e7b04e329c221c46dc2f488aae6d679eb483a88ab8ba639acb010ba520b0af97e9b820dc82909de7c9d384d8ae976a99cd236f68509b0dbe26f457f208218bbfb5f84d6682a3a825b471b920ed7b3304e0bcf408f79fbf6bb3855c60a519a261b0a8b388c85fd8a30a5cb11ca191669d2d34bbbe107fb44b1fc5bcd88892e94cb246e5c881deca79e27296d3f3ebea32089cdf8afee3279cf8185b35ca94538379251633de99fd4e1fd7b929e685360e4a9f644e2252b6ef2988ff6fbc92cad021a932e8ea2d0bae817903a2e59aa56c0557fca5ec5028b47db8168b93710a2be5790f0745bb637cefaf587bc1585dffe002264d7165dc8f204d6e7940cb44cd93030d4411bc3b6fe29e47fd5e5f8adc18c80c27c3574dcf781aea866339a750ddf01d114216cdc7cc91383ffe6c0e3361ab372adc7326abfbcf79afb508922dacadebb37d1486c10d716c682342e2d30555ab68789b7815ea5ed4460de0ee674de71c6dfc095deabe48756e3d6fa2a48a8180e18fc28350745ddce669c0642403de240b69c9974e03b95edc5a7622b04b785aa0bdc28d785851b8b6e73b3167b192e14eb1929aab077b4136d6708a08d0c13b9eef8e9b778f02f96711d392f2c8b3d1e09991f6c3c0d4136899030e447ee8da636fb951692f790eff039bade8e83261bd20c3b627038d91ec8bfb159f2e892f85de76e9e6358d10c349ebfbc7c35d5d20dd29609df4159637703765632e9a35c3e9e9cc6df6eb17508cc1a630ba23d0863313adc2eaafd5d757a3171918578f2cd6d9c95bcf08d86994af8be946d943d82622b1d1abc7f77fe664d9bf64297d41f969ec6e635423cf61e113cbf30c10881933f55f9e73fabf67a805c13e4344bcc1a03b592d8dbd4df92879e98480ce56db8b6ab1cf76efab646bc5568176fda8c973f7756910f8aa7f391827a8bf1c0732346680f7d873107f5d8d2ba053c83b263a02790bcf02f4e94d61e40dad6271c82f8878509145e57a5243e03dcf782ec65fc829e379c08205843cd796a1e674ac59e364838d77125297a04701a8562b65e5c0a1d9205f024131fbacb8c8437a5bb1488dd6992303b11b18f2b376944d09343961292a12ca35996aecfd4aa98d1c125e65b279d5cc514049590581e3c8458a35300723121c331d1ebead494dd9fa7476c04463270b7ef375c5d70c67fb9edbd432ea64a68fac30057d2b7d4fcaab3f7c4529d1bcef0667a0d7bff4e4bb8f8598e13744907563bfdc81a1be7b2d1d232e0ad7a7b09a1597ddb2863146dee280efead394ab0a00b759cb42d44e48c3cd0816f4abfe6b1f2ab39096d94754d2e9c663bc7480d01f9925bc9f5fb305041c4757e21c9d15c7d7980eee72a8aaa6fc3b7306088e98e3a63ce19e70de2742589e70b135304fad6b29c14f2cd8129cbfeb9be910d345372b10103b4c2edfe5f757279c6372ef057ca272b03a779bc89147e59a11d179b4ae2091ef5b48c591830384086d699f64e56efd6020c29a345472187b0c147861eedb16387b7056faa170eb5ebb5276315bc22b34b21a3bbfa2626d3ef955e1cb5fbe4268fab1f625f4c375934d3b075934b7e102b7c7fa7920d5690040ffd6f7b2d989f711c7393eaed1c62a5d1e3ca9cb8263ead30f20018efe4d078dc1a27348674041e64a95180f721e0c44a03973a30230e7c1a0106e522c786f6aaeb75bd187f8f513f0596d5e99f3e86b3742fa1891f33f37276b237808c00a139b6db31010fc7de4a2390f39896ff68409a4a4e45be7048a808cac6f74b179f6dc029a7ffcb14936816884e66ffe5bdfdd9558fb01d6579c6a5d6beab42ff5c29b2db3dd6d87f2ca5af06d8d64df7fc1753c55d67cbcb97e4e057d4cbefd23f65ea7129197a05e1be387a2e293f3abaabc8b54362bc3cd1ada5e1cc68d0d1778d27e21a1775768361622f8d9eb4c8f37d059cb8f9f2a3e8bf2baa02466a1e3654b205ec17b4c4a5562923681d3c890111d5b02f8571df20f8674506e3b418c07b149913fe16b188a7d4286058fabfaefc1a46c5362a942589d32a7e0203df5783acd6e79457310e3c810ec87b7e292bfdc4a14a59f9d1884513358a783a703436bde354e83a8b8fa6955fa3c71ecfb699726e0a1b3d5c4d99084e888d633f4731641c986a4568b82cb0c15a23ac3ef35d9d3c7abaabb88a13edf6e8a98bab871323e56cc46a19e6234e4b426d17852b504bf60e733428823db53498055d617a88466811bdfae898e28d1bd64c74445b76e89dcb134195cb0582078458cdf70c8f74ab1aede5620029326a46066908505360efb5452fe03208e36c19d13a2f5e0cf57a3cf21cdd1fbe689a48dd4ed6690bea7a0e05e3901f2f812dc9572c291557570a48fbd54d5a87bbf9c5a669a860537d2c2307bb467402ab1e806063748118d620fc9ac3a0d19f7b2ab585292021e73e22be14d98153e12c342bbd99ff8fa9f5faaaf9c52c388b6b67b5a34ba9bfb40b8186033f383fa3a459cce77170b565d7da88be77784a24f315d6742b9a3e1df06dd90243da9ec1b9677b2dae879d0a7becd16f0da07a7f8a69df8b8bf80034513fbec85bb023503b85d4688eec5f90e8164b0e2969b2b24b961356f4298c9ea6c71c80df85bacca0a227e30a4e536309925f8557ec634dd5e99c9f2b4711be7911e1b81b24331aa759d95534569ce33df74dc7294c6e98f25c7e75bcc8dc9b784a83369f317fb708cecdfcb9e21d0d3a8927ab591f5e6dc371fd48f04efc7e93504a9cfc56b7f84bd7595b63f979c25d9706e4c47d10d4c2f9da0855922baaf9185a391c630b5674cf1ef9ccb58832af9ed9d4f74481675bc1ca65c0cc02299be85c89616f8f901c89613f32f3fb35666ecc3fe0ffbc4845bbca08e8fec9d5242ed43c273ea219e5cca91347e8b550b0100a743a9136688f55589a7630a8a0650d26f538534f49bc6b737907caca7665e6794d64203eb5fb7a187bdf03737c84ead08d7d6aa6ceb8c2c1265ffc057d1079f2faa42f54ad6e5b046c686c4171a3e494d36ae1a6cb0dc3c5431d304d409d2bbaaab216bf8be3ee61a05163840f384434f88d684edc3592f7f5debb9a9225536adf5013eca2e80d7a7768573ebcb1574b8f8598e4c23d6c4547fc0fdcf7315866bd53e62558e355f2c7715dcf30a46f80518901304d8b96a9b701058bebdd22dca752f2f5ac8b0992500d3d11ef75c1ab092bb3cfa587ade453bf5989da1b435fdf2ea9e6d3822ab615056501a9253dc343c7a7e896b649dbd996821a11a8eaa17e8870893cdf2cff9c094933288ef011febc9f644e701e26d9d7b517b29c63c277c28cfd41cd763d1da2a8bff50488c5dd026c8e99f7bcc5f5fb7fe30502940efbbe9c1d52c140e6aa738cbf3b55a600390725663726f17e4c65dd719a05164adc970f195ba8dbd0d6489862e88c2c4e1a96650140abac56dadd21ba24b9f607347a76c19051ff7c085005d72933ec208abf261e161649ff5d51401c7d2efe0dd063676bb7d6137a5e8dc695d331de76ad07c7a62e8d5388e4558fbea1100a3eb1a5eb6fadcd58a98314bd8000367bb2b78da47aac93408cd19dcc0fa6527b997cbadb3985fa5ea8cb31e3bc06a56c7e9f19116613740098ff1d25d7422733bbd6fd52f293e66ddaf97ad13051f3bed2023108f3252b2592f0fafbe1e4942ac049e2cea55c56ab2abf05927064f019733008a18e7b81e4d18b0e7382cd960b5f1cee489498443f2a7b0d839f1a6db64c55e91b710eeeb53d1f1c3c774e0c2cc311d0063ebbf98ab6389d0e1ab8a61d35cd9c64c31607bcd157f0473459a6c97697fcd464cac314b0acfca6b6c9b5a6172841617f54ed7fc2e566d012a54a0a2090224ba53656f9163702cd1c761dd609c8bd8dd686b2eb868f0c41f24067a84aa8fe9008d166edeb4e6658f7fc4b28b20e0e1349d2b7ead6a93c2f52a5c2827d84de0d3e541adb53b7708f2af5782681324fda0d60ca4caa49b65299e6d711a2908a2b681df8f8058adf750c68c3057b3aa4a8a9432e7803291296a3f6eb2f9e3d53382716d536f189741528dd22a71150f23335f02a8efc35820a9348af4e4fa4d38755bdcfa19f999f93ab2c051fd396f69ec99872facbe723890d93c24111d6b6f92308ed41957846fb212d000d37a915d95572aabb0d126fd0346ed086d9c3b760f77e9e6862a09b2400820117db766acbf6d360f28c8696b96a931e61d1a03b1abfd84b2952d98b58c3485b30017c1f7d4070388d20f610248bacd3ebef1515d108a13f46f72eb3d9851c7adbc386bed6e41a549065d4af39244d37558f5e0dc6c3ec833fab0333686e375d73d55bd2edec8563eff3206f7822754fece97caebd6719880c7d828b8149edcd4155b9eb32b483b2023a72cb810d4a60fe55db89e54c412be136610b57dcb98742c7af4805d08b325335d763c527f62e46b14cf9163d12e1a1446c19cbca48ca61a14b5769fc6fd075f2a9633ca688412ec8a076c1c5d1d85a62c5f4df86f5eaf76077347e3179795fc1187b862f7e07fa3f95d41f25f9b4d8a40848aecfb8dd7b456343ac2e8f780ca9220a8878ffdbbef94332e1687f96e145002d897f7ff9fc924782df9c715c135931e0639f52ea75d659cbe8d35b753487652d4c9815a01a66d7c272e200885bd27f6708db168cd0b13caf9e52d048c069da62466461a37dc42e7bec6fa9636cf5a8a32b5fbc93650103adcb307d7b5434b6d05435ce5d6a1c87859c9b4b32905c9c5494d2e330b63a52d4be7e48c1f648309c171193066b5afac1875bdba7a9bd37c85f83850be4766d6944cff559b2c3b4ab0b05ef0030d5e9e2b6986b651ceab41ecf38d101393819621dd381b4b843d9da234283efb3f3d4a92db4b27516647a7a71aaacd9ab564fe3bfaa227cd1d6b4334d270ab1af2554d911bc4c4ef5f8946a03ef124e5fc3ec81b3c64cf348772cb46c42ee655d0fa23bb2b02d2989fdaeec1b7903bc445d05b3ba6f43066ea49037c788fa320357ce0416bb859590e5031730bc4b54bccfa2104d55adbfebe18d544a97c9da185da7c579e79f7a24855612a7e756f3713f73034bd6608de86233d1ff637d1f4eadd535d607a488679742d37d876b484590849719a6737dd4acb7e58ef47924b5a2635d14dc9cbd06fc6d7dca3ccee4973ff3efbec6d8ff4f2a2033a12a3686e11a58a1b6ba0ec01c3f4bfb8aa97544295174c519647ec004d758a4b1e1b6d0e65fc2af30f5fc4dd8fb4a0f3cfa2fbd8917c5086182913339b83943420c037aca3b3b79a49a17b75aef57c3404314b681fde84dbcacdc50512726913a0646d5aca4549f225af5787b5a717311391cfffaba3045163bbb3186176d067e9afcd855fce99ac795ce05f923c220b6d5962eddccaf39c0310400755498c491fa887f9cd1d041396a64aa6cbd0321491b2327888a484fa08b709788add55786ca3a6b5972e0fa943632c2bd26807ad5ac7be20f5d26cd2cd54d27c8f3c2f3dd99f249d4b203e0bc225b41e402370fc537f16d3dd99b0bb1407e6c4ff3dd8d696591f18aa06faf1b640955d4ad7e9ddcf9de0a5e7caf2672f756f531252e358e61bb858b2e3ae7be00d443cdec485a3baea5523350394d9678dbb13da01135823fd87d6d03d321314b6575caea435f48fd6e6acad735c4b7d90575b6373526449ab8f0d9ab550d2f1811b081973ff467ceda0c740481f7f1eda35276dc44b6ab12ead99eb535fd0af89775e6dbfbdb5b5e7e35de59b24a8888d4e69f8f7391e1fec0a1b25b7e6005c4deb793239c97b547b2be70dc447e2b46e3e96ffe4bedd916258112d4b1403e7f8df3f3ea243d94bb0eaf33d37b19009d824005cb36f9a70c4ecbfdb06397a3fbfac186634664129de37b4c38671af92320ffd42ec2cc67e7570899de4f5bdef86616b1ee0f0be2bc00b538bae7b315e4275680439c1ec13cfda113b7dd21b2fdd0501b3474fdf45c8c01ea404c7c989281ac997cfc0cb2cff3813abad16129046ac53d9a427c0aa7871cc09917dbcd684bbbc02c896da6f37d89d9a79337816019ffb90ce1dc6ad178ce688a714e023f9c1a2ac057cab53aeecba56fdf2569a9708b875f07e2045a671c9d6eea53c9fe48f68d213c79b197b8b062652cf1706e7626fe071e331a1c99418a5d78da487bfa4114e133adfcf8d6ce9c2bc1e9572cf678c2ab35ddd6c1e25ce6a207e9802633e0b65820c53d90e4fa62563f487b8758d24a7721c1984aca316e72d11dd5b9685ceed1d9cc8bc50805afc232d3ed4ccb2cd076cdb42332629d9ba1cba0255d8d854fcd090ef91233b6f5e59c97ab6019d4470aa4f646c6e17cb9d7a76e836d3934467cf8bf118171bcb75da8cbf88ffd74a662057fc092158bf282d10578eaeef2a54467d0fc2779554e8d57a1e425be62eb5a54c1806358e812acc21e927c3438f5bf29c0d508892307942b66b8ea410dac9a279092d48f685e7d52731eb684ab5c385cbb62a2421f00775f6978fed738433496729477575846f8640794b368aeea1c3e13ae52d88aec97d1fc7681388b01be54b665d17722e7cdec7cba4a8a75e54146b3a9a20ccef6eb2185ac672a74bc5c38021c390309158ac5dbb492eb61b5cb213c62be9d5d44be7432ea8bc7d8b66eed7a77f81cf4c94bb928996d9d7066474a245482dbdf741e2038eb6f607ef33a67543878bde2b300a73e6279be94454a443ba426643425058b86ce2e875120af1d67dc2cbeec9291245dcbfe64b8f70cf53cf69a9f1aa763f13f67a271a8979da0ce8de44d6f501d2276efd6101f0f12bb02696666168a5c7936b909fe7879852a73f4a1a804e145cd5e477ef61654eea984e47c5fe11ba4c58bde253003f1c295e1338cef14a824b962bebf5beeb8f7ff6ec49a6020a103a132985d8eb02bfa3da3e084bdab360ec4d1105a83bb48e419920ee431833170cbb7bc0a6aa1d4652e18656b61c99b2df2872c4ff542aa700e42b301f6d4e8b7bc2e925cff7863dd77b516722f351d700d07de0ed0ddca734f315c0d6f1f3628a758257290e53d4072b37cb280ffed1df3431c29190f1e6e3a00ce08af8151086fd23cd1b974e2b5a0f011565be579ad992b75e82668feb9ee5c6596079a52d51807cf0f75b4f0d0fcd02312db08afd540694b3a5405dc2dd982479b72769c51330c28b80665363870b7a3d7cf705f805a203955d0afb9cf17408c81e2d7a4110f6a5456a44df7d91d67e8f9f6366ee8f5f79cfe7c30df9ea63b86c542d983cb0f7de3df0ad3a15bff78ad581ee0df2b3c5c2146937bb75f13d3fea8fe5f941524b9e81e7feba12ed0d25a9561494adebe78c8582bf6ebb4770bb269a54e6904e09a9e9b6cd95751ebe023917ac0daedc8f049c269a990e77f8fbd4497a67b75a4b2fd31d2f4dfaee3210daa8cb39494eca9bf31e8496e45248504e82d14901cfc9e88c956bb8e1d3d0ccad3ff23f6b76b0cecea99f8fe0156a041cbc3209d3cc53b3deb6280af63e214a9ab8238c22f00ff52a4ca1e21f65163c857309327dafa416899c4068b1dceebb8312f01792af7cc3ba14ceb7452734d97e5e1ef0746a0ffe02a3ecf05b2091ae257353f3ee5020184c61f6234a6aa18e3a32b89f6937c42aa4223d19c8e8d59745cb20f69e35266606963f30ae04f258961b05804f299863760d119d1694188299514c833de4266b5041cc6ad5610564edd3bfe2c86846818c2c7338b88af0b7002144f192adb93ccf58811d91ffe97561b44515f656ffaa38a5eb92dbec184c6dcb61904f3590a5faead346c42143ccc5a36293d924826245de32b58034283b6d009cbe9cab6a07f3caacc67e0226dad048161e7d1b25e5e32509645aefd2e8bf22ef6c1339a55895ef6313f5f9828bee3de6097da40e53fdffe59faa233135ba13ab8c6206e029457d6421f0fbd91f0add3ebfb7876918f316640c1b28e6d24ae6a871e75be95eac148c2b63dd282fb00df2f4692cd4e1c8001f39fd3f78756ff63ac5a4f95584c11a75a3d486ae8ebfcc1ed3025201a0c9096a3c4068aa62fae22fe09e3536cb1ed60c315b94b4553dca78d6c9b82a36aa484b530161c95a745154f490632158e560db4a6b699b2f68feb27803af95c244781079f2f578399bf3c1d6196373f0363fbd46de3478032a3af32ae08b2cfea9240eafe42560ae72f0f34deb89fcd1f20dad3625cd1d054b0480bf927a7867264252d6c56be17ae7fd129dc027c17ac7b1a95cb8f3224e819e18ca3a403c65da5cf16b9c471e777107644ecb0b5c108eee955528508e9012ff7fffceb69ce6804de7e0db43ceb3b5ff2bbfad123f7459773ea0edcd9fd00c97faf5249715cce49e506bc903f7f6f0ae5e9a43d28806b9ec20dc33d2b513490929c6d52689848632884194b77f8177608520790351c518ce3e82d53518020837fbee19079c7c6d69865ec693aa36e2bde9d5f9d9202a3fae0141e994460f0fd9aec5309f1cdd60c72738cc5a3c10d0a82e34d50ab29b8e8d2b17e6abd48cea0cc25878a4d6fa98ea445cb2f4271e2ca1c5f5edc7e99b4bce47eef12f72da88e2ea32346a29e939e73e652dd0317f556a5bf40487b5af555032345891736d407bbeb19bd83f0a8b1337e574db4e212a7fa2a52d790d799f9bd1aede3be9fb4591efd9189962d8869abee36833ca45cb2efeff423ee2894b3a2bc74af7c1a79f7813c1a04a1a40907cf6e3af5a488959f48c476f9cdc3917036e65b0c56e9e47425306d99bc25590eb9ba45715b81168159d7eba12893309c3bf1f09902e000168bc6e1585122442260c17cb9da2f848889a5184e6f8b0aaef05416315c2ec52e7b31d9ddaae0be4cfebb4319795c9dab960f6389bd344c465b5eddb1c276622dfd1275d291660d09d5501f22d4b9612427f939b36be4a770faf7b64f7438baa2fd52ec1ff9e4f21bd2231351b5ba1851cc5d432bfd02b452c8a21f8f6026f098b545cc12a80d92b32cf8be7bfd8ef0274eefb20b61d19ed8f419add733b1f4c9d5725f39948d02079a89eb329e59e4b15b4d8f4d99ceea11bd795c2592cc8b471f2713348a593780dd54cb5af24770d7dafa720cb0c2fcec8e999e35e2bf1ebe5cab9aa38512e5735dd19b2a5ca759f753f8ce5c0888842e0a35ad00739d28a68a55e0161b63f8357bdcd35fdbdae4ad31679c0c06cacb943df863d106caeb816956d4e5b63cef80310a39d9f5e36002b984d37a273e6bbc4579265e9758e1e572895431db449399743115ad8863a42b3a7006df411be7d3876dd1af8d0c7fc5e6348e2e6ee7085589e75944b9204b973ae4dab753bfa8ca5c320a482514b51cfae2f6047cbd37e3e8230d1e96239223b6bf4e4baf0569be87675995a2354146bea0bda064dea9d38f6be4663ca05a050621d29706c3d8a1fbe8523149713596b7f2d97a0c57aef289ccabc46985b21fdab1836a9f1bdc8c7954d461b01d447b8b33f81f04d179912c3e03122edf06ec85e394bbfbe157c9285dc734895acc31d6e7cdbf486b4d4d1131f9c4774b42dd1dab62b3aa4a9d051872d9e67dda0ca4e0ace2c17c6e6b5b1c30e7699c7db377798f5ce1958378c390ae40038e2fefab040b275d99c0fd86115cd892190940cb2f994e7de83ce1579cc0a6eb064fbb7ae6d737153b4f90bee4109c1b0db699f8e9fb98854bfa679f237325c1815a0932aa3c7d8413e61083e3e4c9af3657b6c0c6aa6d25fa71d058eb4b331ea691f99b2a0adddb8dd32be78a5975ebf7b38e782a9f909a959e0b1089c850d8e19c6ac3f8f906248a35d739441b627e00b77ef06648cd51167c4e8e56f8afcff4d24bfa15d83e07264538429ab3400c4e436d97e6af46254b993a849a81999ab493ffe9206b4419655a767fc27f28b83e1360bc6c4147dbfcea91c018a4a940cbc862f708f6a919484c354882f3982b705d9110c7d343e13d24e5b062eabecd9f32445f5cedac10dceda9b0853db768ea8d1023f0014477aa2f4449f50aa2aa2dca4d6d75ef4efe42866fc9fa59300cfc7a9f96e4a520c9fcb7bf8bafc8d4b4438452e5a4a9a61c242cc567b8dc93a588abf128c8f360a29a70060b8094653a5795f7bece81ffd734bef959c1a60c6c93dc45574e633e66a376102c07eedca3264c242911892c0fdc036f9e0de4373f73cc684ebdd260c8ece7ba345ae929abec8d9cc978a90cfc546ffeaf148073f34d2f4508cf043ee435cc2d85471745578712dc3809a82f9a4250b1a2b4d3afc659292b0c5cfba440bbae196c706e3e26c18d59f1e268fc1df684f6b87ab84df582b1213f567dd9bb62dd6a3e9453ab089aded4b28f6b2c7595d58cd39b2b2db233ab3dc999f241ec4c2516f824419278d2978f23f1e0f1b574369f60758064e5b4b614e81ce7fb255859032252573e57f167014481084f9ba2870a01b6eb9202e936d5a9d9c2ae228fb4c4f79c46382e0c04eae5707002152d4685258f7ab380704ad7f6d43a97d37f545760702d0722d49c2ad86b060e6f50dc85802af55040adbf00e0923d153f0a6f5856f96d7dc793a53917cda655f97b7c07dfa1d41a34e49bb3aa94645a925c32ceca155d34fa247492e1d8382da5f543fcc53e0db6d134d0d62984ec211558adad5d15c0d0ed283379d550b79af01ecb112e0274045ac6dad7065a823eef1bb698a66b20f4aacd6e73a1db1edf9f47a8356b9cfa515da713afaf0d885c94f2af58a6c83ae053a0687b33b9da5cc7ae36440558de37bb673fd1a75119fe6f7d4aeab120f68bf8bd0eb782cfeb7a261b0c89658f5f9dbff8d768dd54d9d0656a15d34aa81c2ab82ce238fd95e4e84071be2f52788bce1105efc173a0771ca09db06ad49b56a77572c36660540996d7c6375b4b7a393d4753d6c8fb5ed8a2081e592ffbe0124154083e0aed6c8ec539ba58b02dc7b1f9b040ff347cf6f33329a7bbfac57e8ad4e6af6432ad4650adfc7bec2b92b5be36e24c7a7aace86c7ad7ec7d0136a268abd77e0b2199a9f58c25143197997233ee7b58ce9e7a884a02a0018028f432d02fe15ecf9a47ad14226553e68502f2db740311220da3e8037deec1631762bd134dd12eebcea1fd5d46abe9f747f372929d451238d52b33d59e4e710ab0bb6bfd0774e397bdb0022c4e953a28dd5cdb8c6162ef60f8b870d4b26f4566ff525bd415f063fd1a1b029a31eda4a54a2591e93f323afa69d72e16c3f0a177d1b467525d5552bce9a3a19f862268e17ee0bfc168eb154d04fc812230403fb3cbe26a64008f3a93d106c850c20ed9b8e944c90d54d84a72fde05bc11963a15029761648345f9803573fdaa80569b1ce68cf47fb2bff097b73a7961bc3214c9912ac25de22f1b80a32f331b4577761a1ea8d5a97d630ddd04c7366013e57d4d4395bdafde5eb742aac41e14615dbf6980cc56ea4ee9aae85cabb15023d079f24b59b7dd3a6ee1b61336953084434a4bcb2463c2d9abdb37e8b572feb5a942d94887433cc34b5e33cf033afa9220eeee02bbc5493ac76c50bad11931555c7e920ec44cab5474d7b91d1a856f96086aa59d4b752812ca9c833a96f0dad5135278a69277c6f888411924eabb2c793d21919c876681751cab62551fc2c26b32624c96587d21bef5f5e80a31a4f430278db1f8e9cbd15b8fb4eca6cbf1c2d490941ad1df8ab0b9633b0f6f814e142b564f687bcffd160b5cb8296516b19dc2cb142ab4e5325761875393d25400ab0c5b63a6ef9ed08a419489a2cb85d4c624533740fbb97a894eafde041b5910d83951ad7faa6d3e32ce81a3090ba672582c96a29356367fc846ac9383c6212f2222ad531452a6affcbecd00ab27da0e7f9da805bd58f72906077532af91dd5a2ec05c4144e9b9ce701bb60db4d843ab21180c00aafe435d382d8a8b79a491249124aa82398e19b5ead5e281c9883034bbeba49cc34419b4622dc92ceb5fed1a73930442f354b90eb95a72a364eaccfca1043fafe78d8a0fdc99bce70d400cc9a0463ab4e2e5316a76a775fe8477722b4e90c42c9a5cdd4cfead60b2031545c3917d27a2ed4a5355eedb19cfacf954d62a4b547b7b13b79a457309acd466c0e72822b32a528257f98834a26b77f0df62ff344c038f8d791360f5e6e1d4cd8b9541edbc3244c033c782781443e6747903a4cbc3b77ecf7b0201954a5603ec3d523bc0943ec42eb8e06554281a168b1c5528b3e36e7dc407a89d3d30c6b6611fab666fd349760a276497ba71d39d74813f2db515377cc3447c22066aa88c621b779b450e1b3d2a13b4f6f7dfda68afda5847487c7e29ad2626db082ff9574102d3ab51255be0981affeb70be4ffa0afe85db000d412755e87d73cebf127b88cf992c38fa9b68feeb22e2c7df1b41b3cb3c2ce59184a862aefde29f2075aaead3eade67bfcc524f081d62a3e50a10b4151d79567755a152aa8ad34afdbdbdbd0b28ef14ef7cdea90dcf1c5ed0398bae949f676b1800f9b79e7579487eed65d378eb59cb4556e3542162abbae98c161a70aa3de01b42b96907c0017960f09983c404a8c9c5826b1505c272b8e65a90c17a09502e34fdb825bf1c42a43899b021db86277c01c0e51973e4f05bd802074b84760f567db32b18721aa32ef681bb7f18d034dacf4d8bb044f140a8dbe150032e7fd6c2491d85291f25224e73ab6b4c9b2ea4a301bccbf3fcde2108b3b8aabc3644d3c3dd54350cca5488f80444385f9f6121f409042b78477a6a3863cb311dd65ec4e8b8ad15519f87af1eb41888eb2a518bd1f188e0f761b08bc8ceb3aade24ca267f5a84bd6174f20b26fd3cf105ec15f0ece8454dec2e3a41188ac07b8acfa38be777d9acfde6f31a4858e77244db4dc7331b6a403cb5ca29a14d0ad1ee1eb3716642a1731d34b5f59c54339b85d08f351240e84af7f634d3262110fc4859588ae84981b48c85dd26654502dbdc0422f6fce8933acf147865f26f7dff07f1aad262fb0be682ebbbfa189936aa00978c69a06e4e1499742b5524c15a4fa036b86570660f9749f15c4abc22850a484fa2727576235a71f334a2fe1a71f3b5e32407db5c4b3af97e984ec62850d820ec33f0929abc28f1e114f5ea17656b17ffa8803dcd410abbe565be1abc99ad00dff6ec74abc39b26a2a84703e56a3ba0e692b17d4158c39d5ea749ccf22aa159faeb91cdb2419f976f363127079bcdcf4053b1f01ff736cf3dcd4c3f41fdd566c518b979be01c90612480003371405d0e8e591fe99ea398a4a6f80f0c5207730c3262258d264af8c9f63e28bfd079d3ab97ac42b80a6a50a064b00343392f27276b6d5ddd5373d06578152a7b72cb17cd5c1712fb4b32ab123c6411b114ecc35673909298e89b27e90d2c7581d1816cbb89373d00d2677377f63594451176968ae7b039540504ac3136cb05c428cfe39bdb829530deff9d952b2acc4ca23c0434c7f2da44c0f61ecdd5f4bd38b812d6b4bc6350ab159f0a1d490deabd2b3aadaf5032bffe3959dd73ed88f646846c14063b295ba488c29300a4c1fe000e0859f1d5312ccbf1c003909f2b917724851c640328a50c33db01b6cdc9ab0927fdf0e0795423f440c5b9b46d1b3d214fb4ad835375f30937188523f96a47faa05f16ab2d26a1ff1de0a94a0dbe21ad738e1846bef4dda9ac18a2deee50ae073f6af5ec09b754247d2d3a8f1d89df3cd2692b10a1e6c5f99b766cebf4ac9d4611bec822e26aa5740a64edbc08139a277d2c9d569ffaa20ed0bc36bcd454b2933b9523e3a602ca756a0c40b630370cd28863dbd9e36eeea92658d63541295174c366273f0cc9a76727708984942d022477af36eb9f6cf6bacdc2dd346276b60f113744efc49adc7f677fd6fa81a621d0661411b39f9359688e691e80f233e41782bb28f4fa03f18d5897763b171928a8ca08136810e3fb67564ac051e4bb8434a64da306206806a7a9a4dfa9aa96c440e29288c082be7a306cd842ea626d05279f957886e99f178a8b17e91280f3a235d3d9409a40251b9502d9cc9d4b783c30f51c1a2826932a7f033ad5e0abe083a9dfc341f045eb910b3f76df4c3c83e333ab63110d2a47f40aae104d55f2878381fa6ebc6bc8abb9cad6ac1ece5bf56074bf4295c29987d4650e55747bebe77eb630265d9253f314799a1f1f4b3197e6d2e795ab5022bff6290a14737175d27e74054f7b5e47d11ce3276fdcb9b0868393d5e1bd920ca1e01eda0ef438660ecdf4141cc324af4a7adfb0aa9f653abe6f0d7989573b712c8485257ff14688732913fe9a7f7ecc8f3d549b5d46afc9b7a64c134871143e10850551903b7de20a3bcb9df87ad89824f8effb0849e8d042a3942c1e7e5dc744e7277ee5a65986ce9ec2dec57eace139f94499af4cc903f600224b9242baa118ecdb7fdb7dad470bcf23cf889e398e73704de6ed777e757e960f389f9489e75d53a467fe4531db7a69355c8ded32ed959a9da395f50be2de267af25ad9ec22e58925298fa43a2b4459b77ca331438e28fb1269ec23cbcc50737466a16ad38baea16881b09f071fbd63af63c2483e00d757542c5fcf8f685d05556d278dbc0183d438707dd86e5c041caae9e23d52ef54b006f555fa2a2f95409b9b159462c861ce565ea581ee2777a1b228ca9120920934f7b143e4832df44dc55efe8e492141e9a199635af9619210ecad7409d903e969fcec923b190e9675e41b6b458d5bec11c29a7568a573b978cca8011a8185e8a8ae7e4661840a94ab7bc7ef20d445a46e24b70502c0dc420df1863008cc70bc1dde0325e2bf88a0fec867939868dbe219e5ee05f959de93682d9837cc0ad50d8e64d4436c2f04f4d6152a48e47c9b9c15caad8aa5b090e262859cead0564f3593c720bc96849674bed4bd752da30ffb2a570ff36b8ea366e29f4eb22ffb286dd9f502345f96ea69b749c834623d22f8519c11e5bff28b48dc28d7681c5ae5fce940a2f94c5374b1348e1c412cf320e837fd1b99093f95109b7df9c4f90bb3c4535ab2d6aa8d1df547f9fa6abacef7c6a57e59e29421b638492af1a6e3631364be7fb49f372cb09cbdddadd5a0f734c1e75ef7298356849eb8c977c4e33e3f74585647159cd384407ac299765cc4fa19877dd9ea139cdf79be8736973ab12848b72d607d67202941cb4a9a745badfcc8f73a6c5f02ca00969d274aaef4eb453a0e587d6f41c4a3451474af24daddd2cb268b9349696d69f2dd8cd3b233358204204463a47097dbf14214715ae74a1d09625c250e1c43b7f09c853af2e426104393205f8a47958694ceab911c86133b28051b76b7069ae543cac90c27ee63a59eb7f5a295f4c4a37f977132d30b66648de14625984235fbf50407c3bd301757883c5ecfadfb981196cefd8e73cdc440d847642cb14e09a0bd22802ff3de0cfea7af33acb685f1d0778eb2fb19582a380989bc398e74bfc63e5ba789941a48b04f4c28e9541b5439db5026de007c7d1956ec87a21ad5ddefe26d362334145ce1bf726aa1528ecfe6b8f32d07fa258e9bb42f756a875a4fe975ea9be6b50f9d1dc7f60032dc532a4303bddaf6779080078f391c9ebab35f5f8305784c6bdfad870a401e7092303836caa09dc5e55b30985ab0291be1c89e50dd6ce887313dd8eda9f0e64cc8b8c23e4edae8d146c09297a94b6fdf2f2196608e76441a541973553f22d9e3b3d137c0d3e51e68fce381db8640406ea5d07ae0b5b368aa7d4625aa965995e489c4a3c61fff5bb7fb4ae01ec52866360174151cbf8827542a9b6ec7323074fd4967bcb6c88177bc575238ac02efde974aa08256f952dae9549d081f406343a") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_128f_test.go b/ref/params/tests/vector_sphincs_shake_128f_test.go new file mode 100644 index 0000000..661e921 --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_128f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_128f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("f7e10113f28967f7003648b67563f890f2f5d2e51f597e6c2ce9262c706fe8b0482bbaf369dbede7dc8793939a5399c4aa596f8addf664f2eb8d5acd556d8511") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("482bbaf369dbede7dc8793939a5399c4aa596f8addf664f2eb8d5acd556d8511") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("16fd8ef0ee9d4caa190eef7b8b2d9d0207295cdc363e7bd35f2bcb56d8c38cef768bd4fd428fd10de7c5588cd0dae26a6b86d8699c30aeabccf7fbc07193be65ce098c960851dc1dfea34fd6897cf0bf44077eeafbe6cc1ada734a387d40196acf510f592d74d340ce7053ea563dfa71f2dc14ab371690a9b02e47cc3c6838ead26fd1f573ad66df43e354e947d3788e130ef3a1179783bd92f0790f41cd476397e402eaf15bfb6712fc20c7a81489425355eafc6d4556b4e1dc5f21c7d7636620987c6a7c8cdd448bf6ccce560b75cc0681d053bc5a040a00c0941da34eee1930584f79717156f98f0a63b4ab8316ea6965a0f5d848acef0eaf882917c9b4bcc957ce6605843e8cabc8623bfd21ad760418ffc32c169324f55f7d2f9d097fb73d0a81a68f26ea573a8b48be3f9f71b934a63fe09864848254d5d8c26c041e39a241fb22607a56a1f5e38b1467c316e4aeff8f8412216aa1851440f69c31acc62a7812465e7863e3c206fd1b35a01072c028e6da4c5f171ad0d1615d43a92d50003f0cbb3ed4d6b1fe41ccdb3020aa99bf6ae72e517cbc1c742be9cfe0e78cd48899362e8f58060b4e1ebe1253624f37360b06142aaf757f020ba61625d0de868ce157525f2a0f65dd9781f06d2d0ee453bb8ae04fa72dd5cd653731b76f20e223fbd63b34129263154243334234c0d6997462876cc92023efcf7f9ea00ac103f62fe7d322df01d330beb512891cbdd71bc1a368ec552df50c378204c8a943590e5e682ede4462eb05eb38a085a0a7a3b2e310d3fab5e24f6a525192f9b258ff7088f919468bbf7f53ee88eeb54532429775b96e79520bb1e2d0eea1715d4626c28a6727f9264544c7988c802177a6fe7a00dd34d90e832e1b5d4af5d057e766ecf9ef2a30255bac16a15e6ad4074a74736fb7cb445d22228b0cf3a0f8d509df2dcc94c3642091c07193b6150ad89a4601087a085b55e8b5cc011bd9447e3043c4239da2be4e39875806a2414a09438fac56a0dcc1527b8fe1c19780d3d70c7f5acf3f509059a8b1e3305c7d1e4bd6fe2353f33c370144e3ddba12990d47cfc32ede993f32be5e469b65be172aafa16283e46076c264a0424eb08f69eeddba90e0569c964b140a3d3138dca9b854a2ad153d15ece7c769c5ae56786b19a9f419490253872cac660c786b7185319707ce0e16b9330be883878e5b79f7278bb07478ef39f7770bdbc82f8d1a7adff5308ab206e08d53e17bc96b053db2674918a5e8bcf53aa35419a8139721c6c6dbd2254fa10631dcdd79e68232f12a8b9daee695e979e3f1e2ee6f7815bce81ca116575bacf43277326583d0c43b7ccd1290debab378bbcdabd22c12f666b4d893de63da265024f71ec829279596a743398c72a38b338e33d8313c7c9c23937ccc582d35dbb336d0bc3f42581f18671e4323d489b4cb460fdf92c5f56b5451497bc65dca2a355f51de7e90a101ea95788e12fea365f9f8367a6f59ee502bc64b4fcf956672d9bcb80ae86db5a78e4a345a9432d538b611ba7f4b2eb8c4b5d85357287ec9f7487a80223a18a34de77a149af8083c415c2ae935f0e20edec707445051178fdd6b02de2e7a92dfb9653fbff2cabd775102588b7f02e76d0bdecfef9b4f1e86e6bdd88b925c62a9fae8c90c44c4bfeca8373282c24426041d0e3b399c84283954470a4083f0c9718f57ec7598abb1ccdbb3639dcb29d60ea2da01a05455e1e10f76fa7a194cb2fe35e20853aaafd531bc1dbf450a7da512d12f8d428490c4fc02acf4502f82f6ba4ab33b76d05510fbb865a76fe352ca9dd6824a2d4f96eeb2b81ac1318850504adab3c1fa70013cee2de9beb77b763c66358a654d1a684fa9420e4726d7e7701386a8ac34fe41d026e9f144d7ad720caac213149e6918d0cf955a1a506220f2e213eb220fecbc78a22c8a7d79dd9bd00d7773d20d89309ab740b3379f2c9c95d5794d837aeb542d57a1f9d5530f088c8cd6b179d98338b5e41ad50c05b42997196e800f5ef1353b80fba1ccf007926ef7a2b9b077a77f18433c2ef522675b5adac2fe109df31132440ad6f76eacdb213246ff63a11a002e8180aa1a2f02f2e92065453c0d2a1d2252371ea27c3c1d12569ce87bbc2086e5470b67c8d1fb7d4ec9bb3ff0706bbba9acc9758e0fb8dbcfb34a401bc3b80a3afdd0a8239c6afc6130d4d496281a76258c814b362916c784696708c33735562c1b62a5f205a4bb390077e9c477826be79eb819f57b97934132650ae95d8dbcce3a090bff63173c859123697411315d51cccab6a095b73b44fc3e7d9f0b72777233efae23c2fbcd9c0725a7f717f30656672a8ac6a3ae498501effd609e0dd54895f9bafc206977806848169cd9f9fab9c270244b4a0a0d07629af7d16b3d756845017d59d5c280d3d0b5d9b8d6e8a82d28d612b3cfd74e8f4cf30314268317f2af98331e1f43195e57e5243e8cc15bf601b9cce65ff3f199f017b5e92c109aff0f92ceffc84b16aa25c4e9e774c6970e19aaad69b8745cc47a5f39722d23cbbfba9923e34424aab3adfdd1690c35b1cdf31a7d9578e24d3d78c2c6a01929310e7a1490a3bb02fda5f0a0e26c26d7bcf22f45585631ed9a413837dcf07b18f012f77049332ed0a79f2a453451c4cbe5e63004a1e5f5396231c11b45fe5a26ff6e8485d09f6dc2dc3f1f9942600edaf7118a05f5d7c94cbd2e7aaa69ce309096d1aa69e42c99cca8a8994f0440ec9131dc1281419510988f152546ff965a9868dc1e4aa3d0a62b920bad3f23a9a2e7353ee2492dd7231b4194cf97d160421a955543a7440f22b1191d990ee297c4e11dd5a60ab87451451123ced192650e9257eafa89e75bec8f931f3dfd4077d0a0fcdf665855f6cfc7470625611128ed01946020f9db23d240da324f5a293784c8738ff76802183d1e00752f7cbd97389a23fe500d7e2b999d46c6163334a07bc33fd23d43b053841a43a04b8b8292b7d590fd9689e400e8ac9c48b010ff27af9653a894b52eec169a37733845564076e867f5bd7164e3e927ca187de8531558cb0782426ca2fb1db4ad02a6f6a1f44cb122951cd52e16de4775bae822fb784d90cfdd50e07bfa364b28dc54c723d16dce215f333c902ac891ba4c136386819d67255bc2bbff65a1f3c26e09c232a2cce84edcfa6a18bb61d424c7273759ba78d0fb0c13f862afd69106308c675711add4f3e8da8682c8f08262458243cb5ef7341ec1953523d6c1ab277e27378430005af3a915fbd4ac8534d942879d3a9606f7328a4be788f3ed8ddfabb7f2f37e33a98300b446f8fbeee8a78b04cfc72c59ffc9b8fc5a7a651fa643f48ebc1f3cfb2e455befcbeee0c857c91592248d983fe3ff0cef00a042166ad78916aa40ca106a8ae7ef2cb10b9e3bdab5791c5c452546ce3e7a0f306a51ef275bb5321d261739aadbebf0a2f45baa193cb51b98995d6f16f23e5501676da3a9378a1fe65d3ebbb996517c101ff5c04bf57478245b1f0333ebead3a371e06ecab50b32389f90163c10e121a990d50690037e3b1c3e2c41fdfd92cdc1a0a602e9737eccd63d3c89ebe9339892f9350bc037b62a9915e81ddbf696fb9fa46263e3972388d9be6a1b9134ecb8c3cd828f0a0f2100e31e83f27dbd3449bdded6f2dd2d8977d8ee6437e4f6bb1db1828e96eec845acc4907c40374ee467df90e055c1ee8de969daf66a3e90da3e27f9ccb2032e1cd823e2d4ac1dc144c54b3b125605ccd622433042db7998d95460805e0eabe8ec71a6e02162b443dca0fd794cfa20ab5033dbcbf5004d851f8ab2949dcc1d448138e43fc1cac2b19f86b4c8ec14a67907f608dfd8ee75b647a70041f0527f79e3e46c15aa5abeac2880a71ddcbd6bb396a02ad097c878f77f8a9ab121b28cac3e1249b2302b47924fa23d97bf5fce1cb32a0f8da94ec7d1a17ded8ef6a5c0a52672ca2b41992a5e0867369f3fc22037abe52207844610f8960bc52a769157551ba54396f5d892c4d557cea3cffee7b8f276b027b9b1a71b6ee69c84242119af933a34e13a65cdb518b2d716a649cc49d01bd8d1b0cc273a7a3018074377d38e7748af75f5becad593e2db944afcbeb048a57d2751604387561a74a36f8f96a331a5d1b34cf7c3074f064f746e1c6dfb82293aa97184a6aca7816da345f020da755edda370b652aba58a2d288f22806a6b32a0084f8aacb04942dc7b92694e71f09f1b61fbc2ce12a582f0d20a9d46e6a3b6c282523f2517e26b9a201fc8d6d7d659371ff9a430ab1ee6dd53d27eb2f0ef923daa36133beecb04a2767f819a5628ed6799351b705eb8329a0847e21e6a8bc7407a732b8365d99f7f1422613bc7cf26fb8419572d57e10ca5c785b5a48b901074d6d028e5264e0ccb4374edc6ca312d122de92ca7aebd9999483e2c407d6eaca24b8c4f17831b6bcb6138b1a5e5f6dbb62329862d5b31663214656ec8001883328f45639f66c66da189d7b33fdd67783bfa77ca2e54cebe6eb541dcbabc02623019a46f2f1bf45eb1d1dbc1770f2cea4c62b33ee7cd08dbf6245f7446573f80ce3f31072f851ad3a8198a6974d38b78af0536aad666b9fcaf3726074b4e8e19ac43a2cf07013b8397c0623d1f08b8ac519f259eac1dbaa497ce76c51549c41f6c29702b2e4f0ece227662ffb79f58e032b9ba9f77aae68f0381a759eb8c3330e49b7ba85fc451dc99cafd4dc810f7dd5d353f2e6eef5fc8e594ae4e9d52dea07135fd0f3cc2f8b32fd9b529c0a308193c3d67783104200057549c2abe2366e4dbc4d7413e3ed3dc38dc81b15a1823091074bbc19e3983467196800f9002a6751798b3af494fa35cba8e57c96a19a9f276492676c7e226af4e2f0493d81235d6951aa862d52a7c6222594be52aa22ffabfcf7e65bed7b137dde343c6686889162de51053da976228b88f29c2dc22c60e86f5e588d5eaec918446275bd3de06ee6051a25ada4e91a18f37ce0965089ac810d080f4b8e755af5f0a8d8a1a3dc919d5167033252d0facad5d0e8fd1875f8b6f97892b4b4b3cc9925ca006000e69f1cb974cd85e19ea6f2c4bfed59e3c091e11a1576ec579bd80a5ecd4ed92f799f1c1f8091183d40018bcf12a37efe0bea6fd518025a3777030a3a3b3568525299720350bb72ea2d63b946faa8d10780fe65250053797c443d9fa4996621e1391d393fe79c930d48a622b1eff88bd48b7bf136f38e788b58e9661f244a2351064014ce74b3a94a4cba004d3046136eee363de55c78b92a332f73d09417f4f6591aa8b87242f2d40c79f97c8ed8360e939b71ee6b353d6950da9aaf0fddc64801613033cd00a0f9f04205f043d5f306275b63e3244225510ddbb6cad8f6ffc65d18882c5b2d91723ba45ba03a8ac0215821d190c4ad8ddb09cfe426a6632c5632aaa82536f0cb2ac2c130ac5586a7ea93e5a3daf862b99522cb71d325dbcb0e721bc57024b4728c5f56c3e496ba9f66e9ea6eb6f3a9ca440620f05960297c7815d9cb0b7d347a0a096fa1efcb877fd7759e0dd1057e74d5b1ecaf443d3a9191d68fa385788e46039441a5f9978b7467f02366b9106a98f10365d8d475df30f61330a591217a1c6c2ad6f95c7978a7402daf2a985032d7b5c05eb4c15f8287325374beb08098cc312975df1a20fd89e4abe352f7c7116d2192ebea19349ab02cf6496bc323e2f7019407963235d7ddcb29299848137b5be2ffddae213b91fb2f3cd9b0b0074229a73f63185522755b35df670d841f86f468b59629d1ec01ecd1d81c37442826e93626d1a93c3562e7fb1ab04595094dc5ad246441c720bf391cd241b924eea82642b20608a3199e59e20e56cc09687a107d777bd3a91afcae06f240e9b978d6f3831d29f194ec3854b0407add431184f60f4dd9df7507c8bfeef767b459eb07b98a9689e61dd1847f690f3cb1718c0051bf8d194762836b89fbcac823600ce33ccea50d8b2c3afed9828a6506df9fe77b25f7fef93168c333853cd48aa04be9246bf471f75e785344f290bab40b782797f3f94a064ed2dd7b675a01be1000b5aa86f8cc7e7b7b1b0d786ade94679edd43f93ec044ddbcea5216db923780345967d84752f592c36de604efc01f5dc7b9515980b53bd40ba1c6b7c2757b87dbe66cbaeb733eb2966a9113bf8ca19fb1c4cfcc546e2378ec7293f6fbb521762ef377ec60162af1c316b2faf862936f692b0f440c77c31b7ab60bef20f3e3d6b8369655388c1a7b44563e2e06042bf1320fd792bbff71c273a8fb1537e11034ac2177e447cf7ce53bc6eb32dcc17d3e0d88e698ab3f12db19e3d1cba51cb2c4ff8e151f4e4fadd8de831cd8716b8f9d63d5e6c0e11c894981751a9e3a06d06f7db1ed7c81385b581b9ee77a7a7143179ae8187115ea65cca9bd90f6ae4aea6288c4eff5104620a7574e13853d6eb6d70347c8868fd2afb0ea8203d502d55c6c7af0852711ec03e072c506fe30dbfe85d143fde30385fde6b453215d4ffddf5f5937a9a46dc1e49c2f66851f73e733179a460ec09564192a04b440d64e6898aeace1816c3cf8b84dd23c6558ef0a4eea6566b170a814a1535a6070950d1b46d997f803cce1f858962319c6439871b58a42a9f95c9c443e60d4d10c29c0b33a54101fc57545d590ef289e44a4e49206f06403a564a7a7c1f0bc767c22d54fb4f917f40d4fd8ac309258c65ab76979ea101c84a07aef7612c7bc0b68cdf62f28d5028ecd2dd77fd494d52ff8519b0dd1fa3beb99c90d933d8811aff06a23ebac7e1406bea8e6422e57bcd9f90c6d54815f17c3a4f4a29274ead4ef19b7500699875b829a25e55f47b7b98cbd919599f9a760fdcf47120964dd32606b7f1c4b8722c41b9b7be58ae3b1969126c30d26c1e42cb9cf78c6592a6a5f1c865f05286107aaa13d23317375d98556b150c22bd414924d284eb863de77d30f4f08b5e33253cd5cf08591acb75baca3df6aed513a8018ffdcdcf7c6e21be4080c6de0d5638165e89e4fd9fa5e9e3acb5ef306496b537f07adc0e9b6e2e8dd0bb7e1b0544b6c0a55bb018f91fd60a15a5ee8729fc3c3ebf6a923a37bb2d11a1f2f684e8ad3ea5e09c5a45c3264e16aa286d83a631ed733a83f766671e4b4f0909979e9680afae6c5f499aa2b72658843fb591181425b8e6448234bba8b4c72094bb13c11d64ffcc7aa02a429a2a8769df5648e7b25ab28031efc7909679aaf419862332c858e693044952e7e0af63f16e0f6ad8f97408de21ae20c306a8354bff968a36cf7d5c50ef5fc2630d51328858350bf0da6888d30a93daad8c8ebd426fbcf98925f42187b18fc86245e4129c73458ee96440366378afb3beb5c0bf42f91c84a4e77c150816f8b905f239a14f60257cecf912c3a9f155cd6f5e7a16e87c064c97e4ff9ff1952697c974e2aa902bd6edf67a52f67e74a412bec9200704118a6220b172b76d900d228c1c7c4244aa1b8b89cad7371ede326fd59776889df63997895990a6ad686aba6f0cd886338b4debc7d89dabf473c2d426ac70f0819d356ce2c8cd9a96dd248ac17fe964fa8a8977dd9ee70b74e3e47adbf7dca132284bdf74ed60ade0d5a8525a1c1bfe86f61df912edf72d6d51c7486355ae7b911e1e90ea7607c8caae4b4afd79d3d0767ab5554d2e80b860c93af065dd84634ecc767f94ada124c5244cd843a3d596efbeb7ad09050865157125a68e6fdd4f833917bb70cdce867c952669c40b5b54f4cd55cbbab8d6c143596184472c3f8b9b0e0941672b15b46e9819c7f78cc904bd4832cdd399ca7805f8d969a2eb4e88fb970613042ae60a6a3cd5a32bf1add1cf02fb0ac6faf5678067479d6331958cff73a853bfc559221a5d6eca1961624d87234aa8e460f213873a8e3bc608138c7e246c4fa7c534df7ee97fa5d7a65169d9d3e36d3f318c0797b54524397931a84e318267b948e993c1eab392ae4d8647526c346f771140ac0b942afdd9c71b590e4ae2d3621a609d90aa18891669b030184934b7d936800555c1dd9e1b0a6f772a0b8a07e9ecdcb56137422c524f19dda49ccfe5fed4691d26faf8ffe4b189db299519ad7ef7fb4539c348c142c95f1a7b9426248e4596385a9adfa3dec12e992f470d908e6689a4231fce34347372e0eca5f37acd248636dd84f62cc647acd3714b47bd1d2312d12c61387beb6d05d4e0b1917a9ed0f096172072384c63d15e785ef535d9bb6d1ce9dd439e86043e126a042e55f0e2fa9f4dd4d1ad7e21f0ccc4d8d2a4713e3f8826c0240329316de5598f20a5d677a9be0d5ac72c105fbc8b163496f4caf5d6621254715072abd1f0721c107b50c6d9773cf48df938f9fa1d766b85c1c89db624ad94af8d87fc5f8cdfddf3d63f1100dda9908c236bdd2a272d11d9ac01f8d6e52107a5f04584bdb4b99596a1ebc10c508afb5d2e836a002c91a8fe2412b921ede78c94d37c81c7d847f44c7ef2ccdd80185c1f135ba3b658c66cb11661720cc7be980d6b8b42e8c0d80fb7d1f54eb48e6216188a6322914c3faa7a2c3b57e56510e5867852bee760784669a3b673c8615469d94fd02328f6d852e17256d200c7646adce4593b6aa9b4827064baa8b95f3fbf7dec1c6f55ee8bba0957c23581603e124895189e233095cc79e521e53cfaf1496a878ce1b24bf6a5c29b55a8bbdb97a99a71d87f4a2d00b7805a28305ee22517e4b5e7d456ce06da402daa37c3c0b56a4afda463876fa5a0472b1df06f5901707a618d61622a74494d2795ea3c511ced57dfd90d829807d83b4fc43a68db91442dca264af8d7cdf76d0062906e61d4fa318ba9d73e5d00d922832794c36a9bd869067316a3bb3d77d9a582479ad88721241338d6c52256749b94e913ddbcdfedc16c08ac0d5b74338dafe161724d3534d22460a746e9be9978cbd4753231a3864cc3635e9ecbd4c7d2c5a9ec29a67576916a69915a7d86d39d263f8e5d8d7511f86c99ef49e123ecd254e60aed831e297552324fd596cc9a8d35d10045c09ac3a95ca8100342ef23af9a0dda7c07ce3cb51658c7ddd16f69cbdfb52b16114f00704258cd0f42d88900d9e419577647a9024f51b38e2a7449958e1a552fd11c3c00874167792eded75633a44c07c95b7f5c9fc539b6aec56d14512136d2d8286dc3f9eba2b9c438ac0efda5d0198ae5d4e7fbfe0cf2830a5fa10ab89703926f4d3c2e9fe1bc4dedaacced76bae7ab70d05604e6f86f65f0c893435962d2caf134d14146e610090eb4c6987c40ee49457b38f0609f01b758b69a015b54acf00f8b5be2bc487671a7c0b2a90dd14649a86cf0b769087361b4ffdd913bd08f0de8efa7d7c23827f45d93e9672042ccbdf208441004c08a3edce368852bcc8f1a967abc028611f29faab48f220efa54c8c1ca7f7e6b3ace781c38f2da8e6c2589627075b61bbf638249e8e2ea9c22e6bde45ed985726e203e2ee3fa88505f677d187671e54fe3bdf649a1ff832e1efbd6c69d7ebbed949b667ec346051513c434cedf69b97e9c93c49a9e0c50bd24ac28f88e12feef566970cc43d8cd1afc0e081b054f115bd98bfe53a44a56082d26ec06ad89efcaa78f02a676d23d5c483b1f662c36b882cb54ca4be4b2e1abb584e46d36b1e767d5ced23aef78aff6ffed74512d32f2c9f43830b7d55c5a4d30566868e3b9968b7da4f68fe55a25450b8e89044fb4ba73dfae0e486058fef30398f99b9185385e0ef6df00fd93a81ee3dcb1f5574d39733aeb5c32675a8c84babed8c749fa1eff7386d2f7ca5a42aa2054552cb4be17ff422beecb91f455b071b96283649b3106b8eee1608112afbf43ef51014080db2fe17e313d2b25649b0652dc4721835c382a23d6dd216f958f76ca18a22db572f990594a34a851ecfc12a7d3af6a485b67fb6abab91741c147124ea6065fc60f6410e398eacdcf071744cd6775665604a68d3638926fbd3f0ea1e33867e5d859d031e7a325fd1c3f024e29c856871a554626d3d7187e7ca4bef9d90df872ec0272f07b9ca20f5165c00220c55a1de345ae3179335a21aa667a9991ae304a7ef2265d85376b2399816d0253e88c48b4184f2bb61e0c116e08c129f70e4b31822d47f2cf98d6d2dfb321fc0cb2fb49078eca203c83205b5948a961605a109b6b42f02df6bd4405a9f701886290e472afbd25de9d527847315f6f28251c99c8937588d978aa9c70ae7a52552a3b033cf3637f32cae6629f6f63f443d26a7411c3c35b1f528a5ed56db4ecb298fe00e8b6b4a407a34eb6ce59a4674e9056ab13e639a8961a42ad1f40a782b48ef19ba3af8b0e9cdd62237bc601227d6db4c40c11838082f49eb6189073e9aa72ccd5870abb88f61c16bdebe2a6650055d9e4249d5ccdc983ceaa8b3adebe36d9d632cd557bc15f702871aae6ebb966212581ef449395db60519d77bc4b6a52f9da6afa392eece2730fe3fb72eebc17b9648c0c0bd6212aca003ec7f832360cd8804e0ccd5d72ec695eb5043206576ae43e441e3f775cac8f7aaecf4298d8f9519eb7a059d426f1ce477d1633f03debc5629a6c9816eb19bea206feff11b0532ff859bb6b80e689b08ff33a56e0cf9cedb840faa3c1aa17179a5a4d9f57ec8a89335839ab7033eca4c3503c346e24874f7a667801ee756b79bb72b43cb479381bf87573b23e8f221c86a23f1924361e664d7716c7d9ade989fddae90b23bac41f28305745e17fe134d3e5aae7836f3f3340de457e9eb4543a96397145be66e772f6cfe363e7f246ffc0011b2d095fef429e4b2d8e0fcb94a1db47eec30742fa4c0dbd9bf57163372183a45c12439c440ce3ac204078943f7ffee6816a4b98ab8943bb44d6a03cedd76e0f48de1d8f97746e1de9523ba880a1e1aaf3b096a8dcbd19872c2cd2d38a44ccb2969eeb2e7a9e0488761aca576440d78016dc0c6ada1a1ad3b42716468267274addb84287c11c5f19b07d72ab26c864c590d567e1c38f3a5092b940cd1f80f5e533ea8f129e8d18639ae71dfd91b6be9dd66fe4d0b4299c1c22db4d12910e40e75908f63d89d88938d14d9b6bebba06dcad7f097e68eb5031313fdfdd1656fda661e429a7b0870fd521d76b3a74049f5dfeede3412b700aac3d3ba21a0cbdfb30c98895053f21695b413ae151c2f28989cbf53a682022bf8af0f5864490186b7f65d235b64ee4cd392b2c0a2f0f4fd2a510eb350d8d74c2cb1bf0b72d3fe33bbe3624408ed19a6bb8b144d1cbefd734c0837e0d222449cedef9671ee85e72c967d99bbeb2ad1653742e7a109d056340835010a31bbf2d0cf13b4d5b011483d6ee873217f30c6efc03c9332044636ca9a31302c5ca2e34d4416fd7755c2084b4a7c0029b37ab48d5f801949ffa61f6f1bce3917a8650eee017343d49f3674efcb7a80c4a054edc324b0f9b9e0b27c730d96f462c0309c4c9373eafbbd11dfccc044c02c5d5fb1fdf3790a58dadce59b90e9d2d5263e149febf696581364f28c08e1d8f84f3a425c3abda15c7d24942e420fc198b7446292c397db66d1ff1cb6c2aea19aacb227eb891ea8ef141d0727582bef2cf1bd6173a59bc6baaf37387bc83687440caf83c03d567d560f1a3678ab320d3bdbdd87f7171f1685f37b198c0afd906032915335fea934cc07bd1e11c7759e79751613ae42b5ea64a01442de2ef8d8394ab231c2ee1d3c29f6b5c7e89f02385f23823fee305c58539172509a35d929512a399a34b9cadc47f22bacb57ece02d9daa25e504995cce65630b89c013ac75411906b638ed480bc31f337a16ecc4b0d384029941b3a0d4453f91a677a33eaa88f5ecfc9d2157eb34c8c7abbc61eca905af72fa0ee40878c9c4dcde39b942310c7df2c57f05be60816aceab35a61fcbe0c5cbbb1934d218590af67031258d10b4737871584bc7dd199f52c1ec7c054b1a9acc8c53030eb696190db5a125dd8f1948444f0a2affb67d09b49964ce25d7ab7ffcd4fc141a1832a274187936eed58931e2918e5335961d2c1ac51d1305e12427c99e5dd6e1b78fc930aefbc2a4590ad01ad4a1b52e1e56a73e5485689faf781b68909b7cb53dc8914f4e397510bb123fb8eadcff2cb22250aca7159864c9480bdfa9dcc9c60523d4131845b158bd5faee69e22e51cc3b53f7f3c55f28aa79c317a9f2a3b8b4f685ba4b004131e4a37d6a3f9b4ed75138b46f36697045a538b90b28f288936dd10c4827b248458212dd2758157205a81527c704203ae6281d9b1c37a613d3d5fdebcf9ef41118975a8ddf868fc6225acbba35365c45d967c73abe461f2b7bf56439ea097fce1282b81d14e2817d9620de5dce7d609069c1068cdc46036056ad96e48ebbc149258d0d362a6ca2c16aabb39807b42dfb7769576b59961de9ef680767dfa29af111ca37033989372be6d558483dd0abfc92f6b9c91d452f7d51b3512a92c88c366a19c8e824ccb1084489c1d036f796de838809073bb8636a4b3ba32184923dc30ba1eb691cd12f202018aa80caed26d5909c85b2e9f89ee21ef9aa0775c04491ef700ec13e495062bcb2a491e98aaf341cb70ad69246e84571acb55625487809a0864791db9180b6762c0cfbbd7b59e8bb7830e4129c5a0c6a66b0b175d2cb201f3011df4fd1f2307c7a4975c546e00ed237d93c6f3a404d1de7fe94517e60c8b49ff73f1216ddb0d2dbc52e7069b1034da91ac4faabfb72a051d19379c088b9e6d78f88ae9925e0e761ffe2dfc8d34fc5712c1038435028d810131a492c8ee9943a18496855364e8c6a43d6375cf2206e69b14c99638944b26f81a76730df973244ee0a8f8ff9a816bd4199922e0bc0eac4cb75d0d7a2623e78e80092816660d7550d91050a859bf380b044c0329781d142f73418cd2f38f128bd1c22664b30b0e1651fc61fae852ea45177c382d0c233487c8e76cf1c97ff725b36d5c3ebaf31cdaf129f338dc612e4d45428949ccd69f4de336bc8a30c57a2ab7a27b59b2c5eacb05b7a82af725f10be4ea0db1363639af1de068987039677bd8f7daff99ef9b63ed93e4ef20ff7fc7de2b686f6351602b2a7b9f040122caf033b3b3e5882bfe6b2c0256e473ee7612afd8ca95b564a9a3139b3d4475686d77159b6caf8595bd02a7ed13de2602fb9a16f822c271d0ca368325b42a3849822ec1ba7242d7920b90d9780d4216b5ca21813381249ef7766e4dba0c7682311e79a3f1fa158bc925558d189cc927d4a2fe2f3b80aafa6a3a77e231dc884dafcbcf51768e0808eb27941fd8b8ec7b12a198f250d811b81dc13dd13a3a167b0fb3e567500f88e16349cde99ace92edac6dc771f98627e73456b8a8444d7279527e80cad7f42980bedf873f901f78208c6bb66a865e3ff693fc51d006e81162b2291b389cd6d8df43d8833aaf6102808bd110dae9dfc707004a670e1a663dfa38219c1b7a38da87195716073c4eacac896d41718ce6c22d0f5b1b77ed7a375a44378784ce764e5771a2ca3fbb1dc6d77d68a6df6050c7e827bdd1637f461d688ab6482a76f948b783912e53145ff0031532b96e6e40c71d717e2a99cef1f830c7cc347dd087c6f3c1e9b565bb1e23d379aec3d61f66e7d82bbc8d5d118213a100848570fdc9352f1d1304a60ef8a96f1118b12447ea596ac8d2679ae4193dc114f03b0e37b8dd42c271f8e5ae54a5a15228e7d47e1782362cab3cad4fa02948cfa6f58d9073342b70c054654b558b28761acfdbf6c50e2f41a925b867cef733c8d4b5c946749e5cad3215d7abe7eba4a1f453b60620159ca0f5f379171ad3ea87fbd248b9d02a043be932831ac25db0a8128bfe685ba5b3ce2bdc952f0d6352259a0c4ee54840ae506891bf26ae6ff339da290c17f122db587967067eb347b653e9a2bbd5631655960a20affbfcbe4f490bc66c73550f95f190bf6b63374ab531b07dc03cd7fd60fa6fbc8f6a84ff5732413957c23d24092be582f55baef9e0cd246a63abdf71c3d1372b566399330ec135f7a4adc2252a95e7f1dfc18e32532c998029e0098513b9c43169bf520d13554510c1a6d659c9f9032b702e6b318636f513a8f5fc3b6734b3a0b771e9792b17cce0e339c096b4283b972f50c5d898ed7c3f2e3c05a243f4c881c424cd453bc58238064f114619b5bcd10be8dbd975b11c823a2b48503aec5469d1b2b2edd40cd1c4b8fc33fad9a667352e37056bf43cdb029bde7f8a85a373d2f77a1c7ee9d70426689ced99e4516b4abd122314a3aa9482cbcae1032340f3b2a9780ceeb4e556c0665832648e6f829e13032377cd73fa2c22889a3e1fe5052ebd4d1cc618be4aa9ac88387e29a7a41068c7767ffc3e2e3a845f66e413c8955c4a7c486418719231f91aa5b4ac7e9545317fe0b26c6db747fafc2611680ed14157dcc0cc1e3de42628143cccff800d94861d6fbb483ae1af8a5ab3a9f0eb35f155af7fcc2246034044389b38edf78a2e678f63be91c2890e5f00d9689d8dfacc160c82565961e0037b2d657a6e3a8ed50f6c0132151f7e8257b61b245e274afa50fd9fbd1a81de8cdbbb95ebb4445fc8778eed6515ce89bb1b2ef82b67f94e1aff614beed7ba757e5c6e2125ae49cb91fed5969d3a0ec87fe516c094f4317f2c1604c345c26120d6ff5182c812babfb2be7afc329b9c85f9286a84823f6e7d3e008ed0b45e3118ffbd8627915f8e605dfc650c18c43fe90b93607ed71fcece0e2c9fd53074ee0cbcb1794a42190bfafbb649f4c7751f6460c70381e1cc9ca21ba685097cd2a8f23359803f44f3840aa1e894c6dc7711dac2c953a76c05571a90d8ecd7f0a77d3070a89ed86ed74c7edf9c051d3f8c120ab3552a70ac41591e1e20a3ba199252c231b0773c8a005e1103d0aaefb0e50bc4348a55d7cd722f14d2bfb5bb1631eaaaedd6f0a5bf96e4f28b8126b322cd95b5cd9fdd711f5eec78574219b1fb4ecbda690a3f2d345320f92a980e6c2bbbbb1ebf38567513f7f43fb893fe42f9d2ce91fac03fa2fb50c2dd1047018273941c58d61fad07ab6cb5e1d0747df6e1b81fafe62adff737c61d859c1e6c1947116638572bdb4b4bf112b436d319a4379808b226ad6982ae3877e9049816ae545a07be77b2ae88316cc0bc171fb4aaa9e111697075a63e484753c950194d3fb9131e76da40df46b7b82d6d3fdd5bb4357b20f2b3bac5a2546f3c713ee7a67af839b6e070a0b6303d4f44a2eb5437e844bb7d38d14cbd2d5ddf01a8b83463a8792707669fa81cead18b4c6deb5b38763e7a3400c6e6b3d493f5ce9261cfa668631786d94a7c04ed6d028513d0c9a1c6822eceda34df45a5a83e25f495a4dd2bccff1c4ef34d7034a4c8686ef72c21b9bf39268186c61454cbcf6ac6976cbbfd3d1ee2fabc10a968f8a69ba5f30ac41a9eb23619e701205cc67699c14303bcfd4322b4627b62c05926300fb4622d59c1e2188b8760c334f057c999cb71f53398d6dc9d354ea231f80a22846e03085ef47d34f3d2bec9be43a556b7b6778b98625b4937ac97779c96cb88677ab3ee422b47efbae975936542fac6c22546b45f8cc01dd5e309f92d17581169d5db0ee0caeddfe1c4433a8b3b35b80c12cc8095880af79ea83d43f786442f29b0267ca8e6de1ea2e0e31f4f9402d2197d95e6722d3cb547c310e98ba3cc4f6205c8e0504d95f24531707b9a4dd4d443701d487e95dbaba1d92070f5ee4a5b4b58a7ba0c0d90a390f3f228c6ed42d6ecdeb0bd5a867622100e8b8e412edb88e00b900f1ab170cdf825af60ea0a390da45aefb89fcd125e79126805d4c20e58abdfcf2e00b518d7986476372bfc57599f686101975fdc8166ed83fca8fef2f72cd727ec3703650d25191584bb6de3230bd2fbced2424cbdf1121f59d33647381340eeb2f5e0371941bea8967164ba46412d1a8e4a930395fda94a9246744857c28dfa668fdeb3d67dc77fbbe4376263746b8369c4323e1f269a4431bae16ced7659bc26943c9b032a5c63ecb80d310cf735972f3d1412a7eab4d5f0df62334c518d68a1d17f90d72da21a39202548f3738fed17b7c59b031e9cc0aa053111fd1f762d9cb6e3deec039166c2fb8becdc569d47995ec5df2198e2d30dd0c5dcee38f908cf7ed2b14e742769c6338e6684b4cb778404f4d83b9908a2655a5c0f2cc445b20e11fa779b5030d59b3c6787e168a55a1e3ce4630b8328a4a4fcf3de294ad822b2d251228d2a6510b6f60ae374c9f3d2c53bfcf9d1efbc901441a05966172050471feaa3c5c94a88f4a406b40def9830fdc48adabb9d4fb4956c14afed6f3cfc689a230e89919370f5197892c33fcd5f5531e101c8560bee415f706531106ceff1ad20aceb78edbde72eca9e32514618480d0b6786fd2eb7de16784960962becfcb4b6c4318a052a1b42b0598fd6e759f4c2d33892a5589330b4679aa19af59b4009037aeee7a8a2cd75d6f289a47956a02634ef6d71cce214d659d479ff85597923e13f4021eb135ac53ec4d3209305cc96def0d0616cf79c45905522c993bb6a7c359dadc2cfc0b8c0dc146119c63f83659651b9140c7bb519780678d548b2f2fa59e8e35fd8eb37b5592695c03aa7aaa52c8e9f73e994f4d22fe6e7ef57d60dad7d7f4cb221cad161daef38708ac177b9501daec0de760e900e0e026ef8a393be3c2c35e651364c3f5cec5e4bdae10cccd701b974ab140cc8e3b815771eda94bea9508d526167dd7f48ac8afe7ead5cc1a1eebe62a45d59ff69f8859eadfa69a9d237f97dc9e59d0f01836a57cc93c60292e4b68ca02bb49dcff5e296bf7ccf22ee35460443a93b2d6cda35b9c90ded009a6f74a87a1b704a391dfd9c554c7caf80900ca912a6fb9029a3334b48ab90d180453a055eb7415f621979ffda60bab9bd2d46a95c0b4f1f2ae68212dbec41207ef8b9a7e15f3df01f99cbf7d5bb22961f2ff2143d395e5ab3b35eed1aa2bd4b272b9b337e1b8a799fa33f8f3869c302fdfe2f7bd7a3e42ee77aa51bc4ef9132f16c86d8aafa255d3ad3b35a307852266c2d5e130549b6a320a1883989a848ae642a1829bcc06b525979fa80e20c5f9d98b0310f8e0ba20a34cd86ebbd327f3fd1867d2aabd35ef69006d628e6720c2c59b45d86084e15d33be2118832440af4d60b562a9feb8884dc4f5d9663c612c7741cae4baa02e9fb63b7127d2f12b4fb3f64b7f20db123883710eb613c5264665a7347d55e1c7e314a65747e07d305ecf46639845904a75a6409eeadca1891853c684cdb9c1ca5e8ace6c54391444e1a1dcf8dd1fd8e8307af16f2cbcbd98746691ec9ce9bf9f6b97c7c8a733d2800c8059cf227e84b1ebb2832c52c96c88d639c75b10b318fed7b5450c515e07799ad805ab52b5356fb5221d2e3bc293b36ffb7fd403147788092bff259cd8c78b8ba1332277edec801351bb8933e2c5af10766bf29ffdd4400d31bee8e779b84a5e9a72c7c0e3b5f8e1a9bda655321b5f145529608c0f8b2e90bb27fa45f3163f506f1a7a2080d3390985c9428d728f357a810f7e70158598a7b02dfad61200cebc8abd44afa32bb3ae7b7d2c1022d9cd371460c04e958719382751f175b8c581d7a319415e0706322e4d3b96ec056456e3cfdfb1dd93a40217c4d45b2e0c0cb3f230c776f8d5b159261a4ac55ffbe569e7d3e5f0469ce82cf70591c14810674a4b3570a2f0516d0d462aa791e22d97202ccc7184af92da230ddbf5d86572cf26ed031a7979c5b9e06ad01fca082fc3930a3676ab3ae7d80a2e163cf92176a1dfe51281e51e065a5a5c18fffeaa467e7ab4e85298da08d0ecaabeb12399574ea77dc37cc3c08eb8f6ad6ef24c364110f7298db9b6e27876a7b4a690d4a1671edf7e7a7525f9def4785e245ce644c1e746a56b6184590b33a4f2af7b78bd659154211d39c826e6f765132e427301015d083c0f83a08dcc704a30a50e1a754356cd29c90baf8c2698cb22d0d384babf9b1dcbfce887ca800ef942124f2d8bf493be2205fbde2864018c90008cf2c69f53a4f11de2627052693e9bb5d31a9bdfa5ef5a44d994c099dc55a4e9dc373fd2a78a523c536440cbba3b6e4133995570afed4eb8974ae065786cacb496b744d69c4e4a2d1c6363882892ca2fc082a4d21b1cdfad60bbf6fc05d5e9e5260b143ff3b32c16c4cfaeccbe11e722713fe6ff418c4fc6918e7632a76b734ca4152952ef40c9f1a4d3631aa8be9d6e258ea9213e5cf51461383fe1dceaa118ef38040b944c6396e329635fc21298d71410f21d2a5b6b8630e14454f0788642ec69833ef6ac75922c851799fdfe560a180f484677c601b3a6d29983de613bc15fbbb7dcbeece68542ff2efc4d9c69e5001660bc8a1b8c9b76f48349331355696efdd1307a862cb326033b8bbd64ba33e4babe1f1bc52b5fd77dd9d76e22f85ca5ad299f4f93bc76c46640b3168a7b47843c884a53a41deeb7ab99060c8063e09b6243e1fcee311ce8225a61e702e3280128a6ce5500dd59abacfe0e7a8b5415c92852058a645170472203cfd5d9bbe9f0762abe8f4a4bcc0ffe4e2b751a89bcfbc237ec474233de6fbc2e2da0d574c2bac270c472172acda309becd418314ea52dd33e990db01a6345c05f2e00da334c24870b9a25dd3a182570906b3bcdc99cfa39c299af4b3c3e8b8aca6383e84abfa9e0ec1e48e5f30c8b1e7710d87564431337e770fc0ef4d15f952806652d17ca5c059326950036deea4e7e33e8d40218759faf6722e9d37e9b77667af56e3b717cd08e6501dc82b47ef6706fb1f030159494096055970608766fdcce3de317c5d8363eadf1b0952b0160bd4182d4a44daa7f5d1a4003a0b97b78c95ca8b35731aadc7bacdf2ef1865f2cf0eec7bd7fdcbc88325196a34c387cc467de41db7200bafec396257a2dfc7909acfe7a1d795b46e262efe0f01c34b51ca98543fd7b9ca31369238876c4a234afcb1c034b08919f6f09766b4855ade70d1676de64e11a82f4e72d56b6ce0b04e7cf6b1050a789796d3a41cb35b9172e1026258557dec4a7fc9864fd5076c94d6acb7aec8ff3ea887f404d661826459fd85147f99325690883c0061a7fe7f4021cb1fad53f7e68927401bdebbf2817c67e4137b10d1d1ed8ddf22ea752f06d67ecfc7d4ca2eef1673d35df7c3f5e5839de52bf708ad7f4e717524f4a686d2255e0ba91ead1e28e64b59b76e1b2abe1dd291bcdc053b41e4c3d9c2c3b2f9bc3dac54bccf6d875e339115d4086290202f7452739accc7e424d2d652a1373d7fa8505bfaf92316dbbeee03831b21dac6e8eaea145da922bc4412b5d0b0c4c5429d9324af65e7ced6c52b33404217c1cb69528101d14b47b846229620a81b1e442fa497c27afc019ff4b1686b6fa91fba2839bbc1c86d8ab70a81303776d88e983c4c98799f27b97e7dc285f16e577d5fcaff757e225019f9e012e14f7175589a1492aed23d2e88353503fb3ff50d3267c70432efec6ebed752dbe6a131312c27bf16565a708bfc58b12e2bae02eb063bfc0b5e884c827516b8aef9c4150622b3d684a7393f0926a1c4bea329730e9754656fc792ee5101e036304942acba52112187697a93f2323fa44e4c1d2fc10ede7f9b53295899788c03ab97a49ef0ec9f924abd3915f52aa75a755c9a965ab92efdbb2f6a155997e4da8be8269561f3895e0896491b854d33f865d92bd19ed901f17f627db697fe4481f1d44eac5d3db2678ed3d77595bb0febb94eb142571e1ab629bd0bed07702fc3e2fb6f6f7a6abc5375aa6c5034a98c25f86050339559057865231343e1c9ee24ec51909d949a2cabbced9ab27f44be90b4b3edd6b1e099eaf6a85bd166d97223726c7803fdc80da968f3f2c262c2082374c49ea0e497be63a356e1ba303b90c3a1a728cbf5a726edefca2f60f8d316e59deba3d938c7f3ab9672a6c2caf65ae36611a574b1a0500e61898bb2269b2db210b42735dd4bffb45a58c059cff80f46671a0cd48427f3c0f9147efb86376738f0b97856141550b8a41beecb082ef6845d6d0a20aa3ab7fe73faa3ce8dbb2363f51a04cda83096d88075c4bb639a395ed2f266115693e07941387b3a4d41c357bbf1198e64b6faec0d6400e7323b16cd5108ed1dee35413796652bc660cea57ef05abc0402ab63fae2ce883237029726abe572264a9f208845fa8a982d1d2bf6c651a3196719c5b92f76df98f98a472f59393cdb2c212f0083324d602d91f0fb8bf12f07e2eb2804c8cc5ccad72bb7d50565f9f1c387b2ab68699c0ec3bb577252f35036c599d3235b204d96e2d7e647d6de9a7509ced904f8dc5a659fa1a0446c7b7dcd68f6eeb695bda15a7989c6e473b46c67eb2b112bf0cfdf683678a9a2945c38adbe2713a84696b41ab0c17b7a8a46bd947239b90b8bb602af6ac858c2ead74f2852b7690fc40d148602455d4579d062cf681193cb5b7aa16ea8e9ac462be435d4dcee9239b7b930dbfd66074033ebca601f25f3dbee4bcbf22be46385629623fd87b75729ae9fe96ab1ca3162e720e00bbaa1f65d8519ba935dd57766b50156e2c4179a297b6fdbe56cfd258a49b4fe9f322980b96751250d5bb0414f29698e6b7f799a43aa22184d0a7d6398d69989f31ffb930327bf0e83560c825b5eac4e79f222bd4ce7f28dda95388060deb1c73539025b7a54c7b27cbfe412dc8e3a43647309242467919d8b86ef65f40db0bfb4d4e1ae1d172a237039f16bbd025189d5cd86a8ef5afba49cfb34b04ee6beb628f4d21f8eb874f9627427953ff44ef9b97c59539c885c442c760562f83b60632834721b934c3fa1d81eb011c63c3ecf4b9d176e585edd5668d95249a8d11f5c6b6fc428a2b147f7d274fbfa9e5573dc1b87b35f8dd7f1ba0d5d96848c46446a9fd63026755a67616b1a5893fc6e4741348ff9a436585d0dab5fcb4d2257b22e76053b2ca76b56f468905065c17db425d21564979a292eb9959fa38f0b09e74fdd7a15f1bcc2766f1e612b0fe2132fc32483437b4fb24ed1620e84e6a5f4585a2bcd538dcaa1fdc5fbf3ccd02287db46693e9e9b688275d3b815948e797cb4d2f21ca60b3707c4bead67fdf4516c662e10412c4f6c7c393be87cedb8d0e185110b679db065e66dca3b3a805f4f13ef37eea48000c4e83faadf66ddc8801b783e986f5c8e424c136a6049a85a12b3d1c440fa5d14940985f83c30d90b4a0cc6d0f40ead314c04f4f3e739f2d6d32d9c35ef8ef6e854bb9341537ff67ef54b3c9353f47f12909debce9c39ec485cd9e874eca3b79dce20ea0a20392bb0cc315bbbe7ac7d1b9aba815895cf69bbf043c904d3602e64f15872a379a0065f89f321be8257ab8d6c692fbe2a1297f46dc6d113fddb94f96d0a3873ea5bd092bc90ec97bdc37dd04ae3c34a01b3a49af57fb0d7124dfe20ebfc4b8cb5ca47bdb8fa006b429217e3d522adf28b78973ee199e2cdf4c4ec9e27159cff61c66ce076cf71603c16050b65536c2089e2ac3ffab4160fa523a245fe4b5a00ecf2c6e3e701784ba4acd76fbeb16548d8fe3b2d15a9cddf2fb01fa3d22a9f77377ac093afa6c1cfd80cd11112ea8eb4a4a6160929923bacb712ef95f65cf668b67bd19d77ff0f2f3e0bb474d85c6e5c152eb1e71752ff93fb018ebe389ab6ca90e8ac678d554771774cf0f853c06bffa7bf9d0839e755522f725f2a47eb2940af5a2af2edf8dc838cb679a38c55ca2d9a7b65192c7a5779ea4b5cb0c1236996007de62c393a2d68ee6016836f2a4506147b750b9c0628b7e199985b82d182aa83d1acf1fde87f3711ee124d624fdbf33d6180ec0a5b7a06505d988efbee24853f378331024de74cab0d923642f569e00267fbe42375052388773504ca29fe79c5e9d38d2f436027922c5e30f2d04832e400beb4d99b1e18c2ddf8b53e85c19bede25d1b87cd6b2fb78f968e8a651b5b47e259c70b9c8ada0305a8ba0043e7dbcb017cb5f0abec725f431e70cf0ff035de8b91b25828be0c384272acf7a102b422836e5965c4d9dd9a2f3e446227b0d9a8d13cf973ef0e3c6d8dfc1ae7dc3ac30125f49b73994578f4e26eb030427db103238e944230b382b9106587b3932d1c64565f0dd262f104ea9aa95af80d3200dfaa8ce2483d78753ae11a8cd9c5af3290e0011056cacffd73c6f390e78afefda819ad8344db89a137b31122cc94f85b70c9c3e884aac7acedc6c4e80cdc45be2a81d6a588ec6267c64be9fef64809217f1fcd926c01f0deff16672095e3bd897afefc42f38d2c450756be7414474bac5c4641aa87a9b27446a1f5046ef1896767148e753ef4bba5c1597c2b7e7577ba2c76c9d8eedb5c4fcc40100491dffb202d3196191d1b623a1788e938ae6d263645db4e7dc11c7c324ca0ec42bbc0943f8d5f55ba4cb340f498f438eb914be8c428fd75b83c131f06ac7684907ee8d357df11f39d5096a7b00287258006b26ac855f3defffa5bc89b771866f71d2ebbd12646e1474655d90e7157f519517f023e9a5ac606fa0c66f2d2399e91370744c3d251814a1b883899f7b569c2b58700af0fb764e06e45ea2584fa3e4a6f9b3438648febdb0e136a7ab250f3072c1ddfd1f3a1d0d6f3b540f473300d2f92828588272527cddf7757691d4493ad3129e628ac93fedd46319992a561b3697198c278512b7738fa125d3cf08bcbffe3988b5471523aa176ee1b31d47945753449d80f7b4efb41f05d048cb126967020e9b9d26f5ad2e49b155c0a06f30813de2394f21f9171106acc77f4be81ea42212a1e1c4896b02cfd1a0a28d8ec752416a2d232610f57b42be434b7033fc1e7dbfeb472d0316e21e36386d4ad9c812596f2161da5cd00bbd488fa43b85b29dbf905c0b17b0fde4fdba5833c8a871be8f989981b330f4c6034407a79bae1d99c6e6334632abc0445dad9ec22a2e508d471fdfc3834d753fb3090a5c305651be54c8818174409810fa7791d94fb5daf02705845f83f59c9023d2213f2d279c7b2309731e5dd30c8fc3a12a578a3738f5ca8c74263889610938d52dfe388765abc6302e34f3f65c951a5d43b77ab2286f5b416f3bcfe5a55cdf051f5aa08a287bc8d763beb57d7acf9ef0994bf017658e48eeb3168adf7d2f0b64f79571881aa9950301b2235dccb51c5bf9ad9c4298d743dfde33891fd3b42c0a281f7254271fac17b9039a13a055ad2bd426a02fb5f5f8cccd5be0d3a442a5968049ac844d88207cff7bf38e141767c48987e32daf6b2fff557589e9cc43f1140611c0c32a21b51751650dc618963d7456c59ae9f8225fee94b6e2171d45305227aef1da4db28b9a2a8c21caac8f281044d28a49dc5779d61f790c160aa80193c0cd4b10e9c0bb5bfb450f34071739db56a6c619dcec044375d92996cf91464c0527d3a558033186b57732ceef9ed603421029091ba3d2962999f34805728fec6e94480a8877ab4dbe6e59bccb8ee19f488a5edc0fade6c6a44b742d9c6ee7c0069d9d05ca46b6d1773a42c3af128a3cf93c4a564fdb8c646d064a5396f69d7d867836af35f235028080e30b4b08a0c9a81d6b85e9a2e3f0b4b1b3341a57f37a861e73f20b426ee7f57beed0cd7d9e7cbf0896ba2ebc330ab95e21f5df896210847d298f324ad91b8c537b68957e44172669b98701d25b98f4b16d673331dbf123652177d8745133e983f7c715c170096d564a9f061c83db1d10c754ce96a71551cbe9d60b9bc722ffd4ed4bf989d171cc46e430a4ae70d3ba375cb5b70edcc80ac73a1207f7d0629439266ce08908f5271dbb08304d9f171cba01e02b0b068d2f48fcd0847f035dbd4af0e731f9b60e481b2d4b0821ebbeacf9ba82c459797fb3a576f957f7c5a3342f1a212f51066fddba022f82cf46d6acccef9670e4603021b5d2008c19cd860200c12a1db4f1725f6261f2c1a56587b90645e2648ce1027866dff9aa91ab1e976789cbac013efb3b9b045763791588865ed94c72365c04d34a0fd465e78b9f45445b40097299a3d9e5f8bd01afc48538db0e59e3e377bed77bc8b0cd10bdedb63639231b3fc6971ba87584f2223387cf1e0497fc546e0daf274d887e1a6ab6786343b38a1d65522053175ff24977b87c25ab2c53a196808a3b353b3f0b57c217f8a62e9e") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_128s_test.go b/ref/params/tests/vector_sphincs_shake_128s_test.go new file mode 100644 index 0000000..431f78a --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_128s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_128s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("d341483e54c6f82a4a354e0bc7c597976ace0dac30a2cef205195f38445e27d9c9935630e07961ad296bba49f4e5958e701aae8990a6041becff41008c2f2bbb") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("c9935630e07961ad296bba49f4e5958e701aae8990a6041becff41008c2f2bbb") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("a5bd97a90ac28421d66426a393ba774a8311b403abc85c12619d714242eaed99eacca42c31f03308fbca1dd92fa945e26501041e2c484f81a32a97dbe9e722147857c2b856172dcbaa4f7a8b460eebaa3a78f321789b88216ac7516d50c5b533c23af6ce0e7bc6c49ab9b5770d57488290528bfcb22db4b39e8f323f6f9028e696103b8565197943813c752627b41fe33bea90c433fe2a5c67a144c02c683b8c5427580b52aa6e4eca5d28a743f3dc204cf307a7c66749a6974ac727153b225e66fb9fc58b40b25a24047d98f018e4ac92725fed016f66051641af13e0010c001e5dfe7b18514ec92f14313d4cacd103b1ea138c1fb21574f7a0b6c1e2835ab25a5543395c261e1f9174c5a5edc73584159877327f40ec15b1de2ba166030e81c7b8600bfe4a9835955259149f0059f43fb07defc8b84a8fbfc866e5ddbc532d4fbdf796182a86ee330e9eabecfcb5e6e9d1b2b44f2fd8b7ec402f69ded7e34d50d4d18d9cc5b90849fea51b56ab442b2cb2a6766f4e247459027ff1f31750bb839bd1c8d97920a20ae103acf82b387be96a1314b87aa6b2b660631dff9cab3104e79b70d699b4711367e3c06d9dc13e5b283ead6a9c64b1599d0ccac73a3557bdc73e5b1208b5a656285e31f2fb4afe1f074d2acdf379ebb23ad3e665c0c48122299c5fa474b3288b903815428cf6d627abafcf70e8a0fabe747939c139eda5323bd01e3f31439e9977e1eab4d09faf784b16cade394647468881286ae200c1fbf935f79336b4b6d4c2c0c35483082c05fa87a6c9a7f1f7c617507c26fa2fc2e71ab65f08da6bd2b8418d3a1464f2141327a306097c2f297ec3c24827121de1435f2af19bf2ff78e51f98a2f8981c9b41d7c2824c9405d1acd1e891bacb7e6f2594496da70ed8a4355202fa9faa6201ea27e3fe1545860340e483b1303df1cc3fdfe6c36804cd4957b68058f7f9621005b559f5609ff71d0b85fae278a25eac0cef96dbfe36113257c7c02966d3206b485d2f405699bf4cb8589845d112692cb543f3b3238ba7380803ad739f0bc0464ba01337c9e005b48165fe24b06bcd57f821cbdc21850403ac48920757e315150600c0c5c06fc7b3f1e16549e843131362833b6a58a5cbf0f6cbb63e3fde48496ce118ac2d7930b885c5ec2bddc06d1d17f322e76ed96b2706b348af2fa7b1554141dacdcf776b22a4c7e6149e4fce191c0d37e2161c1601b6a103c454318c0c73d94f551578a23cc86fe23218b5d7df160da126d060a89b0271000a978dd87c2bd0b8d0e6bbebe819e4eb7d2628099e9ec1653447bfec5474a1776551005f050b30c0f11e578d9d2c60947ac7a8414b825f0a9dbbcc3eb384db98b3ad2e0708151b820b2d1a213541f21df0afb7a7def55b3a14868d04cfd2b542b9c872581ab8c8312082a55958e8bd1628b919372b7a76fc6b9641fd347036ee8cfd021f994e69745794806f0e2fbea5fcd3325a3f86cd15f71bb6a6fec4395fe0477e542d78fdc8f4218f1faec27974a901778f37da64ae621b8395c05e038e7cb216f6f0c1d06ca072224fa71da2028e137e4101eeb2264972477270532b8980df2198fb05261146c1d93ccc1bc164511b022b80164a08e4fa6414584a100b17194d94581b1f37325bb2713a76d89dbb07f05bc876705963534eefe1a29f2ef8efda534df2b5d2a8f043b4736acafad6a2df4e1a1ad721a2b14d5686d3078bca8da4841a673f4e98ffb84fbbcba909b418f030ef7555681faf8739641acf86b35c79c8bd8ae855c3618c303d9967b71fca5a2841a8c325aa51d0438fb038d567f4404d51ed3dcd033e078fbe3e8f8c37193b70a0b0542739483f1d4714e733e68efd59e2c1e23b2355eb38e255b9c216c806db28fea928ff71f3a9fb96af0da1d59182981a830568e59000fa20c592eb4eea810df2549fd565e53618044a0d412207f480244de1444a536329926866f173ecfd9c15677942ba0dabc92044ee34e75d81e78382692a4a3fe542fd101fa859de732caed26e417bcb2f79003c1d09aa8965b6df9445aead6369e9354d5034bbbdd178ef5afe483dc6bb2f5e91fe99bef131fb0a7d564a7c7b80949d5dbacd79bf79c78084b0511d1c31e31cc6419ba141028ec2ff0a6e6d78b662a4ba29b7411c697f3d33feaa18e9e62b07ee0bd2fd904aa1b20f825717f6075d34e3b7052c106a26b8520831e007814f10a65e1be014643f77cab4d5a765fa6f46b5bfbaa3180d42236d9a949b2966744e4cdee47e594621a50d761a9c3216bdb903597dc0b19e26ca1fd4c6941ce80f58d8920669d57d259071ff63055450b47266248256b2a988083f11e5282b45a71ab50a7320e9ac3e4c49c429a02e4b0c67195713808971e263a04768976bc406a80fc21bf281c9a4280242b9818e8085ebea2a034e19ba3f6b9085799666710a03ec20f16c52e5c2ed49d62c85fa87e4f7422e83306fe5c8c1b8077c0486d70c9aa62ba9d9892614b8a1b01eddbb81180dd80d771a3803dce7c738e5c3e135e5b14004b55619c415ad0f3ae3037fbb10c1983980cf1859bac1e2be9fd283f2195499fe10bfa48c7209d922251c7a6533fcf6cbb823db6163bc464f03fd316307c9f80d329493564e46a609aae5ee7dce4feb5a40ca32d8142f1a8b41632c6a685461e168e5902cb7c7d89fa794d948e1484adffe24887d2e8d9543a4f03c8be836a1dd9235e061a135bd498d5b37333cfa1294e84288b268e31a7cf4c5ea24d77feaa685dc069248152f8632cf90be80c69bcd7288498b844620b85d73fb2830c9104e84c1b4fab4d0799e21328446c3912250b59eedbc1c85c562f23388e04bb08dc270785b77853c855353cd9c67985c1dc96e8d84182b46ab052865abc83b2d99793b4df293d0a8a7a82be461d7a029fb424b6a2bd4f33e6ec19c2762b5f503f9cede1c9aaf619912441136051e87c77613241897d5f86f25df41b814e601ec2bd15befd3e2762e1ede3fa84eb2c28fb6e72605080fcd3ac0a682f0f76af0650614eb88aa5312dd2464004e32db6ea867e4da294892942129945f48227cb8ac6289c0503ad9fa1a0d7e08000253945ac8cf1651f2039e1e06ba3d4a66abfbf26b608128a978b243db0f3fc264cf52f9c078aab051af6deb4479a10ad85685281e4c2ab70d8e51c6350062fe19113b4f3a118fb63970ea2b7204f2c94ed0c1b5b1d347d835e76296264086358cbd084470c305aa94ae3edc589a01629a1da22dfa66298505adc2723a69119a74c481b46443bb6707c13722cb43e854f30cab317c53e4554f80d7ba74c074391fc9b90f1417317749d765257e7632c0c2fd51faff287734d737c035eecb268357359245242da646f3bda9f525648bb71723bb8d414d081eb195c2bed43f002ca2e1aa54fa1ebf0c60306cf03453a039c31f171be69e36c2659c94311262df8f492d7cec44ed11fc7ff3b60b6dceafde2df23640d0cd753f4a51ed3462dadab17ded037507538ba677c2d569098582ec44c0079aa9e279a3c0e4c30f3a87e159a7d4e01f876eaa9c2be249c33ad1f50d6532eff8370e5547473909b0c662ea4838de3be14f19a5704b52c07d5d35a4aa701143bd3f6395d7ad2790c9615d45d5d2cca58d52167bb9fcf471a8ae7f0f77a18699df74bb1a96b6f5d1e2bd7d1ada7d69b71e6b69d56722941546f51bfa92b3a2812cf98afa7af81bb3e0281ef85739fed9f87a75dd22097615354b7bd8957eb2d63d9b8c87635706bd3c21b6afb03dca9fc3f1c469b4121643fd689ce1afdfe60822720eb1496e0bbd39249050ebcc2ac4108eee3b73b7376e921a9949f2f709acaf15d5b853d2a1eb876fc35658c6b9ef7d9e79a516e859aca18eed3867caa1731bdcbb0a7517c781ab244ac67e0b0a85b9d14d4a7508aabdc03b390ebd29bc0f1431b31393908d7bb900176b76cb206ed3e31b526751950f500199aad3138a736df9baa0183e1bf425a7142a72e0690ff3ce9b1acfa814a199b25d6aa7863a7f4b0edd8ec25dae7d80d58da3e0b51d5c87522b8db10fcc184446aae52e08298e8267e949a71953209e3d9cb19fea5c72a6305fcc5df0dd69bc82bfea269182bee20e5ff9b9eaf578d276ce690ea1aa355d913f8fc7b72541db55f37b039f4ea4877cc15fda2a4bca4e78bb18d9c4caae5518ce5ac285eee3d154d30c3917fdd0a6a70e67041bf70dbacbfe5ea760e83c45f30cdc1aab97e4d0420a50f479a8561ccc2f499ae1577f6a2f55313859f6dab6e80ffe953fd875e18f193b9197b975ca095ba4a4ca060aad09202e5f780013efa821613d75c9a6e9898f99fd5b62120f2a823bf1cd3eaa001b27a0e510cd3eeb17aa91acdf4c4cbac2c26929ba00aa8535af4b897df384e01a141e46dc3d90c09bf7251ef2209891324507fe308d39001539e9bf4ba89d38ce98ed722beb1b59617f287b50509200ba22a68bded5ab438b36b12063563713720863cd108aebbfbcc40780c876a52e4c163f35a835d933f8b02d3dd448890fbf68f0ab293a1cb83c4166bfa5ab55066e0a7055f85bc56fdd9e6d2a2e35b43ff03670a7b58a8577ec702b7f61b0b1a18b3573f0c3edad89c46b856341c82d33a88f6eb3692d6f199548504a442a5355fe617b50fc7ba5b0e9813e9f1e6bd11c1f544d29f7e7a36f89575ec0ef9d0dde94d62471f00b17029fc2b9a3497d481ddf2d3de250d532deb18ff3d1594bcaec7228efee811373e3ae77b7d69bc2f0b17091e0b1c3df05a6ea0974a4076cd2f3a2fe59b34925ea9baa0823a107022fdb2b893b11f635b960729e2feebd6c7b3cd6ced58d28c39b90249feb21dc6fda133b8fa4818d717ff28a372d964578da0665cca08db228bd80cc81c604cb0994e377c334cfe7e52a550598a3a73ed9ad78cb0e3e5ebe3ac2f4ffd63ec97321dcb5ff70ec6965ca2728afc497a418edcc9c7088f361552a3e050819c9ca910b2e5e519858b37cc1d7a4f4a62631a61879f36e13da8121059a0e72bd9982a3cbf5f002480d596d419351336e3de2bb71f3a6a37f3026bb64d45ff7d50120fc779667a450e76fd38c45760c9381d104270e798c3e6f84c821451e09831f93761ca5fa5aad6d076bdf23d58d30e4fc601ef355cedb6a96e43b757975d9ffc34c84b2fb216cfb299936d64a9f8db2a77fc408607d0ee657ca72acde999807a96bc21aac267d54a2d43307fbdbc737570733ed335180333dce600afae685ae002ca2ba7f50fac481542d8f076eae9c9dbc76315ea1231b186f2c0cddae2b054772923f037d82726ed7e852acfbd978672a6f22cdd236b25dc4712a9ccb12b5807998cb35d8a5ad55b90b4c8940bea609c674bad784f5f96580f86c33bd7ee95d793051068b6cf56c25149161497a611d8d6fa88de67100d7913eb851a85255bc757f3963be3eac463984d4e8f794996aaa370d3ef1d95512e411473d5b430218531b3751a47098ba76f8771b609ef16811c0bfbe952c1fc1203e470d84d81c26bbe151828ddbe69fe155533b8f67f65bc953c86fc7342971b69adf03ff32b72db68c96b623111083c64d0ad2e76558e56586625a366007cbd66dd8c9bd1dbdbf182c2ebc55d98048f6b62fb6944ce6faaa8d3986a74e256ab136f26c39a21d9c04057889a39c884a2806b5e5eb1025693e98ea0ca2c1159471423a7e84dc83f8fe7c8fffc380b4ea7a2761b6808de7a2a6b7bf2de0a9091ae18cdc76d0fc98cd526fe24371d2b8785b461e5de77ba8a3ea775c3e30fb643fca6d3c5829d6339411678c247f91b00d08ff119a4b93f7aedfc087e64fa1872eed16196b561d11ca05c2d4dea1f4df0806d9fb81573073055335cc59d6d9db30a988b554336fc261cb07e5f77a560693380359a419189f07ab84f984b21e97e068fa44ce670fa2d346fd428bab5429de97c23267c09b4f39ca0be49255eb48557c6f89e4f587ce06c77804dd081d9e0ce5a6caf09e01cec9e2bcc6cf0bde581e7a235f1b2e0e71c1e4d8571f40b1bf1a22af1bafee3a89161cc468d917d7ef0dc05f91f6f9a041a0fd28a76c4abfa12a55deac19d01721d6a960878f5227f8961610be35b57291f483e7f964fd7a8c7f923ee8ebcd048b924f50c229148c1847872d1695b802dc63ce6a478c690ae651d348258d6c08e0ca80229b921885fbce7d5cb26ab1e935ad9d06a075259b4881dc884b22034f16e65ebf0eb9e9ddf09f70216d4e39686ffc13470b28007675eb30dcfef3caa38c4d0bec0b0de12363512e98e7b67460e8d89dc13af2791b7fac88ab73ff24f28cf2081b5713c5b183e4c7f7e7fc5e69a09a9b4679d5cdfa5ed01bf423ac535eccf59109b2485b86d66fde7bc4b39a110b8dedcb7b47f20a611e12fbc95862643eb6c12da5795175a89247bc922dd358b93cc81fbd530a42d888b6aabe95e11387208cffd6750309fed9abdba3d7ca10c0aa8345b1196236dcac25c1dbc674276529370a2fc1f4c69a5b36a3ba7242feb793c1c7734da3c8d4fa3f07b19f7b49006a94c3379434cd7d92a94d6612c0f8e1397235a567f9bf5941e5a7ed8612adfed1005752ebb2750df69856b31d732483551aa3cd5d04e4d87e1c8f70042779173a504c98aedb2157847b7a411ad872f818cae332dfd07c65eaea088a789e8ee31b7368f01c721f2af75f1278e61b4936b176a092386395dab0e29cc1454fe0278a76f11b5b6b5188a4abda54bab4b089689af0d1d862f36c458bd863aceb5de09090b675b77b5145ec92a29bf7120c21bd22d6f74b6911edfd2403f62dcd09d2d01e5c93b5719c05a31262cd4918e2349f68812a03b76f6705b14613854ccc2f0df4591adf106f8e86f27778fb37b1a782dc94170eb21063c5954d830a2c6aff28aeb3ad0d3e469c33a7813c871a4bfca43d9a23332bea7b76fce644263774091acf307a761b5accb52df78368f218ae303bacd0643b0ec33a3de97c9ca78939b1e2d7c5ba815c81d99ff2bbd1b1a719e865bce561c10d6e9742e16cf42d8fd5865e5be14ffcc5a42e6bbf735b33c1c5352d8e30a2ec1abee00c9d474001e2a44fcc68b375b735d5a822209db2dcf2ba98656638992eec74c57071cc13a281ce76c5149c8f171f0c5c004c0b8bf23de23bd40ca36f967c52dba2ac064af9370ecbf809ca0b373cfec87fca0dd590817e26a6d9bdb93f2a709bdc6788cfb3e845abd9fdd8edbc8f8a05fca76391dc5d1fe83b9613e14bebe41c7a4cdc63749fdff697cd34475d7e86a650b6fcf1d26629f3010fee71389c28baf14dc88f1cf9be84eb2f8b68ecd9aaa1d3b0b144a65d28ff7f52896ee0f14824a117c8d60d02fb638310dd129193b84729e5edf69d9448648302cb4d5bb3dd1f21645f257710314cbb5dba1c8d7ba6963aa52966edbaee989c08e217540947ef8b7247b8386d8fe8235307efbe405b8973d8f0056fd0dc12c34a15bfd85b559ca002cbd6eec1254583887b794cf6776d7c31279766ef4958e14b55f4c600373c77ee530051b37d8d4ac31802105c5681bb77b83c20937b3831834989c3dc66b22c84be705c147a75e12d74578b95f5ceee42539a9df212423a39e091f1530b1a2c52cdc8ac6894b345e21fb0af33a5b25ac23a926c9776532387e233c91648c05310c762a9ba7e0813dbe6497cf6f967dfc2a352d9c4e236e02952e1e5a5c08cc6dacd0f23d0dec5bd7594a4b247bedc68de23c76a25a97fc022dd5996f10269145d77f0f15fe16b727e6019f4fd1099f75bdb3e33a2f3e4c654cc93c48dc11691121000eb72d24a3c0d6d7da88f357efd64f4bbebbda83d52c7bbd04d416ecdc3718ea390e55c60f9e3564a5051335df0d5ccc8b129510dcaaaea7e969642ce0154f8e73e43fbef020f3af9d04618ee9853a6d15b4f67d3974c7cce812728d31373b82150184d5cd7a6760a0d57189c5c4d7cb5f657f98cb77a16eb5e237ae1eb50a5890a4b259dea751979e2d462076c88e346e3bbe8ff21e3a246ede3931bef5e24f489925a60094b4f8a659ea754ce85f4b5272ad8e0f1ecb0ef83f1ba4f77b000ac4200d32e6cfb0babadd44a7191db2547e23ea416dad44eca12947ff3ad602249483c371450f1927cfdfc2550e76ab6e5280e84e3759f24548d6ef610fce6dd64ccc979fe749faa3551acfbc36cb24bb73b6bd55abba5adb53b1bd288f85dd4fda2392a113431dede4ad05a76dd8cdd974088ed01e81e2f069333bb8eef213647977c1066f810dbfd384db3cde198823dc3d387dc79a8503a1a946968f8111d9ead759701e40014134f2e45093cc8114682140fb7d58a24ba72ed69ee13117d3f6a3eef4f02935b6ef17df520242d5004b7140cb8dee82c2aae0976d9a0527a86537c8c5e95b8b957ba3c73a0de146521e5e726adcde10a72aab4099985934f96ac1b682093be0a40e6265e981452f64466dca45e625583332d027f91c0cd6b7d2534f6ddbdc274af8ed065e64c6f741aed91748d37788a739cc800889b6265319d6f15f6d6176f06c5ecad9058e097e858c053441a02d44c8857a0e9d975fa90ce5905cabc9346a371cf558ebe1da687ebe3c2fe744bfe0c7b16c71d9b59cbcdfe782cd7c2d29aaa910b5e677ecdf971d3653fa402e5b7ab4fff8fe20d0b00b6f286e156a86ca7e2c7cc66d712bbd83b9b45163d493fb48e015f76edbe6904b91210a7c5ffda9824e6eadfa508957cd36c811707b4cea2b83722c4022cc51d1b11826abf84e9d7354ab22401dea38d19fef7fac87b9da5b81b6195efde0025dadcfcb4d1d347fd8247fe44aa865e430d976b006bbd9f28c2838e2e1748e1c3f14924f1be972fcbd7e1f804836cb6cce63ca21768ebf7429a4494aa3b9d8c15ad571db423391e3e022cd02c47fc8b31bd7b1c3a0f19384504b2a9ee643da14bc6f960c78443ddfcb39814f19c435d775409f307447c86d91f40849f310ca70b8b5593191c3ec2d35b274dca207d89d6d5f691c8453961b4961478c1fc9321f65f94a6b57c4ed2bd9b2d94b09324ee254e8d7ec258e95b7882e6f09c7c1141573b985c2c1e49da480f460bf6b2f8213c63152abda0b754b2a7efac5be79426e4855428d3b7f698a297b61755ef17f9a2b4b44270bda03d9b469279164cbefe52b54f8dbca575c1c183d6ba4aa7503045c38e8e3762f002df0557102fd8d5a3dc3524189efff3a8af3a4b4f41ee9658aceba5e1f2333140587c18469cbd48f769399ac62e0f94344f1fda9d7782282ad6f584ff5271e7f9e79d566640fd88129d6cec3e0d5d56d148200eb8c3c9675c591ee43940aaff52eac453899253ebe815b6bffb21ee698a2b46d0d63dd99eac7609d579b9a67de6e8bcec369239689ad262286cd3836f739dd5f436a5d38f8cf1b56544875e3d69f0337ca64c7fc4eca8fb3c0200e3a133b9dc38d6e5125d300e821832f8eeebc10b17d6087bd078fbdf1924579d356e59596b211da993166c562b60d65352a12039b19578f48133411cfd2758d6ca49d8bb5c0a5db4e02cf79fa0eca51331f000e572c0ee7eeb8156cc94399b77dff1975caf1dffbe1243aaf443fbebf364c0ddbfd9c4e3cd51d04d9ab57c971a4f0e09ec90885af51e1229645a70240e082b0104571e468514df422838b35c91b8f402cf551f8a376d46a27173836e8e2c4d468935f5b0da9079d52c97a0517dfe29d019a95deeb6f1f5092ae63121deaf283ae49ed254acd0c9b6606e6fc3e0615c8d35af284e281a2cae9d57f5683d2e3f81fcc533ae686787ed9b63f5b784963b5df981dc067116fa3b67ba6d54d0a3bac1e246e8a182cf9c654452954854ea3408ae22a71c725b73b4d8f0e37b211dfea43b2d7e6618875db5d07058b989ad675dc47306d547318f6bb8e08f7b496303612d91f02d775e7df1517634c4824f544c19c537813d2fc22cbe17a20cb2c9df48054b3880d7734870b04c4cd39a993b6c71c65e15bc8c47120b762d2f4419d306e41b7fa0af881aa6a5ec442c3caebcb4ea28d4be91d618acc84629f0dbdd0f780c5599937aaf507aa9adec652867d0e4c85d9d428159bfc1b272572c7fa5d1c9f16dfe22e1be92376959fb70e6aa5f76dfe26ca7c496f05074f3771cae111132ce825c20274fc49c02414771e304be620878da02d3bc015cf17b7e9b8c4e121d8ec199453c586b881b19e0fca10cec24d19d5617566d3b84a91d6839d1a73218778dfa7ec5c5bb7018774a45757f55d1dec91bbeb9ff3d118e6a7381496764b43e55ec338e66b965832bf86a138ad1bae111579dcc5d8750ff95e024fcd95834345afef247829ed8d32f54792111828f5700ebe4f5258c00b5e78f847296109d6472830e59ec2fec2191adbd5303d14cafe783375e64759d6a68450eefd4a1e58761ed42f0679f4dd013391d8916b2708b822bf1df10b2d756bc70dad575d8f1566430962495272d18da2292780c0ee314274ead30433929818fcae92cbef49970662274beaa5e14c5d4b229218f9e103f658ebc09ba2da934b528d388bbe8c533c68740ce372a69333ed4e5811a9539be732c852c3f0d086dbb907fa21385eb7c8e4e7ad3c69362fa9feb0a7a23a67c29e44e96540cb5dccfd11cfcd7c3a65f3fbd1e58b4205fe3ca692d5caa398d131e054196d4ff06b86eb1c66b87a2a3ecc0329216d5e08291d81173aa5611dc885d488415ae28b5d5a568be6459f710b2cf51912a76c9af5e8840689f1e81c33b27d02c2fbd510a638bf7b8892ea903ba82660339198c5eee4b5a6f84e5bda0e018b63cb25fde4c57e4ee87ef8bd74f50cbab72e0e23f57132ed18e1a770fc8c930979f48beaa48877c0bc93e4e8f169af0bf3fdc7ab0e18e1cc4566e740066d4e35020a72465bea370ee42867132d3e7b48a79ddb6af8b6cc22104f5f6ecd4e4b07748fc1be44130a8bdd66f813ed3ecbc3fb4facd7e3fe19596df6f31c7b639f2fd8217b138be93f598154c28a3d2077339d74f82728219b63f245c01c425e39c822609604fc9dd6c95807261db39e5f96cb384e17fd0e924ca35a88f5982f3565af62ea1feb652ab4d2def1d16ad9bfb") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_192f_test.go b/ref/params/tests/vector_sphincs_shake_192f_test.go new file mode 100644 index 0000000..0e95875 --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_192f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_192f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("ea59ffddd773825c3dddecc94e5cb45136d2f026a3c2198f745956c9d1f737294e1f6c1810809f560eb53048f78ae9b894f472e2c576db3ab0d34a131451f9e29cc85c6334426eb54897d6c2baf0de54f5ff0eaa37467b78a56ba8e6f7524345") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("94f472e2c576db3ab0d34a131451f9e29cc85c6334426eb54897d6c2baf0de54f5ff0eaa37467b78a56ba8e6f7524345") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("61af17bab3adf887b3e73b63deae6f482d9035be46c1b19249fd1da51b74635d000935b940f858c0452a299eb763f112032523bf9f69a6892190cc8da1877dc6c2827d384d5331bcb558c9802fd83f7ff3bd19dc4742cb7012f73538e1f554e4996d19ecede8b263eacf33befd5ca822b4132312c8f4332c133598ef0ae0e882a139f7c9cb6158277b20bec54555dc26abd3ec59e98e5545e8b69924848c04da8def2456427d541328192c380bca1a2ab930d1dde671053159d73b8a3417a444d4b819b9ca4c8c6ddcc7cff3181dba776194f0020ff3d035bf4d7bcd826f4a8bbc6facd5de7504e282031f2b1e8ef11dd7f7b6396be49fa126a41506dd69f4ed448f6847bbaad0f53b8be27d1119538976a533286f96bce890dc84da3718a0f2b075ba4920f63d6189ad10d60dfe30a26ae746ca1ca582680a2f87be613e3683273232c40692bfdcb59c571363682df0989e1d9b52fc0ead04c27136a61f3b1b9773de86938170c38dfdb46466b89086ab9748083d7af4ab628fea346f559d93e4855140fe41e3284a365c2e1cfc238b30a15cfa57bab11f59f4fae8021c14e70f34ebc3e54dc437f03535124b2b2ee077baef2daf0baf4711eb70f266637cdf97f36c62abb9792a00bdc746380f3cffbd748f97cb2c26618fc8d8317367fd2483d7a082f040248eb37ffbbf3ce5bf71a2101f6ef9fa606e2e98a5e029e8139ed50695219b5ba2797c6831c56ffdb8421486bb6bceab975a4345c2dcf5e49fcde69ae920b98cb14c206478619fb055ad20d9681c3e6dc003ff76b4a668a919e82e204c7e0fa43802be09a1414fa4a70f70056ce63409ee6e1671a65302fdebf2006243914656054a6d1865b9f1f3b536f173c411269192326bbfa13c1d5973a8b4c373d9a4cc7e70ce4e7fea5eba46a3617bc58767c9b219f0cc4a28ba9749592b2e44d0c80fab01d471a10713edf4aea6b9c0c868c59a47a1a443d3b911e301453689fb4b98502e055cca59ba9fb24e9b521f78e742031fa9b77a6fcab197020456ac7ae8bc8e90adf65caeed796aaff9849f6bf25969b4ef8cef134fdb824baef707d139739be8898950dd92db5dac154409261694d0d84eea6168226e066a78a5003f9651c5acc65b8d26f38afb322983de674394bd937a76567282897850b8878a79b354b30031a7f4a12c4dfe011617cd42acb3adfec2d5c035184c30d587fd5e58dcb58094d943b3f811414b938583d8006b59a96a4a2c0baae2f498c766331829432a292e9567062537782c6c1b90cfb91a7d3fccf2f0ddeea616740723d3df3ef15b52e7b7967ce5001c93ad7166017b468e25dc0d8316dccc324ea3c7525359be6ae81382e8028bb45c5e45fff32ec5fe45ff68e6be83ef00823b64f6f6f6a08fbe76087b927ef242a28702da21b2742793c175e5bc80b2920b8a50788c5114a0395b6fb84441e710a8d077b68b60fc8520d9240e0f3fab0f0167f061d92c672c1dda478bb003cc59a53929f3e9234d505bad94a9c03ccf57d3d7f65042c757f2dba4161980ec5ac76fe64b54067a23f2f2052088088ff177089afaee7849fb0bb7c68dbfc9933d5b9da79c7cfd7f5c007d0a07fc657dd9daa7f62c94be437d19ff53d05faa91b6cfae06edb6646fedfc990dd653b33741f5ecf97a3c4a56638082c3d5db18efc949cc8154f74fd428e0358e1fb77418f54de2d9f0792673b78a41f9c53f13b8bfa3cfe2a8000cf4cbef6d96aa15013aa42c7aaff0172a550be900a7542c589dc6c2ff4e8793628bb1c46e1626877f945136fc5dd7c182bedc38b2de2057a07ef8c3b2e325cd84f6d65215cb3c458c7cd2d9984bd0c2c9da90fe172992b726df82c2a58d251fb35f1aab98e51fbbaeef5c79fcb2eb6b688d74d8c244b6efcf1744ae3087fb39fcba087e2b4dbd0cdadeebd2f053a24782e2ea390d525af96c78bbcda99afbd631ad99dc16aa6163f1e59baaff08330e213c74c1eff4d9d4923b6a7ea4e96e70395a0a9670ed0b43360c03665a913301f8349ca71779a8eba961efc9cd500e34c64e850b8d3361f5fbccdc1caba274f05753e6f9919396fa00066197171c0d092b7dde80043e97684f4c8938a0235fb4d393932aa1a6cd47f991f8bc1bd63f095010448b99e0f4c5556bd2aca2b654f183a684ea92db79e30ead4712fe41d8aaa024774351b28bbde77c3ab94a902a8d8c9a6b0ddb9b5eb034d043b9ac18f040cb8b400e0a6e5452060ce9c168533fcf0c5b113f1f44ffeaf6259e5ef2bdf34ed37a111874687123f1ed16d980a565a8699dcb7537cc2a79fbbf70bcf3f8c909aa5e89a442d94fdcb0496fc44bc0d4c994ba4d36a7d27c39c4b05f385c0bf7dea720b5229ddbe004d26c3255a602907e24a0c9c10ca8657e5ac692b81e0239bb6934de7ca0672c999295a49f337a632ebd61fc0db5028884331286339937f85804c3ab7467297198ca9eebbd140e32dfa310a2c303273c0bd194c06dd37c788da90f8273baa38d4b0d9e0193c9b1e9121251af0b5d85df5403a820d7aab32e5d680c8d1af91bf72e8306f7c723286523fef82f6728a9bacc8b27412aa39b55b07b675f4a809d592810f92de7869be45be73f189bc2f330b012c80db79e82b92927969972630f04a9a660a8f98c9ff02c7aa02e14524d66afdfbf34cd39bb249e66334116a28acc1e1b7ad0684a60bb47c3d656a8e13b94820fd02c9077e2bfa443a1410baa8f8b2eb8a8862e77872697a7d650cf53e20308c8e97ed1955be43235658f68782312e78177db4db46ed0d66d77226056f95546e1005a16e3d2d1292e3942b9df84febb51aa7ee94c281d87b1974be9dfd476f6605870bfab83faf5b12f21c0b93c2f9e17f4e2f78348ab4f82cb02641a2f4a53466449ba20884f8e093edfa2485d29607d7b0c2d916a02a4d250d84e23ab0c487c9e1b8bfad37a1de24b28777af58ae604c9053bbd790d592ba2c3b08d398d646642dfb204bca81f5caa11cd03eeb5439148598476cf363d6f414e655990b86ade36d26efa81eaa1ae3db2d72d24ef0659a88843e4b6902a8650340f2158285a02f462c6b79bc220b8c89a841f47edaf155b1ab6deffba254a5c7e87e6a6562c051366eba768f4c20aef5b40710be07c88bab372f4262408149e064c1443223f1728c904131f3e992197da887391a94276e6e4d27555948156d01e03c54fd252541205907b35c0fd2085de15acb6a7e035f4ecbaf8d4876f6ce2c48fe5bac29a82ae59e3d9d6cc613d330f235454ed3838a519a417974697e5925bdbadc71b1e6eda6d1a4fe12a5e5632313327a03bdba245ae81edda3f0b5ecbf99b972c285898a2267e91e87f847354be01f94988677a05ffbf8d5b4fbf851e0418cca055a0a0ca640875c3744989be5b9910076be896e04fd65d9ac7a82aeb93d83e63dcdb4ab48dfab34eca9f3c54a8b1ac9a0385c24708d4c38e70c7cc3e1362b8193e50dd7e5d9f1a7bd5ea7fa8d233071521280e3b8ab11ffae8814dd02cf2c1ae02d3b5c640a1732f55a7aa0eb62da5ffc2e16edbc34b607136cbff9e1c9ff2b298f861817d5dbbde7023facc184ca89cc571a6891ccbe5f3e12e9e40f0eddc506c5bff33eeb13d053d454b28889ea31e46b144478b87de36e6bfd9def44dcb4618e7756a301303f215cf07de25b4130be4774008a4b7fe9ac3450890f2558b49f45b00498be85dd7d99753166b9d2c3d59a61f6b1e984a03de4e63109ae7157cd36b795efb31af70f4c08118eb99a0f4b900d942517e60329a599256ece2a201b7cf6fc44836d6ea4b183ef67f7788cd0e4fde95187a0bbb5ebf9d7399961a621a423b777579876b2c39c66965c8b06c330bab19a09622a4fec1f344970eacfdb6ecdd66f12af9dc51f28404f0646991837f67f718ee040f33e607c40e51d710c0e17541d7886ede5fe6b416282281b5127e3443d27f4c22507a4885ad27c47a0cc3383baceaa77e74a8d9772e35c006f160769afa694fc3e0ed7c050f1dfbf141b333d33e3c1daacdecae1619704bd483a28d87ae02b3cc7c97668232d06b8803394945eff375cda7865f29896863554caa34e1b75c25209a93eda5768c767a1110cb09c0b82ad3d19099ea30673d89ad5e7d2f5d6651bc1ecd37bfafe6515871785c31472d157ecfc5c942e317b579af7e1d55934678943caebec38e7a8a5b40807122624e483a20791afda70e44af0e1b55d940d096bcbd15ef757dce1bcead4072cbfa6d2e8b0f59ed7c22736c53c83066d35fa90aedaf7c879815919868fb86198374acf3d0f641ed1678eae85a6f02893b0e8fe761a5c8a74d5ad5c5afc0198b2c6a28dce0e9a183fd9fc6866c275774fdbca2a88a694f790aeea3f7c6845c70e147e6c69e7ab9cf3006c498a10065744d64ca5d75a5e0cdfe85727f9f7a38b6271a3251d1fd20676cae2f5713c191146b9c390e28899654c74c8ee44367632fe518952e9dac1841385a84e68ae40423a30bfed430067fd5a2e7ef5e6a878173467e80368908b825ceb14f0653176923bf8b9115028c0d628b65719661d762a1c62f0cb864c1fe0f523bbe297c67ec155a321507d8bcf5be357cee7405e1fb366ef687550ea0223870eb54b133b48b43fbd274c08d8df2e31828fc3c73c4312d00b8c810a65608671e6678fa1b95e8a750515e2cd55f5741193886aad045da7f418081de01441140e9cb5cfde34e180653e2654d9cafed6d923e2681d76b16c00c781d3f124fc7206401629c2aac8e170a3d472f0191e0fa3f1539d74a01a5c05ec0cc4aabb05778c3f7da362c5c8f9b17b198fa45dac88469957ba500446e3ec8a7491f1036c4216ef0d77e946b07c78a63f82b5c7dfee6153eb0764374e96eaa4dc8d164c374b15b6c3c3917340bf20b4c1cb2d92470e315d6483dc048208f5b23199f31e729ccaebbc6b7ea13757a05daa3920edca70590c0eee1be0c46645bf10139fe42473f131eb9482b419fd536bc4b7bd6cf6317078f33f22451a11566b4d824aa379b30385477e0063e19454f86314ed110da756416353ddb49edc277f060926857f818be7deddd6441fc85ec023890c656a5739607b072aaaac1acafe52e2513d2e17f8023c0cc000aac484a460ba27fcbf1d35986e6782d36e0f3e994bb02fb5de3ccc2a811d30f5424b271207d785336785e2bf7a85e2a30d97ae0d7312660b264441f7b76f90575128abf6d8beddc38783965f0ef53f15afc39e4ed80e29e0ee4d4f48f0e54aed374e7a78c5b37763a1dfc08b8049e71254298378d7c483dcf4493ae3afb8704f5fa6fb84891c62c73db7c951a4c1b72d17417ab9e8c93a717ecfd72d311228bbf136dd0873425548f556da644c086d1aabb0db4c07266ce79a04016ad8adcf8ea1ea4740d8a64113ccc5efa97cdd6447e9a71952d7e726880a82731330b35a3392451578897aba25b65e369acab8d8aaee8d5a90e00e6c3ea5de778053041ab8c6686c21399e050dfdd875e714bee9201c118d97b7280511b1e9911082d65d938bf78fa4cffed64f5a0900baaa5c282c3fd70cc158d1307654350a17eb194c0ac640aec01fa9aa11c7b90b4e25245cc8c9767321f4e3260df3faf5a0ea749a7a2c9ac04356a1f68117f888d05609644d5d2316172db11c726e594e9f457a0e7a8af34f7c9ba2438683a209d4b8c661511df79ed0e246677beeabf8c9a328eb9bebcb05383a74e1b77e38035e60e2867a97eca3703d2395d9a9a8c6fdcf9eaa5fb0395c8e21c89411cf9ab5fc165f1aaff85ff088f7b38bd687b0fc7488bcdd1e8b378a24a75529f20ddba1114965d5ae93da55aa59736b26903150c13b0ac7c672993c7bafe6eb45b0a79c922d74531db64eef0319fc625e520e92207b80f64e95b52a0fe5bc25ba262d237eb007c75c5a08557631bc84417e6b89006c5d68884b7406571c9c4aa25602f91a660155e74f898db6a7cef997cc3e91c034ba5188c4aa78ffe6e1ba3e6d8e817fdd941579518008801fe3f583ebbbce03211f79ea06b973bbfb04e16ee7aff282ac2b5c0358f99405ea3c844bb33b043b9e77e0fe1df3a637f71e5618e7e6ab02c4c13c52cef7eade2de83b2eccc23f43b071266dc541c42efcd16c80055bea9dfc31645494c49164fa38210417cff595a85462299465e3f940152cfba552ec2a3a3e247b56303c9fb0a937ea08466c45dde5e060956ddd5828f43c3e211afc503fdbfba6c363933c24b3bd16edcc1c007b0bde1a90ee3ed57ad937ea2afb6b47072335ef107684de32388c093347542deacbafd698bf7811049dd1e03e032e0996078412ea79a51cf72c54738ab7793e2130b5966807a9b44bf5ef9dfd564d55f86f7410cd410fee2f556bf7f269cd1d390d8afcc964ceb8e50ec0c150b3f10474d7b3a985e48d8e4180efe83f12a890828a9791e95702c33753065c71b0e976717640d5a7a3cf545122211243596f7a0fcbdce7c3c73d6dc14b173ca9f2860d8774f8c996486c8fa13ccf545946aef9af34db7558fbd56f2ef503ceed1df50c3a4de0a3d2b8bdb49cae4adf89db95c0e2ffc078a4082ee4438a3c520014db8b02b14e93abf56f36b77fa42017b68d5013d7a126fc18778f711cb73261ea8f763d0677717ec96cdef2a11a398c4243d1236a94a10ba4529b442d6bf4873963b15fa33b1032d4be79a68489016dc74b77b9c3a33562adfefa85ac6c8122efd60a69c862bde154b5a90543ec58a54370320b4a55b17c2908e72dbc04a74a8e403ae45ca29c05951d6ebeeff1660ec468fec5c7200ac7300e753f958d1428a4209d24278d7b5dd366757a50ce48885ce32ab2060a5c67a5119e8d40147da3e142fedac510e845779a13818a86fd07354ee872afb0a6f793bd6db4fc5b61c144f356a6ee886dbee1ffeb2601075484d2c2fa5cd28b829de2819b973f060a819e1bacba437a24b104b115b839dacd0436e03c0f8fcdde05c288bb3d48f059cec47a94fbcf47ed4cd5588c453e7ca18104323a03e0bacee0ccfb9266838a154ed50c686c5ce66762f12a89c59f79356d5092ad5079ef9b9bfdba7956b14f3eb9f1162f8a9cfd92825f1ec406d58ed638438cf275c1f9916ab5dd2eb1a3838f3f4af910d21f0e09cdd5707d36b0f068e6b75ae7a3682619682272b4c833a83a3f0cd4c982d357b5ba09290f234b2d2754607c9d350a4f502404df76cb9116c0cb57f275baec84a6599a1c52a2a901741be280857057ecb9a7a824728a3788b23f5a8ede768e2810d46ca7d5f492b9977159df6e633ddf31cdcc4ee2a9b519cef74ab237a27edfcaf1f1353fd5204543bb33aa0bbad03a9156d5855840ce3bd931f57ca684b6ba37d253656781fffb9b27137d2e67b2a04838aa4cd9a6611a1583a6932e3365d5872d655554d7776d51145ddbfb90da0a5f3d527aef1235b26726c535dcef212dd06754c390fd2912a7a0a849957ebd28928da7cd05b05f2863a18223bbe657942832c569190cdfd3b35cff25093dcf1cbbd623f870630aa6f39cd12bbbd85a2127d63434f9504e1e9b9b3a7aea530f113633f17bfba84d9c33925bd1b9646f328b969a848d9b3797ced9fc03fbfc9a7bbeda5635ce75fccf3427e0f55761f79495b0b23582a905061bedb900bb3911df07f863c129fc5fcd908338bcaaf77139b41ac2a3fa26977b0871465037817530be45b6c54242ce7337804bda4b296be9982f2d45391294b09e05d97b670b91017d203077c099862a55db2adebd2359d84131e6f0e91996c27ecc709710207e18861a53d49e982bbf4a0c0c85ac84c5f4efb4e179cd508f31747c11fa7ad4cdb4a7ea4a10d3345050270068eeab01dee385206e2d58363fab0f6b5d05f7897b046508fd779fbc6aa5bd62ad93f926f594f7f6743f6b98c74bffb497414664e43540fc21f8d212c8b2119c861f74e75026a4d11bd3a4b500bba46d27170b18e6cf9eb18a986119d1230bd70c251a3013a9b1c0a8aff64dd74af032a01e1637d2ff0e80b5f71faf7f86a360a0efa85ba0cc9140188e113ae41437d6c2843570c62f8b7c259eabbd905bf467d112d4952dbea30ba639c310c6328ee02e09e831d3f87179dae41d05db6cfe00bceefdbcf766f928ec473b7ecfe48b2dda64fc13f3f32dd8e10acf226f5fc30e804f1329e5f64686eb35c14370929aab44d3b2721981792979dc82f250d484c6e0fad3534a3ac0c36781929fd88c9e07a6c39ea87712fb90c49dfc6b5beb3aaac2cc408c31056beca90107cb11779ce583c08d74f24a1a71c7b8fa053b78486b9c4029cedd623d4c7991166de47101c5801a8fba625cb61a2a542356341ccfb78cb461b562c3271c4842cb44b78d4c799e867e6148e952bfb0b3c3575aac36f7e266fed0accffee10ea7c814ba6a5845068dfd73d929571ef7da4c6b6281cb209f50dc1b98d5ffefe5b45d541aafda115501b6d8fdaf7f97b53da538fcf6d2cd9db0dce8a489e05a0feded5541202056e208274c11618491a4a7b8f602ea7c3b41f6431e3a3e45decc9142345a12d5e4fd769d4c3aec55ce982d36502544e28b87be516e984d7ac770cb60e1d60849d4b55a3efc0205e65a3521b76067564b1b0720bd9eac90a2469b73334f5441a4bec5f49ed2f106313884f84c2e773bb06041d2e7ed8bcab36ebc8e7d6d95e12dd202d91af679eff241b3b430beea70038316c145d84dd1de6c29215cd6afabaa8ecca67d09872f544dc1a4f07ca3a10de17f0142e26b23c055099989613438cef689d406d31c8f1eecdeb1c499732fb58bddbb076bf0dc7a8eff3cfacdc95e473f2060d73d68e574de7406afcdf0ad6f975deeb95a7e112321552ffcc1ddca605e0b604e6f382f205c3ca6a1b9393be89c3273e04434b4b132418573044a9e96c1afb5c3e011c792f2f5dc0280a01763d35c1d8d2a41b9d1afb921e2582589c074c37184104081400bbc8421342ae31ec3e4c49c9f983cb420d4458b34a7a65dc03b974edc04efa9b04f691bfc381e6fa56efd2273210a0add2dd8dee184ddb29a4e11646081c3718675df0c09f51b1972a880f0e52797df06f753186202e5b7cd0d160b563f0e7789066a8415511d8b0850246a80647eefcc9703f5d775b7789db2953c3791d65119f9097317a51ca21f1ede324aab6af4b6bd7f3357c5777f554f7a4c5f416aaee9e57eb4b758f3eb70b447e6fc9e7b9113672276ab28bdaef3bbbead399ae89d8839982cfac81c65504c41c0ead5c5dc920ad7c381d790a2a7a8908179ee431d2e8c1b242785f07d7dec9170d9ff8e8115fc1a22f3f5b03d07b6d5e8e6fb4f0ff9d41c994fe4cb067d7dc6b8622fd060f2b306d1bb2a01a43bba9c7cc1bfa6533b82ae01eea49aa0f5843105ed6a4667122746efdf24edd5c3bc3befab1f3e25837a3def990df01bad536a13628a450432eafca22a6cd03a872dfef84095fbbe527ecfabd99f9692534fd347227c9613460a40a51ee7036888cc32bdcb05c271dc81750a780171dec6b5fee9fc601f34f040747c4f7538bd62f66f23c0c307d96d349a128c3bf7a259e26952cf6f37a7fa3ae444c7edcaefd8f797892b03ffdfc5cc110d80cbccaddc4b4462d756c0790337a21c8ac53c295b64ff5a8ee814c23734db4737883d6cd8e9f9a22158e6e3814045d5f2b3c155bcd6225c916a4af730970f856dcca100348bc6ffe273e3d0f3485e3bd6f20cd46549af795bd4187b1cf49cf489a915f4a9a42d4637c07dc16c15f1b2daa2e0b5266213b2740aa7e9585b4c26fe6be699625e579b5067cf1071a994eedc523dd864db1da6e808af7447e00774a43b679bd16b62822a4993c9678c75f7cefe0d8c4943169410386a40a1a32229b3aa2fd28570a84b4d82c7fa501bb3491e3d554713fb8526affbc99dbb1f31950c7308db651941678622e4cd4422b85a836ea4b081bf5d42958785c4db914fbc13d31a537b0fc3780b0344cc7331df2d7f839ddd792851bd4a165e4c06f78c37f93e0b8ccad3858de681be88096493882ba1e75e4dfd3639471900cbd3fb390f876fb8daf8055269b1a59cbd2a5145111d409e2a88810475259f3cff6d64d26633b056ae1776fc103046065a43fe9fd1c26d79905d57f148d9c56daa83751a15b5e1bea0cc7e5526293cc99026735ce8e19fbcc8fe7203c480c942d62eb1021e0c09ccaa442053f695ebdf28b65a37b9a06ad816ad8f9a4bd5758bfbcb82cb0a79116d5fe60c21799a18e1508c23192c4f78294299df3a9abfea2872595efd8951039ae354d5b6b8a898b021969cc9be5b0aa6b7433435f258385e7b467bed79ea008e839e3547b341b84b0c9f05cfee424fb834e1502cee9f3cac29257746e4b2c9a556670ff23d0252c16c21028c1c325ccba681d1da36e162f85eb3f4adfbd24b01017b0add9e4fee2a384690b60177b7741446bc57d25b83b476d81532213bf66e21fb5ab70ab50b07d42fbd7fab76ce0edccf208d8c8574b21971104feaf71d60bfc4022400b45944b5d07dabca915cfd9018d2d10f4a824d22cbbd26396be187d7aee692644062b6d8d29b21cea6eaa71690e179e40c86c8e72fd28800e3dd3ca1a027dee25f622ea8f524873fdd7e05032ed6ace3fbe358867e3fadf666db58333a048b72c6fd1cf8725dfb3224225f674950e11d01439aa550abb5015edc9c99b97d457158d768ef28ab0696e8c475b61d42749dda2bcde64fa2497aa51783cac0a3f4ea1200d1f6254357b7469e9049a98fbf4f7c93653049076c830c7917d9179ae19feb0f6e5a759e2d5aef2a065c99673ff14cd91823e6d860f22adde939b71184e7756c5ff2d11bb2f5cfdebedf43529f1d73f0472249da0a2ad90ee27eb8dc01179c02ecf19e0a5542f8e69b63794be43ef1a0a63c4a4c9986d5962270beaba4d90332782429330388158cf5bb905f8903aefcdf0a2e92ae6cfaf0792e74a8998657a1374a8a76a9b0a94eb8267cc56ef11c1c4d623b7261faca287152ade28851299785205bfb1c0aefdc8c894cb3af50c4759d7aab42b936e0a0aad908150ec678afb006c8fb8ba0ec7522925537ba8c2c493343a83cdf376ac8ffaf1f91d1ce68f8838f4b3248ae63429fdd5e830146db76b33615947384d83c9c1cef9c18933862c33112f01efbf8d8858cbba6768069d9a56f70f3c28d8d145bf7127b0ef5d8038e08909255f76367ab6c957ff3ef6e1f20e1bc7788e034994a15e8b6b684f837f7fe359dc6b24d2bb1227a1c64b42ec41fee6a6a6c4a27dab8f770aecbb4803462cc6f2e625d811741cce241456e5b617589b2ec095cb6c60cf5abdae13b7f2f8ad3e0c546ed431be93790ba62d3c18714d38275bbf9d9d9bdc1677fd23821ba63cbfbd2b9a872fe0b365daeec14d5a88c8e209301ea4796abad1d4e3bf73620285e86422de5fc6eaac6547b1c1d2eeaae8b2448479c38d41c7f6e648298e586fe600d44ca60c05fe58bcfaf4361f19ec4ac5e1536883fecc6e46c934a79b35c7615adde1576c9092c7a90f183d0193886b09405f11a8c7bec52fff1aea3c42343a4924d47339c5ea070ce6622a28cb80b7d8725457a179aeb24ba128540a6ff37097a0db9ebf79ab9e39acf5b47a48bdd409f67c2036cef98115653c8b5f915825a9c68910e72153837e1c51d3d03e480ce68d236d766261be6fb63ce7d8d41fce40bcd6888f945d1c5d0d847d39bf8d2f3247a34b65cbf693f4ca27975112d98c5c6272d443cdf6f8c63bbf2a9191db151cc2dfc5ebca34f42f3fb27976e4d4c1d61eb1a6a4ba3389fbabb8dd7a764e503db304e67aa0806d454ad8b2284e4e97a3bea1b6eb87d7c69b7e58896768d5a25ded598b93368d7a2711043f5646f54315e3ee79ef4068f7d3e450a7e1145e71e1af8b8c0d301646bf432fe2ce8b578e73bd23c474d222a22414436f3830abb0cc8dcc78142251a362fc602bd9482272f878b7590eafb292005e2b3680d3d49f8c67641e7b8bdbe26f7324399d6b774f40acc8f2a673e4dc457c29d3ababa79aaae4381ba94996910c1db928fa8120e73ade5b84330a235e54b87cda724f8381d450c6437ba462f66c30b95b1fb10483100322d92cf70bc685bd1d25a1b694817e9f76290e4ce7531433630a7e71f9df7efe7397133051d13aaed7150fc171f489f5d5b14df805d85c4de6cecc87a139868201e21d57ec333773ca36633fccae75c08dba3e127720099b8b5351daf24c3a56a8f2683496888b8622c8895921aec30b356166ce3dbd5da5a977b72ed31709cb77fc04b0a15fc5d6acfcd9de55b8415eed949d71a74d10b9e6973a1c12b7e773312a1c647423580ce836b9221abfab769dba61bca670d5b189aeb2ee504754300259bd2db0af64c41fb635d4040cdd9a92b2c34f431e180d3ae3d5e3020d64af9c2c71d88b792cc1746e3fcd5aa0a4b8a2c42e0a27b0727d85efcb52a3aa4c4ab2ef2bfcbcbc293e6e82994dae61cd987c0abd22a745220a80bb0d1fde195b970e0efa73e50fa2c31b617b0008a8afac8422baee187d860655c15b098443e3f45131d0dadedea091969f8a53e3c96f7b03acac85e7a3c8b4ad2b21eadad9b0c47dad47b8549ba32e008b305f4ae1969b8feeea5f882906b3e9081381d66dab8e68472871ff4395a0a13c5b858222d36db73861493848f39246eacb80d2b2473076db00e9b53c8187ef0da9384897dd261085a5ebf781663814ffd248105bb00c4d91fb7c6e7e9a8b0aefbe9014e637f5b5331d394aacd25e2a316885961388e6cb196129f285b400e6469e8ad860ea4ff165b08b804d17f73c53907ddedafd82fedd89b5b6ea91471e412d433ac5dcbf9660b259197d2b6dac1a95e731759c1c2f84ac2253ef6c27d2c8a861ffa7d616880022186197c84214bd2e12d8e2bd15497e62cd75f1684169aa99993ef801e9168a951f14a520b137607aefcc465ccdb6a0b9c72283b49ce5f2d8676d2c340db2134337619c060ddc2a2deaf27e81c3f7e5ff3fe8bb650e0fad79e9710d6e9c4422280f9a889a1315797eb515268fc3ba53862679c4073b021f18066b5ceda75920534e5f057031b5140b640a7d129b69d20d48fa2c3f5c82425e99fe1a0c4a02677b69f58156647f6f9ffc2113d7c6426f5ad5cdf0ba7957db8c6b783d9122ed5503c1b673bff808114de4560e9ed04289a692e14da1397c94053e83cde5cf6f5e2ea98aad4bf4f3f36f2f1402f9af86d7fead3ebedd05c9dc7ec947866449915b92bd7f430103506c4524501959b06bf258da1dcdb90575220ddc64e7b00e6ba39800fcfe0a8fa837f59e9dc4a1fa4eaccd870654b10867b7d46fe9e3e73ecf7069d89fcdf068292ca11886cc6096122f388a4f51c0b875f7d1b9ec77ef604697cacdc4c6dc7a139f79b5b0a640a57c6f4202eceed7bbaf49bb8d7b30a2122310d0360ad219bdf43d70a20068f5c26bb5f544ac3a6c2a50a1148883f5cbbd43e1e570d389c055a039648426a1cd5babe4d6333396f496173fb93ae489b89e2981959b17afb2659479f6e72d19c150bf4d89142f6b916e6296e2e7ec1fc8143333eca8819b36c3bd51a9bd6315927e9706bff65c748c5ec00bc6b3a148f35dbc9b5f0ca7f88ae41aa1c635fd3db431d830303abdbad59eea7fae3be522fed4fd0765ac495ad27b56afc5ce6bfc541d8380f023add77e3ff1e3a637c693ca242b897cd7c7fa95a7f52e228c16058ee752db5c8e3aaba3ec991e3f9adfbe474fa47b10d3bd6955313c621efcf3c984e45842e7f5f8fd5b3c2bd07669186a3ebef9f013625d27868e75754cd427c571cac3ae64297f5bc29e0e1be71ca18d284d335d1d4e04ff011eaa55752a1617d4990f546c2649da82c6fc708414ad0561d7a8d03f365cec4e2587e39fd87b72480ae2ad2432db6bcf4566d25521357d6ea9dc8e40cfbe347ffda7a1521b7ed72ae2e83852cdb45fce7bf09b87be7ec34f43240be2b6b2582aa97862f28a1fef96f0ae12bd05493e91b83d285ff88c1bf9f743751a1e0c2cc64b053c8edff3994b8850d72fa0ab85d4ee3d1b2ca5b78f5920e26bc71da80a2e55113927ae306a1654843e3494c8e60e3ff67538b933636561b0a4d54d0226e12d24b74002f817b27b26dc4b67eeffa033b8e9c933a7f4c0ea3b3329f55a524c40f76553b64484f54e60ca865e102626c9883abbb71f5cd523b0cadd779c8ac1980ae77ca6cbf59a58cd1b9c837914b97494cdd968aceec91c112177a7264f8cdb2c6a94c689de5d871b27af811c79499cd4633e20a6023438bba33f68967c9044fe5f6768187b674eb555d6e753a399670db97f2619e1e7c5fa488670e0f50fff56ae108bbcf96139bcc00afecf3623c50a0e88be2436014d8c750a52b12c9d9375b94a86926949723de97ef5f7e4c071f0e5e4fcafa18e06989bb74f773f8a71aa180b4fbd5e361e751e7ce1d4e4c4b9ddf360567f2100e61099d23e57febb7be05882457fb2bbc7839a1d72b340edf3531e063e352057c2641ca24b4b2879bf2c4472b3e93b5ec213406e9fe0f1c832d9ba86bf4ec59ef7e8d956a6cfd5e1b48083d7e1c5820e3bf42819a096559dbe0f17662b45d4ac4e0bd5e4e922cdebc75a8bbcbcdccf23481769d7e04d1ca914b4083c3815c8989c1cdff5c55dcd6035dd850953d33372be695c443678f0ae3fe60bf50fd3f4b1f5df4822182dad9b901f58eec4efb714b84caa48a6aa0908eeb8a6ed5cc8bb07e2be3ff32ec2c6181200dbb60740903723a6f1e023a83aa3eb8ccf9086ef7e6634f6d3520ce9a7738f22a56c0a9bb86c267226a191ed54392bcf4e3b45ce90b02d7219747febbeb52e20bd9f8a867fce9e63e101e8f1fc2ce387e460a6a2074eccf3702e3897d31046ccadaeb4a06a38b4a618e56aa5fb26b398224152e8f6db98b8844854fefb5d30d167cc4bb0e6ddb39b7891341be0a779600c8b5468936f534210c18133d0a78ef03db7718e91ba37abf569dd3c4a7ff6f8b810e8332a447ba9c51cc6ff76606f6df786d4ef7a222cef62c26bb2f9e028c2c49e34afb47be196354146c872bd70d314c5b1036d3beff4a418af892e0c7b409c317017db1747a89b7e20eb2f36e03c23fbe5e525dc76a7b06e1812b6b2692b9fd839ce7c4eda6d6c03d19bf5c8c01e45ea167c2a8b7d863a8012173ad1fd7adb9198145b6b3dbf2be24de200220010529b83e836b138d2ba9666238d89f7454981564f85c6b2c1ad313157f99beedc0be79ade2f3f558b995b48cc2953b573b10774e66a4072ee704b9eee248af3cca55831db654beefe2004599872344754229de80443db174ccb9e72d4b8c44b2490ace3de966a7da93b2767dc41ca7122f3a5501061c1d483ad09f82c214b1dcf0aa5d1e6775de954bd1f2b514e09cce1534997422b6d3ffd5777b43f64fe3eb5200fb8267c26004dc8ccb75a4fcf71ba0684be8574ae87b4039d49ba0658363d4f195e73d900844d46f5a7e5045c9da634a73085fa35ae47dbb78304bb8e13eb68af4d32fe6f182cffe622d295d80fed428e6b30dbb3f2b6054fc2a1471ba0e2773b3d231cb07ee8b4f68ab67935975f6bf34432e8248cc92260a7cdbcf7225e68d0347468b710b4a22657a448012efc662d55315f635c1e53c3c0105d13e8692350ae805418708e7f636d2f3791a143292d116bfab03db653bbd56a3c79c4c73cf8dc11840e4037b616de8738dcfe5a057628600c47f871c5a6b2e6d0bd310b23e21ffadb7b987ccd496e555c8cab8763a19a2e681df875e0ff2afe4e741866a2e60b69919d3012b0a9c796d2beb91bb476b1a65b058238aeb441c1eeadd9157a0389b1408a617bc6bf4fb0da5eb42b38d43c991e769b33d4cf29d652716c9719f9b2c9ee96688c042b33131e0bc1a81ba23d01c0a2512e3e9c917e70d40f3ddb3434506fcba66bec81cce9d83c2e098444cccf300a4df7807b755b9b94c1465d51438a7ba0754986d0259cf34c2b108dd806c6a6ab656d011e14ad5850e9ef2b50b3ad519fe57b5b9beb250a81dc09a7558f50ad04154dcc5a0df35f0793460fc2d067acb8a210633f6b581d9b8e20a1079eb66a53537fad6a09e006447e86f8779e7d023cc811392619763c46cdcd874adffb2ba7ae06c30e3990c74500f2475ad74c4cea7cd72df4f198ce564d00cefb364e57dfa45fdba33778db8136b2ca6d0e547a53a7cf5f3a8827850b132ba345dc13d5a3919e95c6a7936c1a946459b6cdb4e19903e47c648b3743dc9d6cfca5dcde9d02791800229dd7e4d8b7a2408d359ae22667469dd399ea9ca27cb3d2ae04d812651324620582662dd4c595e3092657d78a658c77562a6f626389025484897bcec21c7b8ca42d1994ec32803cab2111ecbe7a96cfed3bf9e7f7cc41a93870e27ef78997b24b3ab89c9148d0b1f786229a61c1a31312ea5402c7cbe13101659bd25fd67e06f305f3561043e77a78d85bf6ca28218e56d69feb2ca4b5368d076ac95da9871b6be5b6cc84936a210c245725a79b0ee1acc9243e21f80fb3690596699e9ccd3ea7124451dab212c22ace76338398b7b9db125886347eba4d261facefb0405077f2091433632483e2dc7cb7d809db3e3775f1ce79dda5cec641c543923a8c6954bfc86a36df946892c6c0bbc51d3a54dafd554009777d30a0c9e9c9822fadbd98bf7e8f97253ecf9a4e5ada551f7af5199d3b34d1ccf5b1ecb3f372f9911953d01cf95bc5b7992e728ec99208bfd174ab049050201700915a8b729f1b3e832490ae91c3c609339e45f5d75beca838e7796bd9f4c36006c330463bd672bf96bf8f54c30234030983a3374b8267ca807ac10338bb2c843d15f368446a27a6796b8a03988895a6e6f829ac044d997e3842712826ae798ed16b308ec1fc1afdd9defd333fc61ade00b4b78534e4f698ee006b8b529403e74b0d1a1d7315cfc9633eb95e6442c3123c98f22114f16cfb8a12546d03256b7f60f5123f8322c0009cfd587a6dc126c7ed4b95e8ccc01d0613bfcbf6187fcd985021b54a104df07691a82b269975e6eab341dd7970474a2607fe07b732709066819539740bbf759711bd3ee3a7c0b78ebdae56946b9a1d1eaec6113bbc8420502b836a9158960c831b460ce4892b51c995e2dc2df5ca22c78596c539cd84e3fa30dfeb491a4cbfed49b0df9327f5d7c706d17169e2c4cb4233a11477371b7eef7edc6ab19d42ab2e53f5fbc32db885f67956661676e2920d54840d7b3f2b7b8c20090ab7f976bb057aea486e16cb4cd76d7dc5f32e730b15e3576b215a633caf45f85c0bd87f365a655ff1d35469799503f0baac97ad28e42813c6ee2dc4145d4d0dd7c4709953f84d1d6d59a0a893a3471b8d6f4dfa1481f770ff47ba105ad468172089ce0851a7ee6b2b524c18530cb946d444c5e809e926184512d08482068f04ae61650b8416a85a7121f255b019498879db26459b735552f2f582a6b373bdb04ccccce69fb75b99d14be72f9534c867ada32a911d786b93d1c935ffed5a849840f60f85029441b370c071cdca8e85afd87ff18b1be759c0833852d686bc408fa1b2e8feb587dd27e410f3816d05a45fb5f7ed4165cf6bc487fe4cba2f505c51b00c9daeb349eeb1a65c2b71742c9d411c2bd7b513afe3263c3625aa29b33e89a6297a48dff13c657159a7a9e52371e17b2b624e1ca0a46e02dca60ac45f6460c758613206a30885e528292a0d67f83ee903f3ef04a1e2921d60b2279bd8cd2367b990af95e648caced280410a59c4fbe576ea96c2cde44fef0a41a3243ec0d3b6e3ddfe13ae2379fb028409a3da7ffddf04272a7a109fee2e3238cb9df63129a40157fe86ad70230d27c495173b82de398c4039c1069b3cb872c6289feb8bf66180de414d78472bca9ee9befabd55348d392ee410158c07611f99d1fd0643503e29f6cfc622e53021047157c651129624e08119a8af3398c02787e628bf11034a5693aebbfba42765c91798ccdd3b8f70eef0da6737cc2bc90357912f611974ec49fc929bf3325c87aa0ef6506dc1ae25114d92c50bcef26be1f1a1592f0889747e609199454ce1cabd79ec9a54baf327b2c7a956542feddb2aa36c68e86c10704ee4f17aa045598de35e98cee4f539f2c305fcb502f6ab53a625bf1c0eba067e16b70f763167ecb504a58cb8222eeec73cd8ab5462e58e7ef736d06d7598d90e6cd85cba800c529a3c1e80bd750f35bd5a49a96a3e444f673c6ac7de6e6b7c0540bdae57c87fdc5ed328ae0e86f3a48b3982d5062284d2f1d59fefc2a272acd60422bf97bcb855e53cdb6583a162d4b3c880ac7bd99aba1fe4d3c50ac1a5ef94a256a0f540a6c72765a9914354df1817584e3bac7e2b599994c409ea5dae13a89c5b4b566c085626c521b5597159f4b1a5b1a302150a9d83c058406537889abc8937286a77b796fbd1c9ecc9b63cdfc1292979d76cfa84dd98ff74f9deecce780320fe2bfff95b24f335d1257185eee2f1591d588c1f0617a4905cb7ebfd1b663fedd2454e49b83c16d7e5557d2ba48f87910645b854b21d4180d2da2925e594375f04f927da0ae947fa928cb18f1b23c5631d124ac831076d8f044051876c9d86de10f3e38404eb908d3102274acbd522ac81788e92cb2cc43d12da2640bcc05376ff15a5cc821452b148057658fbe3b66a39907d0dff6f5a1f5b05a7a948dc32322db46437809ccd2c1470b018de3badadbb53e43ce1b334b5eef5ca5f8bf5cb61043224e373e4785fd73af5036a0824c2abe13bcc4a8e121c8379c8763ef0ea4210e8e4e26e69514f7ea897a2e0fb2d2ff7bb0357e00481d57f93b6b3f617cf9f997242fc23391f9cce43c9f9d7b875363fe4407efb6bf65ef4f45b2d673e5eb46bc84342f0af1d70955f54fdea3fdefd793eeec52d385afccefe537230781656ac86b2e3ee3f80216361a210a351ddcb20236dd288c92eeb38dd96f5ca1555f321c88104e59fcad6fa1afb629219aad967a46799ca6a89351f9f0ccbc9fe8ccc668160eb91b0a660746db125c579d97b4d735cd6dfa3c619a6b65aa0adfebb680603cbfbcc3c2c7f2d9ed24cf2748ab15ba9942872624b985f34a82decbbb735c19ecda37a8e8467dc3ff725e2dc4ec21b92e7a9c4ede9693c1eec0ede950687ee70e064fd2df5cbfd277cf2e105cd24153565e02a1cdaa87f0b99f5dcd1ed9c70e52c8d9effe7774b400fd4affee76ec69967a3b80bcf476bdafe9cb7baed5d06c27fab052c0756d8817f12a6acc1bd4530c09a87282bcd6f76f94e0faccb1eb32c8a346f9961c041a47b4660dc21929d99aa41c8ef31b7d6b1a08ee6835efc9e74730037fd59ca919dca8dce89e7517b05abc99faf2a6d248db80b189ca76fb7435326f8fdb6caa7e7a733bbeb33c7d4fc2613bf1dd93c3688e166972fdea9db9e1a2281c599fde1d4779ed574920749aa2676b64340eaedb55505d970bc871fb83c7e43392cc7afa499ac0ea2b711e1607e2f2316ccb35a506109ce2398f4c145dbf2f592c72b2ac75a311e8008985e34e72c314026048cff94d7f91dfc7ac6998c6d9c62305ffef97c340bd3889f30c537d9419f1786eb8e17d8bd54774799da2ee45977b2eace70025481b5bb7e926e637590f948bc70e52b0ec2885f7522f3cb3e9c4a0dfd5425a6ed0157557a29cb16736c4fccd10798826685fe60a059ac04c4573fd8e49fb6d1ff10b5f27cf9df4619fcde6c494a6fd20b2d58b3f4256dfcb12f95b11e07d638e19b79ea5db3e91c372b1f029b704aa615aecb7ad39cb23330b7d2fb54aafe74888a2d3da1d5b7dec9dc2a2d7cca2bff0b4a993cd3e20cba044783fbadb9b5696297bc6ee5f9276e107c31a2cc922436c78dc6b67c9d373c21d95011a6d78b674c10aed436fbaa4a15fb4dabfb4908fb32863869c2cc90d4db3f45a540b0f2e6732892d82c2cd5b10d6757578dde0361ef8bc0eec527bea110696fb7560e796d35a763361bc0051b9d248942eae092e80bce79036126a1a4b56741db3c9aefdb5194665cbdd9b37819e01576487a5da3836020ce176259d60bad1bdaf946bda403d9e5f47909cf93062da6d55bc5296bbed5b076d71e7019286426ca22950bf2c226f3da0fedf8e4e5a27b600e9580cdb9677d0b0a6de41b601172ecaa3479d6da106f9b70b3f9808b9254668570c1ea78d0b56f9f5929ed1c95a684a7947987f8fcd79433aa2d843196e8063acc3a8e36d21c04fd6822bb3f4100c131de827b03118f219e7a6f064e39cfa2f9798278cef716113b85e4d319783de7ab9dc303eba9b15e75c06e8085a7b0db6390e61b8302e4296925cb77f136b5b528050f5470b1b724425091540007e42707462b5e22505f94387050146fdd9820f1303f8bdf49cb40e86b6fe5b7d768abcbe99b901fd501531ad02fddfd5334fa5d6412ec06e324ec79b9047301b143f5ad87e5f15da821dd2b19e275694574f97576595290bdee6722417380be0893e04b608c2d936768df79dc83453e8aabdf8aa12a422321669d69d1281e02d819692c6fa8044c8b3f7f147d122960d2c5b9bd33c3cc277aeeac9e614879bc1b117f21bdf77534f5ffd01b2183c0bad84992a24b14fae377f49922e2028dbe59c901e2f1782d75b0776b425853e5433ebe8d866ca45c76493e6cd7e90fd5198b0447c6a4ebefb81e349e873f0b7558641ca11c19e6631d50c15fc56d840b8966f65de0ef4478e362abe99956bde0cde6d57a292977dbca1819129ec7209222cac81712025f53b3eec9d0cfb3b4bc3e0a3fad077bc758f6c70ac3db145005bf95f92d6aa875c8d92ae5d2ee3bd20753f048a7f775ba4e25e09dbfeffc429261206faf3a58f21078bb76eb1a66e7ed7b2bcf19a7c9fef7304b703741fb01df49cce0b66cce6b5aca3b725aeafdb5eab4aeeb6c29f4c5cbd65a5808c8e580c600efe23ec367d16e3a7cf1d0a949e63be18fed4ff1d8106e65526547018e485f63664fd099fc114298dd3fca7c22f0537942d8c86d0af4bffb296c1cf9f43892ecb3242a07d0994c80dc125b635ceaf4fe83d828b0931ac348841d29a1d4d4ec49e8e0b02413d0cfa113bc69b7c1a514f103619c576321bdd7925e130bbb96306622c8a6a7861ae61862309c5207cef9df13c7fa0432c0f3195df01a744d05567897fe3066a467e2c18a8a7ea7a8982b282fcd560f71df852dc7ec94ac0476e3c817fee12ca8c83dac9cd1ed8a5af9d474a2b121044aa4f560eaf848609e0483171d11d05e7e0dcfe4a9ae072a8883cb3a7db0b6b4ab5553a106dd1be1037a7125bb4a4160592bd2a15976da5322dbcd9d0fc452d7cef1a1e4abb0da5edbce8f6b60a732b06e317551c4c16a646e56f314dba18583b5e68f649ddd9b841585f421fbb60c2e90162a821d74ef91036c6b306f8c74f24e7e23ac1bcbb2dad7f7ef0550deb1f9c56f3aaa088611752b2f3b577413e8fd3de4f6038d8b1355012978da0cb9b87d2b4a0385c9b2fa678b0adaf5fde312d126618b1cd5ae4bd5213d87a39c8a6d4f1798811999264121a174b8f377e7c42271a99b83c239168fc75417320db96eee94e4b44eb6cfa1f80928d16ae46fe03cb364357600b45b30af507322ad436e78b1d0b9c8de5f4196e2c31d95c9fdcb6295ef74b2b39952e1b166a18f63047c90d0c5f898ef3eb2725b81ac8937a7f8816e66771fc5f6035be38c1fe91d71b99727fef01e5e3e1d2b22726e8b900ce62a4ba7b7f3d372cfbba296ee35b90479524996851d5a2c9855a75809d84e73389832964f999f2994bddc71692cb4d843574594202918c0fdde308cf84193b60df6192cb08848a8203a2ec66795e2837bb421dbb3a30ada55100788e95f27a15663f45ac30523937da37ab39b3a3833892f66eda8ece0d7e664ff5ded4156362be4834287d073c1f5317c682587f29d81b12e4dcba5138b7508d2af318ea0fda2c1a731f784557adf9acdcb8687a5951f081b5f3a355dfc7227f27b63018e65d1ca977738b1b3537000fa35dae9e9c2387bcb24b63f05270d72b41cc28f96716a929070f9f8f893cead14e2237514bd6d52943c2ee71b7530133e0fbf3afb0e75556b67231f37bc967466d403c7a8540ddb59478868578a211e64477bb7f44d9ea20e7dd695fa0213d9be1179b951a898d8bff2daeab996e04a441a5c64306648d49fea7af15f9aa7df09445efc941b131bc26f0f1fc4fb252534883db62463887fd81c5c8bc664e69decfb427900827e136f6944c278cbf0325546751ec3d7ba0f6eb2a429fbf4186875d3f3fda2b9829229be6832b63ba5a03f8f79c7b1d6025fccb5dd09bd011a3c7f086cf986f6b0963f19db8021d6da28293cf1faabc749f0cd8d1e2e5ec61a4968c3315113bb7b6938716dde31ad67cd6e632dbe675d5435e46f2218b348ff0fed3cc2f1a32b45ddeae2ab17a99de9f3c53c8ac7f65786633bee599be161704214c6b666d6096e8d97c594a6aba903809f8d52f1c22633af5e8da0e5b5415697ee45c638822890d27d7728f781a40c4906b9a92c78280511c0160b249e60c436177da49f614ca9fec7db1d195b60a773637789d3dda669523cd4734f6ef2b4a13228de181787634a6f91f07ffea02a65a9cb9477fca8c52d6f3e5f45332f216cc3ec5b097effe716822eef47e14ac410aa3923a5755f80b963452bdae17bb14b084626bf9dca16fd57e32fcaff9c472e857258733ebbb9db567431f7c8d4782e6237930b60c622a4e7f1ae4341ef15611c763fbb24138ca1802cfb4f8a7e61e58178e73815fbd3cfeca861adafd6f0a0f8405bec8f663d2aadb24144cb507e41090badcbdf2bff35db59ea67fd8df3cdc2325c7eed6581202b16171cbb9c9f6c06f232127b57392d0ffcd8991442aa8aff9518047b8ea782a9ad1de1295941052be734d10ee447ef1d35f2c1c1d68abf1244c7582a9165014ba803a14c558626515abc5d1eed3b74af238c101e030e25542af3593df214706f37eb470de1c8ed614301f776392556df52f044fc8ac779e31426d0e46d25e9e2221bb722674d7e275c939f61baa302ab792c2022b70d710be540b0a7909fac97064dd217fef68b9bc6c35f572a47c95177c064bb0d6465a8fdb2f08bc2da4c0bac3686d3c7e6330b25e04635d07efc51144cecf455e74b195f95483035a0f32dd6fa01ff57ecc38907287584bc0c3f0a943952c292c3905176248e78541389f54a1ee5ab26eb06bda21bea3797c8a14ed6fecdbcde5368c1cfb56bffff078c23cd186ff2b34895fedebbfe29af5a3f3e57928ec0dc8fbd85f72a2e20c8368b53809630889f3defafbc29220516af1b73eef24cc67c1bd155840fb28e2a58b93b9903e54cc18e2df6087af4bfa3e1b205e3e8d7669c5d3c451cc0c14fcc0bbd18fa944a105820f4b3df126fa67e9e89710749066471eadd7cf7a3a61a0ab5b89fc8a98a6ca711cd3c43736e3ab49e4be7f8d3daf3448d11d36b06ceb0b5862301c7dc97f19241eb32499fd8ead8a145c1fc74d059f658cbdbfc6cd283018fdc4b3f6f9c45d613c3cdf6479025f81c850accc5415743a6a5858872f746252332ff5beb59123c76717e5dbfd195182fec0f47ebd6c25114cb8de2fde7ba8c5ef154ded89646b49cbbb638321668ddb0ddbbbae6d7c6ec6fbdcaa99b5e2428e9e9c8c55cc45ba55057fdd0f548a55b87add80e896879e9049ee024eea1736a57c9e57581034bc57e6d3301d2e1b378c4d3e5bb69747e4c2bea288efc25199ba90b45a66b2574830d7f7afc243b06dffe7e3f826aab507cb0bcb29fcec854102a689bc3e09dbd0b541388dec5b91845f3d36e9c30914ccf1a2be1a4d8dbe373a877f6164abf1ce945063dcc468ad11fcf80b21b05632d5843ba5404438e9d735ea1e6b83f2ab3e67dde216efe4fac081dc892a4cfc0a7e0ca3a2f660670b4ab084046f9fcb832faa9914063dc1b628f02da604ea03a363f9aa1f5e9754e4b79e1f3fd181637a7e58198e25aee43612c532142ac7bb4085d03a3db841e2da6676aa5682a7a24a8c39c4616d616799e7f6c541e079cbda6fd897f69262b0dc1e86edd0a37f2ee600e6d8367b31c7753a97a7e3d1bb89dac281df1394c2a3c88b4e1abc1a50e7dca5d9bbfc58472d94a78653649170a128b1a0d3f5d25f2b1ee7305b3e9c5857e3f46374d1cec25e80e103099e4ff504fd8fe62279188e34610a254de788c6cd50a8cefc347bea8e2eb1fba8c70c1794ada9f9ba70333d3c34e45afd434feadc98bcbcb488086687c1617c360d82eeca3ea38ae2627ed9a19a5f4588fb2e5baaf1185b455241dc9f5d48f9425111248bffd760d564d07268ad50f968a625c5e249b51054f089fe08eff303963a159495e0cca7da242367a1a30ec19da99067985c8fcfa85247d14132ae96f301a2886d9d0f83cb55d588d12d7928647db67b9e1bb46950be41ba1e19eecd387504f64fa03cd77be9ccb54809850987b12e9ceab0fd12904828a10ed55d0c1383d42efdc4d7d11ab369aacd349b03cd60fae116f55814c37f4ee3cb5ff1e45d2b9704995751079cbea56e7d2aa8e6bbdb740b3cea890eb523a8925e7107cd10dc62bd72bcdf0c98bb9112774941d3f1d2042316a280ce6799dd0767dc91dee9b24f7ffa25632ef1da0b9f2219f5fb2fa2925b70805a8d2cdc01fe62b47abe6bd1b46d523a94dbad4d2808362695acc0ce88c64218c512f69c834eade6ee5d70e68cef2d1dd163942ae71a559f16b79df45b1ffac330d682faa125a778a38709ccace149b16f2e64830f67f0412279de206a9e41bd293081fc87c7c129ca57dde18756c3e22b83ea98467a5fbb4f95d1531f471108264430ea88dd1ef4037b87cde13b3adab5a779332147459b3f9ba9380ebdffe24514223831c33ed12f86479461b5c8fec50fe7cf0a0788e1b8eae2d160358d0d46ca4b0585317ce4f3e417c2d0a6d837c13a300e1e458f8ecf06763082a533d186034d69e6303a74a68251b0a3c4898cf9bdb8bf5c0403fc23d3032b347cf358fb99e750c962b355a3b8694882c2d3e11ca68890ce126a1f4966cd164264cc5c8d4ade5c38dacb426a32499f853e39423d4e5341e4edcfdeea90fe57ba69c62e0451e3af948468c97d6271c7d5b0c6974c813f58bb302ff66bbfb1bcc9cd4518d97cb3a2551094b322a76d33f44bc60ebb7867c7d009c0def1caa94482711ffa3f945052b129c892d5e741e186ec609273cca7b223772aa5aa872b226e971bf806577b03fa884bd144f193d11d99750d3232df1de590dc1af12171ad47eb14baaa8568d067a6816037c6de52969a09c9fc888a00fb7f9b460a32676e587b5a63cf38662d70a8b77b6bf428fed80ab05f74f09484124ad9ecb94068f842cc849050bdcd9758085d058c64dd1512dde1775f854a5ecf8ae101c865fdeb8f0bf07eebd1e7bc348072c8160d7bc494948a4cb2f6d11c4bc3422f8bed4a125c7d5267f98d466153114a073c50b7c7796a52f226349976374b112bff6e116fb05205a757f6b02711413de8eedad6a10e5b596cef7432abe274ada513580b9d634f1434aac8f1babc6e90cb64c6fc29566eb78751f8a6f2bd82bc785257da2e96cc4091d2129180843719f5b27e4b3312dc596c6bb13f9c514eafc9a7b9f119b4c52823147fb728d216f35d3369077f9022938fa170b00aff79b210f0daeb06dafa914eac98e2294f7999a984b04eec0fdc6c2a9c54a1682b4b5a7a707f29e6259fa4967197a566b92ddfe804ba6f9b2e0ddc9773e9882729002d575ccc4ce2354c925cc5823e19880fd57cdce9ceaea58262f77a4838c2eb187cec21121456a730310cd9b68141a9ae073f7df1501a8fe973168a5d35d17626d7eb6e0b8af9f894be28166d56d4e545cb32620a0d3583ceb28b7b987e44a50f1b2145a153f55714740660e5f220b51817dc86b74e0cd00182993d093940554dcd6b6985716d463a424646b6b8788063c2ccb7f10fdd6b1d109e4dcf054f790364d867753ef6f3ccbf817d0fb77ab08c1a119d2f858f9a1210018cfa98b75e05d59335b85e021007d54aa0df396424c34afffa3abbbcf40e89eedc792e27f6a930b6002ad976cd01d7be83f6d08dde8af05e3f748d8e3ef789aff9e6bbf3288830a45ed4bf49db9ff102767e4838c624abe004604137b23050ab75965a1840a8bb124fa788300c7af9706ccfe74c00b5604cc8ebea263c6ea52de03234d0404d3994aa88341ec56b781d4b6ea4ee8f5f4b6a7d431898207ae68188e6769545b57cc9614e36ba05a74e81fc7cba7be6489ecd00bca3a03122185f57abd067ee9cdcc5b5e5fafdaa908f919e6e9e8a41e349a9636ec5f6af28c9dfe9964c5413c53406d4ce6745ee3d9eb87ac880128c02918133b71bf9bab58a3318b1fccb4bd50982b3df90d810f70aff430ab1dd047a8a9c5cb21e38420a667dbedad509b961d86a03089203575ba09e11e1f4055543f8887f30812dedb79f0588369f9f8d8371b493b2224347e64343d68d72a72e54ff0a27146d4ba9150aa9b8db4920a894b414cc59ac62ed01da1bbf3eba15309faf711e7c9f5dde5fbecb77d7531f413917f7839296d934233f7969364bd478bc35bab2ff0bb46fbba4a0908f829f6ca2ae7c1460538a629f6692e748690d85263b516ac8cc121bd543f2d6478f578387f40056a3243f0e0cbf6d49563e57c0d63a0d51f9520cca3063bdf991a422e75e3d5be4ddd7eb0e4adf907c4560114acf4bbcf098e03729ca010cc162500bb740a60864f9d139f22aeb1d2b6a2746cbdf5fbc0512beba4edd8dcbece61fcee6e0c0c4ea752d2614dff21c24fb131f0a801aab45f2c546073e885bd2d9a3dda56a8780aedbdb2136f70a598e035d4686e5db725e963933a1c4b717816410e1e224094a00542cef57d6da43949c2ae42eb0cc4993fe22735d3f120fe4e7056e376f648ca7b3a2995fbc5b8987dc1a0aad8e817eea62f0461b7e6ac802ba258edb743693e57127cd7f6888e7d077160a8ecd60ea23770115e8d2c1be8256c03f9e862820a73e05af15248524551a55ac8a998cbcdd1f1749d3f9796a677dc8ae8ee8b156931a5f4ed077f2a72cf1398d51810c71f6f8a15cbd5c69a3c8dfb6a97b55bc49494ea1e58304645cfd97cd6ac9f4d19567ef932f292c7b489e65c0b4f60db18f76c540fa9f2d9e40b8d4dd9cd9eeb03c129e764bf9069c013cf16118aad6355dec1266334affc1717d051825f15d8c1cddf771f983a51ca2b344be39e4329a74e123ea63f99d6fa0b5e299f6213ac362d9b533a13e29554cb0fe36f8b2ddeea8939cc7aaf45d02cee30d957700dbac91cba2568054409559ea84d731a7e1e12d5afb5bb5c21d33a4b520e552761caf4e21a45be03ef5f7941f1892bdb0d36411c9847596996b8b4132f1e0349272cf42510dd207013c1f4270d421b66d6984b758ab9c6b42ed69a0814f73715583f6358cce33bcf71f21eaf1294f5b4dd056a9e0abf3174f48daf2d7274fad7ad7bba2eed1eb65b58ada0dac07c308df3012552d4445cb2ff206c211cfefbfa347b933c2d8d3690b3068e967b1746afcf77f750f124cc2d5e0bdb0c626f5502894627d7d318b260c0b1f8a0cdf06f70513d3585901e1123ffeb71b7e8cd8c5407de21c3c028eb655f7480724438e5890d796bfc47c123711650b92cd45b9c78268267a81367712fbf5e5876e46c260bcd6e6b30b1f58e9e3f83c9ae179815893e1ef0137e6230f89da1378a4e915a543b79de7c8e20c44973dde6c4d76deebc936e72d715760a6d6a670666607cf9eced038364cd15b3d1d5c2a76345cbd4d95383aa2ce51134b3bdea85c6ef658bb9e0e86fae75ecdbfe516c828add09a44d852b38133b58a00c9f2c9501d7fca5105c77fdb0e65b3a78907a36a03d16f124a6025c0841403ac5df0e9d0d891ba4e91c32ae63ee1b515d9c84dcd50c1919e563ef82d5c660262f684a3a696692a4207aaf47c40f003fb9efe3809c80b6604079f83575fd588c93b304655bc4c0a4f1ef6af573aac91ac0c05ec524dcc58d11bb40b358512f77840ab55063879a2bd3995556b3d01125e7f1341d16a49fed7cf2e5ebb6e4e8b60e202494ca3e39866a891f0663a5bc6a2b0cd83006ec173bba4d18de8e8126a2b8bf6e7fa98ad17ffdfeb4c00e369695d3a08d1742ff9f2b2be45cc0b95f8e952670d95d18910755cd5ad343061ad5d391086fd4147476e3d908e0734e7d93d14412776d815c690d79b08958c3a6535a4bb58a3c5e1b288961543d4a29a0453a688bd538104cec8537520071cd2a49486c214a52f9183d218cfa463fc453a5caf3a502ede8488f0d8507b4843272dd7e494bdb0e4175ffcdbab88ef9bf92f40e1cd4a932e41fd15f199ddc6eca000af84165a22b139e43f94e476fb83fa2fb83eb285d0619aa6c9eebf377cd3e5d0c116c1a96d48e72c02210e07a53d251d490c261902bffc7feb8c23559ee5b06ac0371a58de56c97a781a8bf42aa24e2119cdef9d86f8274a38112139cd16a7d1c64b1b775f789150e4f01faf0cbe539265ae5a796e37b3c097b68ebfbe84d6c507f72f376666794a784a218259a898594c2179d32d5360b67fb1eddad5446af778d1d3044b8eaa70a68d4f5bce94a6bdcd8203633e61f0ec1a11cf5d34145c2d6c8a00f2910ea8a1e405d70700a5e71a3532a7376de36b3cd7b71be50ed7bf3b905b20cc1c8445eeff8a85b052b6af711f3d486317bce5893a1f43c7ac99fce44b03d3b9bba45a7484e410f85157601d2c8b08518b764a68475c191ac9fcb7255222724b9e0cbfbce1ec7fc43bf7c5844f436190c045b6060ed7a3db5fc79297291d8063aa0b03f9a0ba946b3707c71888ca4a6e480402ea03b5d317754d9817ba135803884256e560b8f5249ae99da92b34a348749bf0b7998bee63059da7161b2c9b3d68846dc5579b2a1fd980327b1c92ab38963515b2a9e1afba2e545bae05574fea75e8e9794b898524e3e633771bb7fde69f10c6a5d85c0726fd1b11fb8ede4bc56c18c75277dfc468c21f355cae17839a32361316036a5ec5526067728a29f25315836d543655b9fc948311e3d4a946cce3cde8043ca23002931974d01238e4638c63f1d79482403cf1342620a2322028e081ea5bf2813baf7f3029732dad034dcae1bc8d23bff81d87664d2d2152081805e8bfd5c288184255c2bbcfcc675d07937a5fd082100b374ed156fa4b007f18914931b8479296800dee0a8b03284298f08a5ebfc641ff6c8fb26e7ed9c2feb82669c9af9c47069550558597f298536612a0dd3a3c97eda58bf43e39b52e2301b67de1fc664367388c8d3db9153f38558b38861364b878b969d8e4e4597eae3f8dc8df14e92c88bea7aeb7fe95c8eca98d4730c398bcd994b575931ba138977fff6b31ede06bcd77a28b282d96e29df8559c9018535c21c4c33ff1683eaa320c822500487f0984b66e17503bac619c4d8b0abe75675fabf6da3fb8c3d66bd7cc9586bc693ba77ee2c42112221c892af951643ad8e2d8c7d7cafbfa3795b4f7187592cbff0c09f1053a7a4c406576ce9a1264858038f551748334bfd993044e14d07b0fc58637d0c5151cccb12dfc43b1fd4edb3fd7ddbda43ef2224352fd09b5f4b5afa49ada150669ac5ae946f5bdad58f393246358d8a62bb16a80c07e6d5d4705e837a399faaad7fa597a7ee6ba706f19f2f0659f08645921d7db2c103365654c81d65492fc508507ae946bf628c5179dcbaa53323da003ffc2997a357db556b461eca2207178521ad7b5d5db302b165a741a7b250e5df0ba70a3e7711736fe0336e476a78037e7ab67cabb8104b835840c3c51547b5c5689fe87ec91cfbc5c3541534c2dafdd05315bb53e16bfd574e5b149f8646ea71b7fe87db7347f8163cc3db64a8aba1ea3363319c02e18eed10e06a1f0c33a25336bc718fccb8847aa31b50beb37fd4168dabb9fdb6c7b8099dc91f016428bc07713905959f1b033056a0c6cecdef3d6fed935479055240a7c9d0b745258a93d4cfef40e249212af6449d1eb60582f7e0f32244b776b25297ccd1cf1452e529489ebd8af1cd35c008770497c413dd10e11a17cc470561456f67fda1fd65c5a1e9930334ed2e0a2f56285d44adb2e268d7837b1d4673c0a86f6e0191e454837400b05e0ba1397f3400e51ced767450e0903d7be113d87398b829ad482a1298ef6feef54f28594a512f2934be4a7d0712072742c04af403dcc1b8ca84a17bf8582d5d93d4da6cf13f031422941744e8eb28981f9c1bfb13d38e7da12dafa63faaa58dcbb442eff2d29a7b223bed8fd7b8acf9d5e67c82e937f765575f9d8f6170680b8cf8f5f415dcb6c2738d5ecf14589a1d442cb76cb1d9f051bc7eb0e186b716b3b49dbb2a83939421ad7f03106cb44708f3ff0633de10575c65522f728d5aad65ae439e7d079c7f3acf8c2a78fc78ae42446d8f69af19e98309da57eb11a57c47c37d7a61b8b386029d4571a70bd796ec8ea4ae5ad9ea74bcb838c8984f501e59e649477dbfc831336fe57a420c92ce31b3cfa0c325bb7f51f334124012a21d95e919b42ec69f9b7af1b8aa73066c1a5760477e511390b3d957237e3c8d83b172198fe3327d7a5b765af6438268d00c86381279ef8de34699b4991cf1aafabc28d3c87795077858c9e9bfe6b838998b3c38dc807c696ab5fbd8eb277a20d2c9edbbdc700d4026ee9f37228b57859f390a3aab611aa401531b05c7cf6a2bfa5861994578a73f75316d95af51a76a847e9315a2b7bdcf58fc4bdefe8b191ccc981f4f07e1dbea8302b58daf049c870c5e098c7bdb92f71db540d2c8db99963afcc570480a562ec718be5f6e805f4c9fa231bc5bc680a96e252e2f976781fab0f5557c264e282b286d61ade8cbe30e1fbadd84ae90ca16b710c29bdb48ec7f0b9d3515cbc6f679bfae63f646167562952f4b2fc60cc46405a04f38f01414dc7567f424693d8e34cf3d7b3093244d85e854010e540502a5cf0060d32e70f49418832e1c31d936ffee8d2f5999947c6ca0d746a9ce985d137e18416e454d829573802237d42d7298c5db4136653ce418ce7921568199a8560ae5369688d1906daf2b3497889f41954ada27ee65aec60dc6584ee8549756a47971e03f4dde97ef025e284686652b8e802cdb007039b66d5e528c878fac1994f00a86ca0576ac230461df7db05eea21994df0d492d65f14ffd02cdb931d18cb1c26f5f8f4ce59b00ad5b79e2ca85a56c89ed351e8a789ea9809f3d9371a33243fc765a3b687fb378b035b146cca5102c2176d99eb109841f7d0def714c669ff39d508724f53543fe4e98e3407d9d15d050defedcb65dcb348b165b0b6809383064e09134c64d2f36259e4ee0ead4c6706e59ad12ce535d0be62d23a8bcd5747922aed00c0161a953d395198a20a87e218e7ff3fa235f5238c8e61209a8b43cb7846f9c73ef74ff1aeecb8480a13608aa332f6cc65f1942fc8f167cf5aa1377bb5faa67ad2d899ba64dcb5e9d5a49f1624fd79f1e2682f1dd1070b813bc7ac612ecb4a3dafef98fcd0bd3197602d5f083e2db278ea404d947280ddf61f5a187924e0f267d2df37a445d0fc6e72e16813663b297c901e7c0dabe0d9364ea1fe05486be7564beddb2ceb4fefd4a0d088cef6b855fc4e060918c8e26c6e6667e206cb0a649d89ecad84109fd2c54d0c7c5701a4b734480315d24484d545e77684c14d7803b90f784848c147e3fc197f578cb10d270abcd29c2874a99300161e995153babd0c2778e7bf7abf479be3fda2be1572d2b72f1278f0669b05594be0e38847ce861c528eb8d5c9603df9aa54f060b121dd6fdf78923dfa217ad0e490754477681656050a845dbb39687ed3c357cc3edbeaa62232806070c55ebd60a2263fe25a6af2ea7decdffe8dc3ea4916d9ab977dc4ea41aaa7a46f601190c329dad4e33959f8028eb1830fed6aa17f2213ca1508325df1a747137c6e2876bb4e8772e92f72a8e4e2482e261debba91181baeb6d002c4aad32656ca19c78a123ff806a33762355787014f4edb214b4b52d85b7d07849ebae5dcc40170a6ae8b4f544030a5389d76ec47773c8083770ccf445eb6e8cef9c191483032b464075796faf8e2a851090a86d23c18ec6767f045363917e4350f7a547774945eab3b5c203a1d51959e0615511b48740dbed2e9a8812922385e7ff724962e9c3641ecd5f03a89eec1908ed8c72fffa5302da09827c9c22f5b01c29e1dfb0793c1ac858857fe0e31f83f2a566a7f6fc9a5c69342aa8edc3fee703c6c0fc7f12d33d026800e417b6111f1d80ad2ac117e5899bd521e7d69721c9a57ebad0bd58d6dc8af026b53b1441abbad9f72aa65d06975104f9ace30963a6fdd9fe89bf86be98320e8db40453cc5119437de1b8400c551dfb22087422cc7a3c339429abab68bbf0d29c57ba58e3b83a2fba057da6c8acc2f964eefeed7bfac1cf7054011c5a125ac19c43cde013207c33e323665b70888f108feb69b23cbd6cd0db8bd13e28f575e5ef67c4028e5b1a72da51b8425f9ea64ac9462b4e1acf7d37b0701b4502b08efe7d035ca3d7c0a6e9e55aa0402e45fe31a51dd6af8c1699b8357d3340ebf345d74251268c74db079c76829863c2beffeb5a2cd33360d86a3a99ffd1aea4ba292c062320c9cff4c4bb136bdf94aac645e1ec395eb7d70bdf9d943333084bf01947d1499dd019ba0db27a1af7076884e620637b8b8b10f9f4d13651ae1e258843abad4695afad2761e7c52b9caf26cb33099225669b8185f659e61fd5c1cd63eb2fd456710e8331fb18e2314468f213bcf7d02ae7cdda1a44600083b4142bd5ebd4b517251fedd4be1a637f3ea56ae3ec0061f2b854eed9c9f95370c84193a6ab7e095e2351cdcbf8f5eac0106703c7e0dc222f981f5e72c64931967774f6c0ea9382de89d6c0ecbca455007fb46ef46c057ae1dfeaee617198275e4b44c516ada1c09cf6197c6d5bc7ce8fcbf564abf95fb5799b4625f911fa56134e47e4c07779560178fbe4e6d841b12165c5dce3969a5be7163357346605b8997b051ae5a4ea456caa50b6423327908a866c95af326b37412c9137217017888cedef7266a5326e57e12351db0781c1eff96c09c9317a49282b15c22000278c3fde6a8f52cf1673de44849165d31046fe7fcf8d4d8e43b5f0991c3fe432fc3e727f91d0e2f53926f8cfadea4e399ef7969297c2091e16e191ec7fe7e7eba607c98f22f59bb492e5063adfd7473a9c03389fce4568a1269eb5a8f71d9d775de65fc332ba6c13658e939726bdf86d4327ea7f4203dc8e1f91ab041e334d280d964dc591e8f058e27e99eefe502a6c4336e23ce1493e15d25e9e34b275297d370669749ccdc553bae44b80a55ab6791882b3c6d0da3c0e770b6a1c258b8638a537047c3a04a844ae772d2ee8d68f836f00fb0df415c1e77ba60c5128a62b2dafd0618956a176900c3cdf0b3030e30da16b3facb41fa4c9aeef279e230901702e3d417f5af268e293489a75e7838d7213259bafd79bb2191e165ce448c7e237d860dd946b4d022e1f29d74921ca50a61986729beda199b3bf21b59b00e147249f66a68db7e3c86cc36939873fe4bc03b565e3febae13a2ace9149ff6216102f8ca37b8446e9c4230c8e548d8fdd1d1247812c12a61d9ede8148fc6de48bd11a1f3af6784a4098c7836d818830533f3ea653b84f05b1861f1f65ae4fe2a4f091113cd2d9024a222f82cfb326d2fe41c45d2552f630c94b5bb99d7788ffd9b01e3fc341e13cc646683ee6b3f92d1c95c49ecc9f3da2e60ea305c1e621204dcc5dce9a26eff53152f4638bf5b5edc05c79f638d93befc7d5440a7def459593bf5acf517ceb945c8d07d1b1e1c72715e34824aee673d8c0460a10280dbeefce485cab798245e7a80cdb10a924fa3d1f3da0f628ae30e41f150e0fa8d8a07ababdb77dd6191b0c748010b90aa6a422b22c5e40e2cd2fc985238d1434de82e76f875440c713cd661e787a3e47845d5915723ee58758c899881ea3a3484ae696f2cab44b8f1b7f103dabe14c531c3a2585cc6782bd1d74bef93cf09691c9dc81645bbfdfd0a0a924528998755629aaded172d40c2a4a3064c4a9abbba9d330dd9b47c223dc71b568e698327dac77620924496689d59306f51eae942175e8ae03ae292a29714dc8ca12c416b2def59c8a2221eabb0e248bbc41686dcb625ba1f70413a93e394248389f34761abed3aa5c682726c191b68ea8f404dcc1bbdd69e53fe25ec8d4728b9cfe5d9fcbb817e5e1af40f527f82029e55b43e677955da97411a71b80b613450dcd4f5f09a6a3adf7ca24899d44a9d4eb21a46158d65603dab471f317c69a21aa5253cf9b09400f0909057f338276a71fc4b61d04808274057f99d69f8eabe25b4d218a1e61c7c32da61db5ab492bd1b1ec4a90a8474d321bfa3ce54d2b900b7459c698f50f3eb26c9fbc5037402d172b04b4e25cf7d60f77332e9e60936d96f28ef1e2edff68a021d8c7c30424a19516d5a29fd7387462476f8c160ea1e800f76065948632838c0b31112da8f9ecf6307ae16d3fc24ca22a8f52aca9a19d131612e9db3bfd9a61e569d1148ae395dd402ad522e7ee3c7d20e14190fe4519e9e3426bfca2c397aca7391fa8aa18e13c1420fe84735854a4a5d394d40b229763d9c335e62e27b4b90fc8b296a2abc31de50f8c80c1feea6b23d655dba885be156461e300b2ad04bd8c70d96cdbdd0bc9dde11c435f48a3fa54a6664ee6018232fb291fa0db3a9e48535a79d5aa6ab27e0be38bc79449cf3c76f15e2a79e4774563037c5ebbe5bdb43975f7283d38fc1626ca048fc515673a6de98ca26f53d5b1cbb611598a2cbdb850384ffba5728f5e2175b093e99a2894204e6f2b57ff741388a8cb9fc1bc619b81bba0d4dd8b3295a4b5b79a1d0e89f91615c49b5785e58f7645fabcbe53f7fb8a72fc186b13fdf13e0b57d3f2fbea050e98e943399f3da5efe3cd461e41fd5259ef5a78bd9a42ea59b3d05ad7800066b9e59b7f93bf37b01999e8eded1ba2efab63e9e35edc57bd44c86cb0d66fd5f26d8eddfe65969976d31741aee1e3a21ae4e6aa11a66a414c71948aa8d38bb2818c2df3af422aeb876973f9eb393d9b927ef66d7d248b9523aa5c22141d000531be70c9516f1070d5043f3fde56f8aec8e168558c6b8825d03a3c8de3299423949b3914240b63e7d9717517ccf3ff8b60b46d4ec4a98844bd100f1242e518ae35b041c63e30b16171742ada1251c511bc21b372cab9abde4605cd4d7ff249f827adb2b3e38c7407a396baeb7d92eadad2e92f6558be8a39b6de3eb51b959b3599311acfc31fcb1bd63d80734ffc39d65c2a15ede7b5fb05e1544580d3f0573e2ee3de25c4b1b7c35a2c1156196508b9865797810a376cf5b7a502bf46375975fdecb4ac7c1250315b6d05b24e46281d6d9c5673b1e3745ea6598a2c378070cb15b82094e603925ede442251927182e93106715351207f931fdab2508392fc0b1b11e171798b27ee7e8b01f6c8d4c3e8d647825951e48b93b470e512e79c0ea336a789802bd5c9706b2bb3705a11755b1b2e25ec695e0de924c10ffd235b1344e70172b86c1fb6e08ae66abc18cb70d29f56797983b2dd70818d25331907166e4e36befc05e25fb479ae1b9b9371095f62bddf84c06ddc78c9055a62574e0c1c9f016a918ba000db3aba8b17043a3d0c86f5cc4b0edb0270833be185b31bb7e128153293698ffba385668b6d2bc036c066b3e5e89760816376167b10c39625efc6f31a612ed81eefe4521305da2bf2773b9117b155e6184c0530d8fe5c83499f282409b5efc0fcfdd2f7552bfc8adf0abd3f1cddef3276673c7d76ca2a495fe5b21d680c9d3f5c31799172a06941902931cb01c8eb6184623d6a05b32bbd20d6fe930d6c3cc4db5564c7515a34762767f7f921cefdeba86e199351819f5bf4cfcc7d7c598272935ee3c0f6095cbce30720959f359dcfccc707d49b959cc7bbe58ff77da2005dfc16104c58799d4e30827e85247327de7b395db100f3676885eb735d568998f9dd923f22c316ab8f15c23db746f0b5f6fb9d5e62a7f5ce5dd3a52c07ef307568bcbc7b986bc749f636f1d8025bd9bf585186eaff3d70b0f7a1372b5e9690de5f513c82b3ce3175d3c5fa6f6cb8b4a0ec7bc270fb077d6bac8b9afbdecb01eddf7298aeb204bdb216f924b7afa30d210ff3d9d83596b3bffef7fcaaf7f5bde98eef19dd6faddde539cc006020dce424f029aac4f7c989fd07832739b7fe8c5724cf8ae013696b3ad957d622b6e8818da9465003ba4b1b3223b64a88d990584242a629e016e8182667b97380d6d1c546b3d8f1f17111b7cb7ffb9f8de9ed082687a82090301a96c253f20364cdcf06f9feb6a4c67138fab87d90155118e318bc0a5703382e8695a2901831191fb652681ad93ac1c732a39a448728ef20d76b1839da9834eb7ca30b8276658352db705629d0963c7694fe227bf0e18b32a7526533acedd46f11aeacf91a5845cb09c36ef129ec73804a58d75ad3e4f0bbee174ff71e0d5ab2a62fd1b1e498e9b28f288d87d7042d4f362c34ff09a5f754ccbdbb6632d38e200e1fa98a41127588cafa0fc796eea6b593b23bbd94d20536f06d6c7eda4ff7d9cf4013d8a65391f94aaf0fbe61e4ef693e3eaf10e45c3b9b6523614b9be6066f8c731889a912d902a2728dbe0d943f5ad57aa17c0bd237bf34141e90df1e8080cbae37c6a6055e2cb066db22eeb7f96b74f1a439bf83a6b4db44da87936241cbbed556f0a33048304ca6ce34c7d08e82748fc2585f786ebe63fcf10a84ac20cc947cc0f1db579e4c284dd588267cc1379e7d70e71d13f27f63b595b7ee28d38776bac886fbd357d0611eb38f1085ecde31fae243c4244d4c032f10f602cf2736c9a9e7f2ccbc1ebd64fa23e219b67f29491dd2ea1c44652022a6d19c2b9120d4351fc92e50b03359d3a592bd530d96b4925ff45a725ab00960ef3bc214dff364d05ebd131c17017fd4a0ffe45080a26e1d12b57875df6e0159d15ce08ffec7dfd12784ec8672cd64318f1e232d38804d7036524f800870788038a84fcf8c3594a0d5cad18230777a0a0ef2e8a0fd00c1c6c21579f2fc3fe6ed8623fdb641c7137dfa213903d0c362100dbd8e16292f8bb4647a1b0a06523b3c83d7c33359fc6a7b2d080909c917b74dfd8a961431df28be52bd618a11f6268ca3337e44231a39d50cf40a22cb2758abd1cbe1346073c1fd173576ee3e018bfa78b9dab2cad8367d8e1266c49c0e7158bf75a15f021421acb744a71db52572da2713d2ae049d2400c9cd272191f291e1682c73492d9892213158e355d137a08afa6d227f02598fefdab67cf72c9d2a57addf6873b331b61caf8190b092b769960ad3ea23295ffe188f8344682c65fd653ff67c255ee92b7bee9805deff0a85147851faf340eec7d6c4e9acf75bfc7fbf2b1fa3c6a36b2333fab5f1f89e4d95d3a4c66fa596419e7ee6957df94db8418266b9ecb561217e21915ccbac35841306358ec646f5b164fe5fc87097e65b3043bfb74a81ca0d99c7bc402affb72ee4df41f91b3b3318fa8df6cfaf456911565faf35bdfdfb03a7627bdbc3e97818a02e62d146a65336395c945b0276fcd37da0975690d98ba349706438e51869702e85d62d92a9d326e50de4bffd0f79e69d0c8c9412c2a8451ca1ba22d4f12ebf1180674964791f0159b120a95a7d5edfd0493d198077d75c7f3cd060b8bd54a1b860123161b3499d1acdd5fcab903689a85506615d24a36cceba813d6826a8c6556cdd953ebc2728527d1bfb9baa851d650d72286d419c0f40647b0bf6101429e3588249e881c73f9e5d66047e847738f69ba3fb8fc01e7c02b8117d702afbcd8c31535b00812b884c4c9645998fe7bc0a96c49934e867d2786a01d8646a400e4583e6a347dd04fd87d8874363954126b3322852fd8e80d65608b37e8f3f5ae0d851500f0a69b5e059e996a28e372c4a1428df4e59bf74aeb357a37cb7936da6e5c2ebce714dcad099e8c986ec6aa6c29ddf794eb3e47696dbc9be6051779438a0889c49aff94500af30cf11334056e0c5d8b207963c2d9e984b4572cdec51f3d034778849cd788942e6fb143de8aeada242d7ab92b95655900627d9773dda4d601edcfdeb9b0766721bc08b9670aa6df3479435f3385c44f682faa4f0d35d991c1cc697c5fc8fcd2955c41016ef04f00dcbb04474ddeaa7edeb23afc72b27f385c11d3247dd7f33278d7c8240b68e00fbb530dbf2185f9211c79c10cd5163e5fb3944de02f291402af948dec18eee8edbf75d9235f002b14b91238dadea88a1594ba236bf3cefabd251691566aad361e17302d1ccde661667213e0609ed9f62319a6d26bacca62a0c8a5672a03d8bdfa6841065fdb687683693369a54ada22abed1583090d4e49063ecda9612fe39ec89c1dac0717b8de109cfb039a4a3ceb2c298fd547894d1f70edf452292556325a9957ece5cba2dea80463f3206c1ad177e968b12459f0528a8a8146c465e8758851f197dab2c4948cb3dcaaca1d1bc3b135e95cf5a7f36624b82d0b13528c04fc6ba8079a63eb7c1ee43765dbb8151731157c577a236ae975269245a80d05dd903479f6f43dd78a2ac1e539595554b6028ac7f0ea042ab2e8159aeb0519c992072f011057972c1b3151729c0d927f35a93a152fac3cf2257cb8b60f73e0c9ac6a8f377acdcc5867f4f355834b767447a3f37ff5a3c678f8879260ad7c13db1c73d1d47b5166f63d56b9ffd8143c23b3afd2be9a6fcdf3a97c806a56faa373aa8c8b1027c908303fb1546a9b3dfa07204d1d29ee2f8489a6eb001875da4036c1dbaaf787cad45dfae69a757d7894a9a3335205633ff1d92eb470a5d306c04bbb1dc59c51a1fad3f0f85a69d0f1822c497375b081681efe2815dac2f1ca2e4cce800c799c552b48d47d438ab29ef664d033aeac8e89904d773c41ac41c4172391f69763a78e7fb64495a3137255560fe1f1999f27dce9ea7bcc438ba7844a0fa710ae2610c7dbbdb8865b7560024f3bc5641de4ec6d1ae69b5c869c77321ac9d956067b77af9783cf49f7f5cfb9991c40c78b0620fbfde40ace088a361f7e72632e1cbb16d724dc3f4472a61500d34cbdb51cc55fc2af7a276bc33fcd187c48a643444ce0cd81e3770bfb4413f60374842ad33942de953f931353149286524d35f9f7c43a6dc6dcf29185497e64790639b28e3eef311cbb4b88c6d1c4245886c9577c3e3f011004b9d35883c4703ebd20508672746c96ca6bedfb2f594c8bd18694013f20cb9e82d802e2c7d5c773c10851c582f9e58ca057795bfa94f42f6f5f160e12853aacbe29b7a30ad753dab892447225f41b69b5943f1bddb7a72080dc35c3c81263b386b65eb0a97d282f95291b21c0bef36bc5f307e630f2df9f9195470241c82e38ce40df4929c8c3445954267831ca692d0f0315371ecf396896ce5b3f697f13885ed437b52c86b7e1b41f00db7a387494dba51a3ddb45e4aefa5ec7a5ee85364cbbe5a4809b78b5ab106c7178f979fa616a5c403e920bcaedaae36339b3a3c8b4639c75dd483fb95fac81d5af88dae723ea3eba5c2a8bcfac52b774d67b8a0c649c629eaf4b92de1ff3174a99ca62cdc8ecb97a69b0e46857eecd00e2ad558f26f34012b92181fcc66d428fae10b558fdd3afe2bb01f01043c26f109f292f9a7a67f51a11b44da5db4ed2d3a229c3d8f49a8e65974def4cabd2dbce3f45cb2af2231620102e98bdfa521e1cdc7ce1dfa439bcb3615432eeec92fcc4facd2ce92fea3e346cf23eee30d7da162811dc804e295d73a4f6f49c0aeab8210f1c8e217d6a70bdee17b08a10d51c566100ffd5aecdfb1459d6a8bff74cf199476dc137de9edce11972dd729734c62995767075df2c5f73bd69a3b5adadbc402ff9d3317b1868b4648386ef049e78aca1d057c19792ea14f2d72466853db559606318436386f730ace0c7d608d5fbc4d6e9f1c46fa257bc3c742a99cf376323219cb6ac9aa704bdb3658aaddfeab338739b0c9b3405ac08cf47c1c37676a32379228d80295eb59c8180834b47524ee584997c5e6ba23db32d6b9be428adfeb279574167d3a4b013b10085f4bbc9dd44be10a2b8a40ed401d0defc4d4994db59d9d0655e99a57043997cc83ef042e784e87d8fce29e9a8229cb7f240f16114b2d089170a322b94b0e941b952cef0c875af965e60bd84028eadba7bd0ba9106d9328b40344e20fcac72af00f98e149f52011c16d27c682f8791e44fd5ca0f79db4901197362fead00821fe9e4301c7f706b9ace11d265f4c67868d939899689a828f3cd06a5d99edcc1ac315fb39ca5eb2c488007a46042d430955c4b1270b7430d947ed1862ffb3e75741771fee18cd14dc862e9c5b5e90236a619039c40fd18473668618bff62f3b04c34b56e984fd8d61f0ae82e99f355a6a3440ccfef5a2274afdaa6ac1fc10e9f34afa78251fc96f0dc52907c694273d19a03dd06ccb920d86dfbe039d45c5066dc162690797b71d39ea211763ef742511dd9fbaab8d525774e83e1f2a5a6950cd116b489d17e5b26e33c7167d864f7f092fc94a607d6c7a9e4a0cebcfe53437d158c5af92065da36d27c5687a15303eb901fe2e594c786d66a3a1f1f5b2f5707148a95129e6d53ae93aa0bab679c420ff1665017d08b3740a6c323dfce0fcb87639c22910e370bb10d53b5ff54e4f443c1ba9d364aad2f77d58cb38154422f49c85a45c2695589fa8d1f373a0dcd3f35d1dc699f30d9242601fcbef7c59c364a59308e95e47436e4dc4f6216a47f7a44f2b91adb90bc21c4bc3b2d6a3bd2a26d659ba25675221971cc2a421670a1be5d351bad63a594ea1a50595ec56ca45767f07e7eb563c3ebceeaeb526417d22c30390cdb46a4fcba5bba16afc249d419df5b36200c586e67fb39307233f43ed839e3dcf1a3219c96240f49b01c4dd0add85a0610b2ba42778e8822d8fb84a2b525a042c7d222b18d8aece1eaf3cda35e817ff4dea9f887564cfb30cab66be42aa25127d0056fab966135051f46a65dcb92c01e5e28b564c2d43135bea90e78678ff4571e76fc8c07c448a066c2a4ca5f1e7ffcbec09226ba85a20c23b7716080ee58c5e3cc9c4d81400e481bac72d6dee2cfcf034b9feb21d63f0bfc6942f5a6de25df08c94094a3093acd07434259cad77f48c1b6ef285655783c0b02955b66e2d0e702f9fcb9e1695f4f6fc45ac3846934d0fccfd89a09ff2acf0e0b7858659d56a697707160c77586acb07b6864d3159b17cde592c23b797c72c3c44168099b60a8a55fdaf1cd57658d7b0630f1c003b2c85eb45255fad3591bb11b58277bb3e44c16a12178c5a1187345e5130ad607d24bd040682f97e7aae50d94a63cfe38b321cda8fc4e13bd67b799f5a5e2a59a09e1df41534c693c17c3172cdf8b8b3f3ecf147f252c9e6037fd064c97052c0f768cdd2075588fb2b1b3a3bf427c05195f23a636c65090c6675e02ce0a990c2f12a43336595789c0e559bac696b90cfc7b69d1f607a7a6227f2f2eb23acf51ec09479348170c069df2cbaa1729a1735d2f53b1bab02b159d484655939639d2f8751eb08f7fd74d14afba9f7371edeb296c6496c72e4d18c2baf3f64ef193495f2d527ec29195be75cf9b7c39f70a38a0116cdf786d9ec2163c53c554b531889c82bcfa84fd48d242c7059b12886f3b80517647158c06627c920ec7850465d3849ec8842db2f17ed9e6d4558ca7d5e0af13b694d72d5e3294a4456f8ce54af613632c058211aeff3d8393ddef21ab129d1542d3d1eff1dbf6f288e38a613286f191d43b7d7a083ef15fd09129e0ed7f55f34b653f65088ec93842aa0814421a5043ebbb6ea6182df53f074eef6f39eaf35ad2855a98df2edecb912ba9441f7cc5ccd5335899e5752427febacd67b6fc8a61f04484171cf165cdaeb6220121116aa6f569f52f116badd8a612ba374e9db6268fb30fe7440c0867c7cf3904ada1279282e524dcfdc2fad421b0550125bf33016a0257c65189899906858d45e99efc4dee14927c06719860716b7cc1f72d1f133ca0b52774d94c77ef58d9fd28f3e52607fe46bec075eb63748570333970c8787dadab3a7a4d29574265312886e59af79bbae7e1a987a854259ac78ef1dc3e4098fef9944681471d043742b4f650eae289d1501f5e574d50da159ebdeeaff4aea25f85de1076745cacd9cfdd69a6275fd70402241ce652b476dcf90407a752d5500b7ab97bdfd354dffe0e06362d425694e134ed2d18de3bf3b61105b40178114356ad5a800766b7e2ce9b32f4eec9bfad9c8bb3d5c914f681bcca7a6c578019a18c6418770644539466085061e4088ab1aaf834c16b8eaaff75555b181b460a7406c1cf908facca5aa1ad053525560a8f5479f55bd12f952dd7a77211d872aad8897cea08be8c8445e737be645b4b6f43ac2093f99bd8c20b58b7d8c9e552e5b273f41e7d3cef4c0ebb4e6438841cbfd203b0cfa15bbb57e3791c12e17a453f29f1780975ccf6668e203745c063073b7393cbac2b75adc40e968cdd49f50de6c46f308860012135593f1403c3eb65c91fcab36407e7cc36fede5c1ffbd56dd810de7671eaa24cf12e4e564872e07875ecb280585822da0729e9d93f702ad2376bc10494300214f348199f1e1d58a684d04f87574edde78e2defef358c5ba2e4a1e867f24641856de1b5d08921e9c147c6a254e415b646852a40878f693fa50d0138e596f140586c848f6b5771661c2b19190471afec8e9204cf5f46a7a46683816d23c15b0bc99ed10cd7c82c4de45c0c453ea4f9b6d4bd058848e6da30abfee83572f37822da300b2d663d7187bafc8d2476ae22a6d6e8cdffe3d51c847ec696c3cb6c06573b72161e1a318a147de8aa9f99879e337ca126e796d004d628d190b874312f1d3e71ab67f8bd099d158c1bf545149b8a673f78943d27cb5ae1dd86cb3c03c4f7e64c900bcdcd06b62be1d74fac66f0da9a5a55eeed33a0f9f58b0b06c9a70fabb7e83f6652e17c701c93c3238059a7c3bf96b9c9f00f95f318abcd99fd98814906bebcab8e0c04e2405a44e98c265636206b17e61546248e98a127a4fa322216e53a7d34e43d8f67dad0a9579fe30bdf16f40fdd8bc052801631b745ab5473358255ed9af60bfb971cd8e16b2fd7791e8a08b996cc9de3be48f58c7631769c19a9861eb1288f9fb2ab7d629e793f156c0efb5509115141d31431ae90b3cd6dd93fdb3a1d6ac6fc5d875c0f0a4be971f6da46419ed4e3be74752f6f28c9b2078e8a950601580e72427fd039d8a34ffa0295cd94523035e05df34a4c0a8bf4015cd13045347383657d6063ec5bdd7a74828c1a125fbaa552f64ecbe87faf19a6f9d12e27f60a04a328d92a5e690c1e68a701dfd9bf6f2e2cf58fcafc58742fbba11fcf4053955e2532b08653aaa89dd6cb0ac64307c59480a0d63f9f76eba3a84eba437a98b53390a1026ba5a7f121e3efbf0c8c0c00c46acdf66a8937b34b6173d8674458adfb12a729f188e962f558a6feddf7a5181986cbd31283529e8e3f507933e6658fe0413068b2b3c537c6f168967b1d71561910a19a5f824dbf63c8baa865f040d308527d43f17d0e8f011ce0e3893df7cd74796616db2096b6563efb5774918e4d349ec2b50417e7a4bac215062688cb398232111927b7c985fb3d686525f2f47794a42691a14ff9fc6133a4f6515e8ef511fb2900a5ce10fd68d3fcb5ddb40982124033f865f3e11224015b1f9a7160152a0b9ece5b80addb87a1b1fa5125e83861bcd80825e0d4ece562f4b5e8eef4169c13dea5e620a9622f0ac97c0769e932d9df808bd3d52533fd0e62b1cdbd52d6d231baeb0364a3c747f51b46cd0b85b2e1193972e7d138e994dba4f2f85a8b181fdbee68605dfa45596bf686effca15317fefa31d31bf0ce76d43bacf190f21b3d5fd585a561ac95b1023672d92c2cfdaf9ef33301730dd3f10a6b86b6c052cad14296760e77c2685e673833e1d05974dbd70101ef986d7db5292c4152ce5a3ffb14724412f56d21408b03fb0510e61ab7cbdfa0814360476dd965220ed6f7e2f294ba97185280cfe223c1b8d00f18095787a47a010513fd8875a0b30bcc1446615f4ee8e065d54d7deb67c18c20285f0cec2f882ba8b70b8ee09000b2c39695861b34bebe1b8b43874a680bf9bb8313dc54e50d18d134219496f20a861cd42c65359fe11be9a04d40580f7fdd1bb05b60e59e26df0f4f4bc388b973d975adde89ef09c6910bf00f27cd38c6ed3e01ee348215e3fac74dd62f256fe68bde912a44265bbda2f1454b8e90efe323c27acad18318ab9705852fd27413bc158f6d3837f018475bde81e946227f2ba83687ea96947610c2344d21103a5fe9cd99ba27a328f9c6334096d7fa9599212c387cb25a27f052f1a045e837484fc7ccc127220e7179a03319533a7f5bc54296ba643897937935b8b81d13234d459ea2567ab24c9162d967444e93d6ab9100b14f0c0a8d530253c355e545a71b83f07db93f56e21b30764e8d2f5c2b1e7f4c9a526e8a2b523ffadc30491a31edf7a47423452a342b1c79f77a64f3eebad654b370e5eeadad7f6668756957d8dea38735a260f00747922d5b0d6678d02c02ac40fdcd7e8ee7d8bd6a9a69d5b0f8fb33e4dc1ddb45fbffbb6c4633f8ce6949bd3bf715b2bdc8ee985097b824126f56214d7654db06bcbdab37d9d4a401e60c2e6b2cf7015016b3b02825a0667d265a624f8ff567ef37729c2a0e11141bcdb1ed64bf9c54e811b0643117b5b1c8fc5e8b7459a2d170031b2745f6def5d966361daaa085e047dc25dd17b78d2dfcaa7852ba416869658c30583f8eb2f6808a357d4e4cdff984ba6aaf8ea0486900aa1f481b2a3cd555ed8d5495c6fd4215556ef936541f8a9e4cd51f3e4e343874061a265091e93d84eee4c7cd531cdf371bf2975e3cacac424437705f4929dc54f49241ee120b6411604775db522e2f1ada8e1d66ecc28dc0d122a813dd8a35d4c4aa6657daf90f311c88659e447c04cbc6f767335f35a0b85be46c09c5c0d9bbb3c505d9b6c3b42de61e6f9e775801d24f1d0335a8ce57a9d461e9ca260ed2698f67a8eb35ce79b8066378f92e62ee81ff47c1c8ec40b72b0d3c85e2e62b8604fb2d170a282aaa47269d3cb9b1ca9003884165b261905c01c1c8b0ae7493979660810e7773e8216980e01336fa18d62991d9ab11b69db9eaf724f216bdea1e06f7615f4872aba038ef47754e4e277a9c762693c22af05af977be2c1ee842ab1284e14bc022bd1802f9e123c0d4117e6084ae0a59f6f8c4b8f50e90fea0f642201a0e47b9ed0444679c57af2f45967d006058954ed87a1c5ff114896e45f9ebc678a7b863c3e8d819a6020aefdaf4f841501916e9006bf7a14cf04a0fb7369657347208c11996a5f05c631798da6423868e580e04a4cd445d7f97f853011fc63c9d35f8ad44617911c5ab0d607c5016d5d564fd93612b461ca84146926aeb6d75bf00a49c04fd338a22d920637d0ca163f224b269e07803362ac37f19834de5f15b86011422442932252549422054b72bbead1588eaf493694b1da68ad425207a161792b79b37ff36588a69ab5b070f5626b43de7f306ea743ad21fb5d980e9433ec36a04b6ed3e2698a894dcd279619ecad1755f36bb5ed921f7a692cd702048a75a54cb6e6da274f7fd4b629a8c24d6ee68cf5eca9f138e1267bc6899018a500831d7e5567739143a0064ce021b2158432fec834c12e8422d5ff384d256b6100bd4d5502542b26cd5d5142fd08ffba7beb8378cd611aa8aefce548168a22cd3270eccd568b0c36be0c0773e9b6069b03f423b431fb265e682a5c07f98861da2a03bbbc97c25b12da903b0dbbb75802b88d6af97c6edea87ec80a18609a0aca89422b02e00a93e2824b164f6ade37f9ee58d7a7c1f2fdd0ec5e0e4bfdd63bde76b3f150a0d123d714f568409abf973a15c64090c0cf1327cc6a00145d9219548ff080c4ff616efa6e09162a98bcbe754698f02df3b8fa370de4b3d3b8c96fb92f15cf007ca1801dc19cc822487e3f7982ee3cefc21d3c99e8bbcefac954351e16e7f896678754a2d94802db3bfe478855f882b30d9e2e5366df94bdadd32c75836014feda2dede5073fc8ce08470f2b6aba98da80c2e1fe4ff253b45936374e083560093e5d901ff1181f57833c0d40784f8d0643c2cf9d13bb5c61c3576cbcd622c2dfdd1f1ef3c1ab71d65136848761ad6e1fa26a4f80f63f8639c3d27bdb6fb0d90f53fd6cbab1e448f50b0fc083f6f0113d87ef39fb869c568703ec25f7cd46c39e4cc99b8095c74aebbc172f78647bea4a3d976e53c3866f5b1ab340cc27ea4ab1d3aa5a91a04d7bba4bed936fd11f08956f89aeda477bfdbb52611c97417bbca436a5b2d3045fdcab28e13346560949f6231a52a2a1dd6a39478353c62f8f81a0adc953c6ad01b26e487479573a4a26f131cc875033dc4577e74f3376026cc7a6613f1463d24c38301bb174f06601f64dc91e099187b63f0bdd24d56a71e1208abb8bc9dba05f36c8e6acc3c1107b41e17f24c5928ac5f97cfdf5ab6cd7209bae7c445144d8f3652b9ce40ac00df6ae60ed370066ff3e44a4e78852e1f01a29a419b1391e97a0754ffd2d3491774d5bf12bc79da1fb83b1814d9ca826a67a080d9f12520e249adfc51b6e5cb8c9bda1c35b87a73d8dee6dca7f06660ff3905c4e2f52c61f6bb4e19f9db29c73a6c0b3bf4e57190ac3f95df241792c93b3576a53b160b631befd10cdccedc6347791f355eea044799028a2d610d1a481dc1f96d664b86f9c63118b2008c39ac86519fcf1d858d78f01768c97c9009cd1d9d9eae867d5c371c5af141a60bb6965c75c460b5eacbd83e4eac126320c916c80fdbe2bf01853568282f320f8d00f2810619b83fa281e79f3dec8f92b3a5c5b81665612aea3e946992cd62e15afd46d911471c11c4e83125c95b3b4695e9ea17c9bcbb1762ec1d38e8388f09d25541ea24ef8a29fbe1738cdea61ef394ccb66d8e0b16548e669afae2e3c773ed78f4d978f6f5feb25cdd141c97b0caf4c982ef2a5911935b07af67b4bb1a960a78e3a786e0fe9280a9603d59c4420123d2e06db3507a6cfc87f1212b333f6f25f9c914a6f872cf93d3a3482ed73a65f2e8185d4217b4ea28078f2e7a33c1da9283a209de99f9241e368395758687a5479d3093ace1a391f91c961f361185c31c65bd298dffb0d4a9a5851fcf50bb9096252357bce33d6e00651233419bcb948b8094a1211b88b98d345b25aca6ae45ceebd616c50302175f62a2f0e67576e0487784aa65946672ecc8edae1464ffdf1f37f3ad8ab10b71b244d6d20e4fb51a4d2aafef3ad3e0edd8d41d57a814597c6ef8579104e2c96137329ba26365297c26af7aee34a82fb0c63aee4a3dd9a827320456584b315fccccb0031401cfef0adc1fc6695829b738a033adf4ab30d6863fe030e033fec7cf1b1f971301b1897a31e7d4f364db8cb158670d6d1ede7edf1c25580b8bf5c993fdde2dabcc48ac51afbc850909e97a3a92c3799f92f3d782ab06326603c6532a7791804a63177844aca4affc47090c885ee6404f4eca4bc8dafc289675356f002403aa7decc4b1cd9be26110780daa0bba78847dcb4e6b694fde7ea3ddd2415ebfc3813c5aa9bcd8b185ebbc8828877208e70acdfe13027882f5b5d7c7dac5fea46a403586c4053b405cb7f7365da3b74dd2909d31dea8118dca6a0784df9893b254447dd65baeeebdff23bd27342bbc9e913505b725ee04c811b6925f271c17640848b558e8fa86b00443e684595def0f769680dedeadecc2f80197ffa26b6f5f1f65b555a40dc1da77e8065961535c9a0bf683d0eb59a1c3e5b696e33e8378a558b1071b89c8f462bbd50a7e6600f837c5e318285b93894896ea8e78b9b17007ead352a701403bb4c0cc69cbcd4928e32d57667998272e524419452c2fe0010da0f179ccdc7a9c8c93bd540c06978416b2534cfdad58e138a6a259c8c6cdc49739b2a154977b3bec15f0fa79659a75164d8c917e30e9de82bcade944221eda98bb6d9b771a720feccaf770414183a4144840a43352ca61f4795e773e406614ad163ad2e560de59b1e02fe6318641d46530de618e951a92c31f8b2ee9662e98a5a0e2cfa80c3d2ef14aefbfe21632660d8fdeae76c424e0e5060cb47c9dd6387d333bfbad6f221b49ca49ceea417e43c13a66f2be8a82b11e04ffd960a447b8d3636c6096185a9ed51637d2071c98262ba752ed43de51c03ccae346a9e12c33b840f702b7cb2cced7bb03f43e8e37cc5d5aee0cb2efef194d7eeb5d17e3843ac60474966c895cfb8f0a87dea60993bd416eedcc7b5e8a893f4b8d1d8122c9555778a9567d0e424eb118b9c1be9d62f58e657f18d76bf53147be128ce723eced06abebf43895e01b7373f8a668def7efdd8d7e003a5d635650daad3163512ba85e49d201f5830529d6a82955a3de50ef8a7e0ecc43cc913b0deba15ca1602d063e22108ec834bc1f03938eeb3bdc64c91a4ee9e31b12efffa7423f632ccc43bcac025cd0029dae2395407b1dddbae4c3019c130cf69f86cc9f0e7bdb2e8b4f49907655933a50631bbeee1b5608a3dba3758cd6a5961fdbf501670d987360aeb5aa99766bed7ddfb6a5f814b586f381b353f3f96fbfd4e81a2da163bc88c4175fe89549ba1a9277e0ebf1dfb390e9efc3192a4c541d27997905403faa5683bbff068576e1e297e0c658c81b1bca54b94d290c503279d503ea8184cbf92d13e75d8bdc8a9e3225827593c72a0a2fe368b09b927641cde48101882dca320172c74e317fd4514c5680b84bb1af4656605270e281552c2c16176c904678669cef13312c67853de0a7b3ea33d47119a62288cb6c2f739a87530e5125e9f895579ac87a4a1ed7c450f082181352f0f274712073e310e4e4ce8433f030d1746a4f92a45a70b8b464e77d85ea42b6d34b91966199ca02a34879af45e6c576dcc72763df8fcfb83cf3f60296ab22bab1610f757558552f0e06d62d29e1d3ed1b6d5a88480d092fe375a0d6c62df9a854f7b27783341e57e7b4f59b719e2f352eee89d3b1ce2d248a2fe7ed98453a77819fb8309c5b3b0265b882a7abce50c508efbf45e25618ab2a6f4a778d5e3175a42dfe85ab9a05ec79a5cc395cecaa1f40adcc022b52171b68f04f73ce44bd4124185676e967a40c1da4c958b8b8cf3333b5684318b7006179308a073fadc4fe6cfcca839ddca467461f6fdd2dc2e2ba7ab8196dbbc216b3212659e19f5fbe47781ab7ce195775f683d0b4216a740e0a88b54f234bba8dc6f3bbc4e9ab30885c85576054109d04aea5c20c3292485a789a1d9516d6599cd815fff1af5d7aabb8bdfbfc9c29ce8ef8dc2131d94bb4dc1c446e46f7101c5ba19442a900f475bd4c16b2689f05f9574a59ca2e4ee6c08fc9a7f81ab99ae035552f49e7d280d9b1d38681a794bd0ef935fe224b3fcb33cf71bff1476781d1bd5177d350650bc2466e3da9b16bda9aa6a61802d3fc40d5e177232d99b16c5c26311ca19a9d25b1dc37f2c9e09bd0a97a3a0c0de2cb9f4678f2833fa0389df92a60739c8de7b471ed04a2d79af99201487af4b488a21eca69f7d597d4394a234aa12db08c5df40a9fc3d0afdd0bb65a5de8fba79f14b423d469c538e1da934b0b64405e8b2d6a6d8d3fcf06b7c39c65f26be4d6886c19fef699053cb3c47848120751a7464f48b2cfad41b6022f7f79b608c4b4d2074ac5b8c893fb7f333bf6d9dbf3b19f428ae047a7cac61b26f5d5142b3f91d3004dedc7366591461c65be1cba7e32732cf33afb1247904d65aef2b93d0a4dad8620029fdd2bafcf2607f0abb8d116014271885ca4b77b2f8a9ab6731183be4ae4c9384e8815df335708658d4ec1219f39558b7394abb0110c36aa40726631202e99f5f8986c887d0af6dc7b188fbb0b10bcaa47746a6688111629ba5e4d71cba0e4a6d60ebbede62f9c1bb196355b942e187011c0a692425d2f618822feb84b5b5b24e937bfcae5202d95cda83f525b063490fa81164796617fc8562a6ddea16797bf35fe2ec60fb03f196598366177f1388b871013e5a44c2d5bd9002fed13d45049e64518406a33c6e8") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_192s_test.go b/ref/params/tests/vector_sphincs_shake_192s_test.go new file mode 100644 index 0000000..b54b5a3 --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_192s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_192s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("a454a7367009d1fcf84e085b3171ec9b06cb3614e7bb249711692d1dc9cb4f908e2ec5e1a88888b1bdf5502b7b93ef5a6a94965f56761af8d3921a19730a5d48428764198aa4eb8d6cded5648978b05604521fcdcce6c2c772c285817f41021c") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("6a94965f56761af8d3921a19730a5d48428764198aa4eb8d6cded5648978b05604521fcdcce6c2c772c285817f41021c") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("c4b23ad74736e8afd091f9ddf810881516f9b979a150c5dbe13efa1988eb8ab3320b9f541df90f0b9850729d887d91de35f85119e710f51597a187ab664d4ef878e3919dae5bc53bed2b63c42e49ec270a752130868e9f4791a55b78ecac2166eef8de537fd06792b8894bde18c6b82b6bd737bbc50b6df03afc848e889857061a98d65e5748ec59572822e5f89d67bd36ffbae3a87e139f64683f61e3e59a47f6ac595f09c278a67ce1764b525217d040b27062e18eb4160be716fca415be3dd58ba65bf780b09547204a614d7a87f527683d1fe0603fc77f1c2ab87767dd40dbe71e653ba1e09cb8b4c891339e087da1d97b326b920d553bb354dafdd909475e6549cf6d5290fc3aedc2a68353259e2e86698fbbc876fb2d309a5a24bd1d0cf2b974ff05c1eb79f09b3ed71e49511802ce367ccf24a255ca2bc0a287be81f878c475e230a648eb518aab4033e7d77e2767e57fbc6bf2748d101924c388c863d4211b023c71af635c642fab0c83531cd90ded2f951678f7b1bdf7f1be1ebe880f1865092cced87e8dd14606f2d0c199d7f59e0322f0ac2fa389ab5032c4e38ae6bd9587444c5d428ca293d4ca912df58576e4c180874c63ac1a9a15269de19f91175155d2c27c9495d8516f37f199f4975f7c5caeaf4d7da108b8e70c07b7b05c8e3749a36d943c54c96a742f72bbbceabb0f2edf1b02493caea6966532205354354be625e5a84673bd9c523edb5313b9e80e112ae2e3dd16a43e099f048814f21f5afcf361a68f9949ad129458d8a79162d69a5eb8cd691208c0af0b010f9f73b48a9808a57b8473307d0ffb99af09108d164746cee5bbef7997c49ce389a91b614f43321fd1bdf221f674732f5200fcf0b6b2856bbaced7af4a63ff17103d34fff24d4633c758295bf6b75d795c4f89efe801205dc1967de805b15ef934608f69ac13f951e097528c099e48c522619ba676c96368095594bdec5a25a4f3d39d9731b54837d54268b0c051b4a89c0b600d862e40ef9a7736c14584a209688c246ace71f0960aae50724d03a321e395e19d28155f5252b041c0ab04df8f5dc31db54312e2080e7656fe1b53e1639d8c02c0ec60322a443728b9fc5042940062753b3f501b5dea775001ce8c3ce7859bb1bbf0c0e6ba1dc6c620fba1aff4ebf0e58d608fe13e625174509add58b7fda09c54f49477507c24584545c15135787d615913c56c2d93fe6b2e27cb115729922ff772f948a98fe9e268496c6e32f48c077e089e1402513cd1d805cc414e21c326530ef1b62ceb80ad8ffc60b47a4ed743051e8cbe5f1650a80752f7050d8b5952d17e562cbfd471e11ef2318b9bb1eee2f9651d91ade081e8fbe251e53b63e1aa93af8d54a31580c6be6cd0256e5d2e19266c369cf7bdfcf5d509f301457c84685b5fa3daf208dc2bccd9393cd2693927016ba46590a472a2fa14eae7662c584e25bc4ddf8c13330fc109cb694c084604ea8a2a95ea562fa55baf2907fb8eb805e7ddac5f30bcc984c39c4b38f71962dbe05a58daf08ba2c72f4dcec4ba45183b8f5feeef146e91f904118d0ec4cdf4e4a87b3fc29adb3500bcb3794d34417b9e8ad9260cf486bf8c6db6dbaa9c5c4113c76fe8e83d92e6345f0fd7dd8619a1cd00a4b49e3647cd779cac2a93b896b808cc52ee1a2f8509903094142c731e61e49d79c4a293dcb597577dc80f0edca7a0d6f7b06c68e08f57c4c3cd90651e6ae7e051fb16a8c1477f34bca3e99d60cd26a59fb3facaebe3bba18f40dcf4a0f91593c6ccef7212144fea457caf4af2030ab8f322f9037f682622cfd52b6fbb853dd2a823b7f8e86b69654f1ff41a04c9e22989c4f662dd133a99f533031e3622e8e533e81d930bd64df541773b0086edb48095b99f010bdc441d485e6e3e2a1457b2fb8f79fa0d602c57b22c7d8e8be9d96f7e7a2345588fc1cbb61bf67ce6b151281e85d4f6ddd761742c00dfcf13e5d658b4317331d9db6b2b787252612f2ac6cfc00e6ef4e42944a4d26ff813807b2e2a671d2be6fb0301157b56c63bdf5b6a096b8d9bdcc096d70f0dd40e3748899cd270a1e3e171a240b2f74b794e15591ab3394d5db28136d24067ed0d8c789ca50b1ae741122b64597fe78e1e161d65cf228e15bcc546fdaf2a283b6a2743c111cb0ec3f9c14a0eb9bcce70a25e10c711c5fd08ff807d54111c299e8b954952fca356ca6ac8f2e32ad1dcce573dc6df8e7b1aba8b10db5cd26e52d75a70bbfb1999ef5c91449f212ead1045d8b636a7ca28f821f63b4a179de5b134f180636a879a4f8602b44daa012e681573efe651f2200013735595ac5aabbdf568ef8ef418a20dfe7834fff1f018a6df7997d10da7a8c5d632052c3ac3b36809d714fce900c446593aef171cdaf92a8e4d7fa6f916faf8053e24ac20524766904f607232981aea0f2fba1096e687d2b1cad86c0a468501488e5660cd129145d888faec49cfd4e197cb22201cdfc0eb9215534a7a9409d9ac88c1743ba95a57aeacab1f778a650b7aa752155c810bf594c7025a881b71a3083360f0fb2beef88137627a80f34e9442e87c7c9d216ee3b6e1f6724987e811beb2ae1c0b68e968fa1b1342eeb224ae940ba7932f78bcc4dd130de4332a201b334a445328e8690887f32d1743fa618c2aae257c42402bcbcb57433c4b8dba29c31671f39bd45d29b5d27e934ff22da7eb318e561b1c0b673610a284a8364d77a76f59908fee137a968bb040453990bcf5b23de0399302af9f4c1018ee7fcd85cdf9a6332ec04e2b76b73f686a5ffc98b3d9a877bfb1ac753f94e0bd88bee6ab9a2992094a522c60a455187ce97038899b49cd0e74863f8d9a93d685cc4ddb2dc58350b2de027cd16d8bb4ce31ab989801e3ccf7ea15f80e3d31cd33bc4f8ba77dfb2793900783d1115f7d9205ac74583ae7ba7f097b0cb6a2c83b94ace0ff991bca427e77589ccc73365b6f106020c2c1cae6e3e0ac7a6efa92bef4b806276a7742d4f66c113abd3d453eb76d5264960b161950378bca4d4b2744edbdb99d374034bdc5a7063baf4a7d11fa3b92337537fd378e6b078735ad204a277c442cbe1d9657520074b56ded16138accb85bfdbcfdb7b45be540c9ef79ce5faf9a205a9ca2882359cb7706360800462dec282b386a8ba759c6de797c0df15d84c035f16d7bcaaa0be3ac478b0bd6d8c28e4ed91163e0efae5826f0d7c556f2fe3c6da74667f8227b9b238c5180e83b76e0b4be25c5683bafbfabe9b89cc7298cb2f679781a4433e78f2972e0d35b39b3375384ad99f93bbf715904be53c0ce9983223e9ea444d7aa36e486af37c352c807ba91703cbc6df03dd77bee0590b81e6c6fc6a7959d808fa6a800eaaf6edfa51458281461e6a54d6d3f12dec9175ddd1aa09e92dcaef624b4505c18d69fba74d70261ce32463e6e5e75e9ff9121a3a7e09484790da183e17487b4be4b84727f3dc1e36a8b9378e4febcfb0f60879b88c9e1f3020a482d71e9b0371ae2c205189a77fbc3a2091384c4c7acb8b4cbd7a2dd3083ce069b447c9cc675657b4e10cc91b0046376e099d9bc2df7f99a2089b87b04d128c623c46e86b3b9bf54074d8595c7868fd090dd29f08b9569ba00937b75e3fb04fc1668090f2ca12b7b230e7edb3842c80f40e1fa4d15f853aff206507edda78679033a0dd45fb68a362103a331c5408bd460745ff6bc9593965ce6c9b903239730177f9ff9d7a82dbb5cff6096498e172841df1d054e7962288d1a28a6bca24de7633bac4683713a6449f5fc1e448fb27455e185b52a135b3e6392e052e3c8512f20580bee472b86195f68b96184be44051f00c5ead923873e435e9271f28ff37e0dcc615489236fcd43f8e2db11fcbe0c7d6c014f75c7d6acbb8a4306274bf9c542e2de0fdb4c7a3f73a5f661e36269c55413bba78e19a2e4fb1c21a040587a0ceebd678b5a363d0751beec1abcca27a3ab955a0e693aa20bd1d0bb97b332191396887d72bdaa09136714fd50a9739abb440e7a6ff6d68cbcca32d0ff6861a8b91d12072f743386043a649925b40e7492e9910c90a10453ec2543fa6840e7062d8149f53f1dc7dc7cc4d7965411fa7728dc67645335c11080a62d56ec1ff996f19a41ebe54381f0cf6ea6c82ac5e54c72372b1af070483b6fbc768333baa5e2ebd03a1d2180c9054850afbba1dbd189bb5ff10999b4dd7e185b9796d88f07efa23576dbe36e9092188c2d2f5eb9184826c7660d888b3e23f8d6c7a514073a9aa9670d639871e27494e26be751a1cfea221d7a94a7eda0c9df8d72923fb5d1fdb69c9954b1229094a440ed05f766e9e71ed73c83408454cbb62740994c0ee6ac32b3b3599555f7d857336c90d6c75b9adc3a7a7faa6fef65b57478fa011cbb4b1201ab6e09cb2056aed0b857fecc2d0e87617dba3640f8313098ae3d90416bbb6882eb169272967ce67e01ff36a248ebb955047327baffb3db14129d98ae8fb836d3e14a43b8ed5ac4b56279e3c19570a7c23fd892cfd9b180e66afa3354fe74aeaa2cba49ef484e322ea97f1caaf319dfb68c813f7e3c451462b380dc6385ccbaae340f6462b47ab5ea380c0fa1a8192ad2b6d1ffb4d085a6639c9b59465216173d0f26d552cc457cd5e336cb49ecf6f13b1143e2fc8815b33a90255cb8b5834da9735c04503bffce1bf361dbc66bef1a90e54d8f5b6a4fb389ed2a72a0d26db4d15075273cbb18a0a91da0c74dc0d915866a074bec9bc33037d63668da13665c995c75d2619da02e83727c93859936b7bbd9a2fc43e47c826b74939d5f5a3b1aacbb9d7d673ecfa523ab0664f033ece9648e267bbc73b1b9c49f3c9a0a9c190713c2baa5a2c9f2a4489aca803514b8e0dc71e6975e054996daeee455db9c58e404ddb738977d1669cd3dd4f12c2a132e32be1d14f5e1bfbeda3b3723e8401fb3117beca8994dca7352b8b1996e14e98e666a9412de18231a92a78abc5ac44a1e97d5aa7219a2d778b89314aada41e839a54d57ce488837e1e0b9a3ef38d54c12560277a8b48e48036fe9c94b9156f4f9ee68e90b93497d5bdcb07ec05bd58359ab1df5aec4ef09363e0f0e1dd0a8465e014afb54b48c9aa1b728320399edd50efdd79a07befd0a3fab0befe0516119a2f3cd9fd6f682c73ddb2ff31ee5f6313b3e3e88a4f56a519c9861ba840aa3abdba4215dceae6d7e817353f7eeb7c155d4823d8cf28db1a3610eb788e21467fea62db03d0ad659981f02645044e78e670c4cc23ea8229390dbaf06645cfd31ab339a89b228887bf32660a660d492308299a5afbbe7099e4f2a2ddef7358241a364cc79b08f06b849d3877f61fde26814bc3b9b7d0e62dd1707447536ad57103cdcac56f120ebd132086040f823e57149928be19a6bbb74e6b441004946fc8462462b52222f7da147eeb9e0aa410d4ab8a6ecceb3d95243b22f2b87c89b5d87f63f34ee75c549cc006cf8dbefce1bd3138514759b0f9afa4f24c5a7be90a907163a535f6ce4afd6fca1f2cd02bdf20f75417547dd863ee0d53159ab560437442bdc1e6c34a517a7fe0c1f4ffd534f47e0ddfecd88d1081442973b6b0513d0bfb22cbc06b50e3c1b4e8e386970171a7ab682bde77b2fa77ca5d9dc8720b265f8baddc8e76b380b94d25e44d58eb5e3c5e3e32a9b2167f9b6872099a3876432b9149c09f66f20a2e50f0291a34e80239e75a4a02bf5e45c88417bc1b9aa27210cfb3cb72555239f0b76fa61ada8f4298024e59c0b29b39d1f025ad1e5c37fe5edf33abb00d89b8bd1d184e897df57c9b352a23fdff91e7b0298da6fff4a66bb5be8be5c527aec9767f0e9dc251e7f1f0187aef9072d8d7aadcabcbef88f9288a5ef0791b88ca8312d672df97ca27419fc29fc36f76841c239b5d78e430d3b5425e0a5eea34a0e8a8e3bf79e3f3832deccc800d291df04fef28224916b7c2a82f5207eb219ada14e47e37317d61c830a92318b1282ea4a9eafb74256c2306ad218e30c4488903c5a600392b565829acd109b33e7678d0c88368926ad58da77e2cc1c94dcc49e9a35cfe5d9186442df91a0e9256c85540a2944ef67aa6a14e770ca27e0871133d8994c31301746b3c425c024eb1f3728621d7c743f904dde1c53095bb58adc9508928bed8f55633c1b42adf839f03673b6ce494a66230a276221e08d8e72f23634ae283fb11fa6c21ad3e76f39b77969302d239a5f907ee1f18d6bf6e66e83052fb0b817364235154af700ab0e94e05a8b815b5ac014ed316b1727c137bc690433790f8caf0d8db31c2220b5e8cf5dbccbfa3004ebc121871e55613d1b1d2eea81fad202d53d00e17ade07f216523c073462ab5976c05c4e252ce75dcf24c67f1bd63a8e69a877fe386d5c36f6302a1d97428686a654b9c93bb6b7dd7885a9fea2597e8b40f475880fa049b0c286e6688b1adf9c09da1243aa7f5e560c26bd6691920fec1a6ba4f3181f70ac58a63aa6c69bcf7415bbd48f5d883d88c79112f524c3fd5c06b3a4c8699b848c96bbd5d06e2807f3bab3cadef49c40078c6b873c788f4c83be4ba877d05f7c504cdfd0b1ddcc006a60e616acc445e00659d7f51b11a1cf33ccb950bacc7a28461a965e4acb01b51433586eaa2b8dde398c7d033f5015c6e4d3cb50200491660defeebc5155933399688b61a78e436e3e2fd027e0cd498abf213f01fd83435b085487d6a7d539e93c187ef23092d371dab5b4998e77d4922c279c2647851f652463f8e748473fcfd04c79beab54999261e5b33d04e8f8609633168f01c51c3405e3fd48bc693427169afa66864c06409ca55d8814da651c9fb3c73987a623f663734b42938df2cf522b60c8b215ba779f5163ee43c1ea8e4ff129af3bc156edaf3da4ba37353757d6b7d1fbf030d8f74829d4a017c87be405c3775760073b82c30fa250e365591bbc73cd8d27b4471af3e040fee94ba245ff8aa5c165994f08f725b69ae1c36aa42260978a3735641a19d476cd971cc267ed03df413e6e9e9a99ae052181f4047dd72fcaee29efce1d3caeb2650dfcf036fd6f9a9e61e15a84f590d8726dd358c40dbbc76f5b7b756fe3c6ba9182ec5231da53599499993861af7726f91dfa76c042b42c028d6fccb553c7e58a06c7c696fcd832df1a7ae0bf324d0beba4a55e083d33176a62cb1e53fc7b2b1381a4b0b3aaf036b89c55b55cd02fec53b934694c9a9df6e095d24cf5b32f4d653bf852897defaf2cbbd0c6a4d6302519c2b2402eda84a8d0a92cc9c94ab310071e79b6c4e9709f347157b3349f1cc31ff1da62061f927557c3604918b52b3d93174a6ff57ce2267c6f80ceb3effd361ccaf9b9f4e1fa8872bee5c9f4cbe96d940ed1fb821df9ba28619549eb9c91795ebe099e26943a6b20fe3399ef08fcfc226bfd63b8671b07238f6eb4a55134d64adf1ed75a05efec5f9ad3174529a26385cdd184c9ac9b3f9a8bea91fbba5f5b3ef7923cf4aefdf58174f7da66dcf3a767441b70a51eaec20b6328810ae95d77d63ced5c68e228a952ddf3265d7fc857f36b2947b9adc13a682bd841389b250387dba909562887dd85037efa81dc3f68bbd48e5a388f80e8e0e2fd9472162fe5f650e99d4527b9edf1f5c642b33a5a7ee77a73703dd4d778e3d2255baa8197f678bd82e3ef4532bcbf224bb441da4ec655d9f175b750ea984f62568e068fe419c9caeddaad0a3e3b5caa8e768e41f23a7d2ad8c2c46486235f250efd29cfbaf01afe34306ca1892339f1e0a3f6bfe5b6f0bc2b77f249f17c8e1769f7df699a7069ef566fcbef125fb6901fdb4e30e318045d73d43b22fe32bb9839b48c4b2e1023c13c9df694b36d6b1397cd2fc9495a887bbb3582efffc1f7394fb0628801e8b2ab11f6f3c481236c1742e3cfe28965f428c91c37b57faabdf6b425803ceb9d96385da463ac923fae3389542bd050cae993f8e5fc42fac34178424a67ec6c25753cf61c6b57f1242b04ad15b836dbaa7508a5c09c43bcac53a6592daacad544efb352c403ef20b9aa4c13fb07196aee3ad769cd02d8ec730fc26f15f5a91d9220e65b9cf28a47e7812be548378e7f0b8f4bfa0e6bf48b0830f67a46ba902a65c2700885c0717d6e9e74d7d995a4b317c90482c502f5a56772aca13491e8287bed4b013440c5f61638563e443505f4c4ce8942cbc602ded595e9b6e75f733e6e59327b1c7063e5ec2361e407ef679686c34d944f46e4e2f0d7d28223847c0e8c66a42dc96df9df297b0db72f1efcb9c3b20fa072b6a3e1715111e4b26d3059889d0ab4413be67ea50b56b8976c1253404b6f3b8a0cb65afa4e0aecde74268b7a64b86f3de3c48707edc84fe5e7db132b86cd42b9f79adfadbe4c3999c6398198daeebf26ccc3021b2a05e7ad588504e6a1274fd4dd3e564f7dfc44817b60b135b144e0ede768d9517e976dd5391829d98204878626a47a8eea03f8c23572b453702906c5ec9696f69446b1daf0581aca9571b806af85803f08c28d9aca9a465ef4fd60718309e6516c73ed153c4ca8abfeb611861884c0b8851379232f3738b7c4c9995ca21d7c9fcf081ad253cd938ade7bd8617c02c3ee81b2a68dcc16315e1234b21294e6d5f8e36f3eca16910dad4af1e95bf7f6057f3db46183ceee9ed3c3610ea790e5b538dae461fce5c3df0f3a4283613245f3e48dbd2f42b22b561b445af9a453b8afe395f63d3d77f06c94a69a2af7505b2aef66a7b1d85c43b6b845a89f6c14a019a0cf0e221e2eb7af952a4788989acc22d276216966d17ce4707b838234f70429ced2087f026e73d467f0ecbe23ad498783903d0ea77ab38ec652520285b72e936b7eb73a0d7df734aeb5960a1ba13a10eea16660bd30600a34bbe118dfd1750303af4e522ca97a1deaefbea94dfc82cf0246eb954d25b3e2bd398892428b11bf2d92c2cde2df2298acd42ad44e530370fae96c67e97b32ce45939931d87f26a2abc27d2bd63405b52cc7baaad5a2281c8984a74462bdea78890e6a42e2ba12c25b02237b1f3013dbc4e84059a24dd54137678c685977763709ff64fec910cb4bbf5f79d8d7edf54eeaf85ff47b6cfb0316b2a2f3f5f60f3d04fa322de748db7a82e2919e62739dafbbf1bd36a4053de5987c9c6621a774a4eb74a4d24652e21bfbb8f19da7ce37f4814a3e70a25faedafd2a956d253c392c30a426179d661549c44b20bcb35de60f5ddcc7c34e7ba6e71353adf6609c933af39d5421ee000a7b1bbd994b4a77a178b29a9241c8543dad070a65f0e6486a100506dbfe15c4160a9ef7c0984eb9b5ca21c2d3dc2fab10751212ec283c4dd1f01441f39bf7101052162388f3947a75e5915c057ce106bfddb4219570f2a8da8ccc398772e5bb54567943ecdca2486ae1ad98c61f18fbed68aeee1d5449c36257d3af6a756e1e9265991a291f01c5caa2a5d0d2f81ecf11d111618ee6e9f39f8eeed76c4b79f181bf267939797b0957fc1a22426a525cec5581bc735b101fca698f656c200541647c4dfee473c421bf525417c76a1daad629ed9f03658eed65014cd879e8ec39602ba6d7c5620ef6496250ae8b313d144866d9bd9e2056bb19f1938f5aef3738d836047daff876c3a4af65763214f0dcb886c815cc1f354b4e4d6182b282493a822a5d5123f6766d6c2f4f13bb5d38eb99299d6a770b5da72c0df8da693464082da1ec671990b62a89c29f90b051df62e221a7b6615ca1aafd94552cb49f25d4babd9aa2cfff53690400333d0ad1603594e97ed7af9c1f4ca777120a9061e2e1eeb842a78fea6c5e9956ca5cb4a5a7ea3ba3fae71f002e6135b75488ec014e26ff03038499cd0fdf363c79e3b5ba9f88b99fdd19c7d00e1661b21c5df4bbff7528baa4904dea64be7dcb4a717d04e43e4fe44720cf7636cb2afe65a28480188f9baa3633e38635844151c02c71a1ecaacc860be7d218c5561f037aeb35acd9c3e3dd91720821e1761f4f0bc7bbd1881a849def9b7771be3fdab0f1533460d620b68f6829fa786c20c972e904ea9f7648b195d0365563298fcd9fc5a853df3c45749fcff88a9a71e77b31e86f567abcd3331d97c63844c2e7fc4b80f4cfe9ce0576a034778002ee652c36e54905fc7828dcaa1e7f34b565e64e51e709c1a0545d695700ee7debe99449d48da41763b264603b1da2a406f3d347d833967c0e4c3b53b51c45f8937749d68bbb8966392f4eb5e9e3222af3c266d2e30d355212ab0b6f94c71ad9ba923e6c80b0d62ec9974bfa09dc469626da029c50ce867ee84d27c3368dcea31bfe57b1dad00b2b515babb79149b1f34cd29ab2583816332304ea2b4b1445a837dce73a796943cd77799a567d535d4a2de690490f29e803e92594dd1b48ef1a8f8ed0fdf765ef988defde1966c7109d1b88a0a9a92468bc92e74a3794a3f14ea4a719e876d1f91a677b12c5178e57fc27ed6c321eeb42512be296513996fbc2eef55f7ae6a8233da793c186f1eb686c8b42d01d214ab2302c0b1af6846b052b45d4f81cb4a9590fbcfd2fbb39be5828478d94068e14dd6df7f85b8f158accde26205a225223cf81774f9336c43071d612f61049bee792a5958306ff1e38037038b90f40caf121eb23408c4ebaac29f103931ed31e61a995e91b412c84fa455c339f30ced90e22838cd2f54d1e9fd450ad07e5fe30e279ff77229e42dd8f9de5c2b28f6571ab1e256e81ebb3ec92e6b82e81744f71402750358e37cbeea0af9c5029daf8b494559eab8dc113466897df8d4b66ff54cd83222e07ec5092adbed05bf0a4d67c4c5efcb620de55269edd7c152428122271ccf21f9a2d1e5b1d53d3f75b062369e93d597ec1e0c3a1865418edb9b4f682e54c742630571422b59d908ef0301bdbad2e21a3f48ea2d25e35854aefcb18aafd92cae5775b8a5103809e5da8a8bb5b9ec7e0453ebd1f6dc0a98441eedff1ee31e5a3a02e38386575c64abbd250897f147dd954b7b0d4b15019d1e7b8fa0824d164b586ee4d054a15655a996bcc241aa2fa2490ee08d4ff50a4fcec5135e7ca803681f9c2c238f9a8d08d12510cf8985be07f42225183786432649b31b081b4861f024d140ed75b65a281e3f2359d7380684880ad8bc39ee957a0a42a1463a0244085cf55227227ce2193704888541bba541fde36d8b49731bca28581360158b45971cc9440b5fcd3fa0405c10d03c3f830414168fb0b76ee7a7eb775b085eee13d193e059bd6dd55545054081aec1620f85ffb47837405b876c88c31c7ff6d03f7db35e7ed13246aa104f334777b116660b95db5edbfdb3684d5d7cff641d76d3046bf2377930e28d45ac4068c4d1b98422d9dd95be6f79f5b6263ed6be16357ff6b9ffd1d81001da3154c81b042ac21471996ec848626db0ba212ce5aa2b7958be812adca9214fdff4bfd76089ac21cd8af57936d97f7382e30de88651d32e5b3194074c2f5e296195ff248649601a9d6e72f9d7fc1866f05277fd7d576ffdb0136edbb1f34e2a8880a1cbe2c79bf51ddfa922bc3686fe407a001670e533c73a6a3980e3561bf81e0034f6ea1a820379ccbada078b0fa043c4000cd37c9459937ccc67f3956304e38b8149ed2ea2db9b01556e7b78e77abe9cc7b5d3435d6209de388ebc3bdbc660cab8ddeeb243b2f99e8482db8cb241bb78c43191aac412e0100528f92dc4cef706247c94adb35d8529107fb70e98d783844b60f0e36038289f3259b2541b8bfff2e5ce9068a2db28f2ed6aa2275f0e9866add8c803d88636bd07be0211496231e5982c06b00ed17e7e2ed58641e818c1053399d452db8ae54dc09cfa91e00f4e89c2ce8964e7f01c5ce3ef82e1f60f2867ec8e7c2df69c588aa4186031db89d848af8964ddaabe0de52087c56fa1490af833539237cacc328fb0526c77088b3911e8999a31b6e87af8bbd2071f5c0576607e806b6d19010174d162c37290c117ca7034bad83c2d838ef722a4063ff91cff03215d496afb1d7095e1b37b64264e1313d1106222ace6da6ef2843f88a71e697f3071bb8065b62ec9202f60fe2918bd69f970c6f02df96fc7aabf5a16fcf0e41147a45a35d6e2c58b348d521ae00b6ebc3d8a91a46821f4593b397532b7490e408c24fafde0864ebb5f5b1a5577841398f8171c55c20bdb6d53dece4bb76e6279f649a953c227c95f882ff65182024a2ea78331b224a3a65a2d237caf1871f9a0afdaefd00cf95561ff4f1c9244c148b43141f220a5cb4ffb18ec3197320f9428d0008bea28c78f02049b229854e2627cece4529cd70d72f8b1797934bc82097b326b74e3a2e7913c318a239001bb90c97ee23afbc1716a503f836b6eb6ce9c1ea194bd6930df259e094a61756b65c5d3a4c2d3249595e6dea723de784c79afe5e2be2c9c6a9c07f83a546c48798708d2c6fd5d68f51c0d1cc57f09a028c5b8275ed0b86bf971ca2946a4a2c31d08c67a034b70dac2084d84b5acbdbf0ec465e2772af1cd530497e42e6146de647e518497594cb70fbe10bdb1ec9c7bbcd8faad17daf3dbf8db1fcdf8d88563a19482f1c7d0febd16946b753f3dc3214e01304048a4a4247ad47934e7b7514829952e20b67c84a56b0fa7499c7469c471d2e89274059ffd411fce9d445e9b71a3c78133d0876d1c632ef9487b8ea3761c25c70f42712a810ab8f7e24db9fd384fbeadd3ed39d388cddf3f790073ccfb83f83e3e91cc00369b0216def9133f5f5b70f56f1a776d785c09a7fcacb0d5dd9f72866fa5636a1e208b2be9ba5e446764d91879c23fed31ec9b6f4031171e84a056de8d8ec52a7f8d066ee0955b26bf90765f496dab99e819678488c41bba96fb72cb97e3966aac8bea966778989d80617bcb40ef3e07abd316385fdbe1f957192e2f3bc1b5c99aeceeea9273a4a2930694d8c1f22634070948a33bb563f61bf1af7a0c37882a8356a174bd9011ac8a3b06d7f056c768f3962a4db229170978a6e9f266981525a56d117096acdace211ea9467fdee6639a439d0ae0e2288f19ff3a1f996b942c96cce6c59f73e06d2d53830658cef4ebd2c54ef9c8c0d3f56919f37701ad3d49f4ab023909b26d3f98f35175f3495c9b8c157a94829d90a6b5b35286cdec31b47ac2e02aea7f3290ee138fc9ae5df1c28cc4e86a5384ab761f90b691e97fbdbf83047280d2a42444465a2cefb0f631f21444649206c656938974a20dc5f103934b75519bf4291e41f1532eab63f4a0b226b1481b36851a95fd3f3830a528ac02dd21a5caf549d273ea777a319db8bcdcd38d120a1385b616aeb2e4d304129e8c527dd7af37e28d07decae3f1b1c68d28951cc8068863c25036f93b3f2c75b716f1a858a911fa3a70e21d1ddd8025eb74b93e7c14a354ff86c324e9f3060a124ca3deac355c3ef14f80483bd7c5b7955c7a35dce94fed1a7079242c5e9561ae284458390686bcffda8823e621d7954428a411e1bac4a0e7c426bd3509092eedf9d5f983456fac22716c37a65c4a0dc9f6ce22ef48d0fe41e9c7e1a2f97815454f80c537f8681fe7c1ca4a735a118fcf875edce6986cd4f38610f0bff69713295d76911d07cd6aabf4799dfe930e92aa257daee63a1beaef772ae4645dd3afe96aacab53e201ecf79670bf019612adb4676b6851d3a9cdc175b62e171a35a8b163a0220624223ddc26a9e82a2fa6a91bcc5786e8a132a0171d27e1986da09ceea12e3a05c22f12d2d01a0949618e2075b8069069e342b6fe755e94615e6a285354037924a9bb6d4ee283767eb85156c1d4cf9f3b31348de6490c48cc8f288332fe11ac53e2650951c22e68d5fc9e746f8c5f2c69a184b14a371be16f0b9843da0c35e3df1ff1cb38923352ea916aad7325769ab61094f01fe8d1d6908dfddf7772c603405d05e76940cc182fbb5a7e790fe777f37625ca96ed22bc769c1743d6eb1caa494d8afed04f982f1c7981e70d079ac2829739f63c6a55c77d86a1d5624bf1b58bcc3c0e1df2e28f8a22f171cd067b7b244cd00aaa141a2ddf9bc43f56d43663ee96c4a1b66781deec6d0b9ceb79e6312cb5e72b7d663740845aa4d7b40ddf78f41868cf334bdd1845ec30b15dfba8cfc89b0f7328ae76397781af4035b45e544348a44de971b66246fa7ea9c10412b5ae590f0ff4a43da9a87c5d1a233eab29548b19241b601c43a255e26f6b6a193f416303c6a3ab794d3b8f3e68c4ebe6f7b2474ff6a982091065e53118927edeff915059710f5148c7bbc6e5b159f81a336f0a3b6e4ec6e9364804597ad0d1a11db6c98b078d5df1f1714951f189f491ca5dfb991c6c7de672ce03b96c3e1a63842b69b1008516c893ee55f11314d5bdbe26ed5d32057e97780f3cf95bd3860b3f9662e2ef3b5496b2cf28794feb4560808bcfb40319de9b69f764bc1758d5771f91e01186d06ab1e2019eb57eb55e72dcca97c186edb09884ef6a3e1c57b4acab72ccb9d9c4837368c6425b931d2570908691fbefdb964cad65bb49b57f7c1bdb729d2752dc9cb0641ac373729d8e9c52ac4942bf60e6e31f35d0561eb3c235b0c47a82896337ce8d12c1ef8739e1d61b599951d6bd870c5b8f3e9cbdeefb6a8eae3147526905a1a5230a218db33a5d189fe2772400b6eca90afa9f31ff5108da187d3e944758320f2c2474b01ce84485690e698832b4da83a45d64a63858d3ea30037df8ea1467ed181ff944be4d994f986126849fe19e4292604e90d8a3898e8a6fa5e64139a8346e0aba5c7be50183eeb136174bb7300deff168df36bff9a6e065402d0dc91ca59b97c4f588fb64e0465d9a95f317b7cd44ae38fa5f2a4abca7738006be81f0ababb6115c213efe037314b2ebb9cebeea702c6086c2679bfde2dbbcc617f4632d78477758e644f2e79babf90ff80812e8dcfe2f8a157e1f951df5e9bad4c8bd5f3b4dcaff19cedb1285ddafeef6fbfd5d0b529a1c9f1a2463da15e08da2f002b332812b5c6776371dd710ca00ed9a5f68e5e95a017de510573e2c951b16cfa459ea97b014dfd22d39b3ef3b90a67d3132d60fe909c82e9666897d3525558fcd1aac9d566b1a3decc7a59d868b409317c11dbad6c56f806dcdba1a7686ad91458b4211892488a8a61d92be630e03cc8f80924534ba821cc2df554887e8b6e1b3e2306abb453360e5ab534b7159a36f5d1a94d2a191d60e6041dd6c68d83c10ea861e4d17ccf62db4cba0a7c3e352b01f8714648bbc2c41871eb43993f16bdf2994aa8caa6adfc4a4d8751b9260a9baa11a2a6f51e8e93ec31179cae6d27bb074abf48191ca76178fe3e0a40a59107feeb40b453b73d480432584b37d335840b9bc16bcc61f67c951cb47f3cfab3385403427f09faed41a8d6dc15a6d521d235fc7022e8033394be35556600b1e0af94e14d24e2fdfd1bad51e164bd9e46e9f1e37b44f7117b5dd501cd887239c35f69daeffc2e3abead13953698118bc25de49b01bdc1629b8142c6e9121376b890f267bb4636b5cde79ee8bd7c2d032864622113de5e5e9b27eb519cabe4f69e8b39845b71f63b44cd7ebc56528c5aed421a3fc6eae6ac18abb85b0668adefaecb811ef7896e51a3710526cf10dd459797acd708c985709d0305d34eedcb78161b12950fc985eda829d7d233e9d10c4d3cfae143233ceccbeef751781d912d022073fec73a4682f66d45aefac9cc707c84b6d38ffe59087d14aa010e64c2b3f4df7e7cfd24faf1bf8db8f184cd64489177b9845e76d50d6e6e7718da32049000513e0a8c4183bd3bb08d8022422bb19c66310e9078bc16ad4b08a249451ee6d347b24100a1524f8e5087a423aa8338a4c2080305a583d686e00b08e58d81f48f67834f2f50b1db70934e9d4c0b5c9e3b768b1f194fe876cf4b169332d952f480c708333b2409fd2ee423dac91334e863f1b9c6def8e099d1897ec4f91768c74b0bd8c4eb9a933504d390a7af7b997655c7722868db69a46063f687c4dcae9ca276959972368aa36d836c0894563a7c232ec2af92e307637703477c84fc77a2769c436bb49eda3cd0fe4cc3182bba50577a0aacb3f7cbd98171fbfa8e12462e018169483b473633ab24d5d59c9ff15346150d8cd1ad170ecfe83b15e0171ce15b65f6768c5d27ef1a4548947af2e88798e30a889454b4e809cab83ce31a6dd0cdf9f8168a5b130a9090ec7e14c4983b14693ebe34b93b3f58eca136ee9ad15de096db6494be5023be363f8b828c7ccdbfbc75edaf37ab6d4a4c502a2c752cde764220e2fde12ba03f2a2aad41b0be4fc83ab6287b56499f9e761278b61d0b8ed9a0e14f929cdd104c69f544e5c8743970e03baf9bac991a359e5980a1c33ae29bc8c311f2979aba8caf58352a9371b58671357d88a51c57c5e7932389a2aad528d4331a593da32bd466d2e2e7cfb4805b2992fc7b4b3ebbb49219f5cb1c96ebf42b562f9588c4551390cacc04161656344c56eda62518436e775d2cb585e9e3396f70e40a7562f0d674386c681321f30a2b7f0bc2dafa09972d6b229340b852c449f83b937127ca64c3d6688d466f74e85db7eabd9af155966d6c14456c6e5175d2d585d8aae08fc64a7acea06c3c4a0da86a9a987bc6fd791d41859fbf0a72c96f8a11d6fa9e00e5db3a8a1a60a4e4b6e861630809c40871efb4ce3d443a0f11f9b071bed5fcfa916d12eb886405e81019c8345931f201a671a7c7a2493cd36325a6e25b39c08125ab84be7b57e4a125057d4f417fe539c6beae5792ca968fff1d732b926722189dbf6f5a181f23fb697fff05df2d83d4895e438e69974fcf2b077e08013122d1f31ae59d12eaad7df74fdc21b53510f9bee201b3d904bf69b5fcb2baafb55f8ea326faabbfcbc6c6bd0057bf5ce5b025e9e4fc8a7434081ec9eda24841a95353f12af7e7779a9edc567df6fe6a92318396671923dc82c1432afc8048e38f5cbf51bc4d4ce3291cb4824d71e2f9bc2d9423855aea895cb378500e6e7c4ec012a49c7a8c094c565dc40bbbaf6cfa04ee5ac53220701fb30309f4e45feedec12a1d0335600da7317e5a14c71c08e8e77d031b6add3f9cdf7927e17b29413c6a69b60b1d606b3415c9c72a8688212b33781e524130a08cc4cf1ac8801be5ca34a771abd94117fa47cb33b5e2c6003b48ee926920a75375437a76db06ec810883210aba797b7dd6d5600af297f9a42a636608a1530f3027804680a9ad9098098007e689c6002fc748618916f5c37bca77362acc19f1f253f2b286ca58bcd97db25ab0ff7e1d72f9f5e710bd49445d7c87180f91551ddbf7a98761a66fa9d80c6e042bb68fdb4ae52146fcbff212e04acc64f4e4282a2e8f61aada52709507bde9860ae0e0bd71017900739a434fb513eb116a32434c844747288452d05c73400684e222960b420e6b06df8b22c0377efb3f26e5e9dbf9ceef37a8142fb3199e58ef707883e877beb2399fb80031099891b2b7e8c3ab1c202c3cd119d1e8cd51c7c07005e50b808cb0a74d3197905525712eb8c64423cef2066c72b9378f7d37bc8f50c2e214c17235dc7cd130c3293e4f1e067b7a1bc52aef12a929b3e72e99cc4be7a3267c685b8c955e769ae225939c7b3877e628fa65261ae7f2475d6259599aa32a701b8b6d8ed263854e33b2d8b7b48a47dbdf03cba4ff7f0fb6dc47e4a6a197149e470e8b7087ac1ce67d7319d7ffb4b576ec60fb185e77a57ae444d8a10c39c946f5eb800304c59e7752b83192bcd01e63c1c6ef253aa0dbff570107b295d0c8d02c1bb98773f451b671c32460cf575bb461817b860e18c1790ab76b73aec3b416eb134ecf852ecd30415f082934c258e4d8780d8c52bce2949bd77e00784bf5de6fc5a0b29cc7467f8726d367f1502bcc0579848b981dffef1544b68e8d6ce42fe0ca43fae04b0cfc1fc1aae3a1111526ebf235633e0b359e42ab238e0907f18390a1ea8d5623ea2c71ae65374ac959c30b444db10593a20a7675c397c02b52a3393cd7c851ead9468c012cf2268c2841f3f3bdc553131f11846c51a41fe2e28aad6441c92738f1c4b6159bea194d3d5d340791de0e335104ee10443599b1b85061c390f6979bd1e202d4dcc7f8e6defd2fa1b3528d19be35ae0874fbadbf12a93d28c9de9c09c8751decb64d1e773a6c967f87fa557bf3fff51180567ae7397b9f212800c4593fc8f3bcfb36461576482ad3c18f0b11b7aee75651bfdb8eeed6516db89cb0d69a0f6f58f0bba87989a3e45a2d0ad2342fcdde53e8368172a95e96f80cad27944ecf37f13639f7a5a92e29d06943a79555a1f28eb7af033297e30466bd1ffbc96208886f2c163bb91e4ce5d06ca45b3e270eb280ed712f761cebbce92c7bf30ad4b004da0a1aeff62b5e4d90f9095a9f15f7b98c1a2505b5f65d17957ae09a6239110cbdebb977734087e36d29031f6ef8fa057d51597da2ca95624f6d0163fbeaa8f4960c40bccf6684376eaeea76bfb7542ed9c47003e35b498f667a92e82f02ce2998cfb65ff8fd47947291c2f52475303cc46b190c957a5c29802b807ca910e86c446d898ff18905329121c2c57c73626b2022e0fc62341820acddf949b1cde88a4b8300ab3b2531e863bdd6211421752ea100e67912a6d5e28691e102d883bcf6caff0dd08bacc0e3ac5a2249948da3e0d8bd5d841247f4dfb12131edd1509ae8b6c8b11d591c851d5d1e8431454ea9db84b29a538a7821b4cfc2b03af0e874a63a724f08513578930ddbdbfb230ce1c9040b973fa65aaae6197cdb8ea390a3cab9aff6fc34995ca00aceb3065cb45ae3ac78afe1e58635dcaea9774f4b91ef733e4ec11cb76189e4a57645804a934211de123486ec46d23695dbf1b0d5b358e7893d7de01c84a79d5d97cc8355ec8101e5fc93aa93624739f9406b93159e241b4f6341d9b3f3108eb4ec29c10a063e08222af66608a49b116b26d1a36b64b2bfecf5edbf3f5832c38529f3a99c8f3ce741744f4f9d0dbfd4893912a7380f83520a9d3396a2438fabbd87b77924d277961166e7c64e89f35ef778836ba5fe88598fc397a29f98346a2ff318bee8e14ff85b74d02fd2f504d4a48c21795f6496064fe1badb6b3661d321227a6b73f25ba1d90f15b29de7c3ca9d4740f29d680c4936d833f8ab2174679b74d1c090b6a07a7040d849a432d2ee7f1aa96eba5398b312673e030411da5122389ef85608379bc1981c68f2889409f06d9d3d59834dfdd9b037cf8768750fb102271f1bfab46d202afa36f9e9351edb6131d81ca4ba4f6a3d001681e48ec43a737a5da12b6ad77183165a6b8123d2e8e5b5e0ea500d455db4c9ad6152489758d7871a62014b33b2ff4faacbd5787c16f98636ec9e171df82a883d1884d99562c507b0f781db385c93028c64ea57d7f3f2fede4a731eba2a47d9001ee9761fd70e0ea05947208fe02e75651524e27cc94e9ccf7afdddbdc37b8ad97368d8906bd73a8b2b71af7580411a44fd02778b7b8b26f0b39a7a2cd48ac007baec6bc31212a271a4cbb3c311e4958085256551accf202a088821c68988b0b30329eb08eff132afb0e0b6a4ebb69c85a86e994e3d490f2fd976f6da43b018fae4f51454086e2431203ab199e0fa3637175d99a031c81f3e5d79da57a6887a5a90a78f6dff30d7f836d3d68d733d1896aeb5428911f22838f991ac8ede75ab93e62450cddfa759d407f1838a6e27f7b7eb2cedb81f7664ae390777384315d493f2af7106ef3de2b8e91f7147a1f01cb46c115835b1d760eaa4da920b9f47c525b779473cf85ce80b100d6fa7bbc2700d095f10397c612c4fd904209eda94a003b588491be03c13915297761341e895f245a10ec969019c211074ae3e260e4bc2d8d772a010ea61d8c636ffcc892ed654695be85a456a06ee1bdb5a8939918f60c4ebbaae64f3ad2fc5ccd75861608d16b55a92d9b48ab318532904c8d42573f0976059c1e6bd7bd6f1b2137ada92bdb21a8d0bd461599bf05e6c759d4c73c55adaf5fe93a80ed53e7e613ab98d83464dc0c1652b7559288497b7d02690bfe78caa03b1f1111a3915490aaef5d4f0fd63656b53b4c5fe2ee3c9637843c7168b9d64f914473db2539b255e9224acd243db5abcd41803e15a4aafe3b4c833eaec3a8f7885db541c675fd905d203ff7bc3762e21b6b04d1f5e4913022674fbebfeb8f5d6bb5249d03f9daf3c90939886cb5d6c9c2b14673dc79bbee020492571f026e5e870e1c696102a90fef80292051f4829adbb539c725af2c75406c054facdca5c45c7d45a82fc8516aad52e23dde38d04d4d28a8a9f102725a2be573c9909b24db7c5be241638c864c53ffcfc32c285dda63b9e150420a001eaf8e3e7c507a40623c5820d12a6ea1c8f122e27407c2b974d79b31af44f88e5132df5c681a0168e6a75063cd48d9ef6a8b3d616d8f436fc5f0bbc2f7a904b468bd490de97caafba0466999e0bdea235f0bc51494cf134c0ab04c56a35e805c1a6a49bf3890c3af418404a9f4fd89fffea095d0dc28d2a9250e0a0445f8cc94f4220cb689c5c61cc6e43ad3acad0989220b02ebc0d570b9f8f8be4d06bc1d22f6376870700806b280ac98700c32871dbdea504c8add62ecedc9312f7dbfd030e9cb3b2e35b6b15b3782819ebd1cc6faf023aaf43dfd87e02a9b318dd6f6f826531b3d41409f3d7df954559d401e5b32a81a8bff8176cb34a08115eb46227528c7370744a30102722b89129b3d3ae6bae1c9ef5d999b42352c928b7dc2276bafd54486de7a9967915565da6e5772b35f4d9ef624558b1c2409be8531309f101e80e3acbd36bf410d9728e7bd25bacee60f11d18faf14ed32ae69a517e497c8ae4443d94e8f6d76eedf4d2215e328ec60c7956a1bbd6632ee6d182b5cbcb1edb2f87d17a98b92cbc037d7cb8843bf49686180cad1acb09d4ce1f55137b93391a1ba2183484f2bd0ba531ede2c259b11008cf8f10a19666a4d97b1101e8af80c430c6c159cc62866c354442d755a2e47700d8a074761e1ec3df30f8215d338892186c7a9649497bacf560b1dc7cb6f1f6265f3a17bb99bcc1e9bff8cca84cd74485a4440442010121e195f3fc36c25a3e8a167ed63e75900b3eebfcce8f60dc460d8ff45a8b55824c8730dee8c6e63b2c41785ec515b2b7aa9f5f9e519e4353198d032dda6b621091a5ad55e9df48e7c4ff2ef2d7393c92b70da75fa5f29af8934249619fe6b22bbc6d2d79a956dae88be322b84f1a525973ca263d54163e1f31182f068f4694fe7f19d977d22e17f2b5ba4a1645fa014d283cbd5849aad20d1fdb89351a64cd68c6546b0f91d3ca49b4d8093415f4ef05ddc25db2a85c3718f0f6065693fe58d7439b2aad706f7956066e8176232f0555a6830dcd5ca4966fe60cff67d33b67316a9837bdb786d9c95130814641033c0e45c2061af8d7a392dd0c24a10352eff7f814a04f2a757c81aa855b2fdfbcb936b382f4777d4e779767d1f2f0ce9a7b355043ca9ffdf6dadc76d3b6673db2616d9f6a2ac1f2c44e396844efd4c7add38a46b339103803b493c76174b44ee219424a91c40dbc4f551f3a3f3e3cfd2e141aa41441b0e451f74f140c5e41b62c6bb5e1926536e70bb2778fef26f87694d517137bd7462fdff715baa527547635756ce5d16abd669170149be9bf4f72e482842951d0f4c2fdb2ed53a8ab45654f555c367e8c498ae3b574c95c646fb8124f0a7da0fa87b1a46d32c6f157a34d92a4d66cc502b2bb88cd26281e43191c5230e26dbd3f964bebc5cc4dcfdf8f7e259e8a5cc9f79761fc50257ab35e0584c763a8ec14e27faee0a5e90046c087a8265034b7f0a9b206b902a345c2ad0729bbc5b0ebc394603185b98af5e6cbcbb1105debd68c13d0fc5aeae1cef6cab4b10dc3b618d3646661570923195e8ff288ac43341e06ab42977742ea679fd3b9588536916df404426170746c7cc2a179139e82d00951ce5e5d5157e74edc9951db146640e39bb420a50967c193065725abbd51d629d9ce0b9eb1e9cbad380a8a07ffcc8a92c2784dadae1e2768063e8feb874961133a87f7d548914aff03af6222c325d2997e215d771e255f30f29ecb12a383b3f6f2580476d4da4d309555ba1862eda6b9b164a4d7c235e9509eb7235c33f6a50a8a802141ccd9110f99a3394c43babb511cfbc80e673a026ff6f63eb98c4777e72e971dcfb99dbe30bed12a71834126be1a511f146f76835831c174932aee4e73163ffcca23d6df683d7160feaa0493cbf372afdb2651153a14f7ff66226e0d910478241a9056f3601d1fceeb5e8211f7b87b20d305bc6fb8ac8ad1352b72be1d2464c77bae873b682993f259d41c29dd6fbc1f5c02016d5fdfd8da921f6b2100cdd0780aa5640b5056990ec0963a7050bc74c83d90432981d7cf1e918eebf8eddb03b7a13f48e8f649f1f03b4f5310d12c9b6ff434d17ab0ad7413ae57b02604e7c59801a476b0c57aa6a4cd094b9efdd4df29a63b751dcf1befb3bc9a702c80e5b200ba808fa5ce0b829700b3a090bd67e2fe8e5c3f41796328e73d78fd6698f4bb4f0c76d410f856e6dc1a346dc15dd16aa0d494bf135b324c087d9c5b6c476540ef9ba4259730dc11cf5702306420c4e803e3b69c719e165f102297b4f67e265d6fd477397a02a77d659cda557e2a45e8fa7b0247f1d0aa85e763232e7994ae3b0dd366ccdf68a7da7f0d6839576491d76498b1beec88c11365f7bf18a6d663adb9912c276e7c7abff7092cd7bae71880ccc17d56a0985621b67b8c62d59060126d1f33617a65722f29e56451323da11ae916c79a7a86ec0dfd16c2b6e0dc965e53956482731df69c26c1403559cfa503e1e7786723995c5a6fbd141fffee6f04dfc87d5ae94b6fb91bb99bc6791cce1989b197b933e4e0a9d92e6b7b5830") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_256f_test.go b/ref/params/tests/vector_sphincs_shake_256f_test.go new file mode 100644 index 0000000..4f5e9ba --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_256f_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_256f + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("60547d8ab249889b797d6cea5917cb3d49d534dc676b1b083636ffc9787bffca076156348344f1af250591bfe490aee5b0391371e69eac5dc7d44e4f73d3bd9954c5fd001f3dbf0a018a77236f84f80e3f50a9ab150edbd30f265f1e1dbd1340b2c69334d3542b5a1ffba4e66a329a93a29fd5ddb7381c85fd974f245ecd99b3") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("54c5fd001f3dbf0a018a77236f84f80e3f50a9ab150edbd30f265f1e1dbd1340b2c69334d3542b5a1ffba4e66a329a93a29fd5ddb7381c85fd974f245ecd99b3") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("9f17fe3fdb5019fa024906e3d4a9584511c50554c616544d44156876306259412934f44a56a9be44c87e9710a32160b091fd1d9d6515c99ed65d57423fb0cf3c207d5cefef4b5e80525e40d3854a1fea9dfe7d9ea0b41efda69f5f39c315790809b7d349eb2b0e06d73dd4fb952f5732d9f9ee904fc9d181ba35bb92d87de640ef0af8067b5e2fa21bedc3702578caad95b4adedc3cef68dde77ec51a67cc4beda8a30f3da270b90e511de89028e48539be12d319e2464d9c4693ac5d188ac227e3b869028d85adf187cff1f7c9b3e816e8a511ed0cb84703a4ae1f620d642f53a399f0d215748b1ac8d0efaef1d8c3ef90b43ece04bf6abc6ab847b92e56816e0982914ed1451dfa3e226f2a100b67a84e8a079cf456b3fc3c6cf8ca4db38f829daae4515670182501ba177215c90446d182fc1fcd67ff8338c8fabbd22e696f8aba140724b8dcd485f56fdb98efae674dbe06f7edc0fcf93c2212cfad667ec6510c0fa027611dc5fc03d1e41542843dcdf00c54dc3e30237db50fef2531a76b2d658ace71553482570faea0c835845937998c5c24c65863d966c0c65559a2d1104994c4bcf893de7f110a1d7f036152488a824105156d729ef00d70eaaa93b7c316f8088ac61649715267ba24acf44f0917d9dbb919025544495047edb318611bac9f02ec628f56db1bfc74e47e06968760d88e8c9c5b01abeb3cdb2e29efd56f7889f770f55ee34ca0aa2f4e216847a83f0375a36a821316aed25a0a3194cf9b74312a06345c14fd7ce424dffdd64591342c9e0beaf28332dc5c00bbe06ce4c91abfd5736995783aa47e5c061732992716d66bc70879bee93fc3c8ccc62d599c8b94f40a3f74b9a1a71f629ce802fb87349e0c8a6d80f5e5d9d05e7743a62826067416ba6d31c0c40eef6ba3e6d3e6a91eda2ca60f30adf60d1e51de711e1159bf660490fb88bd6a9356b1a060f01bdcb7146d5d78f55b56a2f3bf8a319258314ae4385b5666035cfea132cf364bfc77c9addd399ff9e1dfb3e792feb5dc0f35418222bd7b15a71deec5f337bc545327bf0e51aa3cbe86b7319434502f9aecc0fd7831fbbf9cc047bd5f521613f9a1028b76bcf53ed271e9fba1d33abe7d95197c15af350cd7bd9f060555a5db59f17b91c129083082a6912dd4ad0f1c0d3b2f6474df4651fc1ec026eddecd58bfc9271fa7eda9f8dbd42f9427a0a7ca5459da4272a97c0e4b3d0b13fc725e308d24bfad2fb8794702a07cde4cc9e710954c8c01912d1e970976348c05003b515659cbd90eed43ea59a95994096f7c438d9e8f43d692548203768c6baf4fc848afa5f19c357bd24de3902221bc13051cdbc33d135efbe15034c4127fddd8c8f4526ed9f74e7cfd47f79cb7ece02d3e76ddb38644b1e77f38f994b13c64212ca6a7adcab146c0360431f6b51aaf399fd577a2067d78a4a880035a7257b8c930d433d7190b41bdcd34bc6ab3832a30ad49ff444f57247ea16b67437330d7a173b3f22bb206713c6707a41e3991ab63667e3abbeac7e6c23d6225527b53868ae60a2cf17c15b720d5284defbfb1e26294feac0cfd0f978348c7d9b8de00739315759c8cef59d38114aff233fe63f5623723106999a78c7770a6ec8a9c23d60b466b6c6f7f20d92fedc025ac5adba99f6c5b48594e118ff118583931d9ef9f99451cd6a71df3e1eafd2d247c7689b4f57b98db0ae35892cc490dc15d7f73cce06c665619c4497c740e39e2731f90c5c5596cefa41c0dfec48a390bb1dfe509c494bb3d3e7cb8f33ee42390936b229cf054dcf4858d864e7ece7e7f18e9fafb6f90dd1e55daffc14a14437afa7e1d8ab4988816925473d6f799c11a50a23a0f656a0b127f6061640fc9270eba6bc4a59d6441208254d85ac86bc03d6a6488216094eaa3a6fe1d10686359f5c3927fd5f896b8d8e043d27afb75fc0a1ad058acc438636a8af8b1b1a1c095b5424d16a94ffaf7e3f822bb3f5c91dd0dc68c63e72ed268fc701f992834b3d5972aee01ea82573a2b91e0b9d05d3771c635771401a9acf2302bdfa3c1f7f263001b787e9539037eabf73a3b76828b4ef700c1d40e7a1a6d38049514563175262f50e2201ec56b12e891de22e61059c216de7393787a7484dbef2c3ae219b325a5ee7dbcff6ee7c4fc21e41d38f9a229c8573e3dbb06efa689d7bfe96c2451118856a36b4344181a5092e664ab1af05ad4f826af48325b8a7e53dc04de2838562770119b694351958ececdbc654287dd0029e0972d830998b5e259c4c03759f28acedfcd4f22b0591738de9b89ef747c9dd6af463c17d57ffaa38bb521f3a1662b2a6c6a5367c5c5511ad8c2634838e2deb44be5726381d99eada5ea6d63fe92c39a08e1f7b8e2a3949961ba199696c8f91dbd05a3660bfb83a0743257570c3ec396610626dfdcc8f17165e1f071f0468e744e7880a415a593efe58abd7967e22bef4e09fe9e48ce74f673634d799a77836e847ace26741c6382a92cdc3bf19700ae9bf7171a43ac2a2637cfd027d7bc46abe0a1f0e81034e7e24e17f27c00baec74dda535b9932afe2493a32dba8ab8233b811cea16186f2f8f854b35813e3473f01230d8254e6a3131bc87e37901fa8d83eea74e5e18a277174b9dc2c27cee734820e7adbdece82fcfd17a2346e17e02670c43a4ba8ece515beed1926976429edbb32dccdaf2ed9df902e47005d2a343fca1877d23fff12be1f75efd2f16ce110187579a37b19ebb58e11f4c8246885367b9112d0b494c2cf7ad43e65d443b32711a05251b999a3e7d0e370f17407c9bb99d7c15c1bf8d5b7c68730c501895d36c25a47db60ea45f3d962059bd9c126a3198c905e7005168c80e50a8035e0c86d3454a7531a4477e52f642046a2247efe1e45ea8134a16ab0b400e7b5fe247ee911a52646c163edf530e834994d177c2b90a1b203802c8b83ac8904e372bd9e703fc255e942e16843a2678cf71ef929571c26c60da66172f831d3338799023226f1e680767354dd6078c1a12dfb89dcfe9c90a364d6ebf2db65532334abfd87e57a3eecdf20582c70658e1f5e748b545b4290e3c7fd917dba7e05923a2f67f357bc912afebd4019249faabd857380ec1df33b0d0d69ca47feef819d1ca649b973cc3fa3f380e42e9a5740e5c0251cd930766e33e8ee8ec6bc71a1664f7ba44872e019dcd1370551301c71d9a38c2336acc93205a38eb49ae4c5a93a449d16016e88ba44e3331771b311585c0c89029a730ea7f1930f1f679e37a1a50743a09627009c6143f843a06aa89f86608b2afa245b38fbc0bec64734ebe080fdc21aee0aa98d9365ae8428c382be99a2be7d87825035bb2e68d38ef93dbb6deef34fc7ed0ab982fdf2487dfcec82769e957d6353b26216cbd735f1566a6ab552713557926160d85f14bb16c1442d37ed011554517dc048a96506640b4399f91806a506b1d326bc49741c66236ab47dac96d062c341e0f86d4153725787159ac0736c455dfacec0982c2db24480251968bb8a8918272953add9072b80f85537338d2878a15d3455baa74900459bfd4992a345a9d090417cbdc009aa987f5b226e33c3d5f4c3b98901754cf8d0ad908f67877a58101fe02ca02a7ba289801e9455556159f501f96a5f252c921c82a2a6aa6e09b004dddec946fdde7da13f09fde9f27c418b0e608ec8d6a0846109014e4916aa086550d1487df1c88b4df5ddc839aff627d1f987c91e673363a3afff1d82b3dbcdec8f29127ec83411b9881ce55eb948ae5d260d5377de72cefadae0e67d2fb138c2f8b49e01d1dee1a44afa24431f73be979d4b5a09a15866b851c27bd071bdf5fd836c49d3ad37ee1b1df2abf765a7e356c8863a6c0c0f5773513215959f80de25b33465e9e269c0e23133768a5196aae83f4f028d66f4f7d80316a4efaa5b0ad71f0dec5676f0276b9f3ef89ca489f66d9e2bd5f46b8c7c4c33ac79307c2bc73d84d36421f6005883f960c7b14cdd61da90a0688044b81ddffbb67f5ef28f26e29a3610f1a69c28c4e2cbfbc485c5ce4d495b9e663cafadcaf582fe35bfb47d818377deb45590eb6ef383f0103c5cc0fdf943de22d1026465c65bf9885be8d3342aa5b20bcc2d64abc4fbc8611b10ce1c966c113c75922e1ea05365b8bff5f76f1b0477895ca2fbca9a31f11efff1f9951f35bab03f9cf4add45c8bacb88d84a0291d9569e59989f581c32435c4934d951f3b9173c18c1b7dcc595e88b5f144a7cb80bd7816fe8fc27acd585fb67992b3c88b8b3ff91e8d2d390d37e35573096d2a7f22c64b45a0572a813b93d593531f8631d254e69759c168ebaac066ddcc4853b0a158148721068650db0f4ef37c73310147282c43cb6c439b697825a92c82f96e8f8d6cfd553635703ade79a70f7aac06c8a24fa3d7026be3cef3e44f7aa55031b04543130a21a92853037f3843173de7a7a886e83c4a9fa62ea94f402d7b027748f0f6983667a2205b9421cf5816587debdfb92b97245bc39c8987ccda2b0202211484bd77d8b57cd949ab7db8751edca14698d2a87f1a9517592e541f5534423e887263793780af390bf020dff7088f5daa9a138b2cd3423abf2c0afa8a9bf8d65e2d60bf1a9e71b6d919407916b6e6bf713866bb3c94ebe6dc481b2d4ac54b0c49fe2d2e25fab21c9c27fae434f6cf7b5b572ca793dc464f60ef6c7e67e1a312740027df81e9ec0686b11d20281e7648b7cfb739c38180f119033bb94d01a9defb0f5b9f820edf0a9e3705aae32bce88a123b1b3ee7f4b5f1f53641c9922fd52ab0ecfebfed46867f46d54870ca314e0739a4ad6b96252687d3375ea72afe7df5a6fbe349d8136600d590360b4b4ab8f9d3ebc4f6b723191ff1443370b536f60a0a145ca9eef26770b41108d54fb389613ea1087a412038397b8d3ad607b609832bff30488919425df18778e721c93f2957ec0954f9dc013e954b6e8544b2e615bdf1121d5fa77a8457abee24e94717577a40ed136f7d2f28a90b264fc129843d9ea2230002fbfcfc3f5105d05e49b8c8f3f2ce32a9486f37f5eefb07e1c5052fe90e33df1b45e0239baf9fc2949af1eb1581671558a4c897f26c30070342dc8f5c13deaa64a7a0818d905ddd8b4b8d8917e40301f469f5e2d883a9b1f295ae62a1403684ee485fa4eaaee3128394155a29cbaa84748d4721b7d64b8065a3b1073d97fba2187688ec2b729debabbd717fc45f2be936a52d9fc042acdb80a2ae3de8d5ed43e8b990031abc67b37cac9bab9428b8fa1e69b95f312d5c7f3dfad4a01d8b91c312dc71547086541081a4a8a8f86777f8f246f697b4bf18b8e45c06e7b343283763b6b414204fef2f20bbf7b43e6b85becf057797b21273b51bf2234018d555bef40b3d2f6282782a7004b9c532a44ff72ae212e3f1da7a7f87afcd4d7b1a2d10c0ae4a4a41b9c6385a9864bb5c243fcb55e00f5fbab8dd719e7c1ce8cbebeeef9a764e2ffcf67d348d646bbcc37f66832f8464871c593481abea3ff29981db6c43b86377f7ea138a5a7a129a1dbe5069984c4e039ac8751ae43ca61ab0de0576385f11117d487b54741f6f8ad30914b863d1718e14758f56a3c554368571128bdf45057900cd0d478baf36d263c48e38179d09931ceb4e5622f3fba7842cd27179fcd964a6bed969f6315f00a6c64791a405db84df4e41c799d8e9f1c3b0527c249a6a976b2b71679bba4895eda9df9be5f65c3416aad49d1583299467a0edc2b5befc8f77f8a5767375a2315fce2c20b3e1456ed0d3f0194b3cd77601f68c7368a8df88d65d880b6bcd7b943920112624704650afd8b555b8b1f0124a4e15d329792bfe27f633404051524ed6cbf5dfc7199c2eca54e43dd002112bef937da4b448d25ca67534bf38225491caf06a04fa63ce81f48ca80ebb0bb2bfbfad6f03e7384c9ab9f87d5abc30560251712bfd9c963a8df08d1fb2dee0285a7492ac94f426902855ed8396767ad1705a49294d31dbb2a038ade496e572d1c4fa4015f8873c8cc652c4651b690fdb0bca7d15cad05c152e2d5becf0081affcaf632300d17af7506fb23432640891ab62b11d0c77149bc0676c50ca4c290623d3ae814c07c1cdf65ca54c61ea5ac7859421a4b23bc783e785764d8c1345cd69b475b5d97a84651bd5044d95b569e62af1b415024b3716398fd7ceaf510dddb54f46737ebd585d526525568cb865470f4b0671301e4a505a2fb4d63fc4ed6b51181ce16af97db3f36f49107e888cc2c34684ef59595caf16e8df27f8c3bacf4cd891d5397956dcb8e0f855df24cec074dec5ba1a439cb356287fc9e9b778dc421fb945f9266911899dba6b64a08239ca25e9cb6b10fa4cfc897404861a21a92434ce59252f1bc0b5d519223ceed7684258e21fd6c41059c37dd3f0fe22018eba7f3654924b54c2a80c4663bfdf1c6de3c5c4b537ee3fa5c2c1af3d6732e5fc87bc17522051fd740810b4fcffaccb0a31b28776d14439f406238369994f831367099133d138aa4c8353be5de7fdcf79181512185293c774dcb50be010770f67478d365a6174c7e2783a1c9ba7019203ed7e564b67551b9c94699080af61b70c03a1a5d81ab9f911d765701aaaee29e2e1052b11f2f60f577bcdce982b1958b25738f2a5d2bf5a5c4a6c10716b1abf2fa4f1c1437766a64b264553e3e38ad856052ccb35c9f18b91a2e4261619256e812dc428e4e69fadd36fd0452f7e0bb645951683521ff7688a9761294fb04ae8e73a5e2e77946e67363dac1b0826f3671cd273cab6e4ac47d770101aca58894c977a5a55464f56c15bdbd289330a8fd5ba3c9cd74a87a5262f81c0b190eb04595d91bfba62185f53886120766ae47b48d7fbd9bb9c803a58ff421a8cab81ddb3c5f2f2fb1f17ee166526039ae480c9b2dbc1b5814f33b6d373c701cbaf82266a5b4933ea6c5ccee60ca5c3df958046badeb4166f6802dbf3d4d80b5690e1595aee6cc0fb69f17bc5075ea6dcd282ac2e0c393349e9ba7a52580f589275b8f5ab3bbf0f703e296cfef6cf453c21e9daeb4b5542eb91ee4dc55d47ad82d91b8542faeff7fa3852380b99f4c701f3c0291de865119aacddb927c79755a820ac05976d83ee641d6ed4e9f32fa38556a2f1a4584c0de4ec4aee607200a8a64d959aa3565f33dd7637e252ae11af09277230c625ef290235041afc6e43f4d04c14e23a6f2f390a1e2ad10583fff62ef1e42a154792ebb3c888c0f311d9a2f2cabe217f9ebb3636794e45b6b2af9d60582364f70859575907e14df4815e92ade0402e0caa6e0650bd9cdd9d8b3bcbe8b8999e16ca1ede65e5f712b29394ebfa812296bc320ddb37ed5179d58f17bb7bf2751f5aca9120bedf3a59ae0fb3c0ac7e464394dab9c4c25b6a415683c5630f46058518ec43c6bcc0eca0e1375c2e312b0ebeb08a37f923accb1dbd641a335ebe502ab4316f6533548d2d8733af0b6348c1129d72d1af59fda64389d4bd1c40244b213237324afa5264b9dcb0829b45252cf610c4773f41888731b6bade379afa44bffeb9d82b427c675b7330eca57749c9a170f40e5e3121c230ec018a28bcb3713cf61b0f2898d4507e57d3888820321239f3d74056fefb6fe952648f50c2aa96ff5784f0cb695b3ca5960acacf21feffda36a5a11451e3c67a9781701259c11eb5fc5274e3f53aea6ca79f731de3872ef63f8bcb378d26751d67f6248d6ef0a44b367983175831e7cfabd375f289aa33de6be7a4c4a27853ca14b033436d88544945b5e592cac993649c1489505e13896ad1099e61998a4f0be3de2bfdaef07039a445efb2bbcc008ec58c0a4ac38ec10d4479ac2c0dee0e6ce41c67a6335df6c154471ea82396cd3204499ecf41e66ba76f2d1f14be3843bbcddea4ea3adf37e1a333129e272dc6ff10c86afb902d716e55af53fd455bc7f073d6b19698304e6bf1be5a6596d98d23dd1b52175ff7353e379992f1e911f854b8238375d4f23741a48894801fb0993ad982bfb413db33d2e282315c5848f831d995838b4226e02984e33fde484a4963e656451284e20295ce0e1d0ffff9491dcf5563f9f18af7a30944e34aef672c9f3f6ecac4a6b091bffac7a94dd361be8c2e805bb387c964a16dd536013e975364e888349651afbdc3e10eb40ed6040eb1d636f304594a2000438e3d5e3f98a42abdafc0464d10bb9dbb2ef0cc9eba815dd7fe5a4a5bdd29199b583e2c31ab8a6316c282253c97cb37547019d1134edd43266684afc9104576c26e3cb5cc2ac29817447a67e0357f4098c2593a34d9a72a409c203d344f7018820cf52c213d1e92c3dec658f996999e4484774c1d44aaff5f561b93a8fc6060168ffed0ba56d3144ea3514afd017b6019c60ba6411d759b000f43c7ed453a72f9c2d838eed412f1fa5630eb1d462f666d94a5a6ebda4673d05fc86722d7c86dee64151eb2238147fe124a0b573453335430893752b208425b9f3bbbb1d223b95441663637c54c1d8f3f5989bd4f4e6beef5d123c26748a8aa1f3019c83deb5f22c9015fa449cf2aa40a07cfacc1d67bfb1b9fd6b35bacd0fe31360d113e8b15ea59b29b4c01ea0b6a18c7f01f52c4d9a6e0d266f124e16aa9c8f53b0da3b747090bc8833d537e421e5025b94e224eaf675f5d864409879c717b5055ddf8023c890f9543bf68b13cc2a1fbd002737ecc3a2b0b3598c2812fd8c37ccff5c704ba33304e7e7961da9d43bb5415950c199ed47a86031836d368a66f7ad69b1731da94aaf2ead00c6079d1afb3550ab25ccf5bf7e5d6f104900d41c8f7ca14b0bbd3df77c06b4374bc4b8d028e840b0a37dfc4afeb1814cbff93aa9c14218b05de5d9bb51686140aaf35c31fffc6495fc5316a9f21bb945ef2f3238503215d1646c7fd016615d3343062a7457341ff14aa56ecd83b3332606ba70a6d8f96e72246f25bdaab6f7bc6ae6859b5b5199a8fa4187607e2b2a5e72507c52db2fc678589beb1a767096fdfb9af86c3327c0424cc0a35338831ff7fefb16d67e8b29f43583574565e3e36310d6944069346554ca21cd664067218829305f3377854814f63ba9737f9a398b82f57f4de5f23309932e5c0c503eec02b5391376751838cf715153fe18238937630ed88a10fdb3964cb00ccb9354c76d3ee40a369a501d77fcaf5dd3c68ffaa61d3f88b2e8854423cd6f98950f659ae077f2a6860538c84a26a04d1482e4157dd68297b0ffa6ee8e574709da4f16cc1080ac9a9344ca340b102bba790c0d071c31314c353c0b0a009669b3a086f8bc6807b3b587fb3073ada7467b421bd51e6d1668a58d16d51c6244798e18a582eb9f8b8e305e011be6e5fb8ee9475cb1cf7fd38b1fa31cae5c1ded1804e7740503c4620939bc55394f749cc400185815af7097cbcdf83e2ba854b7f606584d3de0e50951e362d256fb0d7c0ef12019c4a080432391a816df3a61be98717a70cfc9668c47a8ca6f387b3c9f045e8501e70f898ea668d91687e48fd399e51e21be47e82e02fd7ecc04a10bb1d43346c024b10307be691dc18df3ff6030a9f603bd974c0a3e939cb17adbb44071a6a3bf4dc58099e00c16e5e9c6c90ffded38152b43ec66cbf1c3850a6ed17181d2724a8591ee03a355c97ffc5501639f6dd6b95054ee5be316bc60b2d99600ba7494c7386ba3cd21a02a4a40b88c0b667574af4e99ac78771e6254f1db5cd0df2ad70bf17ce15f5c3b32f3ee2d4850e4ca8349799413ae6ee6d81b2c7382771c4f47a2d6be22233ca175b7036b954003f8d35738e5587afeaf18a741a1a4bd4edd2d53c72903834443e0e7513d54f06bd2ff3b8e03fd547518f13f0b33c4462392d5cb556731dfdc8f8e6512f0215b59fc33a09c5b3042cbc1e6ca25857e173575e227b8f1f564fc91117566d1b22f5e4dcf3a777911c25dbb09d2ef2d2556c1654ec69a6545055ba837fad6b78867d28990d5d617b439a438a37c8785d64ee405ac92c7c25cbba723b84480b4ee89e3d1d5cfc2d1bd77243084fc6ee2d4e1945b7c2121ab35e163be7445682845dd586b12e0b9e3c5ecc061e8fa89f0965bff328be66e15e4888b0209f32ab8e3c82cad9cd1ab877f44508d247e12106d6944459b7dc35f88105806025d80c4a683cc903217dc2c7f031622929d753f920a296cbf0c5026c128dacd0f8b8f4f1af45a3c0be596482d2f6409ae9131dae6d75d0adab2f0bf1f3a34e60709ea4afbee9cb39e025b2f0fa1810e7e107dd522c9b493ba64436af10def95861acae7cc46de464e2b7334d9b42a73ef8b2a503f90bffcf3906c410cc5733ac180b4e9b20cc7a189a10d54d75f5f45f4e3ba06bbb299249e10a968f20d49c361bc41fa5168420c289f5c70f935582bbef3964954b0661c7b1135bbdb357c0c91195d5e7a7eb9a4b2af5da38656ba2a92ab1a98abe8d7db5b2ff3679a9a85d6b02b37a5f503b93064d0d7aecaa00e75f5ce986c79d6b012e5202a0c3c489474ff7c94b4d0627b18fd06552c020933b7360fdb66f157623909aee9a8456c1436bb15c350ecd9b6702bb873cce749d70512d5400402efc31510123954c7229f25aac09fdf0426958e6130e84b799e9aa0817cc222e806a8b9c86c38386ede1d037a945c1772a7b5a1a586034c5ab058dc5d47bf6b054a3f2de055d077e5fe48680aae791912e444fbdfeb53359cb99694fe1ef0edc81619439b5e47bb2b46e03bd0c9e870e09b0fd8e79ad8ef49ac2eeba5b2f3dea62035e5a8263d901d5602e7d9247c967be42f2d16d6d2aa22fa6c4ab162921976cb16b6730d4c2027a8cbc386cd32a79f85f854758a8734ba3a2b0d260c038985c0140cc7c92889387dff1ab1c9c4445e9a083d1ca7dbfb86995363e990ab975b54d40b62e595cab7a8793e9ee6a4b641792fa3b8c60ba04e7ff3fcfe1ca9371dc5a705d59918ee353753205d3785d3e87bb23f9bc3ad0ff7d97c78a9d10d887c0346dd68977c70b44b998ce863db5c7c7db091d0339205b521e72adfa581346c8bf878fae60858e71afaf456825418f9b5b82c450b407ce5b088868c5979a00957efc213f0dfeed7ecf6c56d278bedafeb4596aa92a5e4f45b28c0d2f3c70c131bc7ffee551abe91fcdbc85110ad75cbe880ab172eb6bbec52d8cc330eff741804490beecccd1a70c6b1c5bdaff8a245585a62199c929b019ed27b69f4e80fcd211924ab54ac1b62aeb062feaf439cefe184282de1d4f4860f260d1911317e9ee3d1bea4b8ca9971466c2baa706fe7f650b96205fb49d0b24b13b0b53786dac585dbdbc59366e6d47060ff3db56bfe4e5643d52430422f3698b774df8a96142926c3bd9c1d35daa945a408a2e05e24647205ec8f7af88e3dba87566596d7dc8f8e48146e326d11742aa8b038c93e3b424cd7d26523a05f2c9d78b00783833c9e31cd20498087a36d6951d600d2e29aae52f39b3866db6a26157b74c2c004602a690f4cbeecc97abdfed22d1e2e807d3dfa86382f7af2696637695c8e7d3a6b53b80f6c5f54101d84878afe1114c9a68ad92f5d8526f42ad2a1123c91b120261cf53e87d63ce3aa88f52b8de851b1b65a89cab6d760e0e2492fe8b19e7569289a315912ffcd6b0d7724c96fbc09de47231097c759f41c1c7382260797d242e5331fab096bf659fafb9095cc7da3abf84549f438be12095fb3289d6d8ce5dbb0106a9bea00f76c851b54de75666b0527a5432bdd58ca5f8017496335c4cbcffd5b3733052c9fe047c50c2f96a033e637c3264c61cd1a91124b479dcdc81e6a7cc92dd04a9715a7c53c35234bee4bb00f80fb5d1034fdf54f15e862df861708892d9eb9b99341748a917dac1c37e2599ff814b473317b3fcecfa8c4d7fdc71df0b9104ebc008a1153542e03fefaceff579ac38d9f69f2f7f2acbee53bafd5846b945aa62ff5ac86838190bdfc04548865ecca49b3e0e87a7ac4a382a619e85e090878bd46e806e147958096726477a13ecdd2713d44a5c6261bd9b01236945b97cfd06c74b36033d6b125cdfec5cf2e02fa893d99c90296cdc1700a5a4ad7d5649661291fbf79a7c7a64082208e16e3fb6f71be7134841e534bef57c819ec5f2e968879df0b72e56ced188410859dda68edb21ba61b31ef941415605bc29a31ae46132192ce400e0ba2ff1f68f0d28cee41160e82f2511f4e99ef9f7b936e270d053be3e7469308f85b0d031d6c304e681c0dd8f4a3c3e39d29a6c1b2a08866248341a67a5174ec3e52b2281455f23abb5c990b39de87222a786f554f088311d3c4709c39592955d164b1ec7c411e1e19709a1ab5b28ad6270e555402ec36ba8bfde278008a9aa2a294ea19284624c311c459bd4d27800f0f36cd6aff4028c3fdeaf7d8f917e818e1248bc5f870bd61c85fcc2648af98e7d8829631042975715ca5fc27e5104cfd4caae917d93fe03ef6b5a30cde029f30895b63b6528cd0a3682f99e978e9f1c0aee1a8059326f1f76a7774d09cae1243b0bbb79dc93727403ec16fcaf30b3dcf3a2cdd9dfde86467d7ae8b3d3b5de432f1cbe1225cc7b30f63376162cf9f9c6eb77b71a159db1e82291d309600edca28c9342cbe4d78390e3f27585c2c2c63f686762e37e9cbebf1a91b292be1eab026725f97c957a9cddb07b16eddc4f2ea4183e5812d1ade8ad5ca4179481a9f48aeed5c57bd1e3730b0c969104c28c541a21093084cc0b7170cec46bf5ab877a869bd454d814ca28dee892a3c352defcee0b41f2f97f87c8a8864794dbf18ed8e2f70eeb84d37a49695748082386ddcfa89a49aad809d99c6bba130383de3a1dffadac59a89b376e91f5e0be7c98f2ab2e834b1be03b5a7ee9a8893b02b7919ac74b1902010541e47c101b3b7255c88ad2d9728538f26e7b3ca3a7558b8ca1b37cd1c095ebcfbc7c204c3a31d09d1e0a3534aaa09204cd0e4e1de568e5cfc58b7633ba938526e6ff797bb36654c371d928a75e4ec696007b8be471d026ed152f68925d0f4ccf43d4cbb98e5f51aa4ac477ab5bf66f1ea10da3af24fa1a3901f553cc3d61e5c48680aa813086a52cbbb24080d400c6022e6267817f45892cd0b952c7e652cf7da470f2148098c8c02bd59011df76c39e037d137d011047328e009e2d09917d9a00022cb95f6fab8e61274c86d842bdf8c638f5600cc82fbb30b610b1a6a5576abf911d7cf4fcea917b08bd40dc09a9b9e02b9b181f6a8e806e920df6a3418e1f3fd50234d0b797966d5eace1266c0cf938c78ad307308b5785e7e24c868400f9cfa60abb32182d57b729b91e891e4d86c40ab795058c204164a773c76c8154de37716d639756331d6aae2df889058b06fa54145bd2ed6f6ca0d09f020b5795a6b6fae6f3bbee791146718368fcb720b070ab023f24e897f78442e0314315101d69df813820b44e5cc5d01efd19d29ac29c01285b67ff98eb2f868230987553ac5217cad40c0b64f53d1e4af1daa4fd8ac5fc87dceae76fe07bf8448dd8c6c8ca29cddc47adeced44c0deb1048aec0b68347217d60bd4ec1198e89f52818a007dcbb76f129ebd77af85fff263b6852db492eb9a2227810035a983ab4a54f690719bbc800366869de9c419a0ebaf709adab880954d29066a306801e6389d14500924fb4b3e5b6c84714f9a7192c32bad0da00ab3432b4b077243e511b8ff4a7713468c948e9c4401c9286cbaced1a5da09c2de74954b234d30f498b4b1d7424ab441e08f3e44f2c4d72305dc27e3d045a27f2962442af868973fc462ba8ac716c73c82aaeebb91ee5ef1f7284159169fadc8b5c08fc6e29d061dfed9b5ebfd9f66992e6817f72f9c1eb58dae8ceac29558ed3597b3f5026a529f666329580cdf61186426dff24d27187325fc8c5e2efc6ffebc1be6720eb7e0ad324d52a9f90a4c6638b4d3eeb98cc78f8bc7332f2f41d4f3ebf0b7de8a822e7537fb53d0ed3cb4893a3c1c0e7e935649cdef8f626593d3245b3579c04a2eace2a4f07d3da718e69c240556354375240aa679d02b73451d815e9f5aec6d7cbe727e2c53f8ef4d5e4c8300d3b332e80eb11c808ce09416d44cc1f6fe4b1215a996556bf65cd28481a1b7668c0f4a929c252852021ccd07209302651a847b4180276ded8374fa52f9aeb4925ed91c4e5fc2829261d4d96403f190c8c98ef771e341666d6b01f40187d8b468d9804993880e587db2824cf209cffe530796e6dff1cd45151ed82ce53fa850b9510ea1216590de3de22db757238f1eee7ae5460d8fa4c9e4953c6de2f5c2d7c2a65318ddbf996b31c4a2a76db45a312990f0eaeff8559d5e3abb506c7a4a2cf61f8a19c3e1907f9494e8267d9f5942bef6937feede723478a758c980df25353463a20d5a9d46542eee41d5cb17f1e21808f0d307dac2c45dc75a1d8b5011f008c583b7a7ca164b0b076964372bf430858f4b68ded28e5c543859b2103b189a9f03226ed4e04241c23f64e76648a26f3b6bb6f72cea65f707d40a4e5b22e007c2220eda9e2eab5016e83338a488985d0bd3cc80e3251ff9758c2391b05147ff18e5413f88c402177803186d0d4cf63c74426ac3e40ed2afc851a2ffe819457b256415d3766d6a4dea51ef19e22acf008876dfc814450675dc74646cb275ec148bede8462899e25e524cb2878efac97081fe4dc22a55766bf47ac37dc1d60d9311c09ebab5d6666ab5897eb6e346959c650887fe4d69356c704bb182c0ccb51ca22069d8b26b7b1d1623228d26d7b4ed95fb500fd548c9513a358e6fedcf24bcc056185016283c5fcc325e2bfbf71ec81380e6799120d756d31fd70bfb1d8f4fe391adf1f6ecad8f9d11a6f205f2f5a96d89b68ccf6efccd624a42c2e4b6e6b20b28550c9dc766e73d3930ab791196b59bc6be9b1396086538a4c377246488fddcf2392497da52dac394e9566efe90caa90be6e9927f88ecfebd03bcbfa2a0261ab868e0952fb59fb93a7308d40c33b690ea649a0e45f8b9a9f28a63bd81096649073cff346ea6e9b4aaeb240b96e47136c5be35982879088c8f70567cd7be7c5378fac4db7be61dce5ee846d0738b52b5b54d6e2a893927990d1eeb477405b9019d6f90e3695bbfe76103310c50e1e413d396a36671810af2e209d57434eb16cc41551156c0ab5cc1e972ca8cbc7afb4352381084a5ca114278fc164001f92c00c13e7282e08a535be790e69e31bfb088ef6b497e81089694a086cd59c2f0977d973fc881c95599e1ab12fd7fa7a7ed1cfd9798d44d8d5d739ce63b88f6e47af291e70105da998fb9c421e252160d7bf69d10cced1b1639be400cd898037f13c5150bd0badddbf1ab19251bbbabd34d028e6eb0c1ff698340983df0697cc9770017ae5718588765b8a46d1afdebea8b7665d05abecb4cca779c101786bd8e8f97461ede9752df499b40758377f2cc77103fc6b250c8efb154738ca037e6e559d42a91d9dd036aef880d61af3bb55220e127b237e04e441cdf1e5e0f1a1db93f3dd1b62b11100a7c9fcb48d04755f3df9be7f71db0ee7dae59d7e55f0953b25e1205604629fc936b0d7dc75849f4f03f8eb7c6c67f14e5dce102ad17fc9bb6d674eb1272bea197ea31fbee67dad70e7483d61df313c5d85a050026970844debc9c9d9334781dda1aa2c8e00f9d03fab6c8060ca6705028ee13b6a99e4219bfa703bdc73f50bdb7051305f1b359abd1ce310d3562a8ed9e53ff4e33bbfc01f3db87599d3ccef485ef3688290029ce65ab25af06da8c55ca9337371f92f582c6fd73d02801e5c6bd32a6f4062e0e99a2aa48ebf3c1b1b61409a8208fd875b8241be8afb7535bcf49e8e1163ae60aa454004d2cb6797d57727d620fe657230f50e554eed97ffadf86dfa9e6169ef59f73851b72da3855a5aaf0ed7a4207321a147642078c3b2d1ffd94ba0c2e3a1d91cd9140d1874cd0a624ebf65efed72f33244af1c3194952debbdd4ac84197993a135046f4a094a255e997a87de331be5ded635ad8898e0a461191baa151e6bc348dd713c1aa785659a28d73e91f539c5e2e8fe35353028887f04c7370a2a523b2c059f4bedab3c0f5070a32547a467bc2045133ab684b35c9f659da11bb2f76f24d3b2c448ae8ffdfbf72dafcf7837e9bcdcad779840ac106f7b524c01e8a11c1ad1ef8760e506bc7a392c000450489f6ad4772717d5271b2f423f2b3a4051d13d7ab19063000fdd2ef0037da459649574d1304af17a3bb94d2f7c49a8f62e6cd0a8d3c6bfa1165aa4e340af6e1cd3621ce9b2343abaab6e3670a6de250befead1bcb5625b77d5cd0a74ac34317d92feb9319ff8dc6a6b5d4eeb15ddd3a78b5d5dcff695292c61ef7769ea379a266585d5f2efb08dbc1d0d1d9c77ee1f4cc14ee77bc1a12da7c52b9f95f7bd094b01ac0df23ae6bd2e0c8c69cf7dda7a78f94e22bba6a20e28092d1bb19fdaee42adf2f49912a9bd8255606be783c58e0d599103728b3563db3314c7ba9240063eb67fd4bef64c461ff66146b540a4592ba9f15580f79c3a1d25a44b82e36d64dd347a89cef84432690566b09c7181cd54585897291cbc8a1ab263fbda967c86954f5e9d372f7863d543a3b95852ac045ac2488954302f105856332f76090c3741a5f319ddd65b161be3a98b1ab9299df1a8cf183f0bcc8aa09ebe0ae0718448e9ff62f49f15cc134bf05c4572148421835255914553388a5dd6cfb0ef9f042143d16e464c937e92b19155e271cef92b701d9fef53301e737c5fc1036d7382bd022da57b10d174df8068f4522549b304181af04b0b48425f33b7fd4defa07ee9a8a175715f5b4a9d12a5e89449df334605f4bcd9cc1b39d9ae21fe0facddddfb9c473bdd8ef08dc0b9965c24ff30ead0b7f5907a1a9fb6ee57e8730a224eb603ab6871126b8978799d802194b2e6471c99541aa93e3661fd580c35e93c8277e1871402cf943da624e67c3847d0bdb36cc26d61adc51ceafac6a3a931d8103db0d6e66cff84fe442a702721cb51a1ece16d2dbea7edf189a1332441e5d98f90725ec0017061b9920deb327be831f1358f1600d3496238e8720943cf4e5968e305d914a9f4a5759df884d58c2f8d8188f7ed94f62609a87b6a5081d838183b64d6ca3414d26579289aeae233ef0240d1ce7ce3a50085b9feadf27db18eb81bd5dc695025ed6a67d8ef5987b6d125d69e5dc2862c303ffe7f9b9b97f3c8bd18fb52ff7aa3eee37b44c024b10c62986987959f979fc1d0df5c94c1fd598782dac7d6de71ce716101d562ebe46b7c1d42898eafc018bc6993168844809c8acdab7a2d665b2bbb8be60e1b7193a12b62d28f95c0537503069e444dacd816e42a54eaec7a59a69e82ecb83794699094e8ab930fadc65537866fa2b75a64feb071092bf8f63fe1bc7e6d1d5ff2a19a78a6a27037250d866a214bad41093ab731cf4505d62870d30bbdf35d9c1208d6b097d0f2b2cca10442d033d30570c74b45b4357c0c32c1d8baabe86d10ff90faf840ae9ca340fe8d3d23243029eb3e7030d4962eadb3efa06e5182e9a8da2785ba33e4c8c4081c113efeabd50c0c04c187733c7f60ef3f1dd6eac60c06e0479898888afaecdb460e2f460af0eb74b32e790acff1bb5016a8a57b4cc78f934839a785aa0ae7f5f7b00fb6452d16a990dee73bc83af17c14fc3ff4df349a2a3ebb398633a425f62cc2e4d03c485181513904a0e8d13f083f196e36ad0ff3e37c752d3dfa71478508445c3ac3376f31e9b9593544aae4bab02f41130d40aa3692e5fc7b170b49346b44c51eb09e45ff1671e751152c093dd25b616191e5eb12535b1c9f4acd7cbb7d1d9d4ce057bc3bb654ab8bf74eb0018868ee607f047b9c5769932263fe0686b34b745b4aac3e3faf82ab13f34ce06d1536c0389296957eca088983c0964a6a1842d97b7ecb800c86bec6ea7a8ea0378518aa5036e81efcb81689a187b6e8a7dbb5bebc9dad872a8a4cc3d23369b71cc846a7c181c59cddf1978ae402b46dbdec187a3a5a78a04936d1d959f692ff43d071d55cbe95dbe386bcc1cd6fc41a69aafe15186a9c35bb9d7c4e044aaf4a262e7a8e668e9436586230948e30aaafe65d9ad1d764d3241c328878a9291c8a1842c41a2fe02a0fc2da80ff7362e637654c8a470d5d036d91e908be9584a22eff432e988c943bec5a9be1d451a5ad8ee7413210199d5277de6f66bfc9e11d879c2d6c0178f48c86cf7e465137879af002498e80f7757634bf8c5d63d5b17da239cced638fde19b0a2b0710593934b8ff0b27d3da2e0685b340700cbcc473834b2c7f0e3490a5dd80aae9496574abc74f814f70ac027b2bf95fa6bef643eef689c5c1aaee812c0cf5148475d808e8e88951532a4182aed82a79c3919f5b328fc67bac1db9bc6785002535508f8035521e97aa91a6f7a8685f0e45f34d524788faa898ac64874aa370e45c4701274ae3d66a2aba0c68de1ef032322453f3ff18e069eb2f1c33480d7e11b93455a09c5d2358727aa9b2e5d40faa9b4c6ee14f89017e61de5074be65bfb8a4e1f92a6f012294f84fb6d96727be31dca266ec1220835801920860400b4cc76bf4c91326fdf7bf8bd6f7741c628d56cacb9455e13a06c156eda05e5336f57fae25a33213f94701076aaa95cdb826b6054de5359d21d03671da1ec4272597046f361e026cb48c03aabd72ed79f2db966f1aecf5f1a9bf926718010aaa0effefab327aeecdf1bbd29ce2cca613fc8cd5bba4dd94dd8eda1c4269bd42436734ae168a3f380153ebb588e78239be682fe2831087d379b53c04a842a310325db21e19bae36d4c34da04ed9fc351f3b2644b1d996e0a07818a91485d3640f64f91d5ed5dd5a497c2a7d5e83ea6ec32ab259a7cf2453166fcd54780cdb8878b3319bd430db46c320ee68251b94ce74e9b4dc7c91fbbf097cbf962d88f3d2e356c48c2d37d6e2c03ed1845f6ec4b1b54e1e2bdb75a83ea28a25298ec2d3abab8e477f3da9170ce53c2c96da8f4e832c14950c488db23518a466fa15ba2fe04ac0daa990445caa0eb1aa00b6ba578cdd76cea1602c56104febac96b5a3dcbd46c0041f2a96d4e13b5a432f4c38b9de4118cb7209c6bd37b9a9d1887d1c6ce069aa6da7aa73fd2fcc669ea26c0f6842c943d674a41cddf11f0aa3487ae71d8d77b6630859a759be1166d1069adc62238ae33fe6ad56cc5bfae7cbad927d7aa50634ceaa3d758eb48179b76c62fe1585dd6ea1193fed58240c9f311a14dd544f80bb61c079bb25dca378b0b9700dfabc754d66d4b36ce5c2cc9c75263f18feb022a6e5d0b4097a358028b3933cf79c0f8fc08239a3168d8ad3bad4006c50b37e4986348a6a98842d340a344f24f7bba58a90e847f2e28532129b0f8a11cefb6838033c513ebb064ab1c0ce56f9d46ac962b8f2ebd02003c4a3248a2354fd20161bd5c7384ca69976d0255c9b943a6acda2ab173769e94a5e1c3f1b72a8ef07609508a280db13cfec78fa41ab0948d50de3800889b7294fe10065e02db930d06bbfe615afc48496dc8fdc03905d0e4573c10668d41558761920c530095fda38d56eda4e9f69d264933671f31d5155a2d393fbe513528f83e5ab52bc9fd0ae7801cc65bd259390832c19949b2afbf7bc1bbf8cbad72d13e412b6d271e0e937e311b10cac08a3e0e874c287f2b552460fddbb80fcfff07dbae80e3a942d95c9dc9bd9fa2f5922bb71207ab8e71a4bcb6d7378c17bdd8cf2fa39daa7c5cdf12565874eff225df2e2e376f7db5cfd57f3a28c1d8ed0acf28e34182cf92689be1b226b1f7c52f0b9e5a0a85e4dea15c31cd357ba00898cb79d0c14329b8de7f14db292c2bb1cdc0512d65e6233e9bf61e601ce3169bc3d3fa518cc2082cf78cdabe74e627370a2c9be119e4ec37fe398262f4e2a389f09cd797127d0b153032a9ceccd4524ac05655607245c5649e0aa80170bec02942b5e98089a975caab85a2b7175c8ecb9e0b6ded8d3e4754b98ff23ef665c15dbc5c7d27e56d55b20d17d2dd3e3c372a9a8c7dea7e21af4fcc56f96bbfaa5c6c0f0bd3e5e7a312e76476892f21121ea46b4a0f489c26f456e82170bcebfd76c3cf5cc8849f879a2bda616272ec7d9ab552cf89bf73530fdd58fdcd5881967d260f03e3dfda398222bb0ae46128df6b79fbd435df88b61b32e2e6f4efad1be221281cf06171303cc597eb155a52ddd50ecf6a3ce415466978267abf7287e569092bffd39b39dfc05b7d0bce2e64d515a3f053aacedf10ac2959d023e406fa67d82c61a575af075392c364f7e4c8fb03a2f99f690199edbeac3f586ceaca4dc176455348e7086a177ed2aaff42f43342af52bb24b4962c9cd85c707fff025348b2cca3b05abe3bd0087a8465b987a85063bb9816c8711e4828490f14602ba82ed1da6a56d3eff10f68575e7b84f0bb1fa8d61f07bf95791199063226fefff3d4a6db65bb1ac975a9b66ddfc51e4eef487d9059d4b3882dcd015996836a4aca2dca1fb5a9fa5e69630b83d91d71488f12b609c2fd93ce076f33e71d4b7e465dce9566066b82d16f702c1016b0576f995ffd10e0b5ecc14db99ec7c553778ebadce2c82b49d3e75dd222547eae3c61b3ff700e687e2d4aeb087c32a446a8b79da353c8fcbc827e5564ad1b6e6d072683ce909a1469d1b753fdec4ea64196b548126866c0c80751032c29dcc17bff1b0a6174597b2b402800c4325327b695e21b72861f708b6baa1526d0313137a37a0a814c8581e606e960812a7c959f443c2ff3e9b9079ae1cd992e5ee65654062d5bb5ad859f335f5dc7413049d9f63f9c0a530b204a1f5ef1164f4daed852fdbd6ca4de79ab73764a48c6779959d275decd056efe7a4cb408a8bdbe258b8f488b219c37efc65c2e43c5122e1d573e3cbaa0baea86f420eb3aa0088744a3f99da8cdab1c347ad092e781b3abc822c1a7260c68e92eb1143fa462b9aeeefbfa450d5eb727be13520071d30c6da65a8bd2f28ff4cfff7d07e94b16c0688667b2a268426dc872400cdac58de36544ad0fb8cb58ef50fd97cb9263d344770a112c9e1c0e0ad71d13b938de9b0a3cd213c15d2cbe75ec7d570b8507eb08dde8d39f95f487c33244ab151bc612cfd67e5c18ef69fc218437c58ff7e7673ce8681d177211467e1aa70d748257eff973a98134875b2678c6544d85b1a47b84cf5de572ff80d71aa70bfee6709df8659330454220a1ec458a2ad6369261fdd5719750ef23a345e421f7f08d32eaf2dd83325a8aa0c85da4ef74afa32f294d0008fee5ddeb453dbc2838dcea177daa680b0429b0afaa832002f7a8ec2e09163086d4c32adb4b5909ad60f9f075b6fbfa5e660a706eddca7fecd38a85d55fb3520b722b56b382da2fe63fd085a881201d05a4777433a9151e44fa1cff4f1d01f8d3f282b733aa3f65471a8dc187eb2762f8337685c5390b81fff3be64088ff9659c105b3721fdfc111e47648503595bc0997777f38864e50872c5c63fe605fa13f120edd6509ceef5b4e14143ed40af1fcf8523831be0775dc238921ea528aa095cb6f75031cbf50c581996dcfc2a8b886b534ba5b781b9a5acfd18ffc74de7aa2c83cdd724362e1b4635e67ca52f2f9fb876bc80152f58621392c7163b2bfdd5c9601692cbdfb955241dfd321a196b4749bca6411af9d6935d1edc18800d4e01b537bc9f2aae8eeacc8eabb67fd0868b83e0e0923b23925fcb3254e4ddc77cf56bbfba10125ce457ca17e0366993ab53181ecc1a7031cbe4f2689c7aa2afa92ac1597c87370779c906c53378f6de4f9416e261a29533f60521618bbdb3338eef23047aa5d67e349835eac3bc53cb2fee56161ff545a0ba91a2f7f9bc30f2383bf9380ca1be77de10869eda38449a4c9b5e7868d29f9b2606b781c8fc7af33f4ec404968bf80c9c8e20d4ca4ebb7c09c9cc7395f7d5186229ddafbf77c3f921181a47d9e22d0f32cf044be9f57a351730eb9a75848715a816e65a4a69c8d504059aebc7dca2b581033cefe267eb535a46d9dc2137f5fc6dc680620550b203bb38e1bc3f2e1c1ad0fca941a234cddad46959ca19086c3eb62a1d59503f6921d97a917800431098daaa7c32786a0121eaaebcd7c24b5aaa66cc6ce11e43efd1da130811b7980d6a3e60bdaa1785d42cb6de5007f3335d80952379f7ec7e1fa4a7bd2a14534e4d4d2ca62d68ac8b0d412c83231401e075a5b5804aef5f1cfa8f090c546617923035aa73fa23269b04bb0add79193f8d8e05ab27eeff82ab4049c57ad32e051aad4df9c8ee1741459d78b8d1adc0b1d77fc143163ddc00e45767efcccca4f75dccfc68e4fddcf362d28cbd3c4e6fac5c8d392bdf2a4a676fb8847211ea9668312be7245bd20075f1f2bc1ce510f41897accbea9668f16f0fe5f68981cbf8be09e1b21cb86906580a2c920e0d960e5f27f471544efb7d3ce8467abc66d5e7ad6522a0c892b88986ae143aa1d16f11fcbe003d82a04dfbd6162140750bd5c3177f274f4baf2b7b704ac4e86a3ad43643e3e340743dc3684da09210ef3818fa2fc0900160984c3ea25042bbd5bfa5578c5053c28244a2f17dd7dd723935eca9b96ba95399518a8b93d2fd5749496fab40001ee23fa1721b953694084eee04723d34a35c00fd0fd4c6fe4a3e3eaaf36047c9d88e1e6d15215826e51f7440cdadb715290c196f85e3fb4b4926c6e8678234c36782c63eebe0a80254ddbccbe149ffed673a89db378be575e3162f6ed498ebacb6773db0e88a8d467eeb3510011025f90562f47feffa63dd2385162f8e5d79f012925004003592a7231479d778ad08ea645879f7dd589c4de23af53b482730e21baacb158ba5b9b88bcd9360076fefdf7b4510b845c9d44d89eeb3e132051257dbaa7a1821a616df76361b1a12d7a5990fbfdab2b0edc5e252bac2baab5b0eee59299708bdfa94d3455706e5edd0fd4d0129d9aadb3a05ec924b6c36b21f55d33a9c3bbdec2584652aa8170cf0baf90e079163f24ff42854bc8addaa9ba65d5ed4967fdb62953242d6ae5f2dd15c3c16f37e9fdf039eb09ad4bbb9d4f68223a6e0a4ff6a56f11308a66660e50f165224eba570eb3595782e22db80f664d7c1d9db6ecf6817b2736ef04c6fac53a57cd675dcedc04119d2a5d50436eef485ef9af12dbc8e5f7bd5d001b02b30c457fa1ada151f29fbcca3795434d006fc6df3ab6402d7f09c0c669b1a6702d40c11e8cae78eeb462581e3d031fa05b2f66caf150956cf5f17e91a9b15b85c4e4acd7b5b1954007a932462b41c7b564ebf436f85e2d4b136e3fc8449084f0b558dcce2ba48baaa58eb1cfe46b889046a480cac5043ea65bab4ccfd0c893fa9bd777d5b9466b8bd51f866f602b1b865a205727cf2bc918a6e6ea81e765e77bae9c39effcab6d20b5b180a406d5bf80f3000762300589155bd6f71cc898a00ec0e69720fe183823f328c66dee48c51ce221f961e92ef0c0ab9e0d31139b4751635f29430d028f6cae31df97765257f4398c1f294de180141743d07133229d31e8513949db102bd12012921569561695d112de0006cae765b51d091963ef6b66f955bab557768764f82082740502cd083c3e85a309932b352fce960048f52cdb8a8e819a8888218e36055a5e1e02dc4486062c8f3a66dbdb57ded29791e5e18d01e5c8fcc776f59b7664fc8226f5bb18b3d363e074c533628f1a97a1d602595683bfba8ff223b53bd5bbe233f667db9d9792e879540954910ea3f4afadd7e4107b1bd363cab9a8562ce2c3dce1fd84eeabc56226b2715d64651f151fdacc136385d892427a58e425387ad026b4f7cd1df851774b01bf213ba97c1aadf0801ffa7a7eaca3d711de72a47ab6cccad7517178d33679458bed8b13c7f3571ab0e5a7e2489f048f4185adb0ca63c6d0da7758e597e37f8fd6d22085114e4ccd275474d0c97330b5bb2b166b1485c9b57a55dc5bbd10000030a3e1a0d71a721b3ee957677ad4992e07cb6d6a0e5a8ed591418192298a37c815851e80ab40d85bb13d6716f87f1063b1784c806c8a095cb5e7e2d48ab430d87668f3268b03bc255c498cb5d2c948898f0acd47694968f59e7eb0c44ea2edec1786f13c8126ddcaac4faec2240ec309635a3c2928e43de0c590d201dfdc4e7a3a6cc3e8087573436bf1cd6d855db0a33fdabd8036d1dc94603b95ce66d02b9c95cd1cc5d026ec99d2199860f74d197d7e278a0dec68076015f4f5b154da89992d3607272b4b01727e90b44edc0751092ca6ace1cf7100a02abc7de5d1de0ce65db5daef681cf57773cb4651816745e8967a273eb302ad1027ea1d1a2f3206042b4b47db4a4e2ce9dfc9f6c55ce45dd2c63ab6ec655138b3815a4c5330a5f58b108210c3c66c15b11d0508049c83f1c6271f4b33ae30ad8ea1865ac46c262f1f53cfeb4da88b6258b7a4502707377c370fdca8b724f2a92373767606e154afa6b23551e3a9cd06de68696d96736ebb19e196f806fab76b6981f7e27c3e5d709556888f10413016114cc25763597937f9f823f0dca04a5abaec5b2e7804f74762b2f6421bad1356fe8ecb0f9e4492567cc99260b49b1a0aff65793bb0f7b4c5221fdeeb8a8908e89ccfe9d11676cce3baa74a170858d472b98b9d69a5891b429a08cb4cafa49d013dd1a2052c072ea9b28994d041519fc1d75b49f955d0e0237f0cdd2b4dc06120c67eddff388858981f00ed327b495669f371cb36fe9c894ca1e3ca400cadfeefc187cfaa4101b90401fde406776035b198bdbc39f42e4d9fa66e93df01c42b416bbc864b619d83831a27e651745efefe6875adaa467408344f28c7c8a333c437146c4b94607808cc36e06de264dc241c8763f272b207e0679dc2b2378d8c29f811cf17d23c7e483988557fe1b466d0eb5b5b3a3005538488d9e01c252d617c2da8230e8dd7bf21af4b623b03300cea5d11f7d089ef5e875bce674f04b2b3d70e836ba4eb9021c83b8192b65c4a81a1ca33bda1e7c5e7d8a890ce931ea28eabad1cba4515df6e6c01c9fb9fce0bf891d71564bd67949df8130a9eecf267e052ba278de0ca25fc3b8d368c6c09911a2a4581f2844d71995977a858e6187b4f33eebaee278adcb9613e33203a10b1b21bf4787f17e400f0e726c689d8c7bb9464646ddef762cfbaf09019d4cb60f019efbd55b53a347efd6b257cc2f4e6f2fedc0f867395ec04d058104a94de6df28d60d4ba04e61b72ed950defa8a1e7a050f8140c75aeb12fd488960cc5371dc00085515feb9a5798f8e74689e2469d5842e8f6689d3e28dfa5d64db77f01392c6649ed2b8ae65df68c94eb0be1016d385160c2fc5e2bfb473fd6df172e1cd22cedefa3f65a54ece13a00b72eb1c3af3b63ed0c323df4c20afa35ada53fa3a1b435f1f53c04c2ce67cbaa39204b4752946b584f4a89b8e7eda23c8e6147f62ccfcee6a25914243f0da7c2ea9bdb053d1e08f6419373b2d84a5220acb87a5611002c49fe79df2ca57bb0cec4b5d9a9c7c64f8fc34b5aae1f4cc0cf69c80c21d5df14274f08e227f9a4521b96de16ff93fdb48be16447358c9fff91c55de710bbecaad51f7619926150cc56ae1b81748f2b3d03072c19215692143c010aa1777f5a86f5f7043707938ad980b486f76eb8b2bd07c009a3ad1532fdef9ed8c110e23a86707783912b9f904b1b7f0f22927bb40ad1e0d13e011e884b64985911cc97434ce304617ff8c405e0761fe8df5d42da34dd8c7931b356caeaea93c919c0cbfc3222b47f0394d3ca0dddfc3ca9de2124d2ab067009209f5aa0b0bfacba95479a7f5b8aa0487623e82ef538ca115b9a5ce5f941d497445130f49c29837a73212cccd1774a11ac4d5a4a2c9109e3dc2c2a1c2ad260d3d3dbc1fa1613b16da2d9a5691f806771453d8ff6dcd2f8bdfddb1810e9a6cd0d8fc5436c8e214eb0d91e71461d6fa8245c4854f4f36821e3b2569b88a0063ca90a34d76e6bcd9132c945c8fd508207bdce0405ff74a9914474f2b15994a242265587d117acf956b331630735895451da7be0490b8daba246e0197bada3c63834b2a7163cb1032762d6fc2deafbea21f4cb7323bc66f2e0b1d360e658a66c64025d6870bdd136f25324c363faabea23de02ecb31a728f2698d91e1e3ee679e5c46fd2ae0a6fb6888c68fda65eb142b43812a7c32365f31cf0ff9fdb52e07939639f082fe7281e7046eb7d1ea9f858729b32c7ff513abc9189021003e5fc31f1ae3017bfebcdbcc08e8ee799a79abc67cf770a5811e58cc337124af45adb8d4e57ec04db6478cfffe8fd83087d9ec6b3599e74956c6ff91f6164f478638dbbd7b747e6eeb5eb84dfcfc164983646a074aa78566473ffa14e9330eaf9fab1c4f0c0bf857f1165697d1d5a1e0f600145d70b83165969a34277ef1f1598e8944decf618a5aa0bd30039fce98c0f42847f9373c5fa524bc0f86b7246a7b718d53210ffebff10bf7964891acb5429f792d9dc7a2e67823042149c7b8310aaa2ed831ec7584b72f61664976367e9734377ed6652b3f4058cbf0796abcc2149b184de86e4e65ca44fcf6d2c69411c685ebd1c29ac439feec60fa5cb8d31b6a9bb4f48ac0f5968deb51cc01ce0e35b72ba3f699d1adb62ad516f3812266bce189145e2b960cc267cef8ff56df05b32a3783316747f8d35b04a4dea53b8788c4c558e3bbaee58ca08a89e18bd0852d29139a67ca07d2da054b13c9c38899b5bdc3f7f29e1b750c451fba9cf4e263c05b3c844bd16e776540eb4bb03f578d95f90ee6a54b5ec7bd21947bdbf2bd2345db03533078280b550d2faa1b201c87ae3f223bbc665efdcc04259e624c5284fcc34376744c30b31b72d5e6b98ee64d9ceb3d3cf53f7fbc504dc2f1d03a43b2cca67487a49a0c0e797c5d7db390553f4a9f89c9587a9ebeeb35a491c9db7533927e2b3d7da10c06e678096a499e600aca6ca7467010b231a3c13ff75d8a1bb62a463d19a542c87ce4813cd3c40c68be9989690ea83e7344edf61bf7458f7ff6c06da5448e468d145f347fb932207e3273616253f8f790f52a4bf15332ad5e993b186d3e7d6c8cd8f03ca898840b51acdd60b06b6e720d23f7fb4888cccd40b32f79d35318e774bc3bd42ab74d938c75bf0195dca5066139f8a06b4e702d2e01149d0dc2deb446bab73dedf0dabb27da0a2b6ff1c8937041a19299cacd4926d0cf7a387c428e59dfb2f42fc858539220e0bbba343b7acb3bc560847431d4827e567422865f8f176475bb02cbfe0e688f7c6e9eec0e54ea721753d0b4a6ff0b35a95c02c3f94e96f7131b92263b33fef89a46209157b1e0e2dc20484e8886cadfcd22e6192bdd8dac414627b76c7b321329188753c02454f15c666ac870979ecb7b07cc41e0053079dfc8be3955a5cef0ca24564bc1bca3265f97a957205230f5bdec7ecbc9f1849f25f8296b1d5715330b7d36cc285525f1b002ce2ae47e598fb2eac0daa97439636bd43a055e77f7c8af217d354d1118d590db5946fd83049f26aba8ed58a79a4797c79e549743f1808b6667f4ffe633a26de74811e791856a3c0728eb85bcd3e2be7cebb861df0ab836c032d9ec08c4a0fa6823a0e44640efc8de07925531cfe0adaddc80eba24d581b2720e87267ad1fd8ce71745fc424995bc2af430b6af376d5c320ac64187ad1545d1ed6c12a009e6ef1e6eccba933a9dd99659f8c3e41590a40f4afed95d02fdd1eddb6c7121c8408f580a0348c1fcfceb72524f3da455b535b8441cb1ba4412fcaff03a9ff0f4df2c9fca582ab452daf9e10dd33b0846f28ba6add515673427baca6e35c2a01e5d7065d4026a6c21e355ac861e25e0da894af06766dfbb92631a659d824220db6cd7fd6cb9fc316ab1e2b68f629e4996fa9ed965ef41f45676243641c8c26279153d49a39e6f34ea2bbf793ec928e6f9d6a03cad05634b58429e7b4fd0e23d594f2df5d830a6e152ba4249473a1b1e0e247e63c9baba36e50ecf2880f3bd18d741b1eefcc55f676180a56f7dfa3b49e4db7a8c34b5b5c380e96d65bb1d9e0fe587bd45c277b679834433783f8ca7ed7f7c67d4087efd6adb6d8f0d3ccac4d7115495c0895617794199394f33e6192c6eb30f6f0283418d127c87bbdecbfd66488825bdecb422b4080603d48b529faa99f3fe3abdd7ec196cf4fe0207b055a735ecf7b71d3058d462399715f0fd8a64988614379477318075f175c876ec7deebd6069b10043c87cdf638ba01299b8d9fb5bbb2c043be8afa8e21a91e6c9cbc2e17104d22c288e30facd1efdec698ea28e1aa46cfd55f26d170f1a8455bc0f5a0feb1e8ae2cc763a21e9001f5def719f1bafdc3dfae8d0b07e8240e88e08d5f6dfb1d57d73aa57a01b7c0d0ca4a97bf74fff45e78361eb2dcb2dea950883dc8bd0b090d2dfb347bb3a9591f4d06d5b3acdade29627f653d7c7dba31cac8497c2efe98d6be44c3ab8cb4999ab88aaa9f34778289e4c24514ebb61a38ecb6868e0a81c2d31d54d88a9659a9cd411a9c5cd3869ba58ec6c114537deb9ce3727935b70e611042df609ed60bc626f44387248e750a08c096f811d0114dc24e0066577d2d8cdb5e0fa5fdb1abce5eb44f470a2c96d36daec99180c05d1821d283c3789bde2cb5760998af42378d4789dcf9337f4f8c7a56602da303915a5384138607752d7ba6a7cec57d5832a5f4ea91d246f57472cb2e870b6e2e65d2a203441123065d2ea413399a0429371ee45de475ead4afb3cdea44564a6d5eaf641c03ee90dae4c0af02da87a07840f543061fddf0391ae134299d7347835fd86bc1ca0510c5df8f81cd29c57ea24fea53c26967610ed95d94e67500a1c4a8742ed22ecf6ba0b44e41e8df3c9e00035a7767c7aaf13f1e39ea19b7c441c2d78a885e6e4a7c6e1eeed445b57b8922050f7041b7f14a5eb60c8d0420d7ccf05a0ebb5ae2ffe15d127adf9bc209d6cb0685e9cd505068e3d3df12fe1a73ad45fc904505870f14ecb9703e7efb57adaa4b363e8a483981e9102a754c04ce1dd4f668a707d2723b6133ce8b88ace228ca0147531bd04b4af647cf478ae502b377d7363ec0d0e57c9b2ac8b7bcbbab23a15549966f17ad1ee619f9e070573bfafc93ffd1eb29495318c51ed6420e6659850cc3086fac36ae7b76c10c3fa6e40357f9750f2136707ddb7634bd45a83445e45e4528230961f1276ad06f176ed87974c8810c8431446659e0705290a1fb1b71f7fc559e64063b9a96aa5dcf6708b34dbd055caf97cf454baad3df16a0a4c2979a3962455d83e68c7af1456b9f05dda76dd12f27f864ab9ff222df55a86c15aad25fa5ac6574ac9ae28cc637e4e7a57c12c2513590d0226f6717e90fe1f702b3c18e586a1bfe393265ed8642f0f9afc665c7fa9f79ebab6a971376d6c9c1544c3ebf3baa9b48499c2aed1dab61bcb01cd6b16a6610462ccbe9039705d346ea97763418920270969631dc49505edf223659a193742ffed5c3f0194511aae698308ea6caf5fa1e3460053fd8beba07af3e99e3e1cd70602631ab974378e3bd83bad104c6ebd0078f7fce868771af6993844c42730538e641d98b2fa545d41e6dd4d7c2d178b552c3a276c3027e38fab6304503a8624592eacc60a9121ce031b17779bf4948c9de8d823c84d1ddf261ed06bcb4049a55116124a768323d2869cae3d289fb78294522373a0571860b2be3a48a3829acee4cbc5d68c07cd690bf00d9479c3c476c656b7f80e278a58fa95de5e865dbe0b1bb0d7b5c3d198108b958aee9624c266aed17631c5734874fb0a41a978c58cd797e0ee55feca1448262c1db5ba5e2db1859146d3ad78657b92e6a6b6cb650608fed093c8138d02b2b3f4ff32844314bef351d4f99e1f428077468f8c591fd458c66095e095dca84d0cd47dfa13c9e1bd7af4b9a797b50bf4935b196d04b48ea698e0a459721adf6f85f74f84b4850f6370881895b2d298f0e5e48b7a6e3a995a79dbfa3ea40bdc337214d7f2df8109db9c31022423eb37aad335cd3f830023f7bce75aa7edbb8417a820d2450f998dcabdf516c68e8eec2953b88aab054caff011979c5a563a025ac5ebbe463aa55eb3f1bfd6a9bf686bba9d0ee85c96792fac484005b0b39b502f4254e71de09f512ddf9d00b1aefb3dc459de417f736d02ff2404261b8a852e8ba9837034de13d94e06373e2bb06bc971a4e9f92b6e3edf5d8ed23f5da8414213470513c16a7567c8fb4a78c9a2e6aa467ac732a026dfadebc3ec3cedc75cfde09ee855305afdba97c61f9f551e27a56563d10e99b991667f11b1b409cc895d46d3fa2ee4340041220a584e6176235919fa62fd8affbd8ec09391adfd3a8474eb0850b9ce75943144ecb86e2f100a821b61326095a4ab66ea474f6cd4a4fa7bfdbcc4a6951482a0a8a6257642b3b4b5189743201ec6081ae3765413612e893cbf074f95b6fcd7f86360f64dcf397e6896019b0aa7875afcf33c758fb1951ea1354200a261afb7c095bb48d423c874b8409e13609e5a382ac228b7169180ac4bef021c11d58b9cf441a1d20ab5c3e652ff8c9eb3cdf4440634e2b8970102e440ea2f1c2db98e9b03a7a297949a8bf5edac6d2c27a44c1ae7a91e72c810c417ae02da7a07e54d7b480285a1dc586f8d9b19e301feab31e552c470820b151204cfb063597da7f7fcc14a193f1c42a15f4798cd27071a5ae0a097d1cfb79c39a49759f4b25b43de7ab8e5d346f47a1185dd8ed168583f537099e2bb8205f4d0199732fed5fb76f0ec24e309c4fa51eb56dbe973bc9d5789d6b483696f5ebc916a4a85690f5aa46f87c16c0cd4a76955012b887be6bc77e70ae0dbad11ec32131fed0778c1f90a6ab49d1044da176e245a0a975dfd36f648d7ae6a41e2c8deb7ce17ce4acb1cc93189a206a7300de90da85c9ed8a346eb3e6657fd7fbdd9662b352dd7c9a0896f5b7cb2319d23a0bdb8f1757f8a8418988594b7e523f6487e6d681869f110d62282444ae7db4a942987b462001e83dd746b99bdf3b343eeb710b5768cf782a9216e73af88d56691f800a15a76b7967a282deef059774adfe4e8a6f51695aed9991b980b5271746e8cb72ab53b835a31e5fa2880667db1798307d1d26c9250b970036c8ba7b07ea98d171aee4326096322b9a8b19ff334b53b106f77a584cdad4046b5ae05ceaa55fbd90e2a08fdb29edfcaf001e59b7b4a7587c131fe224a988ea88a2f4a08a5c7ad6e6eb0d97d093d168359f52e33fafadb6796d3433ad244a4ea55e6b581360fc0a20e223d0942a80c7b0ca43537b6c636f04b39fbdc3b2b3836d864bb8691c45788b298060697a9bd192b311c0779707e4490488d391a5cd8e580a4717d854c591bf329fa8e47bc714cd26341c697f0971e44f19a4b41f190890e1890972c103abcc58d4d6fd9b19e670fbafdacc47cb1d8b7e13e3ebde72124599e21f0ac5dc3aa3ea595422475ef319f4a8193769e6e15669b73c3d2877b85295a233f6dfd565fba10621f7bf38a1b9976a4ca8fc305a5c834b322104305bf50412429684903a4cab3816918319d2d4915b5a42df3261989d052834240f08529484592ec9635ebcc92503bb88d72331a5ec0251f9a753c16ebb01840062beea090279e305688cc4b46b7a131e92a1ef16a9d5d0029170cb3170de5b7c33650c464b00a3a92ab5946ecf0549dd3105a6ed5281df87da7a9b4b91561fe267aa285b60f1d7a55b3829a90e59644580b501367939563b85707c5cb4942ac1f3c2ffbbc14c4878a71d37e6914cc46085d29cb5a5a54732d3aceec38d20600a70511bed50222e1e31eeb8fdc3818204be20a19e529790d3757a706ade57ac3f089d81af7adcbe9170f522482772cb3e4912209fad14b3fb13feb547eb4b30a45bcb25710094896c5bbe8556e7472a9f9edd34c216127cfbe491c523de73409e46e45bc583be4d407ad141db28557256baaa4f6e529482a804897e84e254b43a662c5671ecea7451993886eb8710176f4d52858a1c6087861acdc89de8d1baa998dc19a442d2937f49feb62dcc712b2ebe1545dc44628a9f94a694a2eec9ef8ae4896ebc26f6ed833492a5c45bdcddae22a9a0021b46d3ca75356c04ece9bc359c64b26aea7d3dc3a06270587dd97f8ba65079940399d9ea815a08796e727765c77095d6433f700b1f962e7e0ac26ab0452154002f868193c1c80014b6fe83def111db13033f249e0ed564e9c4005979075052214af969fdbace83534b0d858df1956e09c3d6a7d0d36740917c8f2bec249024556dfe0763b7cd0d005c1c3e7116e71fb28dea6b4aa4f194190de0c49f51a27003392ec4ccd142e7e131e502ee7e27400f09420022aee5dc45d56f2cfb81db1565059aff1cf0e3f8b0e6a3412211b14bcef1ede95102ffd6afe8d938191997d60455488c326a57dbef923dc43c969bbd3a060dcb88206ec933709df515be2b332fdbab83510b8546ef12c8892ccb0085694aa41f14e625ce812d18683582611907a378113a55fdcf3b9da5ae56e8f09935858820c1e2ca63a5758235e195fc065c3e17eff89e70a9b46378b7ce547685c71e441d60c674283914c7034ecd032ca5eb382e832ba1c17549dc94dc34ec1d31563ded33d1190d2f358fa8b5156feb7e98495f33b8927ed0fd9d5a841b2131c44fc37fb1d75127f4c9c6165d41febc108f2f3ce8d5c68b666465f1fd9099a8d6e82b1310b2e93fe5612654c761a2b5c4d989c9f871225aa2ed643e71e6e31046653f252710f48efaee597bf3a16e26f5f25c0032716f94b7622497e8e5c32a29086158165b839f8eb3759eafb2a3684d3fb772e4e068791f97d570e4a00cb22e628a466b4a23211fa4b4c42dba1bad70d8f06979c475d29205e8c368a525aca302fd973c6b8bdb38d331b7732d210377ac926a513b87c9580dff138726bd60c2d5f699f606169673a0d9b0dcaa09f75949adf9f76dabd9820eded5a7d3ba371d97926379944e687225f67eaf851e5d75ca62cfd49511cad1a30c4aceadf372ad8e23d70ca43895aa3dd08e63061984e3424c932afcef5855e90a7ad2c271be89bc4d11b8a4499616a9fc0cbabb6614e048b60aa6e6c8bb20e16bb532c83ce729865113e64e8df34474673097e7e097431891fbda4cb4a4837128d816b5d415b0e013279f2431ea4d09a814950945adfb5b2ab73a627433dc85f34a71ae6588807d9c07d562b9ebc714cb8c82b9355bee2b2ff3c170be1d60611ef50c5b35c3505d2ee15919211a015ca9963f7b8853b6dc3b926840439fa4a37a086f3773a06f23c4c316317d8f1223f3ee2b5c45cd167f3538d145aeb3239c9a13a960775d18dcd83e8039117570c1ef3be3eb95740a636822fb6171c498d7f682bfeb2956ff67f6065740ec21344a5e2c494672bbd8a3c071e0c8d16473ebcb157f91829e8f7b31b37403d62e249c7b97b791afb023cda8b2604b5743e6e27b4918b8ce1731661a63c57f634bdedb7754147aaf7bf706060b8aa8ba4526e5a460e27e2ac5a6700caadc9dc0f7b9a7fcb978824a755f4a5f58f5e42976584fcc4d8d8bd457713dc18ca057a65c66dd48bca7853df46fc460d9ba33c48875e57146e71e94317d4762735cd00a81c4a4da032e5ccc88b9e5b203075ec6a42914178e26154b5b7a799b7e3b06b49dc686902d3e4bdfad5ad2b27c447c2391008c2f152ff51d4074c9edaf78015b361c279637ee68ed23e091661abee5f068fd2a3457a7a137fd80d0c1f02977923c2927491e2c6e920ceeda6cffb4bd2fd21691885d1ad8827dc059ebb2c35c7f40dceb58ebde6bd98596edf38cef7b94b2354755b304af9997f2b68f2487fb54cf52dde4bedb535f7c4666835db49f68583e6d0e0acf4012b2d4fcbd44ed08bb79a3313517f960972a903ab8fcdca7a7a8a3e213fb58a15191ca635b995ede6203905802f29422afc8724b134eadfcbf5123a75f49f9a817a924610f9c9a8d1aa3e187e25441773112906e08d56563af0274ba4b2eab79d82d4b45f281778821bf452389fa473eed7a591a7bda2d46ec1d3e35d7b011ab0108a471cd585871dc3016828002a6d5562a19b885fd4216c9369c767e41a6c0d0b96511aae686423b1ab389ac85865eb136ee29fc54a935c64d31a80b59bd601a32c812f6a2918808f90f193cf62b7c14734da614a11e06ad699eccb2f82a5c0e96e540331ea4fd561b74ca0c97786552967b865854a0aae95c68c56f4a1acd1d879c9daf1445df8a1244e2c9833658e8103a3dc475d810f4e80707cfb4c238d01a66ef75de1c8019fcb580ae041b1194a802add9a5c0816cee7eccdf934180d7dbd55e0c462ee9dae60a00ef157b23e5303a2629c1a3269a98ac49cc81ab85bb4f6b7bafd4d3ed431bb83ce28b7720060fc5d758ea626f3fe045b305ba29a50bef2a5b3ea84d0ded8a4aa25da49ef3a4c91babf820b6f2d448e9df3d01058ef13f61114f25947a8f598752fdbdd71fe211138b642d4a95289b912b454a46fb0638771ef7da804fa05c2d477c318fc04b76873bf59994cae8490cb47ac479914a1f0365eb3381608491a6e7465a5c065861088b4cb270505c5eec2d7b221898f3814b326df90ed3cf7e4c7c4984cbab3b78eeb39c726a549414a25f43e3709918de0cc2b13293998ec97ab7f8e5de51887048038fece7b1ee22bd0148afd6ca3ad485d7c28061844fe29ca9972885494dce21e0e80458c8fa0983b94b83e6f72406fbd39a6ed9f7efe4068e0183612a0be721d5d3132d188de3613353d14138950839183de43dd155b933f64a466f44451c7033d85329b45ec0b3cc857edc786d5ff01b65c146d71e0d23173ea2a4b975327e53a71fb08890f77bd61ea3893f0ee357e64910fb1e0be40c9d0e66b9c0644ef06d655b44393245b9624f4847001336ea1de3de27d5c49501a1207f6c37a92aded5aa6e92dd321bd5d0e2595a63f34d127c4499e32d4d25117bcf6abdbbdb8b43bbe0c7b1a7c72508dfc3ae5e60181dbd36f4bb5f5dc83d29ac650ff8d6bd16ad9d5ad95ef132424316668d73fbaf0b0e7329101ce7036ca55468272d3701c1dda79902e72653d4cf4e6d5f85b66424fa682948018cf2edefd2fb934509cc4f9bf8cc34b7bafc006c59bb5d084877d67bab1dec06470148f968e4b81de8b6e292b6d442a1a616cff11a3f5b4257f5f1db492048b56b3751113f8abf0a45fd04db0c389589c62f2dbe0bc3fbc724b86cdb8bdd67da89dbf41b294e8b0c952dff8ae51b370fdc2cc74bf03b5e9ac79727b4bac085c43f63de3e5cebc5872d57071ac13a6d2c23f4efaffe2e1a36fd538b599c9dc399312f915a566ab23e77bb517993654dd5c7216371e83ea355e50e968f4002a4e8dc335bb204bbd3340339f6aa9190fbc6f0cff12bb76fbc2099d01fd692aa7bdd272304a4ff2cd77f9c533a3a11e362119b041a069891018d4211e4cb57d806a63f00515186ae4ff6cb0d3af3145b94a88e613e0ff099cf37fff06f419e3b4111475880e0ab853c0f3a8d266b089b2ff3bd8b13f73851d7414315b288f2ec724aceae2a33436f33937d7068fa6d0770aad5f537ffbe9328f244e9b4bbb194527098e17a2db212b1dd7d89770195c9210f8a336f122479e0eff1cf8d61640d2164ca38699657295c33b7b7ed6ae465c39d00fe30fe71289fa51cb16c9b25fcc72fcc903ecfe2ddc4583d7b6786029b6420b6c19a83e1a5c58aa98f4df5f96f163f114480aaa26f0a2e4f9ba9a906e552ee7c64ec042674ab0bcaaed8f9083d6003700859e8616a03a342a4244e536397c3316c04fb5499a3cce1f2075fc4d8f443002343dd827a3d706f5b8c71d81757ce5090a8314c1841d57465483d62d45b7cdb38c521856c7891ed0c4f980f24c9a11b09bf2572e1f67d522443f65a4e3ed318d3385e3491616712d3ea817122f888159f09c59e509f23c33001df2f66f412432229572bfe956a0b57c6e74a90e58501a3e5edd5dfd98307cef1b72eda2ef976536182b8a7694542f97604a166a6d84aa08370db3fe7212ca860deb8af5b07ed025da35193a81c66003ad51b514ab1ad9bd64e35d4a974bf04cd79c3c82ad54ed68e44145148aedd1714945014bd040ef002e8f145f5f4ef237e82895348636a4b4009d62baf78cc7916dd825f4cdb85e19ec16e362490c44249df93162ddd2d7a688696eb502b2276333bd4343961fd28dd1ad75c858c42b159e1eb732b60735d06b8af9cae2bccf1392c2ce433c3ef79718f21835249654bc7134f596c39b9fa548faca74f3fb0057126401f0c00d225f54bfb2460facf440be5c6db14f6f919f8b68415ae5d36cb9b2ec893e6a9fa1b171b0d69c3518036706621674c3c32443d76fcbb6f1572f2c62862fa00138e5dd6db3612d25a3d442f459545937b6adfd29ed4e558a244f415d5baeeedc6c7fd5f1279d9126ce8ca6f27d54bf290d202ecafcb5c2cf2001c8ef83e2cedc102c57dcab145cf986fd8b8e3f6619964365ad97c3a14817bf076a9eb6a849b4ed5e903c66bcb8a3e78cc32e396e327a143e7f0eba01bbe9a6abc24b76ccfcea3ce4f8625c535252571ae9b5d191330a79e24a517bf193ac37cf17c36d2eab2016af5b090327996f7aecd3b837ac05bd1d7228dde14b497cde113d377cc4ab1df62c567b6e982cacf331ed4b0a32554e18cbe650018c77a6d00753b71c4f0e3aa9574aeafd488b9ef0cce9f85076b9167c62989250f0190276545e2319db84f9f2178c7ba8431c091d6428ac5e11996448637cdc78bb0b24c02a7dc17f04ee92f25bb590c717ee9959540429a837d9f9b10b606e054e35e5dbe5848f4508f37763464298e15b7a0b0c1f8b11fc3da7d661f2e126db54268547927635fff8761d71682d14c6e6c6e05f9b0c073c65284f3d492392954532dbc09d710ed5b81ee923c4757b0a09de30c0e21a02376360817f9fe7d896f4dc5bdd1cb3b303e1715944002376e4bbc5bdca9733e955450d1bc7ba0cf1efacb7d9a0c3c315b526fc1e94b2a879b8cd03844798110065f2e8db52d70ccde5339722c27ba98eb2e19f417b1b1cca90c690a5a282963a1c6511a16198d306436d7bb7b207832d56108a3345a38b8f20be8afa4aa63f374fee6b5004e704106aa45837f6469b6e91bddab1b443ca8fae999797470c09f6e7cd25baf5cfe3c81ca9749250286583c57f380e2cf7e467590af553f43b89852c42fa59b7c2ff57451e8abbd821db0ac7eaddb57de2a179b14bf9975cb71b8158929d4464b5e238f10f8eeb2062af6409eaa9948a58e527d37922bf85cd61c3767f68de7263a6edd595db39eae1404b3f5ef3a354aa7bcf857770027a375f2deee23baa3fa23f6afd77de28c01217b7c2b4fa929e02f68be9b3d2dd711e073912c0b6d99500b59efdf3b3e506a3ac18ce7aae3698d285571b7b71f0c1beb648cca1a9cbe3bfce1e387ff10ebfb605d8d3d0c25b70fbe9303b8248f1ba14a2b53ff8e8a587b5fa1c8107a19fc4dc71d58059982fb10bdb263551b144efbb570156e5e5a9d74a40711a4ffa6ac1b3fcb4078b3bc02dc6b7a57262e3f94e8f4b7d6054ad46f7917ae00da1a9c6d192480bc4306e09b52f504d556a45350fc41f6d1809f2859f15b22466226564b57dc5ed778534befe297cd230134b75ee5beb25d7c33be659deb40b566b10c6acd4c41038056bded3ea3a59b41063179a053c94ee412142e1aa92e091dd5b0a9f1d457c54bd5b30decccffc39ef2f2ccbbfcc453e4146d64384ed7205c1fed35c847550918725b34509d03fc545dc6bab70405d80ac8e3f4567c559404ae9614a1fa88ad548c83cd5663ef78e5d60bb4e7c3d307b927db78422d7ea3fee7ad56e2da34ec75fe7e3061958c271c650853f08fed8c1d31823a9b5ac8944baaa8f03541bab356ecfee6c817d5a7456d8ff89801a1f68baac29dc3064b93af34d0fcd73ba88728a688cb5ac70f89ff51d6d9dec3ea5a2381327fda19a2396fe771175c03a74b25abd4018ad028657af84aafa877d150a5c4e226b45ed51c1bf70f7f85e8cde87a70283e8fb8a6f0b6f1b4c07b69e8e5a0dd5fbd1d7eb7f592fdec9325e6073205c2d50b65034cf51c7a0d7a1f6bb7c296d5587d71d5070f3a7080876c92e01a85495d596ff85d08b8eba10203aa620f1c8c9c1667f344b888e781fcaef9af055225599509f647c35ed2d794bbf4c05dd4dd814a847563bb0badd979dbce7ee0745f6d7f53b2ecc01e46542a6a9ef323d584f09144a896610fb42d40d9d5f51a718a7619452afc2b7f897662ba59a3d47294ffc9dea5505b43e0cc4b2657b6b63a84840f592429bc3c0da0761ce8d96ca55e6b4e416d7174ee1a67d4c2b59bfc2c850f97a5f2ae81a5b73ab47973a38703cceb5316279daf5ce988ea4f9d9ef6d4d6468605081104e7ab6087c64fa3d0866608308b240afdadebb64e980e6467b2e84308b3025eed35b4d94d6c04baf3c06f2b9b1ad6dfac644a66abb61f6ae6156770462244c3a802599cf457838d4078b19d9488c0eb2f10002f8276e5ed06eeebc505a589ddc785478f2e625474f360da45122998c235577903ef6922f7bffa04fed63d76870e0857b6ce367631539f12615e4e73ee5d3968eb5f0881ff55fa8d6e6abdb87c9956500059da425c4b0b25378d17791c9baa4bc9ab1261c8f7d4d8a2268e86a8ed4cd138dab8040a8e28388e5e3655ffc5369201d996ede0db81e2a89cf39cab01064bb14d7ff826d380bac82a4a732cf597c7d483aafce0f70dce4bb535599a76a55ae8d24a4a1549fbff273cde8fcb1fbbcc64acaf6591472b8a995e4430ba3f282a3cf7376f93a79b71a3e9d9c07bd14e5e3fb96938898616507cc8073f1c3d149388f79412138a38579428247ab8a142dcedd5456dc12e24e5b37ba428240130863cbb131aedb3f0fca43d2bd81edb77cfa0676958a57e8dd0c32e506686c8c52b03bbcace45da4264704a684b17038403b0c1a678aa1962c2239a934ce7445495acda8cdf45962d3db7f3982185a70d139a367210eaedfa2405527ae0b97c0ef4d52aee203bcc5e15611e2301c76115bb07aca49167f5ff48487c9d929c5be54b5d938e9fbf3173f96ee9aa35cae0349e5f10282b80d28c00e766f5e6e47d3314c1e7fd0117746b1459ce7f0627b779df6146ec2eb987c2fa5a7bac21fd17b187c0b10371025c6031063d9ea709f3299883cc0fcc734f42394be26e9792c1048b8cb6e603bb8c9f1f3a3e6ae399c464d34b1d0cebc44058b75ec6c0b5326d84017b87832ad7b46b6b6f4a00d7de76efa10d9fb25fad6c36ca1110a43b4ff350b36223641d2a1fa34a63570d5e17dfa25065d0ecdd5e36abd536105d3827e8eb739284539569d0a2dc2ba17340ae18fd5dd936ae29495599a0e018241cda021edabe2d94d076b7827b96c17f0dd2df0958265db032029ad82f9a47ff6c56901514c9875126ef1c049eed6be0c5188a100d71bc209ddaf208ac0c8317ad6fca32ce38582818ea8ee77de1242895128756ac38ac84ed26c9fc929e0a52dfdc01d283fa16179882d9badb0de503d97c0aa50877f3bd8be1dde7b284698aad08f6d3b0c52d30807b900325658829815a66f46f2ec92dc53f0c45e098272a678bb9af44e5bbc30cc9a9fd09bcf6de47f933552ce022f5e089f112662ee4611611a234761216c77fdabd7e11a5acb148bcd6e2b126b15fea725f4a5bdd578b37c7389c9c3aef3430eb82965138e150674626693e6347c11c3de78c344d74c0cba21ca53e22b21d5fd83f144f5c9911b7f034139fec38b86de7216e2c1b1194d921db7fe54b61561e6caa4e56d2e138416a98caafd96515bf4f0e46b9199e7e579ec5bc2298c107c238130fa4aa3ccc03e7836f9426966bd6875202c7c72a08fc78b0631b9189e88583faff666be42396d35f9f9cdd39c141e70ed8dbb36ebacb268e5e3869eb5050db27e67e549e1e4f16c9531545d97f9a364927836875964f11a1cbef629de123488b2a84c28d9de562189fac54ce0ca84e2fc3a2aea3a7f5534bc3354844ac205ef1d4fd006eb29c29a6f7ec56cc932b0ae2e010aa0349658c4c837d33c91fb179ba703eb63044993ca56f1163fb5afcf2e81612fbe57bfebbe3323a8db7bb0a7d09dcb6dd40d8a485cba029ac9a8f45e4a19d6a158e25030b5aeff88b1561faad09c24d668db393c933a0674dd01fdb878e45db661ad1d3e8138f08eec5dded09a0f3086c1aac6c7d4568d7ea9425d0d2f63fde067d33e7f7eded1de66ca9230d5c0007cf8b662fab69c14d68dd824db36f6e9e3a4630440e2de780255a3e56e81e82eae34060b71d449b31c9233808464c5944fd42dd4b4a448c7d53ec1813728edefb95a97f165b3753eb9a27cf6adb03acc955d0905825ca0058fdac7a94eb5ef4d5c9f249863919dd82329384646deb6e1871843e05dc1aeb73828a898a0bd7d6f250ad364ca78d53b3dbb3ee4f7ea7457cf25e7cf1ce08618e6cedebf3d19b1a9264a9804921d318956f9d2f44cb4bd024d46b27fafaf7afa8335c536f03f3a5ef86ee71767cba50cb7e3538b13ad4e9db3a04f7de9896e3cb199062c9f051286af95ed6801a307c43ede2323138a8a78a9cbfda19fa1b24d230b726445396ddd9659439a8ce31db3df889baf8f6f31da0d701f61e3b888e6ebff5a2f9f591ef95c7a217c5d5143a03d83ed4a37882f010a3bea86fec2ddca5b78469fd32a964d06175743cc3d3066af78b6148d1b1a6c43a9c16776d1e99e3351493542a18bc9a157e061bc5df6ff13d7e5a30eebe374e6f283df78512de99f80172de9d3a3f0282649ae1f553abd372e46c3aadc5f498db67e69f413003e63bb14f16927104af615b242eff78082bca8797f398ab3159f25ff9ba90183534fde7443e6d463a4bb8ca55412e8c240007dcedc8e1ea61656f2fcda51912f12dda831b75ed043f31c0118a5bbe248652f65c94129063a45f712f6b8f9cd45e063db561460d3eb1fbf948d8a81159ce40f6f86e93821044f86b96fdf12cea6cbd373c45e3e26f9a951062f46761d1f5ff4fa61c889b1802954f3609c59a8b5ee11b0f9a6863238982ee242e578ae84ac8adb706e36cc8da12d73518ac3d633acba1a92253a88dbecbb7d1a1548122b829f024a5561103221a39514e767c2a5c002a12b59ac91551a3ca1df5f0ada62e54750ff5b9a42362b1d003cc752cdba418ad63fe9200bcd6d5255020f2b978d17953554d355a264d0d5d6d8c6fa144cf3570f95eace5eb2d5939f253e4201e3cd0288f2dc71b2fd61736d68d0c1d1210389983b0a0076d82faef458bdd4e3d7e57c43d55c78186f40d7898536d66b0c32f45bf9cb78bce08e1c12ad75c9d7c015a8454fac570e12c4f18af15548d1795a73cd78f6ec7791e60cee55f559770097702bb1697016622675032190b1ac4766ed091f08b4a90f034eccfd214e3fb01b12f19263f2af62ad586f3ac3029dbb83ce1fc874854bc5577df10962051da39923c9923ebf5324af328a46914cfd1d5629197c112d491cca9dcbb662194a93184bf669b18e853c839ccd4bdbc05b843cbebfc0e299cd2e8c41639998ac0a54491dde93004eae8a8813a2ffc8254f694400e218a06ed7929a518913a59b6f49a2fdaf1f554124305e02d01d1f45c33f24c8132409e56893da5aea4bb5a45cfdfa5dfc6b5e50533d18151a0e307f7a273a2913608e5697ad8e776f605437da4c1a35a3e79a7cab69e8751b3d90eb25a0b5256cf478567d808bafdc8be02b594eaa34b85d56fda6480546e78c2458b2b10c19c15b0e6d2ab54f8bbd6981323d98ccbbee22a11396979507262bc6243989253b1bc426eb21636cf23514d69cd489b020d770d9490ffadba92750959273ca8c5b7b3992c809487f9f47d8694c2db4a20201de7aa49395231362002ddc48834d5c6dccebf109c207fbf7ebe498c824f437ab4d1193b447ba6f387ec4ad9091f15acc425cdbe10332c1d8f8a50dab18f58011f07e1c285f875fce1b17938c3978991fd8c9dbc56a95b44dd6e793068a5f53b795c15b169571297375b21eb95082688dd2efa942d42af1441806852dcb59c90fd4a93eeb1d5c1c5686097e70a1ecb7b82194e432d76a63a8db1c75a82de4fb01efce893b10ef45cc3d21451e7113d46797a20204d305dac23cd4c447b25597826fdfe2fa12fd5df6aa3f176ffd04a6c8be748ba1e3c92b5d1e2880c2501ef7c4b9603bf47620cdb70261e273d590ab1242e720ab66ff93786290ef911030adfb83b495e92b3259ae9d35fe32e0c9ede47e512ed52d9b12f2bd1980c3bc56c3c70e86d7046f0b33c54d4ba6b1dae15556bdfcfdcc1fa44c332201d9dbab5df1f04d60cc69923d1f15134922bb7793604c430dc5cb6310106c983249f426a36e416cb3fb9425bb6b63a1404a5c1ac43843fcf2b414f99b95c0ab105e8644adb93e1ab9ce2ef0fb906793d04813186e627b967c945acd00ead04b0a1efb51c669b7b6cb76e54367c3ee4e8334f96b4f83a6c4c7dc8fc58201553b137275b346bf9f93ed5ac180287169287e919eba582561a02f754d3f16615fcbb53445e6d9998fb8b252051fbfa8128f524b4fb4d43792a0626f2966c1f3392771deb25fa0761da7a690a6c71cfdc43718b813ac5d7cf1f7fbb5fccb44d45fca664db3d886ceb3cb8bfc4f2778b76684558a895fbe338b61a345ed69a81d2ee43a4a5238788657e363c2c4576ba2367479084475c558ce6bd8ba81a68c233e6931db736b99f7a6a852f8856d1b1a30fca4d7a3b654832a736c53cdd2f5e8b2692445ef3b829d4b43c6e8ba1d3de38e0d9ae6e730e6d4e40d8f7b9f001f8b552f7f9fc456d6866a5a0f819e73d055685fe4b1681419ff0429e261eed16092c3fbe51f6f4bc072bacd21fff3aa0ae7ca0c8f632b1246133984c6cd520e261dedd042cf98b3e3b7b9cc8e76e89c8d580c9f127fb2aa8c23687ae79cf177ecb9169bd2e2f87d2b3d0818aa1ad750019cbb182336e2c85b01331c77f753e0d9a686d3e7e1450544ca243091b5e96898ed64924940e3ab88edd03e30352f1af09cfa505020ec8533f647761feadc17a45c0b596f7234a61134760937cd6cb0b0ce03a1939f526fa18accf766e58450fbc367849c1cd31aba0c1c8b0eef7c1f23cabbfdd3dcb2921c920c392265268e6dbc0a1d5876c3753ceb6decb6aefbe27d9cbad0d88d4d62e69df99cf6120dc754dcc071bfe97dcf4c91d3359ddfacc92cbb346a89ec0eea97baf35d3dc26208a8662dcb6f46a74e669f2f9171f30b6dca541ccfd95faf6b5eb415815279d5a9233b17a6423d730f8af1abfb22ae3c1557c76b441a85de505e54a3c1d4396716a48e8f14885ed0d67c8169bbac76051e1840f6307f2ab63e0a92029052635403853601c9e3e69d25f5dd3b98be80e60b86354106bb5c540c556ff0c4e2b39cdfd24652c2e99df8f60f9efbf12f6a4b39ffa19b06ebba270e48738de6591955efe3d063531994ff3b2a2e1e41204cfcca7764611cf6e9a8c4f69bff0a30bc2441148f1855276ce1f12a86155e2359df4136aa426d6e82b6487df9cf24302e2b9f2a0b62fb5250708e208d9529770f9fc105da3b541ee319a19d30c857643eab58de43c050b11f98f83531117465de9cbcaac043dbf1fe736ac1ef5eb1d9b60b9529e99f46acb817dca1d0e87c677a816f53a9a515bf62d810c1dc1e111ee1d69af107d4a670209a9434b64e0d79afcab55ab3ab21745bdba29f5a927d05db424698c71f694a34fbf5f77239ed93aa2192f386423c18d3e31aedba7c4547ea5d7edc2895f5f4b0b179a5c734c4917ef658b036cf7ae91a88a2b889784a5f6e105514c16e31aa94c427ec9655c99fdada00532a1f0639124931fe99a0f0ead57ab1e98cc238ba47050b4da6abe7dff83b5d58ca7f7c679e01e587dbca418e1692c5ea7a8d23d68d145539f63717cbf5a118b88b0389aada482a13d735dfb0612b47dae56f468c55ab6cb0f5a7c74801e803c5f339a244fc5eebf42b41f27a33961b79b8cdd4cdf2046b09a01aedbc6655e7bdcacaab689961983343ab3bd128b411e62b179d04903e1626e905c8df509b1fe278eb6f0d9e5ad6d526722b8559b66dc1b5ae4704600513f8a48a2956ec23460be3052952545057728a93a6bfd0626abd7da81caf455fcdaef31899f8d79c13e83664d7a0c3e7364657573cda4c86fc42c298a8dc4022035a5e29913102c042b0fa37fe51d134e8d551abc6687761541fd7aaef58129d0d1077789252180c1ffdf2b85b1ef0cdf2e897bd4b6913295b3a1550e3f15819f5c2fd0a1256bca38c44219ef752d7f577c5b01b65265df0ba63a60df8990d975ab4edbc64ef684bf2e7fc82a2d16cc63797e47328ef2a902b64170a5c2e6fbc0629d7aed172270bc5765d9a0f4628716c3e044672c0fa5798710bfa65d1d226e7e521b918caa9d72f0917ba645180a78d6e15ff8782114c3950d9a4c8d4b687ec95d5f749ca85923b083b505a63b3cd134ba52ca388659b5261be881f3634e294b6b3e4833134f50162040d806e38b6fef82ea7aa9f855c1369e82619d4ac2ac2e626d8bd0a0ed06eaa1b1d37e58f79454d7c88d4b89b4ab39743cf6a512b140078a116c49e6a919b9b9f83b422f2cee3ba1850774aaf46da0ab23662a5f5b47e9389d381e3cf871f0bbcc52263c1becc12017f96ec46b5c6e3910f82069806a9d11904338f4d137f7f3fb18b305d2828e6c785156c97748de231901e8184a11b06dcc4585fa2f75f8a4c21a3561d7c63c14ae446f9aea5d930fadb72d283900b13dfbe7bba5fd2500e98867e7f40282355972f6e684a4ff77f5c600adac0774247ede6df8c4e4affb77e309a1518af68b155d6bca656bf47e5db5bb45cf20c90d53ee260c94211ba3dce74f5228c3e53ab66d240227f71eca54c1e596ac7346e0ba58c55f93415323b87d77a3bfb3b1801d105aafdfbfb95004865e38c3e6dec2ac344c45d5380060840eb9ceb11bbe86fa811ac307048053ed9b657ec925ebc13f4ceab7100ce230e905a1193229a31ac4277025547a46f67e446b514eecadebc9e87fc2e99ce1d867c0cd1b771fb95120e608d271b888687b94d4ec35683f7bd7ac1e4dc73b897cc6b026d5dd4128a81ad48a2d4394e449846d8c778051aaa72338d5b77ac3672f7f11a8039778ce19d72b1c420d65377bc0af12ea93d503f117ca381c41d8a519af38d2107417b993dadfff8f93d97598a9db0bb49e79a382a6446e23320ac79e57de955bdb72a7ed908bce2cf196ba2b462934f03008018d28bfd4714e89ac6d833d7885a74a4957c5e1ff68fb8daaee0b21618f671bceec2e182d984a4288eea477385d5300663806d95e1c9503e391e814dc645f5d36ea6d7408a05d1af31f5e3d19a1e703a5c26abcf27838acd058ad3ad994d8b6f3e3711a6f6f044ece8596a9fd5f68b2f3a493693144caeaa8bce011c83a6daa02f303cada6ee480b2393779c7f2ced16e1d2256beae3ac0b50a3b21fa892e56f3de2ff332ae1fbfd0b595c584cb681c6df31a9ded9bc43ef8b47718c94a0b3f5965f4e7bee6074b3e51064c58ebf91f0335b240f94789319030e8a07b2c9637db1f20c9a1be7ac8de831eedbfd90997300d98b4fca2507be9232d22e72144691e02e78e771570bd213feaa68747ef4ff14d4ff5254fd06876a845acbbdab1233cd172c2a93facf8aceb67aa83636009f7b2a2e4fa96c7b980a9afe8c221eddb9c0c2a85a77f4a88711328e4257ce562fa8a1ff47f0e23a0e3d05ae55e109c68f183dfaef92728d4664fe16a009af21fd0647438f285554c19b654fbc0a7e2016c7c75a792888d3b1f9d37d85fb914e4f094af34783c44d5ce2e293dd7766dc7964e9ac57fdc7c4dfed60a33f518d156737203e363faaaccf08a96ee4d8751f98f9c46cb1f6862ed1e8d5b454a7525beb35f5716e84a3ea3295db2590e7faedd826a98e28c6b212b4a8e3e1a9c2be0582c87fa9a90100256e3f43ef7c31153ed9a1ab7b8cb41ce926807b17c6065123b5d36a0b32cac7b01a4f1845e52f46ac464c7986065b43f5fe8a7b8b0d399e7636058a0270700f43beb2f635c3b51d4ffa5221911fa965473377b9b5e0c60758530a0ded5241a29fd5540d38561b76fbae9d22cad6ed1f42875a49a9ad4e4814544f70f4418899fb1a40ff36aa0be729572386218d03e147623ab396a7e6efe350e0869b86316015109b9d943c52763bdb2c165adc8696f36a3c702c517aee7a347b4d45f89b94661e8e60cb3c9393269a45f32e545f09dcf1d65f6f8fb32dffddc7c5c75a67e9e9c4fc3eff9c41084b42729d533919a345037f83d383de13cc0627f7d9ac0416e21f2a2ae84f9d5bbe8f13039b56e9d2eec4726fce2c5df149a2c984fd7203c684e76fdfed19406a977310c89720a3a5daac6c1832b11283d47b6f70780d63db5a49aa25faf085cfc86fa03ac9f92c901384395734f2ae3e2f2c8579ddb120462c479f489ec2631ec6e6f2ed08ef3284a40324040a3d742ce00aabe2644b0d988440fb493157f7d6ffd0587618af856abbe5bfc9bd9acd553b34d7cf251f3866fa1002e608cce0404acbf53c035f1c0a7a960ab1e855f19fc401ef94ef1e786eae6ec2d7baaabb05e13bc9ece1aaab828e377195afcc5ecca687603ad06cbf9d7dcf88c57e953e5f48d959f5ed3517315613354fb3308bfb7ddedfaa714b404acc45031cdf29d67b904feb44f086353264ed74efac6a1698da6e10d0f1a82dd636b2fd3796ef98ad7f9b466b2a14f0f76cd13b2caaeccfaaa47657401c4326e8d7884627d658649012092e85f8c6c52de463b378feaaa460a7d28480feed753d9de86d5d10e57db489960c3dcd725fb609244ee3d825a88d0628b54a6bc156657aec13fc1022355f156f8e1cec9779ddd3dacc2707334c0ca38229337e2b4b957b3858c780dcfe8aa0fc005d2f2ebd76020f7a783cfaab66c7b8e79795ca000e0b4e22ad8256cfab52ede065a1f51520362b904cd423ab5d5211d3b13893badb9a7594e2b4b0d4a155c2d4d6acd5ae884044cc6f5af70e982ae80cbbf32a08dcfc10a2a7ea07a20f82d595cb80b3a5c8522101f1dc2ecd9be0a4e367b0e7130f62e398e3ac457466d808007f23846bc07246aaedafee6fe4657d3b145db4fe7522a5bf309c65a2e569c8750a6b769747718a09508a6fdf3864c390211710c7c7857ff7fe65e76bfd0d266ad080ed9d4a320e89e89171dd5b22a94192accd981463fe1e50d6be9c59ad256900cc785ed512e12bfe766d6aeed5a2f4de31b299b9bb961ef1b1961376d4613c8f12995a281b18e4b303c95af2fa190950da6e0a150fb8cc2d274595e8421e9422df1bcda95b5526d7ad24151ca7f145560085cfac745c47924c9d9dfefede2639b3479bef20390e1e22ab16e83ed0710ca7e0865babef02deeea81bbb594fc8e3d740913755d0ec90f43cf4ff0784e9a17d67eff205c5f76cba992a79d3fb21d263d0a7a2283aa0a7ef3438ddc7f84ae7dd400b6eb233a0618069bdec56bcde621e7d787b8bcb7c29e87001168c0c53aa3ab638f51219e4664d421d910dfd5c01d6c22d8ffd531427e855b09cdf6ca10271892656f99db145943415eaad48a37d4dbbe4ebba732d4cec4fb9b33c4f9bde87c43796850923985f750cf426c9688c62f391aab35d356f6671f773f059d464da95b72b8e500d3d6ee3adf66999ae9cd6e70deffa22fa006a251ede9bd9e08d0ba61570ee2244b06e62823c3bc641bfeb904c596f65ab565f77223fcce04253e46dddbe895dde2146585b2e4b0fd4c961dd06d938fa0fb81f2939d6260de82b10a175f0cdeedc5ec22f26c7d65ac86d3928fced102324c12384ca2f7b238a5bdfbc396de9a8d2b724d669b08a088ba2ce9a115217f04dc58505e12db81857577c2acd31bbe6defa7d2b8f36113fa0cd9783f237bdb394f81ee1d4d94677d1e43570a553ebb875469c88029bfbc3911988d3fd0bd58537381ad1256ae3cba76528d5ff12a0e8287402c45c0f72f1d9ec653393d1c4e250bf2e5ce628e6dd426b695bd7b2b486ea9cb83bb0b7999d017d75f728161317406f7ea97ebe8dfc20e7459bcd434b23d2fe99b72343b744bd4274bcaeddc085ffb9f8c93d84a30285c086924aa1506923a6062bd09903cfdb94b037f701da38788392916f5f7d46d14b4a7e96b475208021b2bf9b802af4f913e85f0e11d262f22c08a08690d7e80dbcd58d590af384c60b7410490d462ffdc27a21c8f41369f862154b203ce1d03bf363c65f6a474625afcab9f4806849d974d0005bab9ea48ff2ad72ad449112a9c425bd7f41f3a922134b18f771d533b4a64df5ae9ef163bbd27fbb4a7d260721e330cefd8275705c090e6c5519bdd1fa73ba8783cdd41a07ef2d38464f180533331711111e26b0908bf1462594e833b5b8afcbe6f0bcb0fe587340c34d2b48d213815b47184574e9f2e8e6482374729532493962ac08f0c1093a703f03c1b10f1e99c4feda0e2c01acf1d896109f8d311b70450b54b2eed6fa609f0988e422d459c7243960e87e9df647352a56ad5cdc0529ea602c0663722fc2748c67541116024e4b53517029354615550db58b914faa38f9aed7d99591630c5299e06c4de941648ceb73f52b908a9788822d78a64a529e8db18e097265ab413560df89d05595ae5200cc9ff9afe432dc87c9f1a24fe2763be5beb414c82565d98a3629a2027eece90bd6096906b734d31cfa1da10747fa65e13a14c2576fb42be79a13e9c52b0ba07cba84e56b324292fa43c87141d4ac6fe92a52c8eff5c9a20ab4e9dd51fb0d8c9318757f14ade80dfe4e9919eb92e1197e79dede7a2bd0df315cd5980d1235879b4f734b47882f0fbdc6631a7024eafeedb3fb97949fc9bb09c87e539349c82d1254fb5de878b29ede998ff71dce622f63d2290657d89061d13608a0d8c9d663d53fe19a2a54d10aca1e9b923f523cfa7c93f2239369b1ca7fed3d91e2c6dbd152772621e55e5d920ce532b9f8b44c454ec8db54ccde58a268e4d73614dcf92c9850ce2b3b4da7ba87b601c922bd0f5404eb232f483e89d73c2eaa6f9571abc123ed627ea8d883633332eb828806514a4f31fe7ba9511da09e8ed40d58e774fd2a9fbaf9c1ee25fbdb753b493c851705d95804f7c8d8f4b343ad14b94fffde878b86f54e04a7af9ebe45b45c8994103f62a695abad205a2f0615c7ef09490e9d513e5acf673e63b2d983e67333d651eb23d5af047cf8ced955569d5b8acb51066dd7e9ea094100dc957968f6ca5a599ddfb4d63d007ad54d24ae1b68b10398d918790edbc06a61ff73b268e994e3c65d95a2f0f1043ab4e03c7f86e4c654b789886dead8c59cf541eca41890f3a59165bf50a56e4eca784427fa3460ca025e1a640c1e2197efd2eef6102f8fb33a4207c15555cb489b0a64e46966838a4e2e0289440d9367a837894e23189fa0f1430da30be02cc1eb2d0d4508d01964b68bb01ae3fda1f59faad11b5d2d761307d984793107f194b14c3041375cce0bfb0cb3796aec6af31ade29b29d20b54be96364eb085bc65064c2271054428d16ceec24e27cd57d82e35b14456895e2160f8f7fe66a598671a8afd558e4d42dfb91101f60679cb4439698db789b76cc7a6fba6652266c5ac2911552af30b8888cbd03bd715bd3f0fed9f91f98ab2ba1bcef7fd532bb36cb2426c30f405c31bebbe7eb1cf85db39c8acbad010bdce2d6ae7148eab7aaa6ef81a3d10b7aacd2dc6a442a0549c50b734b23f3ccd489681fc07f13ccdb7ab61cc735df1f091e0456c362ab1f4df2a5da9f3a7cdbd924cfcdc09973c279aa588ab98232ab42800dbb679702f34d54aae28cee268c09c856ad6bebd8a2cb18fc0b5330406365e9c023ea4d927b0493a4558668fd233029280068515c94ad0a3200506ef7f42052b3783ea99663436aae014554f9c9f6114543df91f30a9ab7a0252ff9569ad08f783008d1ebae0fd3cb4954293e398f39cb1b84d16f7f9fb127f020f621ea7e0a2240bf59185368122af284e527444a5b3d541e35e0e19743104237df867375f2eeef2c5b363294921077ce32d4c3d82e89bb5fcec346e3f1230c38a8f847865cd15f079b07609d9ac4070e5d1454b32b9d8760ed3a0fd6b3d181fcb575fa05358b9de52178b315f17d9b3df8ff7e017d85171bb6ed510205b59219a9124299750176b5088d0bd7337d4f5197f49d1bab4d2ecf7844d801b88132cce533fa91ef61df879b822862e919f4ec4c1d823d286dc2ee6a52744f5eab46f6326d5c1109dfee7508423c5b2f87a6a738af72ed3a16a39272d7812e27f470b5f4211aa971b935ce4340453bd531a62a27782c3e502bbaf14d0c9090bfa73d6df6d9d52576c2c740cbd469969c2d6993c48d0162685388b32a48d205abf0460014f6f5e734cb7d1c6f8354e42a682b3f777c0f2c9fcd8a2b0071db51fd38de6511d48fdf6c0a25a96d4760bd7cceca91974c5f4351cf2e6f2435e4c2b6f62f2457c9977e3e8376d6de939901222afa904c4f12c8be34ca8874cac11321fa44d24dd27e56b5f2db51658145700b3826be54efa44cf6a68a9f95c1064d579fb19f86658ca6188f9dacd2348eb3407994ef9cf186b6c1cbc4effaf2b43f6b638315905df2dd0ef99a9bae008c00b6c48b6496ee53715d14dd0e51af41141c74fe8382298c2c03c97fb46c8b8b44d78d115050c51899cd1b48ac5fba6cace3242d2aa3660be49e9cb66722afccbb389b4baf0714375e50e41a3dd76eddf29e2fefb83f72de2fe727b55938de84e8f6430294f5bc6fc55a54d24bb2ddf242f1876ef66f02c254837dfa170f30967a1ff3973d62e559d55a0e37c67817a41acd0b181538be53d4c54f99644a24b74ec631fb54e5e4fc9647b34f7d4cf96a5fd61e867bce776dcea1227a742a251596e6edd71204700c692637e4c4c64fa4872d62af1a92825bf6ba14ea5f623c1c01d24d01b05bd9f9c78884b02246eab4c449c5d95b29da52691f113efa26d1276e41efcf846e73b09ee637fe6f0cd46f8b0eb5be37030a377e9ff6300146ae80753dac22cdfa946e4ba9ea1c9e4ff547b8015cef0a43efc5a5c62eb5d45215967e66225a97024119ccd576c22e3e307833857d70b90a2281c190131426bd4d3263d2e09822a6c6ad37f9279d763614495740a0de541c1d8b7f70820bda40dc8aca88c8c3e483f3d5e080bfa6a3b1138452c39a7328f4925c5c7f61dfda42e8a00bddb5d5042b2ba2c7726ed7e3d76011a8402480669dba1c401cd291c636c0985908b17172e58ce7ef185bb69fd3bef44b01f939205bf329d58a376b6e9abae35ba19ad49474c76142b3053ae65519900e76f3ab0118357a06fdee54a6a9d1395fb4e45b3683c02993389ee01b2809549356d6ca49636a73915df26606c37f0aad84a38d9318fe97e36009ab1750ad5f1558db47c42f950845db26d2b00ab9fe6fc5a249d57f3426556f93eb549cce6e3de5d9f273eba185966c94fc016c2775d7f03ea3fdec2b77ffa4b9aea7ea539243c18758a16b69599c7137b72b18720053e85a7ebc09614cc816336851163da92fe479ba731b167364e76a32a00bb2c4263a920a745f71522949332d1d34f8a236377f1208db1106de9a0ff33703cb57f552c9cf557d23895db30e6383a383984ca7964857ed97c919b6243c8a4ed00209e46cab771f0d86399472116a49124cf021de2e87a55497ba75faa3e4521440e839c25db18c1ced36511288d3ae832451f5e8cc8b593dc1bd8b1bdd20d705a60e348cd35b6484bd8b015bbc289df7f64a9530db81de49f18eeb3e98feea1d5c07e1a65ed615ff051b2ed126699b2f03c23f896766b8bfc112987511d18cd1228be079875fd65621c37a3d4b45587c93cbdb90b7694a0fbd3715d4360a606581ca9ca4a8382600867447b81bdae8bb6b067bf211c07526be2acec58bab7e876abe3ac3d868422f660e37e09546c4efa2f0b4e4af95f33127cd677a02daf0f90119087f015b378c38ca6fa325bafa04f61739a32a30d2eb6eed5ab073e39b049da964152ef0d0e5a393bfd257fa386eab1dd3ac9df2d3173ff72e6674daac1c802cc6a46df10ec9b7f70485f30c94f7976fe23bb8293f60230722e411c420b7677f41502cc9aea3ea95bd03cc0c5d7a5694423b058da1b4d2f958cf818107bebf410fbd3772af5193415f1fd000d2e1b9c1f61f340fa4adb4cda4e35a6ca3b1f306bfe38ef49e74182d226545ffbd8cdda08af9a24d4ddd07e443ad7ecc6a709e223013d3acfb25278ea1fe1c7d67578707b0ae626d69ef06ce6db08461c33a75d820f9a36a222795de1045f7c2a2e7f101fe3f91b26e234fe8e35146046006a5068586e0bdc0de8838448f1582fd81f4513b815f6bba4d48d3564b86e0f6ba5c46ea50e4e52bac80f667592e7cfb0298e5a5f9c3d97f2fd31ca5c2cd03ec9f0d97fdff7534fd62e51f9f5a0ffca4fd6246cdbc610c90409280b1f24a13eaa797c8a4c965bac60b896820600dd903d6212c693cf40a9d760abda4ed8f0a900f23923eefd712c9aa47aabfc1d6d904e16ed5922fb6d0cec4f1db28a0894254331e56ba37d57c5941a45be8db2e87b7a42d8b696522523ff4681f394a0837cdbab91cd2023c4fbfca03d7409b429081e3a91468629aefccf0c972405f582939bf0e283d074ce959355cc6f23857ea7dd3c6b430a8eb3731e58c98ae0d751d2fd4f2a31208e8ef04add6afe7665068f1c95eedfb41768ea8a93999ef959e489ae70379c12a7fa87bc6a9518987130cdec8083a5ccf1410b2b66806b68d80b5d7ceb6ce36d5a5d2e41b5fdd55c15807f0eb799cc14bfdbdee89f234412768820a7940903d88798cbb6edaff209993fbd9650c5973719f44c1fdfcbc2dd35b63f73babf463e2ac2ac8a0b0e98f778baa43a0d0128aec67b74b1db326afd24a4ed3217729d44fb76dd15de6c1fe868caa10e98bee995c5f76d09ff5a0cca87f540a37ca3c7085b76f53eaed2539d9bf83d92b94456e4bb9d496a858a714497c8537fe7573cdb57d00f55b863caa89b15bebe85ebb3004e9d87197ad82a556b93250adb6b3872c5a2714980cdbeaf441f52dd3a8d2d9b09e4d20e7861f92e3b2e610098e2debb4e096f796cb4bacd5c49df7eb7ebfedf7e8cdea227eea7ac5b09245fba6c34ec74e93adf11868850e864500742551399ded073acb5b1d906e1989965ea3b85d43769197dab831c7b2b209ae2330e38b57a9440d5cdfced6280c59151a40bac85f002cebc2143185553da8825fff32976bbf0beced1aa648e5abeb5f203f422a5f6b66104c2208905664f67fbba5639215131ba5608e5feb405698f31bc576db43548d91124ef816510f9d7693ae7121b3f579af0271d8e1b39775559f348520bead71f45b4850bfc3ad82d57f6de6cebc4fd94ab2cf9c5c96d48b1ef062f761af08debafc3d32be1f923192bb53cb21de3faa23a64387379752a35ddb0e9e65ec841add608122623f76a323c0fb7d08bc565772f13c45f6f34b2aaef3b180be0d5f25b1fcf7166881b5f3b2ccd0e2b62bbe15dee85e2a4884e899bd63f5750987ecee9f202f5718cac9c529007eec6a2bc02fd3ea45a342b1fe535caf3e3945ec6f8164daa0ee6dbd415afac5ced769e50f938f2b86bcf2f3baa8a2d4e64b5c64346c11050e57c30d1358f9e4ebde2daa72da9d4bc599d71d9cbf717b4c5e7dedb47259ce8c027cb08c34bb465c351afbe7cf3dfb379aaede729480c6a56cc28285b8825ec90b9d68892f5c93801b2ceb100527413ed6c22505637206e4821d84f11864e77cb852dddaf3309b818e2f12f0e289d27b1c0ab6cc8077dbe5812ed1d9c013bc85cd18b369ec93a9acd1e3061ec812e0e395a28c8ba4ad580d36f8d75227a3fc7b8b32de86507b6216710f67a38ae89c09ba3c64051292bfaf211fdb7ff18beb30c29993fdf572728f44f52b6a8a8b570e4b3cc4debf9ee97c1d895a8b1e7bf9b67874914b958b70f50e6824500f9f94a0960af1a98b4085e837aeaeedb0be93d7563ad25ebdc79acec626fea966f8ecfb3b5bd13b8374b87cf1228520c87046ae89495e615c86b90e8a44bc4b7debc00cd8e7855b0f461af2521f67f04524863bed51f9de33dc01306399135362e25859cf2de84e454d8c119f45d9501349f196b5e1db5e7f6d54789d6359d5987f5458edd91d26d43802a52bc38b2927faf77b2a50bc4bcd8075deeed920ff23ad9d145f3663a024d7a29d0c5629a448b78bf064581883f5be4909a881d5fa9e44e4fb334a511a7fd90e71e9434c9e43a064613252ca6da2aa23a8fc586682751028d80952fc79ef7078f7d3642224b87ad5def99066259b4b87bfea097de6252a529f3ca37072e7bf3fdc7a298242fec1282699f34326960b998affc96962d67871407ce4ab52a34cd6d330662b4df058e4174f39fa951fc012bc44977d766e711e5698ffaaf12d352a9c3a6b0e67c31bd42db9feb932ccb87717b7bf86fe23261a9ca0f826caa7f633e21ba6098c0696186d3fad961447471c582ec4d7df4912b7abfba94ee788330136d4868c3e0bf1b130bcb6e4ff1511b91c9e61ffe9671acfbfecb4f5cc49a50278e2c44a76683a4307ae075bc5541eefd58c0108dbfd162b106959cd82e86eb571603b5ad6941f89f07a4606b1c764c361723d68f69c1ce7ebe8ebdf27b0a77e4cfdc7bff31bd51f30cc8712d4b4c93806ba35406623c81db86c9a0952ac08a50dd4e425669b01121fc7a455b479bb740c921669485815a0b434da47a79dd798ed9e51a27c3cecc1e8f3bfda451728a536d96d5755f296475d15161b705680306a2ffd592ee613cd091319f364b975bb89b863a21d9c878bdf4f6fd78d00514c40851d68ab7d08f273594dc84940543cbcb4471d7ca7943bcab108181e80fcc36b0e70ccf5e0946014fc6efa0fb859fe273fa360ee45bf5f65c8f36693262e24aae4b9ad6935dbaaf860baf8dbea5fea52ee98773acd268af9817b4ebdb3b86c54ccd7618acf46c82e5b5d165d8cf9b9330ca00632e22253845571a65d16017202835326d75bd490db356f787ce49852b4f143c3a18807e2a30dc33fde75f379a667444de81089311ad1da28f4a881dfffc0ab811cdebf671017de863b76c2dd00801281af3e468b4bb4573b1db874c810280ec5bd867b53008192288f00a8be420d1a382cb8257a3eb292f1c08f1efae99ff9ecbcfdc6c437cb45d11e65faaf7cb699e729e54fd80607cb12f6df4daea81cbc51e1f93bb07cf86c18f0827af62186ebb40bbdb5451ca7e0c973b28a09004a474a5604cdb19ea0e53fe55a6fcc8e02df525c77d2244be89852ba31f49712d00b6c85ae6c468dab5acb568212a4376ec1806b5476bb4257d4967504c46fc9e3c986a35eefe8fdb840e0387f42e843f384b228c4184531ddab921612317339145b8371d7105b9e0e3b16e2438e92feaf358fcd26eb773fb81141a70e9998139f4abddef8033d340d70d7c766d56b1756af0f76fea4e128a1a301581062c1cf981df65f9fd82b16b21d70724f09d7d677b44f677ed0c3fb403f87582f24b3f847b8b076456d9654ad0b791f62a707c4c8cc56aedadfac31f4c53084f02542adfaa8a8cb8c1954ba42d431903d5d9bcab329a4214637d17b8a28361f5a3d99620a0f6a51570706d7010f3a94b7cfdb2e260ca2e4cefbd173a89b81b24cc58417020abbbe4c0cc1b323ca97bf20e37aba05a7332f376ef5285cf6a0b82d4880a62c8fb7052051d93a583bea79bcbce42177e19e8e8ed4ebf7697b4163a2cd0d3560367a57b9d20d5498edbfec3e3ff35e780ab0427d438d1bbdd7f902b05368fad5b96b971e527cb2504045cf636dacfc8ad954ca265c9427c316adb0e3c47a61a3cccdf95c749fcf5ed07f84be13cd8bee25ba93328ae423919d1631883ee1640d04e0e0671e8fa5004ac91bff1ea9002034d0a493f9d94542079e7eeef1dcba9e59255c8a80b7d286bda63a43b098f4da7ff24a7ed6bb8d4ea288d1ad453006607a087151ac992aeadfbb3a6e760cf5bdfbb834eee0bd9db8a2976363c1ffa93dc38699583b02f08d9c17343871cd12635c7cfdc5d7b08b890f4a51c7418c22ed8887c342aa1270d28fb6d29544c547234a05a3463660fe2bf0cc4a6d9ef843c42890975d7705203cc8d62ea6fded822ac5c7535f66ec3484b83dc617430bacd82f3e536af592d7a04c2e07233b9a86b732c9035a88279ce64576b9cdb3d56407176039ca2e2afa6e098837b10288645ed112c8e62dc109c27e16cf378f969080c60bb590a3bcffae1557933eb1d01017ce4f859ff5353a443e9144b983b6159e83cd20d2490995ba7caf4e0e627c76f15b089bfa80a510185ba066830accdaa30ed6ed3fbffa0af52213cec9aed09c7c46f6310ea1f00da7cc9158a717dced2309440204f4a2360e8fec1cc3a69874f04cf41092587622dea6e6d82b5c5aacb948244c7db38940264f02b1072a8e1a170b441e3c76d9d7b19c5209492e8df59ee9e62fc3d9ca82b0a71d7a53118561120b182d7158202359dd41675eb18a9876263dc04854ceabcaca7b0c44514713976a2a48b043988b7808a0928af0ca217be146aaf57487fce6d571ba267b97db431cff9a1279b22f2344e6f2cb59cb5957cca48f0f7ed14a247c5f45fd2d73164bba1976dea96f7c92a3337a3412a1c2d09f5979c4100ee5fbe663d431abd8137749df1408ec74d7ce68bc5589d85fca9ac803b3a172adeb8c8e7eb5ac5186a12619d983bc5f64c85a7abef26905b0622ef899ac614e0e9a5eecaacd3ca92446a87201eea6c7ed0afdd4dcc7032e00a8705fcc3e50278695c84f174890a09b4ff47ca706a43b006785b6718914a8500c1a009f9095a7fddfd9d7cdb998cb975633cb2eb0a5c736b0cc504e9ffc7aa5b174a1c7d5ce18d0822bc908d0b42c73a62a65df6241f6c2dca7c65fd14553418e8be591d6155747a67cccd90b59e012e878826e54f93ebd0b6fee783792584ed039966a24d51842bdbd0a53e6840e35758cfc51b8617a5932488e3a704555c1aa1a0e246a971bd3d1e336568889430a0993b9cd98b3de035a4036f966c30c19bdf276cb919251f686c36eab654dbcca2e9e212d9aa3dabe1eb95d517fc81e16620c20f7526504301dbf9ebaab3736b10d362446087718cfb4bab8b5ff35f1799afccaf153b8a5bec186eb6ce16fac0d3ffe4722f42fb3a7d609224eea7e97061b859d5494146173ba6a2788e945dc8a73e2c5919a113dd582accd0c17a0f5a15f45dd277e8fffd597de0a0fbaed0ce0012a1193d34f27604cc0dea58e51cf9ce5645a6cfa9cd7049b1ff88e431b8bc0c151827ea4690d51a25d3cc781c36db4de092917fe2e250f1273c67519950ff9ac821b1ba125ab8cea6e5609ba5ee2863a08c358eb6912258c952005242b8ed2fddf4ed61daf4c5ab74efbcade29d86c1c0bf386c2e30f1f25044f233a1584d15bd11fd1434f49ce67610a7c18a473dc8ebfaa9401fd45d84a1a7eaf882841e5214c37cfc1a6a311f4b5aed407ebdaa774d40d8d6762df4d161fbbdea66f324fea8bb0b61abf86ba2786e5180f9877039d0fc1475c5600c0a7099bc8133a1bf5cccf46ee112a91b2aa488efc2305cadf48b2cb9aeeace56c3cd0c7459eba84cc5746a9bfd60dc9a891823fc3b68b0edbd21f82451b9b2394a89b28dee270429440ae21436af3938583403732d23dd2d8e940ce8c0750cd451f0e6035d737bb21cf93f4adf75c8eaa6e2e304e7afcca068188d94080de490a5b0010062cbc7c0fb2d77138873a1d33445ac25d7ba51c4d556d8dd1391dc4174c1365c944c4528a8e37a4a93eb59b8dd619ae67a6f44b9f79e79af7ecc64ce97269147ccbab318b4a34e529843334ab78cf5dd6ead54c031dc1bc40aba39add00aa1b11d5b4416e846179612efd2ae6554834d4960519aba6ec91dc1e02eb40d8dbcf4dc291d61bda717524a3123b9bdf37c74a2445983ed40ec644ef338f3436db983bc1cf02251a4339969422b84d6d7c5f16c94e0c22d81b3b48411e7a7c864a58b625927adbe518915d64089093ba1769e90a49d34529fb4fbbeabb0e0763ec9400ec2b09e63fc313275a21dd14265af096a1dea4bef246d0c8d80737568f313794894d8c9370a034e9de7a7a3a97584c74345596df1df20e48143850718041835a6915dd4bfe59579bea46075d5a24167564737fc64b4f54b943e70a996ce2c27518f06ef072dcf72828093535dfba7e8b357c7c6a563a7bce897a8fbacaeb70ab89d39b911605642e6b223723b750e60bd449edca215cd4bc4f65681085d56324fa750a0229c848caa59fce65bc450bffb98e8c496b12c3701b36a1e3a8c5fe2de7dfe3ae9c608c266e6acfadeb231d38d9c87966926559af54b91a75af008d8af94ae3730d8003d8022e5d8dc23328fd491c73ea8a73d4a8c2cd7855075a1ad4d11c20c7a3dbb84d10554cc940d25bd8e10dab2ddbb50136b535014c2c58fc5ef43708aa54e123e7bba6b8dc7f6817a962aaac1a0505046e381d9fb685c03895613f2604c45576fecd68d5419036b73dd3e1ef4ec93fd7ce26d165d76007f72922faeb5b38ad488b9b72379073dba5ed002720fe6795f27037cbfc83466500e603fd6940d31a38942a63b3432a38dfe6af4e6af592154ad7c6816f6226fffb56ce376766a3f9d178b402ead1bc99e47acb98783f3119e2a24dc0b03856f941d16301140f7f7cf1931a854ecb3a468afc006a5eb0c454ca0a9068e01477174363ca8cd2b9116f3d5a9788eedcda892bd0f7e33c89e295f37d4c411c2432dfbba76b6f93663a29726b19af3d951d0265a3a89db7fecb65864ff65c7ee118c1cca0de68d580643985280a618c7931c86a3803e8115be756df152c919f4682d3d0db40b1c45114de49f541f5d0016cd2408d8320d543452cd47f99531f294266961c20436473300615b75a796dbaf388adc94473f40d720140be35046b9c94cde9e234da92462720e0eb6cc6e2ab60ed99dada5f5fa999ef50c2f203f24a4f498275f730709a3045c845884ed19a06b473d81fc8adc170333127cd40e7d06fa47d2501ed09c70834b5eae1e6cf37cb08e0782bf270af4ede1c9860bd3a83a57a03f1a0820cc0968b6a7c7e2c5a79183767c4bb30a8fe117b02767d080c9be445d0e0707c3d83f968531d613e1510257a9adfc1d5ef9ae05422a8af67926a37d84a2cb6c04b3829ea258e1d58b8ed4ec27d55fef3f36ce9d5a00ba2f471847edea09602a74e94931626e18befeb1e2d7e9591644abb142bf6f2ab39d6731e26a1f512aeedd60a918f1f45f3a1f1434ac3017a806dd6c646788b16ebcbaca3805a56e6697a3f5f68bd18ff668a1493cc24eec11c5d264e7ab090f65b17e20dd8e1359cc1d00663b09b0c40d17e295239a9e03887e9f4b1513905d347ffe92e8cc975ff92755771a339b9a26aa67d9339106a31e6ecfccf827d36dbc6272c4f2b131881262765795a2a7a9fd4211678c7383854be6c5764a569ab34c912e47f305c2fa67bfd00d330022374be98094965ae645a6391821b8c6f382ab327e1630a9a45ea9a01afdc0823e21b95e84dcc64f5aa8754e0364603604eaf8954e2decb9938b2c07e7fdd83a3486139a73a4d2efca7012cb543bbda6115b7f9b95d44e7aa53e84eec625bf25b613121a24785cd6c126a020d661259d4070957aa68135a1b68ce879cb55f7a59fa3fae4fa9c8556e68cb8433597410679af684da8202556aebb856717b54370dd62091921de48d9e02131f3eafb891aba06feaee31480bf3b95c12db0f18634c353b797dfe8001a2d1905cf007164bd63686ba1f57b0568e4423a66539660e36da8ace995fbe27d72adba7bcc864c86e27af3bb37aaf690616694f3f51cf646e9a9902ba122ccbe189f2638e6d3db376022d032129dfe4a3d2fbb3df0bebb44d393acfb81ad18e5abe220db1ef1bfa71295b1a4ffdd5b3eb4448aafe45d65d7d93106081c2e73864a6d979357283ee8b75e7bf6c38b883c425805b3feb419889e6b985bc73f51e064803c6a2038253cc53948b8248f0d40129db612675f34044bc1d1d3ec5fc22c7c0b75870309b3b0978c7fec870a18a077021391ca275d43e21bce64261da6b1ea623989da6b3fa5dd40dd611699ac512a292df8a2ff1887a3524c9efe3e5f8db1d5942d3c32a55ebee51b2d00b11be485b6f2fe63e1b10c86c85cac52414a30340ab8d34ae04911ebeb9a97a839cf6fa22b7b8140b335caf17c1db4be2a083294f4b386da6124421fffd9ff4b8f2ad910f49be32da46ddcbc4fa47806c17cddf4b52f7351eb6fc2981a8a4170c5e6b0900a47c2c77a9881812f5ffd6311ac937f5f7ce0dbb1e135d81727d23bd8c8bd1e44c4ee823bc314c4f5bb658ae2d24c8bc929bb545f82145d977cea4b4d394b7e5d85b1c8133d8c0f2a83efe742e4271c460bb06e303a66ab6119306e45b12a20b3f5850b54ca6c4a107077eb7fbd2b8d44f03b91172f5d4ac08d5b36c16b81d75b6201c787f646d672a2a248de808e1ca56c1278f007599ba463bb61bb73c7ebccb5eac5d1da7c03050cd00f1ce11113a9aea40289f95fdc7f518286b09bc07a4c80f700f5b6e79b23cc820333aafb39e91fb0b815d4111469a0a7593ceb5215f786433c8599cfbc150d0ce584765c7a4584b322e0fa372a3027883b04fc2521262d8125164f48e5bac631d1347c8b31f51f040069d2aa88c9dba1ed497857ba0a2a33082fa402d25d9646c163dc34f8a58e34e8b3342b5f1cd0b697f7125a39b9582da6baa5103379a58f24b1af003a7225212de13234d6873ab56a505b5a0e4f6e5604151ba54d582658fb7ae288443c5881e0003a32c79b91c2fd67b07d844f89b928b316b02f257339f4b8029b4c1f0374a98ad42aa92c370073a65d34636dddeda086a8d4ad4cf30e8cf54a90ada789fa16f5fa14fcd69c04d29584fe48c3df42c8c1d4fa947799ed1e5401504b465ddd65dc56efe3976d00f164a10e5e37fad491a967fa1aaa8223e46d8768fbc084d1bc096007df749ad325d0e3d4cb7ed06b83f13c0fecba4810ae156ca15bf9f9660a8343c2f0f88d76472807fcd87a59c4c2c2ea108fe83bcc8cddcc38f10fdd341710949fbbe2b57c4c3857e9482d55861b86095d01580fe20e3635e2be68a2c92d12672903f43447e3de304a60b72a092c202f9822575aff1b4d3f51d415ba006c6940ce34ab92b9182465733d3b8caf293053678cbdb13b52db8299a2cd51ffc5b229af6a145b56e9065b640c3da8f8e308c101abd81d8730a5408c39f4690bdbfef5c8b0530e750c559d263fb8856f7e967d20c284985cd8f64994b2915ed0c3bd9b6413e332e5b27d0e8414773cfcf37383f3910f1bc4f8eb7b3712c0d6dc6c3a63b1fcc702cb0726ee2f78982a047a6b68b6d64665462703885dbbfa17aec913c9195971225778a9bffa39aef9bda91027740e51c10437616e934d86af6bacdb84f5f81179044febfd037f00e5c271a8f9c4eb8969058b39fd2e3bcf641ab43048413c635bc9ed3bb5f3ed9382e44721a6e4ff62c79d058e11833c6320dfd98e63c620031f3f1b4ff1c1b4415c5866658ced8f97f4f9d9b5987f4029e14ae28fb2050f591ac9e81a81f43ed8a2779972169968c1281eb57242a788f99d02b7bfd3528d8901028aa0539d9d71d902758d076129e144c70e847e0d52f40e8b92dfeb2a305fa8154b08dc622532fbbf29cb740741f499e8f3547ea01568ad24e9e0361dc397bd5c1d3f02d8af829dfd3f469a0689b3f795ac3849abe4594d4dadea588089ddba7c86a742b3f311f0b2882f23779e35d9f1a44bca6d862ba437bde86a0ba5f2b645a180561ce5601fa9f275fbe3ef0c9a5e33df0c9a351f6c0a0985bf27dc3c9d24d6ef052fa1e13098dbdbeee605c1952515c90a6259044697dddde28340b91a1df16e44d65d0fddcf8a0aa783aad811e4a35a5607d5e499489286cdbef1f5ec79de2c85bc9068951cce3044a776d08c8e5186e5a548ab60bb28e6db047c52079591b91af89ae718e352c58a1257a3ccc449aba69ba8adca4bd519293c14545416da9653cdc5faa700f1f5541d56e067f1eceef844efe9831e05ee47e1985bd74c2ee2f1630558001caea16068157f9bb830343f6a4d3dc94092205a290f5aaa627ff782decfd06583e06bed2d8cd174402692d7317805a50bd795696c6d045d52cf46757c27134a9a3b9e3cc9adc64a476c333ccf7c14968036132f336d32d23b91d3eb0b7ad5959a9e2f66115cdba1c72c9c020a0000b2fe5e361fd5d65c4472122a1b478d622aa4e117328e4bebd90aa123192681933b4c937f6c60061c654b3c0cc4bda2c8a55c4d43c56188bfd75e14f1743c7a44977187af3bda90ce222955e435d4ae5be47b0313728519d49e36dc401b4868834286032be9a0004e6559a1e439819f25ccd614d9dcf3cfbbc677dac78a25a53dbbcad4a066638da99fa847ed70292299b70a487307f3e3c92f7dcabc142c47cb9bc7a2eaf4e1dea9e4c9b2f9e78542fdf43bd04654e9ed3043d1debd57e2cf7375fbd240fec1f7e8c939933d4842a1b47a7b423a1b11728b5ff54b5d696b26f3cfaae5c04d0da3b37ee2d2ddd2238b707bcd090d460d32888cd40102aae231a88c8d7d66d51f0de2644bd54d65d52294afc3aa613624e65577f5c8594b6a2d9d8cd17159ee8425e4e7481fcf18b378b0dd52aed914818449d71039def57bd429e190560932ee339bc8ac769f820c452e36551d7a016a5b7687a5c384d3aec375b19824291ad474e3cbc3787b70fc4985dcdfc5012258c0674886a479150672afbc4396c76a205b3ccf9edca259e2cfedceb25851eae8e3c136b49ad65dadcc69709f2f7e4e4256d8b0c9be32d3ff8e25aa122b0bda2ca5b210d19bb85815f99492239759018f11ba8ba8cdc48395e9ed71ed5ba7132e7c12177f3cf5073c325cdae031189afd3ecee52bacf65c31f9c7499128adf17ff27f16988f7e7a2b246d02ee0afa6f956c6913c0175c70a09fbf8bdcd418bba1508ebeba0d3a60d46ee126ef5530a6b6f31f8d7d0865de10160b8b75aea990c2f99430c8842fd3f479cfb87043bedaabf7916ad9f22d893ab0ac6e0fe59fe94640105d195194ac85d2b00d616194e193a7a505c0715580ca3d258e1914377c36932fbf1c586f13edd5c75b7a199c3da0438f0325ae2ea2be9bf6d075e4d91268d230fd4ff6b00b8f7e27cff55fed24e7bc18bf6817c2282cf64b18f2aba870681786449b4f162e8abff6104aece440adcc79a96fecd4ae999989ffa593aa9335b89577a46558c284459e947562a6e41985a4795bfd748869a72a92d76d19ed3187905feb8b28538cac06ee15f466c3199b3b94f2139509f8141bf4c05c3f3a7955befd85dd04830afcfabfb157a244891beb88a9338a350bca6c9ef43177b3e99490748840d60d01b6059f66473a12a8bc75157641bef22dde93229991d7a74d11336aa9e4f3a6eaeadd9b9fb738f783f42abd56e2fb322ab6f8350444cf1514792315ce5f756f3731d14e42b49b706280e468d2f75d82105b863c226af3583aef6f4c7c7de764e6a4f08d0c4448f079e03d9cd91e41f8e4c51c4ff73395f3e2141d08a7a87ca4a9081fc0ea921e0c33b35d28da0ce7fca0fe90d89e8e35ce2609e80664f017d68ac2c027c36f6f2326980a9474f8b4fbce9641b01d911879ef7ef6dbc0d75e089cb3588ac6f65723ab7fb3193432f915cc8e222fc02f533db651412ad49763c98f759b99d5b32d534ff89b2b4867a797fedf5716529e8722193d11f29934dbbc9491796278fd781e1fd400146055e0f691cd3ecaa1619b1e584b45f8f9585bcfe8075f1714af47ece3bb36e237738e56fe595aba837d77a5f413caa919aa84217467772acbc541254cf6657aa6eb0643ecee121fbc64b7482f2be0d0e0275c9602b4c9204dc1618713269989bf5863f8a22fe2b24819cc42a00d005fd9cba80f2d39bc96746ac556cab0882d44c68716166a04dbb5035b9d0034b285623a19f95e00e71ba2dd48b1c3ff9b87586bbf2e33301df3b798af85fb6cd8e3f874c8b8aecc0ed6fcb9b62dc0600f6ba7ddca76f468a2c6683ac8bd0f3026a6e420138d96e4488189eb045cd36bf3ed3d405c9593d423fd5c1a41a46ce8c2fbc30a0a0b06db4772b36a89fb9f83a887b76dc6a27c36344ab5f1602aa80f1629fad16cb70a0ea93c6e2b0916305c9976211bd02b377092cbcc6fce26d8bc76e07314431236f28c31e4166bed215ee7f4a5b6b2caa73d716ede52393ffe42c0eda72dff810ecc6063ae0111a569132931699b270c16f1dc3fff9df6cd25d1a8a96c8a5fdeef161eb42c97b7f218839dd895c5d8ccdd6e1d9225b2e566165c023eaf8493c014ac3a9a029baf5f4e79347386a4c17f1f15e79344f1d4465b0a01095117a343191ed78c9caa4c5fa5f4884f22d15fddfb5f4bac6b64554697a442698b7c8c5302f01835b067c09d562849c0c4c1a09d78ffc8c9e110441ef9c231819da088f1b8e30cacf042be772f62fff3bbe32c66af2b3cef7f9fc7e09a81b0e4a63b4b8073d5aed5a712257db942dec25c5ff283aa1eb7da28a26aa40a2a72c10c1d5bcd358a97faac954f4961b1c92c2c1b1bfaae193eaa8f6c8249c0b51d980df6f830308b06ed26209a5b93ef6d2ad09e49dd2c7181fc16ded7c6647a69cbb51566fdb1acfe2e6b49e71dba69eed7ccc90fb5c07e31827952a76ab3d4cb6a3a9cca66143bc65d8b7380d69a52097fb61028cec916becd3abdb23b6bf4c7c888e762b034a3a8099c11bb0c006ad1ac854e19a18734cca5d8a48e01daeb2e7bdc9cf6eacdf7d684ff9130f5237facbcedde4e278c43f991ff31c475646003dc267bf2983fb3128babd7d90a4f66bd66b4fe2cb64d792f47aa9cd596ef96c2c819fdca9676e1421672d7c93c0c8c5d7eed1f02d714fab5d80d2de358f48d037f82cf29f62bc6e6d5a7680f5f2d2700877d15a8c8f9b797882822d3f11b354a2afa608f32573715ac85da9eb964d186e71c08453c2e12cba7726850c4f14c5d09ad2e7acd70f8d31eacfd521978c03db2628056b43411036c67fa670c0170b214eeddaa74a7c4e5c8a575b1d56759c3a885d4968a9e7dc3bd7fd2d29b201c07fd8524a4cf6826836033f50be582dfd748c897e2a96047ea11cd25f663734c1afda8319fae5e1c3f518af598bd5cf2ed411eb70c82f05c78b1b99d6244756ec82ae1cdf0185554e8b23fcd38a9da11335baa4bdff97a9abaef9ad60cf21a5797001c1f4cad4dbabdd89b82d93748646b9ece4dac58e668c2a02a5d8d6f52c29e144c5c6015b7520e80747cfa111ae3363f5e98146179785ce37b817d78ad8718ae12df7e93916788b0366e8f94a67df69b9ee03bebcbdf9e467a748600f38a71ae2b0b22dcceb6a872c01173bbecc46b65d62431e9e57d94640097844f9eaa5600a3602992eced0f0eefcbaa3caa29a5151c151d8fd6ff58b83dd73d28a9f513460ace2487beab0eb869bae8b84ccc41dd5273f23c35c5ce3bd63f6636d4b949c7bbf6e2f92d8f71f6784e28154cb29f2729b4b29e097e641b84c90fcf894b0a0f4ac59ff5469d9d514a5abbff4a964ede4ddde8d34c2e3bacfd6f80b9094e9db389f0526e2ee726c4e7765a322d5e1f4b5a1e12add1886b6b6d8c5bb9d42ddcc9c5ad301e368e32bff3c3433bacc7795d24edcaf4a1d4f7fc1fca418274e460312fcac0e3456972332dce1aff9eb845207e8f5fb7fc5a0f7eafd59640c6f5cb324b9b72e4acca925adf9054c3e2b21dce3d034d0fb04528f5ebaf9d413eb6f7e19e1daad0825fe310f96189d2bf5b8709baa4e4e24f0fbc8cb3aab5adc74a5081d108c32540848ceeba5fdc08f06fff0ff720260fc66ed86ffa854e9018b454bfe2cef1e3a09c60112d01070795361456125c7a20dcb6d98872c3c14a41fd26ca80c537c5cc69783db2d7bdcf1f40d950abf0647aabc4919d3d4fd084e1669b7ab381e10d19354700e95e1d79128f3dfa1025c5c4ec7f60844a590108c7660bb25e9423fe115731b64be591bbfdac76d1fd0c8cfd5ad43428507f2bc98241d239b162a7f451db5e8afe628f0855aa9b1256536a87bb80b868a6c7409586501e2b196e60128db7b1166a065e3c500ec00835122649f1fc90fbde5ba374f4379a58ca2960b8be71e0a2adcb5d57db11b12a6d22c71b5e29d9c129200d474563ad4f602b2756d02f5d73b7ee2fa3b3a47c68a6436d70aba7645de6b71931685f0da56f9643fd897abcacbd65a277de986ebdc817275e6dfe6f6cd88fe015618db106793b59bc138c551c71671ce3f8308245d56927935e428b321a972e9d3d68d52bfebf9546358d7fc43efd29b92e116280b4848e2a0039eaf86bf9bd2602ba878c0f3f3f8d93ff9359120e1d0e4da3d90cb3892db6509b6851ffac212e9c48ac511490ecbaf95990f4dfd26c38a7e273cde0ea1d3afcb653e0515fe2589bbde8899f1b52c2be2ce66b7af1125b810b323c8a81cbbac3fddcb905f344892f8ebe962ae15d97363c8718beef582746df627a62779048d53872eab441128cf45dea6c20df787fed08d83728a5cb21bcea5c4f38919c9c332d84642343568bc5f529a67ce0fb5f7687e09fd797d2e5646eb9ee24ffa790c6f643a50c87732c1552e71c8b6e2c4bf7819e4625ca9b91a9354cabbcd318737948dc9310c73a0a56f038ddba9ae383568b10da32ffc0ab451eadb774eb4ce675f67387aeb1f5af0c93e9696e4153d777eb87eff1e1c61f9cadc783faa4359db074f43a9b8cd8bd9274f753fcd256b5d1e2b283d638150d8a0c501ac3bb4005a1162b9483019aa51e1847e8b638264103dbb2a0737398de85faaed83181024be080c9c46bcab6bd52db10afababcfb0813203917738b9cba8f08ca4fcb3bc83b290a49f28315bff2ded5ac0ce21fedd5cf28c8d51064ec1c365031d6fcb183d4d1d73b068a78b60cc643d56258be46ce840dc9b04037422f642def84e8accc7c5453890a59177c165e6caf89025421401f1443438abd87c27502988b52bafd5945505eb303477054475d631c4a1749f222e05960524fe25097ff446be488e8f4ce2444cc1ca53457fd83818d0ba28c7988ce4cdc2ee945e56285d02b36854e5db1a5f4ffc8d852dbdc637a992bc5b28ed97523a65cc4791c6c6703c33acf58dd26576d2cf95967dc21e12e5cda67d7ea4a38f0c88e3bdbdc767c78bbc742bd0fb3c9c6d2ba9d76ca1120d07ee688f911305a29c8d308056606ff6862a426dd8ba1a05f3d9ee15d95d7cba5e95dd3c0ca3199b61d11e92453ad83459e1c1f0003028e82a4ca24b87f1e34e5d764f398f177860c31b8897c30c961ba6946775b7b3bbf1f7e73c7f8f9470b7b8f6aa59df2e8813a7f176cf242260a7e59cb15eda2ec197e4911f0fccfc92f2828d1ee4dca6135088bd63e7f12d77eb1c07655d0b941d1fe8a3b51bf692dd994c2fe3e4b164816a124be5b51757f0ce1c5e914436ba061aebddcc95a47c2b1c99a46e6423e3f2894cdf33775310397bd6dec297d1d8d84e9d15b7e9b1dacfc4a4d3a2046441f3f4344ac8e19bb73d9bb496f0c1e4a0302475d011264688b105a78aa06ba0fa35a66e37d0f166a5fcc3171d504a5016a9a78c3ee8245c8ea5b62ef97a7ede43c738ded9c122bcb12b695a22c1aa2f36391061f9161b4be7b30859537c4ff2f864d61fde529595b545860f5ee200e8b2bc3e06748f21babd557cf7161918b7c46ea914125311c71457a3cc7762aa0726fe2066c476ee42b6009600e8d8bf24c498bcad134df4f81bb1ca09617fa5a67b2d8b5b1ca6131249093937fe86ddd2c071d80f30d00934bf97b7f5a9d47b50e18685e995e402ba5fff35f819ade37a51a3f96ee0dd595c4a11c9741118ba5ba3d179accf678324375fccdf9b2bce1cdc70270d9084d6fde24ac384aade013b1ecc6ef314b8f174c3258e1c5a6d8b44681312cc729415c069176c8cbf17dc6b5165f176b002633b08edb0c5e23a27a082b0834e460b7554e06fc599027b26df5b741185e587f3f48b8983c9bd8859f40fdaa9a649ae889e14e6f0ede78386907b246aacd1a056fdceec42e3ad348cfaa2d7ba64c9af763ec181e6fffa4340afe7790446e07fe7c3efead4178b8fc76afa40132a0dae88c1a42102bc5185266897a908e10245a686aff77dfe0ac290658a882aca6c19168e8a8fad2d48c420a159042086904f8e167d560ce1a50dd5e46a1894b0b01c6208ae2d8b8a4aabcfd4ee0fa7d57fe18383f7dfd2b2ba3f4d8b4be722fdfec18d90ff133db6eacf81e2e15160068fe5128159a6c0a242300a7fa5d079af9297ebf3e19d712b2b2e885a45a1dcd798d46d8da4c650993d3a4fd3ce4d67ba4bf3df31c08a03986b665977b22ef2f57b60df0e2646e5b7eb1000ab03739b5a2157389ac91879293e5757c67934eff8641c360251eccb08e2721df1fe97e80da842a982fea27b62e04e3c0ad1b59d6a83129df87e55504e442fc2ac445021f5c537b6c2a9fc06906a42083c69f6c44adf9da8753e5137c4c6a70582f0b5f3b819bdd762f6476f055d131c85d29b7f307cc9459182b46bf36adf2147ad664408a7e0f117ab957cdb4c2ece396b6ea529ec16396a51b895c544ad695197b8f6ad2ad5edac8ad301aa8c817ccfd2ab0c901cb87f28b00e231327924b17a5853657b4aa167d024552deaa18e01db136142d6482507498f088092ae2844495480119184a72f57efffb68a75459f4ba01861e6319ed59a12d640216cf19bea94b45fac5a50d5031958e5f7b1b4f27039fd5dd4208657f46c6349a36b99ac198753126386c8263ca7edb1ce288f5202690089650e91ea128cdb245a4a0a8cd8ccff836ac8db0b08d0309e570ac93f7e3f3f18a583ee731f508d16bf97104e849e7d46b45b95b9c6421415e1eb612e944670d56a47599900db28d24203eafecc5bbbe15b51706e8e993b949b17eed9d94193c044a3c688020f0befd844beea82a3ceea5d6c688b494fd6cad7136770bd2653c1667b6e4d4b53508cb6d405a6c1e3eb801c9da9a136a54a54c92534200f1c06eff2f3e4da4f469d044b5ada43d87ff44d4f22a088d9d884acf92d2ecd838760347911080738af57d81194cb97223f0d9c91f4e9b7c18a80d3e5b85a5d7ed7c18e6edf706c46a99adcb7d8871ab8922b49e921ddb0a338a41a84f9e76e03410df0a9296cd8c54c94dc90a326a6bb094e249927d8546c4e3de769cdc0fb9c4715a8f83daf9a0c042a63bf65914384644344bd7545cb5478334322a36df1596a66bdff8ad4ba1d74cd9d117cfa13d0fff5125a749fff74b33a89d14a577f3ccd09c6e28390c6440e3ac77b12826908d35bb2f496394548fa10c7d6a47a2da46977b7cac9132ce1955685a6e2050e7f2213fa55408ae172d898bf8bb66e811d139ea7a80150f0c19659ec93675023b38ec4c248d6a76400dff8042c0852505caa65da19bc3d44e3d755b2ca436ba4c3b483e8f4767f633841747b982854c666eb53f2e5f0091543207bbf269b0674ebdc4e64503385b377b5a6ff4249898ee51dd0ba7cfca241f02823ffa4269e35ccccf3e0ef35459dbf3aeddeb5db147ab9d05bd9741d734b33a6ee6beee97c9f79ea140efc15d3d0f208e9e91ac573ffd57128cbd0c1dea649c59f50f79badadf6e852bdc54740e25078b0c8aa3d48be388214f3965de5b05dec75b50b4a1b57adf13f5d4bac0507f8b20dcdbbd5e10ad9e2bffa5ac061b0ffde2df2ec102df6ec6775a9a1688c223bf8f1e3cf68574d9d5e7bf71c44d130816a517df56e95f46ade9b3bd676f2e440944199ecd8a11549c8f5dbd30d8e449696398b838892293553e99e657bc6c19f1621a6ee451293cf03d1bfe3c1db3e45eefddca01afad60b3f736e1a63ceb5f234ff56a23fd229e8d1b77a0a20f87190bce67f7fe9fee3fb5e8b5182f3336686f2f59eddb0a556a82f591fdfeb1c4326d182be15bea0e87e6c701ecbd95897893bc4f2a1a3e2a13fdb228220b6a5dadd69b4e23eb9da555dc314fd9798055f01801608630fa2b6b1f5e87d9f233387b446a32c78066531ec33e90533dbaf3b93217e12f7ca5edbd780937496d5531eb0b579caa10e90a0d0e1aca31f0734d5160196e") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/params/tests/vector_sphincs_shake_256s_test.go b/ref/params/tests/vector_sphincs_shake_256s_test.go new file mode 100644 index 0000000..581aec8 --- /dev/null +++ b/ref/params/tests/vector_sphincs_shake_256s_test.go @@ -0,0 +1,36 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && sphincs_shake_256s + +package tests + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + sphincsplus "github.com/katzenpost/sphincsplus/ref" +) + +func TestSignVerifyVectorSpecifics(t *testing.T) { + + privKey := new(sphincsplus.PrivateKey) + privKeyBytes, err := hex.DecodeString("91f480fb3545c1ca7ee620b538ba5d41e21c13907543b5e2550a9e5a4214df2ba846aca3b143dd4cc27e81b2c77bef89d0c3f69b5cbcb99c5b4a340ae017e19384738fd4c6719e54d8fb0caa7a3eb3e016293488e307f807ba14c110c1bf829359fec4c9ac8b5e0d6270f095e356f548a164701d593ebe209edb718c29903e77") + require.NoError(t, err) + err = privKey.FromBytes(privKeyBytes) + require.NoError(t, err) + + pubKey := new(sphincsplus.PublicKey) + pubKeyBytes, err := hex.DecodeString("84738fd4c6719e54d8fb0caa7a3eb3e016293488e307f807ba14c110c1bf829359fec4c9ac8b5e0d6270f095e356f548a164701d593ebe209edb718c29903e77") + require.NoError(t, err) + err = pubKey.FromBytes(pubKeyBytes) + + signature, err := hex.DecodeString("69dc1f373bcc987a819e29f8b719d9e432f18a690162b7003bd60312f331b77c5bc48b1a3cf562535bd36b74cea23563b0cd4fa20cd32dfa9992692cba441bc4adf8ec55da9353521eb9596aa44b6f9e3b2fe643e667821aade99e5274e1c03aa7c0290ed106b59fc1c4172feaa4694e3b060cdd5354639753b28f97ab0278abc0c4bf5c85105fb581654b127cecb08d381b90132e58033278b58193ca593a74b0579c8c739ad5eadaba195d1171dea70ebac7ba386d4fb09fc60fdfe4ad8624c968c1a4f293d221d9f4bc924d467a1909cee2acfb5af9cd63b7a40769eb94ff04a3c89495e544509756ed513c987d569bd4ca541e4e52965496dd01ddec1b34b8d5e76c0aed5cc0f6c7ed722853fb3c783fa7c53caa78b0981866e1a6762e8200a52ddff7f094937e4aa77c37ea407818f8a071d04e567aacdf085b3c16bdc190e64f973a1f4d050c6c1aad2829bf4c40f249a46fc67f6c92c0c10b9c3e218ee1a36e528e0f042de22479891ff6f2b006868c8bdd178a5a1b31793bf423d55bf393b96c021cacee0b48bf51651f17eb151c4803b63ae5e97a978185d62db1247435e4573881a6b1f8f4773bf3ff9b3fe3bdbfb874fdebc663877763166c265f28338b0f99e31245134a7dc233e4e1fbb0a3a84872a0e97417712dd0a2caf811eaa647b1afab50ea15fe360e0caf5e1094735a2cd8172452373b1fafdfb443387b0fdfa53db21edfed096a9f2fe825725accd8019f87ac75b259bc1d577c6e47b37ecc8bb79459d13ba2f7d674aeafd23e154dd7f191538274e93bc8045d512949d97e7e242142eaea0623102b893dc695ac154e90f5b092bff8d12d9fa4202564b77770b410b2159e507131c97712cdad3aad7effedd2396b180ade0ffe24adffcc274c9140507cde1d367af26ced6f0fbb6aae6f34a1217775eebe297b255f9e6a4322344da800b03643995826cd0c5564a71c593004e0e0212d31e1ddab345d69ce0892d781c592c484c7006bad00b60d46c14345f9e94646474b99775c30720a442096788d5004dfae1a6bfcd8e1b89c7f9c7a9103576943da65e6eac8a0d191cf8d1a2af93bedfd3ce97a939d1dba3ad789ef5a7988afc15a61f1b60f3960e1d1c0b11f9b7ddc7936733eeb4558a067eb1d8c96abd1d0033809515be62be189d13c777e2c943ea4cc5f7022d7b1a2721f1a7696d94918878ad807b7f3fc86310465b21f47e6910402d4766483d51f0d0989f11f9069baf5b03572e3f40eeeaceccaab97981bed8415e5a8605658dbc71d8a16b8f5025d8ec95346dce85a021a524d6a821bf666c16fa3573e2d0c37d736f2fb130f30cbf4e58a88f68efd7074c092d08ec8e6403831df178510b09d54038e4381d3a79d7119da9386eb3fee98ebf5fa7685ac5f1296337ccfd3be730fe95ad55906f2df96dc993dc1e1f2748799860195e2487b20d4db388123a376cc961a4b75d924c3483adda3099ae6f8fbeaecba16377a2d7e70c9d0f5e745e0ca7b66ae1956fd1980d114afec0517e10973d2f9285defdba0962c3c3cd8ef0fa488b80bb934b558091a761e2de4d3de7f97029900708214d7f55c759fbf1bd9e5df219fbaf1c89108338bffb54994fb476db2c0a8a328fdfa9f84da0f3a006925296fd7d09ecc99d44a22cb60cc3a578c9018dfdb7850073cd3fd4522fdabfaada5620bcb8ecae2b69de9d07540d3e474ee8be51aafbf0c27843c466658a0f90d4f882cd7eeeb79df98d0fb0380ed9b20c3860d730c976d7e881e98b9efbe6989fc55759ba9146667d4aeadb6cc0d1cbe77ead388e4749f93c72e98bd614ac107dc064b9013f9f01eef0185aad241ad1d16a9cb544d83481ae273af1a5ca2cc7ee93091f054cec39d1af07c751b063c3d0c9f5ff069f689b8c71039e375460d720164ab3e38dc3b105f83856954dfdaa59df7cf686aa686d077d38c8ef4951cc6b770b72b9975e7850439d67eb5945ed722755f4f84552be5d26bd2c87f967107c36fb34e98623d7efa1358f4f2a821f889d650f9d939507c315b34625593f240e39d0aec413695ffd474c893b33d6ae01ab3a26f6c79c26c302f756170d69089f5bab5a224111ffc4ea83bdde1d6cd8c9b52ec964db0c37812c15b80e13995e59599f73f25c52ec36580e7125cf94e2d3f6dd42347e901aaf843b2a9a1147bea88357903da7d4f002be13a177af5eeff3f619464cd6ee5da1bc50688f662e58097db516a40ad69a88a66b751d03a2e302342c278e00f6b91bc4a7f060ec528fc9252a95b47509782eb988032e9d51591af2659d3c9428b3adba91e69abdea86022d672e5f8cc4288f70c0a08962ba8d8c5bc52fe6ffd06aae22426957232ac968d825802e2b18b87cf78ba5fcac28ff1dbf6c80e46ec63607f157e3b79b7de39dcabea67f10fbef6db3e4be32f25c0480c6f81472a7b953c639a0271407f8e208ac75aec493980475969c87f02bf801f5bf0dc2d068fd398310526c2e90ae3d07bda71460feddfe4a646b9a5fe2bfef90bbea484830ddca965ba5daedacd8f568c9b4bd40f50e97e075e86cc5aa4c738a5989fd407c6311a99cdf3e769c422bca5a993a0431dfcd9479afce281def07b8a8a3ebdcbb370fe642775c62d094ac6379bb0cb2288c9bf5ed5fff90b325b392f0dddf274e134972794086b72f119bad54cc8838d2a049baf409b10794de571b12b5ff224507bf4c4ff0ebf3dfa4a5930525e703e78ff0c6a02e062d2a29ad98bda59b2eea007dfe38b64220920185af10f15437ed47b0819ec946a93d905e373db776857792bdecf64b9b5b71ea389a4be6817dbb4cd99c17d365b8571673c313cf305aee44a45a3adb97820b7395bcde16601be31c3e73b8512b9913024f324b3954fccbdbd660b99498a84a5bde2942d96e58ebff8c10387ac5c9c1e3a8ea8637dffe85cebd13af37be8ab6d278ea068afe67ff0b6a94fdfa0c7a23dceee69dfe701492b1e25ba5b168b4be25dea101e1bcd461e3d79fc57321c0716163277e73923db193788c327217415daeebce0dca04c4213a7a31c689d1f3218992e054386ad809d50a612c9f693d417c62944fbd775f1a8755ab6e1fe8600789be3192668d722c702b19149b177aa30ff2389148361ab1e336a1832865f72b8492743a1af804910d6f8b66d41b1aafbdad2cf9763edfd095942ec183b59c94ef6a09c6acffd1e47318cc3b03dfffc9b98159de206e4fcb5e2163da25add1625008bcb4164fe1a3d3c9427b29f3f3fc057f49dbc83970fd1d619c75caa5d691c14a3c3340b288c1d889719405dbaa7dec9e8868c52b51ecee4c402132f8d0428708942a1b4bbf50b0f5ba28d12f14e81e32618fa85fa9a5520854eab2a1fe382ef45655f590f39533d9434d61c7396731fb1e5f5a0d937203567fd45920528e8f18c28f93cf2e6577685a92a6cb555c0f9b2dc6d32af658e32c89825962d1989fcc5305df81c7dc8d3c583ed1dda7814f0631bd4d16fb974a1c8be7d8068949fa3cc843a079e11485d3aefc1afa74d77ad4f651f0ef12173f5739a478f9a32d1f16ab98bb8ea8f54c214e9b8809d384a986f44f2ce4b0da05cfb378f37ca28c9875c535af8ad094885fe2d2bf04fe670b920504fc7c31c6641f515f991ce2324a28b3ccaf7eaf1351adb3261495a7385f60ea9c19c77a1c5b930d36f05a6f19929e33de9e96a1878c6b28f48b0d5c15e59e0b3b2b7ad7248ccfa806f0388a13276f978c8337bcbc41f92d269b90f5946eb72f616b1b3147912f5c745d41f20ec48b3442018eebc9540671c7903469648f3306485b68a30a22e4c24d0e94bc786ea4b0b1a30924dca64baaf82c5661d8f872eaedf8885f5688f7962da36918d3a44eac48aa01bc26cc6b50ab94ae2bbbe69239dcb326d12cb6a60265fe3d6b4f714ab0698da2a567d55c277b6a6a0850ec09d78d41d4f6097070df8c15885eb8fea0e96a0dcd235a570d44f4be5f9bd2a30670ea16609037cd527b01835f3b999aa3d3465417c8f349893d09778160e9cc81f10dce083b37e91ffc7882c8a3fd02d6ad1293e51111cd3860316660ada316f78d1e73fc2d5f8bc3c52ffac208e0fcc5baac7d9159ad418ec06250bdc875e598cb18b89138ab74fc6f607a5f51cf8c6e96b5ace8bb54f2952a58a54e677751b8e33d3daf0c73f2a84fcaa781d0cf4bd0ee036c66b37411c6d11eb1a2f67444eca99cddbc329cd2f381b762d2c9a167bd89108208d1a496ac6377be70e590a785053b9e329aef3fe1f64ef3ae5bb073e83c9a3377d3e0937fa1b2449c2e28fb284a1cd0c36ad14c7e84877dccec2cb8b2a2a6470c42e280fc5889ad8b5a2b870d8997ec41d76a458354d5428cb41375457398d3b12fc488d21314ad9ba71a36be23aa59ca8bf2ca67b63a1eb5779371196e8114badf1857f7c446ae442f437908715532441b39060a7ad2c4275931c3ee53bbf760fdf9d98267bb0e87402c4ad14491ef1bdccb18c7985738be8479ba9d332b52990b0fc04e3e78bd84611971f1463cba167fd38b80ed239c8d2b274ad256be0f3f037eca4fbda9b128ef97d4edbce2ecba32ee909204f6ec029998c8455208b01fbe73a97195bfd21b04d8a16887483055b4795a45766777a366cc692d60751765ec498b0723b36ad3f712508a9e73f4005ff2a7615acaec1620ff544b7ded3b46feda13c290b16e21d313c0c24ccc82738ba46a825e7a16315916b1bdf684c8d46d52d23f7f47f50681a4105440ebb4c75a7665c3c873a979216231d2c95fae3362edf8bf0d0265e3e4dbc50c53c0062ee7a2e8749790436370bf6c8164bd32f590cbaac2fefdd422b1529da6403946ca6382cd224247cf57894e02e6950f91b555ae197fad80550c89e07b839c624fca3d0b9211d8ef6da59c493e969db33bda4e1c6e0f8e3f0b507b0eb5c195df879a7e300030f9e8e96357ef4ddbf7e12fc8b4a687f5e540f08d9c2dcbdb730f5d2f7761f6292f84f4b9101b24770855b4b8bb678e253f62d1918c1425bfad55b2f327730e102b1132acac7b51281ab6b026448ff0ab800e622acd30195116fa41db05f24fa41df9736c57bcb11a585b21beff5bca4f712eeea865f2446819c389395b735a7ddb3116e0116c56141511753b0155cbf8cd4e7916ec6cd033eeac3afc2e503a1d98c6045c3840e59f4e4e145a0836aaddff66061d34102018ca07519f6da5f1e9baa5a8085b8c44c32eff42c88a89de738dab9dcd4ee4c63d75225eef604dd551ecf2483420dc2400a96cb04b573dc5782f41b960e2c8c37eedd57ec70d3ebce44f4cb8e9627bc3e9ab80634feae9f51690dc09534baf97047452af455612b01f9b3c3c25fbdcb3080b35714ab3c7eb5a861820c51bb0c80bc81a6ce46bf91751c65f7f1276aa98db11f08417b2afc13603462b94753cb11303c29cf02d0e902b8772c08eea73e26d2578a386d82ef543817df4db7a6d048325d205a646843bf91573146bc7dee9ba6382ec6c4456aaa24ade49f584420afad798c7dc0e32925734566694651aeb02c9151cc92480d68c190abf25eeb47e8b3304c46296b9a5ca59479df543ba85f86445bc2b2b5cba999425017922375e3c15c0f955e50334b814c458e1ffdb9b2d470f7b9b6672a72beac15d840108e1d11817c39ace75a257b1fa8f20468b357a5c26dacb14592de8be6b435ee6739ab74f1234f4fb4747ba37004d33c6769b8eeddb2b076e8ceba155b525de0f726d7d2d83acc72e12cc4298e717cea04bf8b9cfe20571367375cd8646dc1c246b66bd709fb2295be0b899d4eda30891b16bab88401c158daecf3bc52f63911719237d60d410fa7aa0476cbc6081ebb9dfc38a6f63b5568192daa72391cdf813063a596fa4b1edff4d60a860f6fd71ad5b79531bff428f81e3cc53aaf1610fa01611fefac034e4b8a5e476f587691e2e7d84ddfb521875e901fb410bfba2f306a096b9b2ebbab082cf792a7b532a156f8e256034f79b561e437a7763fc921562c53e0eeadcbca23fdd12278ce92974efdd6346e180066533342f53ee6c6023c265b71eac536fbd986d4ab09b8fe844f18757195032739b5db8fa286e456afb5b82d9f5b34929de8607f4504a6a329ab5616973240fd3cc515b6068cde36fca18849cce48d0e78110576f93f10e825babce65da507e5b4584ba846049544988711c7ce81109c4eb75eb5c7729502dc1a7afc59cbe8b345bedae003fa155f031ed623cb95569f6729ac14f99e49f787b048723e04760b57be3df19e42e702f9bcd0e9e208e091e6864326d9a41d1636f06bd66f7926a7a1676bc55ef00a48460adab6060ce025621633ce27ab629729eaeb58d8c6bc8987006a87e9a18b9cafbfb14bde1b05d1c3b52e6fa974008ad7ca501df709414ae18fa575e59af2aeca7e6ef08951524818b5a1ffb148250e240d8581e697e98fc700e22c6c4fa82c112f8bc5f0d9cbd40c93365913b1cdecac7e57c7d39d2118114451628f9006500badf5a6c397777f2a6b8f1a9a255e5e55a5c8dcfeae5213d7c63e4a6ae777c2993ae3cded26d5443e1f3671fcf80021b4f9344d72e7ab752aab137c927264cecbc3616de26c79e1ceec15eaa26e42fcd3cd0d72dc104bad383bb6cd8739a8544bc07eaf9a0d8ac8dbf0353a62fedab9b520f706dfd093fbfd1cf4d532c5a4f9ae0b771a1189a5a02adf0a527e9da4d3c15b07b5ccf6caa044fbf60d8e4a6fd3e6301729b3082ed971b4691dc73ebb45fe2da30eb9f933ba05780bcd2a56befa9112cccdf55b48e24ae937547dd368efaab1d70a20f5da87f3f366386703f65695e7d8bcf31b7fd107f18020628b5ff50e035ebde0d9c6a5c29ac83732b3ad3d40569353a740c4fc6a7c1f87c9364496215c446eb22b69b1999f51b4b9093c5d37419b066974f1bddbceaf945660d119e8e3c960864f07a40030aa0f1356d3581d56825a44377c2a6b3bcc63d5ab9af6951c3885796ba7c1318f907017b2d424d6bb37d25e86fa92f50bc865e5a3ba6ce1d2184536afa30d6f7ee39407194b21ae2782e2fea314156b533d7b122ee284212665e45d81a24fd5f745451bce6924ee64a0726fa1ee2674c90aa13c814549de709d378997632ac622dafe71978257c67941aeb02f4bbc4239447a02cdead1c846e14dee76db63b917d1149a1ee9bbb5983fb3161971fd38f29521c86e0c20927577daf5e72b0fd2b90926301ca95ce7dc6399157f984285d3681f16bdba6250bf515c74a566b4ad9ddba6d61a9f4bb1f36d15eca22b61c98c7e071f41518e5250d54b19c23a230634a95b6b6c70d22c0429895630abeed23821a259417a8c8ebef18bd3ff6b6100e93205d264338b807fbc4dcff7587fcde905b5b06a3bfb7c45aeee1411d37cb83a1d8750d90362507bfd6eb9520ade6a31f90c69cb5da381c9c0435e7e9c819adf43be1fc6240d2696c506c91de0da39fce4c555234cebed605b6df20fd759ddb88f064a3972c830ec62c6c58cd8cc38b0b05a60515a90aa95692342135fd4d8aaaa97133e753659e3b631eb8aa18a5f1849e09f88f8f82e4ead5483fb3fb1f67a9c20b9f4ff31a659be3ceaf8f49730b29ff10d5a2d86f5b9d05ee31f4f42b1103f8c85bc84e0f3d6530d01959e09ce55e49dfe46b52202a587d0a1f5e940f4a3147b0fb1a69c384553d4c3f8ef2cf587e6d3e179d1e1b40109a534f377a2be6fc30e41b1d92158a49d3ff4736c6eb6ec7d18f48a786db549cb36e66196c348ed11a456a297504a711b6e7551df9859172777d03a5f6a474f07910265e9da7ac902ad09dae5a12f15de54113af2138d5b71aeba9d9ca5fd9c0b14a741bbaba8c74a4a9509aff69ee19d8748dee674f72bb4d547b8782d9ecaacc4d8d74bda4eee26ec34c4f9699f4bc004db14e82c16819e7bfa0581159713e5b494981783f1c26ccb7d2664a0486d923a68492ec33ea9fe2a09eea6d186224089f280d0de903c6a1b57f9db256269f0f8e91ffb7f22c852aec686e8619d4de2a1e5c62d272e84f8441b8e23b41b99af3e8114650b3e88af4080a2e8f5e8e3f53aa8aee44ad7dfb01ad51509dadba09de69efd823af5dfd0cd1f003af8dc35ea317b87c1dfa55bd684940938d01f279b29a2b03622d95aad6434f41fc07e81c7a084cb276dfd7ee9c80af171a3589a7fce5afed5abe694cce33072b7ce6cbe4715071daaeb50787c36c3be5c8621dedaa67a0d3ebdb4fbe8ceb33801250690f209a300d292217fe219d30c9523ccfa3085b85ac48e2e7c44f8bedaac3c7a38a50b0f9693316123169b5d8cd7fa25fb775e836953d95281e3cf9289745b1007b16de189a8957118b31a4c793f948a86a40394616869a9173acc9e9ef3f26832e5c2b4bf4ffd1892c460bf3369cf0dbe97a04452067162627c3069b96f9f907163a4d201fc54bbab863e6ecab5a1b6c49d5d09eed1aa05d34cf69550f11708b9e5d25e32b4e6a7f429cced682a721a29d9098de127abc8a857963d1cb0d6347e375e653672787c6e707fd21db855284dcc8796ca476d766764630b54ae8a65b5c4d368ad4fe53587639dc4579529960146e853e67acdc04e23288b5786d114dca6745ac74571c8852eac297127303e66e4a4073970b6f595ab2c04d21b69b8cda63b37690d48ef0546603ea3b30655583102c3f9fdfdefd3b6629540b0e19bbf39284f32ecefb9ee0f37672266edadabecdad068e62530616916905d67be6d365bce6036d1412d7f2d59096c4e241af358f2f9620ac64a90887188e97d6c0a4b74781dc2715e71fb66a00cf9b21e4a018e7cd155192b6fa45ac6d51ca34a03212a9d992975b712fea65e928e54114c53f6bc0ad5a25133b6237bd31b3ecf9461f60dbc449a54b984eae2865ff69f2988533d545866bfe85317f52ba9a8b5e743e34587bbed92fb6772a9646096054708a347c740cc95394fee2920d8fcd63a30c0f029e3497c3de5e851f0171d9d3c9fc5b2b88b7b722187a2755aa74f4cc9d395f778404f13acd502c4c7a49657c56d2e61d39a9c6a7de50450df489d6c234674f355d1f655f371a03ab181395b77ac6f126925c385e220ab29fa4d90b75e57e3228f16532ca462d2658f6ce0c24890bea0033ff5ae94eba91dc72eda64a1888745a6a3e80e7df12f8b44feddee91fd10c19d6b812c27d267cd0d967b2dc8b3c0a9470d5c013b37a5d72544baada35fee1cdd31a7ba787a774ee609e4ecdbccc3d4ebca6780a8cf581c5a30441f1fa9e63eac3d199fbba4816257fea34043f38274687aa23f581e38dd6c02d49710510b462b84bb9af201c1f6ee5ceb27b2728064fe3e08540f28621f54a0731f3af94c8da1d565e176e2c22bbd2295d0420aac2cd941f2e5d7bc1c55f2aa14a0d7748ebf70fbb098f4db16188aa1c0b87182179d16a0c274aadbf55ad1510d10f1b3191196227971f652c9b2592a8d4dad2839119797a5f74d757868a6353363f4b47e769c96e09aa87f9017815fff417390abf4af36ccc43fc5389d85ae52a434d5ef25a06bb19a8b46a9b0df8585460d85d12448a68c86d497515183b63a8017bd27599de003664efe05dd381a241e893462ac93990cc92d0faadf8b4aaab23f33aca9b77c45ca803fc3f98af4aa2cf9fd15c10ec03839cfd2b0ac276a93a1aef6d0555ae76af74ea18e82b8e5fec8a46af3aa5f029abc1d03744f9e1eac95e09879e92eef98ac43dab0a64db7de6c9b34a91e147c7b5a2cf4e5347582f70f0eef175c1468e651f40fa2892cf24fc09c74f02ef23b2d55ae56aa6bd9a29f74adb16f71401ade8c374d17b52bd61661df8c5686a92d55ebc5686741dbbe815fba5c04a56d45d6b5b9aafff6afc161e1fd4237af089027bea9b412d77dfc2196428769bc1505e03b77d1341f1df8c27785ebbcaf45916d9bc64807c068d8d3e4f8a809d3c856e35529ef2d9a34d0568bedc7b9107950bcd54e938b1b01a33f9a8a29ffda6c379ed58a0ed7d37f453002d2a1078c1edf3f929d583acdd67fe88c58b17b3cb64133fb87e4d91f57cfcacedcf80a76601a53823ef88e68d6f8010594b14599b166745e9678703957f24f48bd1696d93d45079c1d830dd9145e7ce97109598a11f180fd561ed013093248badeb304c5249a7d82ffcd4fd41160d55ab4e632485ccee38ea46a4bcccde9dcd99be29cae18c5d72bb85b371598a962045bc71331f0d90514ecf21d2680bd449ad51255b0993838b23f007fd6e3d4d5e4c9071034dd274573ac944ede3542d801c21157ed5008d0b602a76eacdfdc1bbba8bb4280094961167d0c0091346d8ab2aa3bb622ab5cd48272874bcbb6e7cdb5418f9924459f3eda25e2e08e068916ed76e3ca3b4a7f3a351d9fc7de230aa3c80deb9400c01478769e403c96c82870d43c82724c506bbf06594c211d5f99c8bb78530a4c6f3efe16a0f7eecd2500880f5dd81e69697d718611d2f734ed0a167e16d8b681f378bdf28e3eedb53b3568ab2d2aa3e714c5cecfe5579db4e8668b1e97a6a697ffdac4548b7d658368e90c73c74468fd38a60440274364350c8732ab77c92a59ebc3e6e489a764069ef326fc472d41c8fa6ac683741815edd1e00c59f4d182ab93dbe0e3a7c49f702c3b556c280d4254f7e72c3e40ca9c5b26404077585fd70258b884004544866ada44b4644bb45f66582cb7827d37503f120c337d6aed138d40e2abeda84641da66c7e512737c57d9ce129ccddb529ef63ed7526612b0f0e7e3600486fcd9e59f3817d05a7d0000f33d78e43d26965d8917d9574050e0ece86148c0210d302ffd8f8794c05c7df7a3a02f27f65997f4f36b86494227344ca84b08a599fab7e7aa14e5f31b081b77a3278866a70936fd835f9ab1e99d4b354f54ef2221bd469e9198298f5f26063ae04fb3115b39af654172649e1e6e9374af1261383ecb9ad281f528136f7a6702892ba3d2657117aa650d549b7b0bf8508add0fdfd1d49450f495de08acdea2aa53b44a45a22bafe86a1d7175c434b243736e64f664c8d7b5d1815c215b17db68136b9b716a937c9b923a184b3021747ace72f3683f0848a277015291051d954c33c28183d5eb5b144d208ddf3ced5c8c2cf2f53ed3055e3f4bdb6976bb851514176082d8fe32b3761647ae7a6458d4288937681823528d5f0cdf18067720196f1e6087d006f3359836a3c7b740eb621d5306e0ecfe91460403b265ac0ded8f64a2831a82084f379932d05c83fe8176c93d01f22a8be558d7e7fcec717d6dadba8b9f704917ee850b46c9c762cc4e5ec17af4b08dbf013e0a11662eb2121a8ae931be7f7a90f77fd519b01e43ba2fde19c2f60a3d886a191e2e86f1cc07209eefbc7d7b6f78ece3bb8ebb17befafdd73acf8bec05a736311c767d0f9c54f0271b1c674b213f8be54196caf853d94c13c2713c3be06a866988bf2fc4cb5cf956f6addee8721522e1d01e85adb8bdef9c4035258bf9f7bfcf93263dcea1c7a3849b5c140089790a9f8c807c85895a245300e4cdc25ec8498356b1d02e74e4b7332d4a74c2b50b5edbd80e76f395804e83f0439c763da7dc581bb89c7494d019c589045e6aeb7a3ab7b1385ba238915e415956409e71d69e0862bbebfe6e6e3e0dbc2d21a127bd3d336961db1b07abfeb03198a62f9d270420331a90cf94345b1fae30f5799a44f4655a582d9cabb2148164ea224a026d9887256d71d73bf23e53b33c62b95d6de4ff6528308ab41cb1ce74529ead198d56c98efe85ea104bc3f0cb3ce091a78372563d52543b50f2fcc5f36f3204a7b627645d50f7efd4f70f974b1b0f3714a4acfde1e80fc4a54be0c75edb4f3fedc6ae2bd6d021e87c7cfb14d944cc62bd4b2f767f01dd37f54e0114c9597d74399a05dee06b225598026e146fa08ebfc10957fcf27befb9c5b2f3c7c800d6a5697f3f8e3126ece54aa1d4ed7c7d53f3ccc31fefba947a8285688d26a1c60021ff5dc05bdd6819f36944837a5472c95f1463436134d7d15bf9365ddef69dd4c6e3b16b535589f7f5fdab0e3a16c515ad3c6a51f3469546aebf9d7789d2596f729c002fb6826acdf962406fa7f1c7d9f3b692fe1350a0d4c262fa6a2726b15da412437b923dae661c7658067795620d8af008f22f86eaa3e5a7715d34ab25678663e438fe7083cc98c0cb7de29a5bc58a4df89c8807bb44d32f80a82e227d2fcea536c0ed2c719a28b3dd696895e43099ba85f24e05525aecd7cedb39b8bb4388a7a0fc7fc7db93dbddaacbadbff2f5dcf27055ccfdbb54a046e19a9e084688d41bd3a820d63a8c376e4b52e8cda7b9b0f8a2d8b79d93c7bfd7ceec3947f5411ef175b021ba587bfbd0f34ee45db05a4f6cb4b64c4d8674f1fb0f26c6b3551c0b89178e243ec95433184ec5dc437e5d96597fbd00f837b27907246d0623503f4723a3fefda61ceff376d056d0b027da7e566b0205b90e069cfca57694e1918780d6fb42af7dccb90faf93f937acc745c84bcb4f0d2133e73c9ffb7d461df4cb3383237cab084490327463d4404feefa8d42f3fc7b8341ffa4277b214c78e705bee318a8f35b96e562e1ce8dc1289fa6465d280edea4e932eeb61a606eaefe7a48013580b5f66bed7839bd7d5ea9230d2faaa0b0db100a39407a0518a004550ddc7d567c5b281fe19c1b2c18b3cd331a5a40254fac1deb23b504378bc8428c72cccedb66efed8ba2478a4ab3e36077cf319969156a379137af4cc35d1e6e521262cd597e25bbd50e0838f01db6f8b2efa01eb5c13eeacfa5cad3103311c8f5faa406ade36d55c6d503b657b0e530c340c73454555e87e3ce197e63e17af5e72eb8fffed97f35e788d5a4823d764941900725bedf687ad22caf48ae02742c191533b12bde78f7c7b6a31dc1fc0af28b6e44969cd61e51b9ec0bf2be7ae3e7ab55e197a27d792b630c307ad0a7d9f406dac171fba1507545de7da82cbfbfed7fe0a3db2f2768a57fc4e15f6778041e36b8b9996cb728411134392f5aa5472ece48f2abce5c76c42409adeb61691a7fad4a93727b1ea3a06a6530b62c3a7f95065c632b1bac862ee0d84c8b32596e24890b3f5a2e7da9b8e439d9db5f77490c944936d281f3d7896d38471e84a27e7ce874efb95519bfed1ea76264e3091a239196bed6cdeaec069d333f930df018266b0061326bf85f7f0c6f61f6a74086797d2299c545e1fbfa9e029d3157e43e325622f8cbbdce2e073b405c2c6f62c257873cd52bd77aa3dd9eed2ea8b53b800695f3cef4b9c72adeff5e5d23eb72533cd7447e2820e6700207a8a66529a0426b63ee3cf07d20367257cdca54fa5831457333f8cf562d2ab282ee0f21d9678a2cc43fd3bcf5a0fddd7e778913e26b639bba5d57cac79c02833c23ce11bcc37a6a3c370aadb804737821c3bd28c8390def9fe5566edf986fd7012c018efd3a762a7155308bd21aa736f87d2acdccf939a1cec5cac9a47c858bf01a9c16859d14b1dd8c8fcda2ebd69eec2c4c58738a9aaaf484d04f03cc0f3b5cc9256613940397c241710182c4ec6e8c12f5ca3e82e39fb05a0c9aa2dc1970ab1e3a244ff0fbfc36520df7851436deda570b9d490fed58b9255263f1abd5c11cc4f7d7e478af6e3dddfba68b91e99c9eea61588110cca703ce3da445941235b917babb26c446f7a86d49b705c018439224a9c60cd07c37c45da39de53851dd1aedddfb3e23245229ed1a0c59010955105af6e74843e74e551895aef13022ba596093ab23903ecf01f758b289c366898bf9e731b3a4ff1fa5bcdfbac155d18393ca9d39ed6a2794586d461ff7d34488b970e55838cb443d168040742cd61b4642e6950c715509cc9f3833936aed8f01cf07b672bfa37cd5d28a576f24047c26dfd108bad267bb5c685dce37a5cf338dde8570a7cf1cc68734151592c2802960cb055bfb1f30af9ad41952ae63a65927d6308a66a13ed0a9d91aa5da925a2399cef10ff6d7bf155b7dfa7dc45eba8e6de72f1defa6d60e83e07649e2a151d9d85c373bbca97c55e8dcc708e2d500680d2bf4414e86a2e147e1f231a76606c98665dca2249b58fc81b341a3c3ecb10eb4e98da655a8bb64dde67a9737a09fa5bac0eddfb46e65edb3d3e1caffc8145a976f21f3ecced3010040205528f5ba4d41dcacedad183750422c68d342a1315b6e9e3e2861863ecee57083d0ca80c7502557642bf7192d6a79fda326e48421771f3060dbc11d5eb916bd2da27def815217fc8283eee2e3c47b233cb2924d6c93704ee43a54649f4ed1d74e43291ab6bbab925dc9cb13ec746675ee6e7480dd69fa77c6d17a5746e1def1806737b798f877c362977dfe978626f74896b73aa7c9fa0199633beee1af2bfab04e31a9f1aa8d2195ff234f7c871c466ddbdf3ce72f945fd62b722e15869821b7e52faca610581438d4196a9522b3275da8587a51d7dae98cb6da77d153bec877457c6351185418137886187b1ba7057bfec9da30394e519181477bbcce7415ebb8b96128d78229a502c98e8471c9385c43f3b265a33d91ebadda12344cc655c34d40e845793da94d3fe2896690bd2861e2640ab5e3c447c3a7a2b2f30c398a9eff37b6940b4630bdc55f5b6df38b69651bbe16f8df1d7ef759693b15c0d4d34c24606fdfc1a6961b7183b5a96c9bc9725e32ce9a40e03af91cc6d78ea794e0783e32dee60df5463f7099a7cd94c2e46b3729f9def0d10ee5908252b82c0f75bce3f5ffc7f5d8a3337db2571ff1ec8fd4afe49be0f24cebf31b7f125e5b1cb3d6c35f508cc1a73d0a292e02dc6a0dd8420fd4f401bb2837088e21f2e98a3beb356d9e688a65233a73b2a12555935f52ca7f624e6b01be654a18bc15105cb8c297e08af08e013bfd05568a3ebbf3602eeb12e828058f57799bec0d6072db8d8f9cec47396fe5b66ac40204eb1ef59491aae51bb18cdd720f9c4e0315a24e86569402ab29b4b1c8ba990884d5580e4a7cbcea89d08163797b43786547f9908f0f4ac949f354cac965887ecb872c862cb3bfab5aefbcd2056a870d1ecc5e3d5d625734466dc59248412e75a1852576b024814ba255b7e53e9f4b90bbbca9bdf2a948b7184b5104c33c6819252b29f558faa3aa219281638f1625efc564c0b4e3a277d03866526cadbeba86077f17ced4483aed276dddbfb784d84da33d4de70d9a2a13e1abc68805d890fba2145fee8c7fdb4381d1940593d147a163da7c3b80b5094b0ddbb0d62a09e8d56ea06b147473dd25224e174d535e871b3d3c8aeb6fd3baa53bf526e33a432df4dcc2627fbccd3d3cc18a61c33bba2b0b1238cfd9679994032831b06e63db10c1a5f6e2d02ca47c79716c09323714c17f27c26522627cb3fabaa0965f41beed6cccb2c6e74c7180abd8d146e26273bf6c86c1e0ac4ad9bd98434e7e8ee87cb68380d77b8fe83baa301763a1cc314aa50d6250c708a267305bd59ef01039bd335c218b91c9b8e36decf5ef058e4a9930208f039abbfadb5c856c2814e291732b4ada039ee70807318a0567a831a313fc275ed83ce0b0b2dca924fbfc2894a389158c6a5561ef486b2513750cde4fc67b0564881d78a9ffff6e0db95364a2c5b1920947d30fced9939b7f6ee85b8c421b57c95dc60cac76cbcbf458e33e25195a5b357f7a9bdb7b7b30e3d14ef087c818d8535119bac8bcc7c009fbb1ffa2e80e46430f44ed13b05f1ec2588f4f423737f3d35cf2d5c0189e2cb6522b7f381114c380a9103a48b6abac1cf64bcc17eae8ac8defcf2a44e82758f4fb5e47f0e090448043c3a2b94705dc4c7b0dc7d2edd739480112ed15003c51314240528a31cd02d69b720e2e8e58c3b6196b42adc397d62a5898784153d1fa3e4cbc32daecfd3136436f6c69a8450ef9ae2d5fff25d57659ecd0ec6b95de71dd67c0f8df21a9eabe552d7218ad79a9b27c0c617da3b254ea753defec11125d5f7452e3b48f107ced4e846155db426b11e9e02835e643a43094258f3812ac1f3d016ac797e49f9110c721b18d1040c89b3eabc16b5a96f282b36bf67aedeab34e05c0cb10aae1e96532328a097d71835a002ba85b474bc31e8f3f5a71ece8aaa286f75fe796a60d58e18857536532c2c10371ddf6d2545c5685d3e469f01bc048407b864c64caf726b039aab6e40d4c5bbc357a8871607877e4034e37c291b0ddc8b0f982bed1fba37c90f4460ba06c889b6272608ce892d0873cfa7df03f901f7ef5012d99eb0559fcdc344adbd728ee81484bd0407fcfc18849be9174d1b7d53ed648dbaaa29c4f856fdf5373c257b63ce306b4b732a0a29ae4f53af70037506f9026d530d44fcb49d7c2f98c79ceaa5054902f70792b4ce5cf07073186766ddcd9778438ef6ada9057f9f7144713efc08256caaa1b6de085613631e620a55f95e7a5066efa5a8e3dc6dc00ed7eadb11736787fa86f94499b2bdeb8d2c14a1d0ee0f259d96326daaf4c7ed69b3f79579020a932299110b04bb59d8549ca742504373e38fe035491f05ac45061ace1a080f9ea569d00605470f26828a9dc241a9c1b27e421597067856fdf5a9ff26f6cb3cb6e47e18a7f670cd6ee60ce0e2dea14daa2c098d7a9f7a52f255162ba4f763b208b3ba77d43463768ebf3a7658019fe2fadf5d777e940626b66cf4a0f88f452880510f8f1279b7c89bf6585a10b48c606b5a2b0aaa44bbf93231f90237f57ca5fda7938de95b8c2c67c8e7c49becd0dccddc0cf441107949b89f9ec334f4c465fa47f707af42c4cf6fe6cd0c2ed8d559a40d423836600e2368d15b80b5a9ef4c94176e055627a067dc474f9364c019ce9cea1ce477a68f66359c5351790fba101e49a0b059c115794f61362a72c5f7b7167a62c7ca3fd716a5b3eaffe330bd09477c4622b6edceeff4e4fc965758ea17b2b1d820157d2ddf17a9df7c8f4fcb3c3bc60897254dfd36db09fb21cb170329141befce3d915675c3f5f30a4c6fdada074c4fb729da6d91987e87b433ad8e82d177f95cb3fd4d2885f90980d91006c91872bb635131635436c6544ad6726e9d6e5a95cb0afc345fcfe6d71437a674cfcdd65dffb1b600f3d58c51c865b307077346cc860da80261fbdde13038b80f98405c57310c867de5a85435efea7c98ce54531626e77b0c6524f7c28ee12a0bc98f2ca42915ddceecd5ad033831d0130a60ee1c18d6b7629f7d6c7e8c68f76d42bf2211f1a9275026cac06fe122315fc3044d2072d024bf65e63e7384c416ad1f85ae102c1a3a226a1d6f05e609deceb04c7a75c43a828f159cef4f8252470d40c3314b436e12d4295ab66ba77b3d2f2bf778f772b517b873226454ab767f274c215baa89d5b6aec08e25ddc09ad124322445c2cd5abab77e543194555e944b732584d8b8a050bcba94f38cd04639765b972e4b3925690dc890f9b6d0036a7cd60943d8b83019a02bbb28080ed9fba8427d914c2190027d66644ca6eb1bfac48e00baaa2b4a2362401611ec2f485d08b2e851425e65ab84332895137b34262ffbb558640286ad498d8ee2025e65d9cf568a8a9ae4874a8705f0feb787c3abf2344510fe7c07c361eecd7744fedc695174897af7d0949f0d53ee5807aa7ea5e40c9663d55e10e04dad5acfa1b6c7dac3cd70e6307234ece7a7e95a2791519167814c4349b10035aa2c14b5bfaa92fc8d02019be872ca16b82d851ea2ebadb1d1814ac5fccbfecc999912161070b5c6952b0473b12c4c7f6cde921cedad1df1bd6e46e326e03b80e651163f97498304ac40150f995b0f98ca747a69f7bb9c6791cc3c5ef7ce2c4ab24d75d3a02665a3da6ddde75ed01d341ef02eb4adcdc34f4eb89840dd3fe5a3984333e661749c9beddee7cf64e5a9261163b91909793f14c74769012055dc135b8dde37811faac9f40bd4ab91c63f552f1e4683efdab702b020bcd6ff718830574c3f888c113d6e2d9f4c036f85f9d4fe668303cf52c580486df1748f00d426e2b673ae7bf29a286fb59553cc6ad3ef6c27d2f84b94da3f6d9888dffb38372601a114031a67ca2912f04cd61c5ff6dc5fbe8fe402c6bda7463fbd46e292b5ef6efa451263877c7b9cad3638a07aaaf20f7fe29caae147e3d6351970d30436a165eb7801e23eeccf9d6d12b5f305c0626cc5db7b608eff3135954c03f5ef53019e2020f930ac8105af1932061d065a21d2831cbefcc20712f49c677112776af5cbb3dc56aeb369ced3f4762c6f6d26cc4525d39c76251c0a457630e65b95bf113f4a7fe35f9d314308a8b75d5f041150e914b7a16f451176abdc88f3584daf497680a83e85439ec59975ebfb3cc2671d81aba950fa277cd2544085d967de7ef46672859589174a8e41d9971e78546035effec7fed80c24fd753f1737cdd9323d980f53b9efbf0211714ebb1f6ade7507be7c063e329d021aed2838b22b53ec8241a3e1457270352e144a75316a1febcbf4b07f9e38c744c8a3ceb1460cf7706a9ffa6c7c55143735c8a4cc60457ec892ed0dd346cef7f527567b6c0da57521501cdc0aca376f1a1c43eedbbbcdc0e79d9249d6d14f83cb036fa39318e5f5e11e4c0bfe1ff1885f3e48b72cdded2baced707253fd5aabae4495215e52d46859378e18047afaa004154bf7811157b28ee170c9c257a10190915674349a42f00e77f79570d7210ac6f2b6704d8cc39c01cd3fbb4b5e5f0ee78657da201a67f812645fd9dd824e497755d446951e6927415a3cabf21d9b638b23d1238f4bf305d075f877c4d53150ea01f04884644d9bda507488d0206e4b82670750594de9ca20a0c9c7a9e2309907be9fc2f88a13f3c1d95cf2dc1f2f7cd4672df9ec18ef1e7e3b0a6c9fb1a62b95ee144ffe845451ccf329dd1519657ab103e14109555d8a2786a5fb04c97e97684c523662c3745fc0d8a50fa679a533e505b9e6effef411d3af59774dd2c43f1f2786e80e54c37b60335dce31194ec12d7e430993221d65c85cdf732512410b607ba1f97249b647037a300fadf3a1f1656ed0bbc8d3c680587f8741b1cb5d81b34fc4d96ec84584cfdb86b6e305d54a8ec7d7d9f15c81ca1c71c2fb9d8994c5fa2de9232173c75ce2049cb4b4168c424bab6c5dc9b980631c62915bc829d092929f36763eac574420141a617ee70f0d4fa4e8bf1b034b84fb918cc11cd3673658e7c862344d366ee0b03989d7d257a3b9f363a1ff54a9c97dd3860f8b934e90224514d8bb9c4506ecd8d69f22507d57577ad6ce106fab250fc8bf20cade6e4919f67af476279ed050a7fb8f741a62f3f206e00904114ab827ab55e67b4968eb0a8dd99cdf014afaa0093ab4c295090787e68847bbc3566843a05ba02676217e719cca0ebd741a213c6a8dd5f9035f857b3000da3dd24d0842800bbc7030ac95121cfe722a7c4329d1b88074ae2c039d80b6005bc60fb370afe2e4c893e66495472760eb717900aa6c079339b183a89f980aaa11b9666bc43170933bfc85a3da4df2d1f28a6be651e728d69c1fa7d9f84b893778d1c57a65d28e5313325e58d440c9d518411fd600aba42f6c2582124817e4d8e296b67705600a0d4f0d09b9fbdb3c870fcf0fade40b6b02bdc54279c0ee28bb8e232a1e35e3871e851867c4e319e434ebd099165c585f9564a53c5418eeacbac1e1aa19bda2c94f50c4085ed24c9ed977ccbb0bbe4fe4dfb816532b775af7a49ddbb7932c4f31b7a184515436d5a7fa2cdc41b89aaa54fcfd347fb8dca456df959ccf5f9707b779c6aa76578c8a517f74c6db981b43ef5c47d99b707699a6c42d5bb1807e88ee687ec5ef4ede246e55bf149d59a8844366d19852559aaecf0a462b700caf1cd66a640810c7bea3dd86e7c00b718c2b0a645ec74f41e17cedda583846c5b3d06a9c090557aa57158193d2d67bb6ce366ff6a8cd7f98171f28409b91b902f6196ff316817ab109e3e03b6b11c53996dbcfa7626751c8d3af6352da3631e3da4f478a18f91f40bc1c09adef7788489aa13a41bf8db911c88a4094a0cf069886469375a241cae8554cc87c5e452a8835965a449862d93f8fd9360d5033f8647a59f6707885e43aef9ff5ffedce9126dc44999bb4ce21fb3a664310b18ca76cb2da341546edf817d9acad3879c02472102bfed8b9ed8dad8b7bcf25a0544bc8ce3840087a0caf6ef0ba7c8b95a086a8b77bf010f335a2b7793163de8b681ac9b8c88d3d2d56690f6c961984c35b74168c6ef64e581331137e377af80de4cc682e3ab1df68ba627c9f62c975011a0cb6090464055b58fbc3974c5182f9c29a9fba80b71ee41af9ce16e3a395d0950f427269ce94ed52eb3fc4d5dde9f7620ae18aa1060bce7a734d3b1d254bd91cff1d215147eb4ec1b8efd0c4db1c4f0d8cfe6a6c4c9ce8acaada579dc4607d668b950511e73701ea9876489877a105d247bb5996895453a4b7c958ff41773d177c622a2b96ce75a0f2a499311a82166e57cda20fac39b7bf3891673ee2cc5dce2a87ca40aa95429e66b6d6ce6c2952e7fa31a1b8cae51d5f2b521b6a71444b5a1b1acbed3a384a91523ec7fa979396fb46096eced966de80f4de802ec4e936f62a70a8c2bc77eb012c45164eed7c6bac0ed63b4a2dcb61abcdcbba4fb6cf981878cdcdd4d6b525f6ace7837f58c4657219279cac416f7fc34c2fb785acc4502ff7111965b8acb200689f4315e6f04bb1aaed276834e6d022e6bbe429bd3897ebe01caf895d9ec9c473db01c0df0bdd778beb71a3e1ee1f99e30c0152bd2825c5b279438635e40055ac0cac62bf4516ddd82a120236f2b42cbef0bdf6ad1a0475f5aeba6755f00e66dec6c93f4e378103384f854a07206779d5a8fc675b33c2b52d2db40e78481aa0dff2029fbcde716ba77d65dae0507c9dc3386b877aa88d6105d8725927a7572930bc1170a49b70df681da33457aa6269e30a28f917e9d3e53a90fa8adf5e94ffb3f26266feac1ae7126553b9aeab99c631220542138284749dc6259f32568e1696081a3461c79fec46fbcccb6724b18e97168007f8eae5113c2356535c99072b3095c8e9ba9638e512aa68bf8e543d13af0cf371962bf7dc45f093478398a356811c54a6df014a97ab94930e75c26a2447c2907933a319967014b11fc346f3dcea395133a8f93a390b7c9686a95918fa8534f832fbd66b03cf121b6108691d837a9ea45585cfb0a6ea0c8a022a18a2ee3229035957581ebb8bd6a5defabd3a458f9abae72b8c01342aa1e7d7c1c2a8fb88ff2457b1861f6fc7b77118f997b33f518040aa01310533cf594c27a73a03cecef110ab582f03567248dbb7d613dc61ea5a0a101c96658bd7808caf6e694cf8842914404130339f850844813c9743c6abb3cb22b2132d03e4025cf2d6bed984846e8c5a8419b25dc7c520966930192d3eb9baa2fb0f22bdca1e7e05e6e9031c952c9e6b9047515a19c1be78307536827984700a8e02585a34ac225f3aeb5f73618ca925feea76654cd5cb64a93b8de4d6a5e03308ddc24981863a04b61678193201667b7173910a9b0f8e14279c6479ff7fa936652f930a57487ba2493be3d1b854e66d28c0020b617c58742f59a6fa96a7c734d35830e5d2c47d3b3cf4c1ed702e6e3b31466865394c8e1ded0cb6b691ba95cc4b4bd9772939e6171d838427b21e3e8dd94c0b987ea5a6b2f4923680372f7e675fd9d03be47feac5f129b312fa93b4b5799ca7675e8f066ad5b40d810c8d9563d361d7380a514824e2bda2233b5d77a4075a027403d8ff3729239e0996aa8df1c3e8faaa1ee4b89c0f6cd4e8e7a6ec9cfcfc3900f72a9b39fb3456ee77dd92b11bdfba3335c9c14f41de17d9a257f23bf28b58d942abb31bfc5df6c7551ddba16cb34b4a2d1613486b0daebabe4c89f2b0480a14e24c40b665998101b6b13ce8f6cac56aa105d848aa35a1012db97258b56e7add0136b72e378e6dafa5a2d9b40be8ea0c8fe86c804fbbe42fa009ed04159c819b633b5d940015c0b3b3949d720407633d60dcdbe11ccc4b30dd706476d3a8eaa0f2b64aa53bae7ac637f372441057b1006ce9cf72ac8aa661a271fd49767ea50a30542d42ff4679a40233557f82d2dd2b9acd1be35c3dc0e315a2cdae0d437f6c560329507243541394a8c844779200963f7210a1db337d8a00174400b260dd807369027bc149109c9bedadf4d98fd9fde6338d76a9921ea59ac051549bc7c5f535de65b2ab0db19cf7171882bedc10a71c2d53fc63ddc3765e2a01418358339eaf4b2b81c5f24fd7f000d11cd636798872dcb44ba2d92c963d370cbd56d061ed5b059a90a622ae79ad0ac7d591546255fcbd4ca9f82c363de792b2c2bd1386c69a519df35d540fb28209c59d8bb0b9d2d62afd27beeb4dd5ad5bf71491d750534a2bf9bc24ff96468e227c0c97efbd783faee6c2f9698b7f4742fb70d5ab656d88f652fc4d537a19282797776e8ff056e5bed1bc034a5b337921a2dfcc7d61cee0b7240b1ff8c5aaeb432610ed0dd9999e8183243be695740c955c94ca5581080b292dae778ab398cb72ef71cfa69df627d5648f525ce41674eb2b6868b17b9bc043d2102dad59cbf8c37ad522e52954d602f4721c7cd38b40b8c9cc3801b4f706287fe0a557c73bdb059173200adeed295fe6a8c93cc37da0c214d7bf0ac2aee0f242c55309f6960952f0bca5b86d2598dfbdedb563b29b884bda6ce5ccecba73f7eafb3bdc38150d82d445729f778742a6426549d6ba6f2d0176b3a4a46b15d3b239789951effbf0dc2c330df5a854791f5eb719b60203c9c07a72c58437a40a5b85f450f56269260e9c1d9e76d2e3e538f1a196f1bf3f1e6747799bf0f895e41b033b6d527c69d64256ff4fa8ef1c46100e16c618daa1d6a0b80bd7c620ddd56196184ff02cbbadce20ff030430b63655cafd3466938eb2788c2a8dedaf5c922eae74e73976943163a535585206e9e5b9ed4802b98d7b483a437fe9fa4ed8684a3fd599059968275af92dfb655861475860133a50e3f6d1c6c1a30343616cf34dbe489064ed07f468125f20e55de845cf2766c274c2fd416372ffb6a0c8b6c6e18dcb34688a1823a0e3e5ce702429b3641756d47a5154d9cef7b1fdb9241f121aaa939057f252d3ad91f93d650893c4d15297eef6ea26c725bfc529a1ddd67c8f582aeb41af03dc2cf1e7de32935e70388892bce08901f504797c7c9484ccc72e804a3f96868e69ab053718b489345934718c6b1dc795a7452fc78bd5bdccf70a3aa2872b154ff33883b96a84129b5f4ae3820162e6adc763e27ea6b1248e3e59a9f6fe5a64b2187a9f46795aa3aa1ee559a9090bdf282e19856ef1ec98fb5cc7965ff46a3620fd8c54edca1137e02737e1b87c7dc4ad1436f71fa4dee9d72b88d08e9f917571f6790ce036e39b00269d9fc215ceb7e566385a39bfb6f6f2ba5854d32ea78fd6bc5c775de2367507e234044cd28f2a886aee8eeca0e7f9911290c551df3b76d9d761f27e169377993647918027bbcf85837a11038f7753ac599980f1b1b4cd44c5f8e0602b23b552920af474597e0c66000dfd58776c01b8b20d5e8b3985f3defac5fa619b9cee306a75e0631626841ec30a366273c9429c19c724a9b08a2b075a7424ea4a7da121a44fa7f4aa70d4b54739b0c09a8c9e3aa28ed2c840853d9051d737058b780509e60a72dd52bc7ecff64d34df85fcc82b66530df484b82c9516b5d69bb8e8d865455127c47c3869c5192f60d76c4e182d0eb147d8ba0765fe55f64b7fd71e4a4ff4afe8b36c620e4f06a62ced3c22350fd169e1e2dc2f4eea53614e6603aca8df9fdb94659c0a573fe6a6b0494e66ad3c35e2fd0b426edf30b7faa28728315c01ec11ce733b24d8f246278bc04840fc2d32da9a78772843d2b3dbd6801f33812b846bc2bb7211442315d64037e499a8a7a4f14c95e8d73e9969b039a195c16d9cc18aab617cfa1a6bbb9fd3c285bade32f222531f989175714c572c32d85411ac499bd439bf5b5afac3d614f1804a159a158cf7da404538e8f649fd52d9d6f8dd14d606d26342b19ff306e62b93401ce1cc473654e958d09542ac5ef93967e33870fe97b3b260d6c92786366146aaf72aa41a6477969a120486b6a9d890e5c5e2d9b7ecba400cafd01341931083f7b19a45bcc27ba6ed176911006d1c3f6498b867f929f910343bb45b2919126cf1f4b9e3856e36ffd83f50a7da047abb2c344348af57ba70e068adf8e5226618c2a3cc47f0118fe6b86109c952a1989169f24e3df0f61050bbe0a67fbcfcb9f3586dcc59c1293f99c97c87ac69524420f11be04729e903bb5b602c1bdf9941b47ec33f978ca4ecda83c44665e1ad890677c47d58a10192056820faa88431391bc713aeb0eb8e695ec4bce44e5ea68f333509002470013d268c5fbe375073020ba086864b2004a57c0cfcb9d2a1c658ae5af120988d06f9a70a7e7ff1fddd0fe2b57662309530d76c22180b7ebb2a220eb5f0a43cd45733347575aa18a69c2ac04f912630fc2e69af2f38b5627b33eb92c03c6801da59d77e45d0ad554aaac52b767f3c5c3287aa6276b162566649682ddbb86c04c2c2ca3ff04c0411d6e335bb1ee28621070db3704b72f8a5d5f4e85c768f830e7a54ff163fff0c0130ecbc3eae0058f1f5d5e101fc197da86adffc3f36d4c8c6abebca93a5f236f511d1987282c67bc9d6cfae5b2441738fe9962a4ef280f71b24e0e1b1f3b1cc4f2d09182e0631baa6eb68340425ece5d06bae04b1a04ce707da697778ae0d273ec0b5e8024be0cd5ec4f0df93c41a7baf947a872a12a08c1068db2d6525446df15c055dfa1918a62599279e15844c148c76808c341ec936fe2f1dc50763e2f2dd98a19007af7f59b8c0713228dc1cd1320ce82449e2806ce790d6256543999b740a3e15c268a5b3952c26895dec1e724332255a4e0d9d93161b0b6254589e51aa239af4e0b390c596efe6be86f5620ae750e89bbb6dfdb11d732fde64e4fa196f98a12909ccd94bf886693d54609b645c3f1ce2bf1fe08bad3be5cd9c1adf9102d4123eb7c3bcff0c8328a94fb234632452247dbf592d3f3c3efc8d0e4b5a756e52781c89f62eec89ebd9996193d8b433350d1c11661ab98924bc9774dda510e02cdab9468db2e1a0ec126c844990e0e9b9ed3de5a5e7a596321e3cba210193f22f2d7fd8b0ed2e637771e151001aca3ff1dd91cb430bc7e8d7b9feaa88cc0ff9f6952fd53a58be3c804dfb6cdcd6d7af6064eb43e9ba56c9e6e2409657283f370e37adc489bdd1d231fe8a80220acf50293ec23b4f24a29b2cd67ef3fc9c8d1dc06a92e3d8c7dfe6b9b23fad33d2401da1717921b961b306b23153bf49352723543f314aacdf8ec409c57275a940c89c6ce144cf7896f2f92beae8af1a9bdebe646c2bca887036a9c2cf664362f2db8f5c955cf69cc280e6c8961c8dddef73622dcfd349bc88fad7645e3a7633a371642863eb03c6dfc99e9a1b4dd5a362a4c0122381b7c52bcbf7be5d8c4f491fa124d46d53139ef12d0f4f2a17c2ddcb97a8fd949878c3f09ebd84dbd982e664844baec001c8bdaaede19495fa642be6e869966fe30bf2c800bf007d387e12978d365d0f82dcbe612d61c3f882849bf30df2299c659a52467f119529f30579ec737d08361e587b413e993086fa7f1daab52761e3f601d4a6f37a8801d545464c797e185b38132fdbecdf478181d864de4006f80d5eca925ac51cb349c9dd79cd75cf4b07a2fac11c60899c5386607bef7321a60380240703a5772f9c79bb98b6ff585a00788182c3d2afbf25f2dd25542991d0cce677b1a2bba038337a52052ba29b8131569fcdbf38922994a6e86ba5efb993c979dfda76c8269a8793d4a9295c0aaf7fe9a69322d676d3a88d5a9a6f65b3d667d18c79cc18d59a962633c5aee2bc733bbf889da750101b411b51b2564fc77ad65d9b13e8d714cfd47045472cee11838791337a6c2fa4d2d2d702af1639510fac1238fd071ee80f3ba3fb9e5e4a175f8e57bffe620192d968d01b9b7d13108014ed74eb189bd4d41eb4b0cab79952d87c28b849785ec664cb78d396f1537379f1ce535772f5da8c6ffaf89bfa9bcc57bc5a1d5c18ef477f414a3b2007db3106b7d4d611f37d60e69f8d6c6070c551c3ffdccb3517b9d3af6ddf50642eb4119a92a24fb90881f6ee572ce084d7102ab155b4ac70a661f8856744baf8a9b2a155656b9f894893c1a2df7b94007f97bc500f2ad372b0613c1cde8c0844b6bd69feffc70faca636b0c766878736cd8a152c75d68de648a1f9c8a23d8d0f9b1166e9780078b70d00a21c7bde35c490f4faa5092391b941361cd9949b7f56b9dad23c24620639fa61bd554c1efd10f8447ead350aebe989216780906ffdbb8e1c733b53c0e2b6444bf808b751d0ed4fda7f9d4bac25283504c7294bd300dac75fc6c05ba5dd9ad5d8ba7db48071b28775db00d9fd6f32fa8e504ee7c406ab835696efd5eda12c0dc53919fc027193cfd2e21962de460d80e9b52cfa0d96d57ffe4bbbe18c22128d7436b51d73a7cc9d6a959b36932158e884816c08b1623889e3f9d8621c864283ab7333cc0a57d459991f354dc79c73b77a927a45dc02573b7accad077fdcf39e5bfd9081117b3cece120bda76f780dae56f642b5f7cab19f088aafbdc0c82b3b6f78153c36c0e3a070f7f914884ec1b76e9ef889add651aadd09419a3e4c74e340740a5c3a82581588e42577fd4177da1754dee60516c7a57f66aa9ea04706e2acc21742b71489e5a01fa7340bd6126d06d5c28a11c219712f83d4093f2ca184a9bc8282bf4e02328240bcdb5be35d94f47329e148f081f8ee40996f95949622b1090968ab77236365fc2aec223a7d29c4b42bd2d455f4230d8fd0d34c40c4b8a1276edfc356ed48bea6da6240b45a85845b6881a7b3cd81a4292be3aa35c26474bfddef4e624940030b71273d1df971c6ee3ca410f87c89e9d95edcf2fec3ea9145ea65cbedf8a5094b94fed98862a56fc3a86488b950e1937e448b28cd9fd9092f70f46a0995d0bb63baad7a009316bf1c0112a158a5dd7d9a31a82aa19acb67a25c63d73a814487d311def3c195449dca554c50fc4cd985b22b205c8e303b46a608d4af185c31f878dbd62e469ef61a42229cf6df6bd8aed304e4af7784dff59601fd84336d3351de55a9295fb63d88aa2166fa74cd2a110eed56dc38469fae5318ecc6d7e0ee42b1bf879bb6e17481b2f12f05b8edf26fb5256fe3cab618425431751a25e4db92c1f32918c41b9113d47a771bf9c507d39f6e1408c98a97c0564a3693513c589ccdc569527868720674d67f3d4f14cf4bdbe806a3df74f010a0d9b702100632775700a73db27aeb20bd17577710f80e0ad17e0ad1b8e35463782760d122ec8b87e577d322bbbcde81829d63bcf76c3c16cfab8239ec214b19b13fbe7a48116b47e1321526833388dd8902079c217003a56e3af73718e7b135ab90b074ec149cf345d03fc37f8304c3f31edff7e44f709014bdf91659514e630e15d6dcb31a78e51892badb044a82665f0a4a0a8e5dca93ba0d2ae4257c0c38fb2fd4467143b121a0a4480d9d2d26012886ec43fc069f1b8ddd635bd1345c50d822abad52fede487a4d5da3d24a92ec21af979e9a0dceee835f66babb16d71f3dda4f51efc133f35d053eb202d4fbeee08d6082914de8f83dbc3964afa725d96671f8237d7e15f983b9c321fb1dd624a51ed2d884bdac5401b804a37e3916664f05e51d63796f0b94ce04753a6f8af9b784abdf19ab6ebd5b1e1ca27610efa81c05fab515d63d2cccbc3fbb1cc7fce0ffebe5ba6a2b1be5cce2f2003f61d6d1002afabbf865a007c8d575e2d28c61861a36aa70d5ab3cb87643b1cd06333169b992fd8f467e6519c9bb755eb60dbf6af9eef66b12fc24ffed02f80a9cdd6e3b4bd78043fc3e4a3e765b9a719d8487297ab1dd3e5ae4002c9b2893d5dc169e62cc7913d6a432e83bf1ffc1662acd99e93d9ebf5b2b0e38030e6e344796a7cfc9180df98a1a3fede09585e86e3f68dd05655226c37f305aca2d5c6f1353844e85cfe0141359e628f74d21d8dbc9867f620f819af9dd46430b71fafe7642cb219a17d2d8e0517d1172af339f4f4d8c26fa5fff8b7ba5a76bac2df37e7bcae80b21247c9de1572621a4bc6f33a3dabde09675cb635a61f1b2b132579bc72cea555dd235b868104b0898f2f849d57b5c8fc28813aa3fd075e0b74b8081076e997f9ef5f9bb6db4bfff8588bd59c9a232df78008991d389f86b78360b609502a3e3f0fdb50b5bb17497cc98da671271fd899bc6057a150d9bb032649608d4caa94b417bbd8d5dc9fc49d042fb0616d76555704e42c2d0c5f993d023892ace5f7d5e20e04f1e5c79a6e7a106b60544e657396193697ea5acc7fc3b958321f4b719bcd823ded9e5ef3f874d20b9aca100f68bc5d54ef1624ab25e330a62a22702f8cb1a0f93070b6dae3663dc16a4a1663614e74e7a928a2a02a266097f9754bc7418d813a3c35b5ef7221d8c63311f22ab5c4b4ec04aa4dbd7d9578eb6c5f0a0a01811fa7cd4f75c2c249369845852f5294eb639d08e8c720d85fec865c9bde53448e0fe2385b5fb354bf22a7330d47ba5264332ad45f78abc8f180591ecf02c26c238003968341ea86b94a66f0c33bacc23fb9c35264a7f59e29f732d27c431e651f7a838d747f2da733ac5679f0310cdaed21cd55f37afae4cb31241bef94686823f13553c0a9e645c8dccc541cf73ed24096b0302584f4bed1969443f9ae4ddcb550e20c4f8276001222dce33796c21f32bae18de9f48a9be2a21816b24cadda519a93d3ead423892f721714eca9bea073f8eb74829be6fff84ca9927b163d81c52a23c787a5a085fd1ddcab3f32a8c0893e875a1d4ee95edf39e2892c22ee25133b018f134a7f58ced2cea9a5d4694fd52de6fc0df24921def3584f0ddbbb019056adff701e0d8e41066eb4f5978502c77bdd48762e0901dc04fabd94aceee7b146e115aa051c932d3de6e765c26251932b9a1392233e87f7858476ebafe69f4653990e32be07a806c6787b7e195edd5116db9de7762113c3ab29d3fc6353c6a47c487b171a1246ad255d5a835f3b0284dbc337125c5fa20129fead2e610aca4ebbca743330399e04909123001dc9145908cd9e30fc7ed7664bcc0795c2aeef11768653634634a6a8c3297ae16386658aa303a0d71967bb1f6168c0f447c13113ebf08414512249b172dab7649af0c2657972dec65c00e4b2412409be40e3e0039d398fe4105f94e8546eaf8439c78494668bfbb4ecbf90edaebfd65eb4a03900d609ab3c75fb086820b86b7bb9d5ecef37acad064f3397f3d98bf02479fd56a0a48bbf6207cff7e22d7c8c56cc0e0760e477c15270956a845d8932eee0dc6a6d3423b7ed083e20e2d93a20d36210723c3244e9548b593513e065a4c110a98ec0a7c40db691adc3f4e90d63376c88eda7ad5a2d47e402da6d6e340731b034f6a9517eab8b8dabe807126ff5f5b18ceca2a30f5912ceba7056e68d62c3ec049ed98a2059ae9411122677053622a50e43d2c9e6e9cfb487fda4b6d8d92791647d101ebdaa724f41a4806f52205ff5036d356e376da7ed92dafc155d1eb444a786ad697a1cc13759d98166e85eadedf1d41818710129e32304a9f32d830565ff20125c8dd1f6989a08059c557f8f9301b9b2f5fe22e2bdd8682b3f42a7328f58b0adf0b019a921c786a6874f9d63e5a343a91e3c230daa77d2e2f2874ac3059cdc4d17bcdf1e3dbe795d6aed867eef4d318465051a576731c9dca962ad3a8dde8609e1899330652d0e7f3758fae7550557c21fd896e22b2fd2a7712af178820e1f98507715c0cee2b9af12005eef38238d6f91bb0baee85059ccefd65c6c25896f552618a59d795805b5597553bc239fcf2c01d9ccc41f6be68fdd5891ba480ec0f05582c7c6870a7179144c70a59cb054eb39e7a6c2604b673895c7f14d599d8e474212e15613633484b9449795e8a3ff25bc5ca902a94495d78078669679ebd850975e0e7d93c4f6aa6f4cbcf83d6f385c76d1cce46202e71b454edfcc84981bd2eb530bfe1437bfe67b99e3a4568674d9be5d74e2e6820d437ae97677a300ccf4982be34b8315c0431543838c665b94d1f34b045682762571e35f21f2bacd9758113bdf671429f235ffe209f9baf4ebd1fc914bef77635a1812a6845ddd335e8f0cd903e5c6df28db7ca05b547e0eacc44c7db0b125b06e5cc4453230dc46c2ced20f2b8474b995ce015007b342cf71d06ce4f52342b0c1b032235baf4ddf21efb0f8e535f35b2761131570ac914d0dc02e868339085868515068bf5edee7f149355b886a251b49d547dee48e0bc8e80bace7c27d6e8c3c67948ced009dcbf624759f0861d88264bbd9e4004b5576c83c2bf2ebc286b1eb30c91367cf6e6a466a506f61c62ec37394214749bb9a98599b23f5e6860b5c5c3c18a659fbb874790c7696eab2b4f02a42b2f8dae9497aaba2f49fa9a3345760b355a887a1fddecf18826b650a52016c3410d3680b942bc892a53e05c3d901e5f759f909b3966d398f4aec9473d90d13a59499d4dfc4ac567a9a4bc9cea7e22eae64d460a6fa7427f94144ef56cad2bc94ce71ae7621f7f03c4f77065f26749fe85711e17dd59f1ef3ccedc0a6f9617031e41c860accfdb183b87f92ed543a79050be7a32ce56ece79ba1532822fcc997d8d05880eb401fc1b2288dcf952e58ff8b51daf56b95ffcf0d61fb772e144a150dbd92d71d9263fbdb7484ed3f622da4d84b3ed9e9d27c36c34ef743b635d59d3411e4b172c01575df87dce3e8a4ae4ba76dd4b31bc131fa49b315e455f025b72bfe2e40370bfcecc23ca182d5224d1078127400895ca06de04a2f65425e37a737f80b6bd795f8699f02ea591ff0185921cf7597a1e3bbb2f627bdccc4e342d51b79d82d9f922e0fa61b247969fca67663bbe7e378a5c82af7fbbb5beb7d4b7b3bf4bc00c6f35c32bb94a9dce46cd8e300a0aea0eecc584bb7317976dc43cbce95609b70657d56ef66c80928a189777e614e5553398b440d3709722157f01a0f31031b2c38f46737c5cb508b593fe98dda34ac649ce41ad7ce72247ab33293f75e431e9e84f0b5072df941e8db3dcd526ee54f36d08d2d5f7dcde27d2ee8217e9599a23a2fd8d3171b235cbb8f0635815ae7f0175f64619b1fd2022afd295ee8d9b6f2f230c09b944c6422470ebcc30148e7cce02cf043b71cbb6a72d2a216828a30f583be76a9b3c2e9a771b01a23de3194f6a536a2d12a89aa645392dceba7ecf1b40733204e871eccb9e8465597c06be10225960b238bb6ee5c51fc89fa8fb11f0698b13265cc031381e74fabf7e666cf221152ac158b81e1d7cdecff1a8a4ad76ac18c891e84e5c248992335ea8b903c68f020bbffa8e612e7ee205814086360afde7115ce72c061ee0be5cedebad4536731b72c298398f0188f984d1883da187fe36ba031921d9b704552c42e2b4da81ab02ab64aaeea1c2b996381545e9f81df869e75d5607ee1b6dbb43af06df19c44f28511f867a49efc25d8a1eeebddaad48a9594ac82c2cef82f1fd4be45a589ebed9706fce7d0cc1674dd51c42eec9375ab8aea5c723f6e9af3e5ed331e18e3e486ebe96d81a24ce5630e87d0c7155cb5e17bf0ef1eab2386afbe5551c07e13c5e86762d5f184ee71de617b56ddb61f123dfa3d2d369e6fcfd1af5cd3df537fabe06255d176aa676daa2172b4bd5ff5031ec92f7b7ef3659387e456904a594434a687d969f45c9a9bd49e13902cc6d1fc174683a76b3931b59ff10a35d1e76ff9284bf0e09adc75cac79b186a50d48264d35cc7527c1f508c9da49aa6de68df4e782bae9c3006123942709ea9cbc1f6eea3a7b952332b542d3ee3413e7afee4a0e71be970d17dc2d7ca31451b93e6824ad9405112acc24f3763f40ea2e8c9e3b76c7a215c0d66f91f85004c1a6724370725972f26b4ba8fa0ba394a9f25827e8d13b1a4f293a7d191b80c1b8cb5eaea03054e98c8138bef29dee6d32f76d3d21c58b7e75589d628b8691146fe488a5f9fe24b95bfd61553fa0275c93d12c86331db76fb0357e65b5d1ffc0a05836a8750a3834111abb87e6bc8f1eb46fa658b54c12df0b1f2ce993b666da59a44fabd4a773826c47646a9444e402da9277856c340035bc16529594fcdef62e54e52f236e6e94b9dd56881cfad1958550dde48b6ea6e72b093e433d819a52d8d5d28ba5beacc357090ae3c51a3e5f98722efa9b00c0e2838df844d53351fc497c44a12bfc1e5c23d367060d785f53b51c74bd0339e59b2c5c9a34ff8911898929b49e92f4c4e193d4c758066f28029a1996bbb5cb6df7d0a8257b10f4dab36515417285e1375866a06e55c91df5a6c27bff6f54a257da225705d734eb618dcbad2cdf8edfef644af71120447667f01250f71bbc17bd3dedf4401c69739f5f7e3e40c10c1698364fb167b05d72d7390549c0db4f4eacdccc339ac945017785c9836471d8b11ec823c8c4b983f58b13110637804f9c2be9c2d6221959e22d1f7ba3c1e89b7e2619fea5fc2ac00c198672a87d2fc125937fded1e7f8691fe0ef02a96120b5e3f8b8a1a667a548c796b3ef64ca4a8662670164d5901c75fcf32b08d0cbd6ec10eda748e993fb77a494763320923741a2c5ef06d0251bceedd55bda91885e0ccfff952684acd62201f5fe217671058ee99a7460b5e619ad010d2fcb21b97ebc3a55f88041d38c1e5acb9a91ed9b9c3f240a906c411d9ca964ff879e76137af1a87cfe24c79423355dde034d89c8cb8b4ff2e23d493118a229b7b926cdc98ed80aeb8170cc348431ae4ba8118e402809b91f6c3a87bc3b6d8c3141a16be82847cf3f4c0b68dd8d622878992194a13b8538c130350fb3102e1e729107d0105af08fbe0fc2483ab216d68be5c79287ec2f5aa22582ba819b407fcb6f0cdc5fdc317f9994efda743b454081cffa32694142455cadd65a902cdbb5c70f0d0c6f7edd6a2dd30d45b90b8a2073b6ee8eab5406ca7fd3e197143dcf13ddf19b978c8c2312c309494c3d84ab92f4c32cb8f8607b0b965c395dd266b8d4dcb6cb4d7db571615ad85ab753c04e7d534a25121f6b774384c16c548dff7105859f12d6d4504f7273e43d1cfa0db84582c34fa370da27551a542ce3e886bd06ab9b121fb704bd47a22523ce6a02e60dd694b708971d4430396047a54b8fccb6fe1eb31f35d2eb3618ef3354065d30a69b062b9fbe8b0c78116fbc8c4db66ff8fd97450175a8756e9f28f2107606edcecd33d30f07cf8774bbe1a9a5aa87de7c1872b84c776503169a27559a367b202bf5838c457111be5e2b59879e2a11132d0f95fed630519c290863c50d2872ad047fcb27a68196a3606bd3103cfdcab3ecf50cd56e54c1175aedcfe1be9e07c0505ba50b0a4ef7120208a059ee73d8f9773137f1d4001c409ab718a19d559469a890f23c78c0c3afc2bd16c407aa8e7cdb3ce6748d1e35f0a978e57bc0a3ab8e80a243fac892f1ae9ac7c2b5204d5d717d0f482d8071a8f3ce6a98f2b993da9769e92c591a25f81d735ead722a7ab2fea357ebee0eec2fc51895bdc05ccdf216f6a656c208b1f0d4947830317662d60491bbd898eeff39c10315b2edd1a9863781df118f8a661eb3f45e368630534008569ec8661f0cd66a608be21fc7af1561d0258df7b5fd1b000dec32550a07e179d8f4cbc32f3a0989c4e1aa49151b1dab94a3d3556f7b22876ba86e4004994626673c71a18df9bf1419f46e4bd6e0b35b6ceebeb3d093ab7bbfe5a4754ad193fde1e268d4df995337e873e04199890936450e7235933a433b664930414a037441007b5676967f7c6cc2d91250fdfbe96527dfcba73c6ab6b1bf601bd4866f4bdc800ddcfb8a90a2469b9cd3d996d47285d8057957a00c9015455557ca37fcba910a9bb9239de1f3ca36ba4ec5b27a30ed9fd852f78f7d9c860855aecf592e4c575ec0a85431c9cccec661c7a5654fa211888b993113ce1ec1b028cc1b4aca18d9b78abd5a50b5d287783254a771bcfc3e66c70f9296ed5c35b93be0a05d3658f175d0e223fcc7e596a006d1db3cf487c4b190ca857bd1d1997a24cd55353a5804721317eec4bedd75b69209cc29557ab26433d1085c5a33b4c44a9b36b3e8a6d10b3449fe488b9f1a1ccc723fe33cb63a43e16e1cf927de932f79b9c4f91f2e2e422c4066b2154737c7624eed87323283d7a427d735a86740f1fff3961fdacfc04bbabc0fd5ef9d6253ec490a312b08a177cc295574f17d3f1d9ef11e2ea2c81fcb08d9cc752f46c1a41935ef11ad3cc180e20c4e62d6df2751d3757dd4bdb12077559f26eb2b599e9ac08ba2fa1cac615d668789bb91e5c133ed0bf3b267a3f91c7693024daaf814b82d016d889df2ae4746920606c924d7cb53cdfcda0a5fa542661bdbec1c9a7e7f39cee09e0bf6105972ee54d0f3dd610d36bac6abc81a0056f9a15eee5678694eb02eb8902af43761ed93e440d62f310fe5b39f61ea35044652685ca2834d07fbcb9cf67cf76ecbf2be36a224307ae7973adaa95512129712961d7fee68ded97e1afb7af7a8518fa239125868f02ceef3c1fc57a8fe8cf6acab86b8ba97892ec487b9ec32f1d03925b639a9aac55e168ec21d547881c0b2ff44c7684d7287b5e21de233fdfdd42aec7f40db45ae58755308fbad18eabfc19368100e7e08aeeb3a0a9899373d795811170042053d220c7463d977dadb571ddbf7c57398ef7464d4762335646797fac3023030680e678e146b3ce27340de606922d7ed9447ffeabe026b5090d28eb2d49127f85f750018d2cf91e0e22caaae6e03d7fc16a324d5100bd1acaa773aae08b4f84c0a966e3dec8f36ca7d96b99de04987d73982432ccd7fcb910d3bbcb64efc282f2cbe35f670f95bbb99f1e3ece9c0f924bbc131626a30e38c0a5ccedf5a88851639133d6ab637928441d2622619434513b9846a02f08e568bc29b0fa8afbbe73bed634eace06506b11a1372a3b1582a6458cb953a7cc0dd5a775875422ef34af376a2f9643f50a9f290af4a35b074657d37b4c6bb54ce147de7a1c6cc959f721baf5f9332485b070a929aad598aa8a0dd31bd595d143d0d16b91593ace06b54ff2b30e5ed57251f7ddcb3874bcdfab28b86f3ebb0f3762b5325deb5fcc0aba0115f43b7ae8634deb34e9274e40375d0a4a9836b55841fadb51205c46dbb1027cd700d4d69133bab32b58817ac98e547928db2a1d4b41c64b055cfaf3c99715bb7a97b725adfefe8c51f46e112b57aa2c7fa5881547e47e3bd206ff47a372885e6e710cf9ca325172591f502ed19c6bb77bac5d8ff9223b74efab641c23a692b850fe40f172c286f0ac2fc4983b05fccef873cd57e9f3e19fc24ff08c493fad1a91a2a1a32b9fd5d44fd2bcbff80b38c732803484b1566723c2c605d1906292c01b15ac84602fd4b2650aa2a5144476ad90503351874eba98014f83aaee28f3698129bbd0c6de1c7f47856bb738d72e565da293d6e4bcde786a67f143071bee2eb3b3d17e5ab66a74539a0d0a9dd8055ec8f33afe4f9f47b6bd17d705a43d4208b876229030a7acb1d1d6dc5281619ac7c6d6cc3a5c4de02f5ad73980f8eca986503ed224235998bbf02291b172f0cec5808a9997038201441abadcf554cc7858e4e25b00fe4997a740c497e7f9f5f58022dad174179815676c543c9f92ca299557f7f07a32681b3d20380898b9310370390f20dea99bbdaba36bc0c7abf2c7397a1458b3beef4c3c1233308d5b6545c49cc45fc554afee327c765f24fdbcea9690a416bafee32b24ddda4a9d10696c273ad94c99ea443ce8c7fca6308fb5442f8f5e174e6130f556983ef3759ed24e00080c2570d4465995e73335e72bc1f72bdb1dacc342ff41254358296c1a8fdf4cffc94b9337db5983d612a5fadd87fe5435d87458d38e04c67af96f727b39c75a8a6ddb006a7f5c721fc7e9af12f3eb473c7e7f4b913a539de624242d0c5b3ace9be75b0d9f4a3c649a264e6176b2edb11ec20ec011a6c4101ee10b2a5e6e51c64d5c1ab308252fd97df15e597086fd4ddfad246ec126752c5053df1f39f97e71e326923c037a4cf848a8a34226a77809c872ec5592f93305d9b3de44a2ac647568d02e6f6d12e7b2b11131f69e71061203989c2d1e3550b2f1794f80518ac345bce973196c49511aeaecf40ac36630739e80762eee4cc33ba731f2e105520f261ea4ff16e60f3e7d05eafe73fa45c01f609a35a04d0a095b6643fcb22dbc3eac9294fa33324dceb4b5f9e7c75e4c0fe8c54917a43ea355e4daf21e9124258d62e2aa1e7b009a8979298af75b3e04813378555250afd9435661eb3e4736a1130a114f0bbb16212fc051469e00c436464795167f861b7a83a49867dce5665b95ea75b8fb4fa8a54ba18e9f49206c48b2d3f4e0851605880b742a1eff60ff9196a96b0cb1f947808005b908b97f568af072919578139eb5f062bb311d1d35d16f3edc6ef2de77f66491bf2f4eab9841dac8400fc75068a5191376a5289171e17911afd4280070f4f31cc39bce7fbba28b44b3fce5d8eee09080d608a93af629fc22e3055df35f690d34a9f432487d39d09b6ad0b9a7dc88fa6b707472ce540b25c1d14b06fd97e098a956521aa672b4c4108e39e4c367e26639ca642a40e5a9d67b9341de789673ba553ae1440e3b98f27353ef555b59515ccfab8cef5b8bbe5f31ac4fdb86b349d86f6e5c2f553952f86c37ca7d46337f596ed6b9a812a996722673f6e1d8c65c4437543e100b9c5362cf2c2770f1dd5e6fbb2bdc3ab0838e52859a5dcf034e942c495403481ae1cda718728e6dd7d7d0ccd553e870c29a32c9384f699c2b97a7319e8a89efec9be49a2570c3a1b10a1b3c729be8a54c14de4526d8f39529a678d9c40a5a8669e55a3e95f6f8de7971087d317ccf37d5d7eddcfb18a0091f6c6546501e17c0d8bfdf3c1d9c63e80e81185632c28e24d5068799aeb94df0f3752888787707d129433a30ceec5b5eba35ff75fa6e3f21770ec24fe3cc0ce781cbf3e1bb1f53d19ee8cc677b856baa4733010f604c0bf0856228a704a96fefe48fe82d0861d0a669c247c4ee7c4cf838113d51c123d8b87479145ccd153ddd5d63094b5e472608df8494607ba8fb4f51b4555c3e56cba716eb8f4f819c311d6c52e193e4cd74b2d45f25ee79317b2a0e6b1f246aa6c8a1e7bdf4b494e7de47bc5ecd049a330c17c50e494c750822acee4a2f0bd3ccf9d21e7879e1013b2757048cf99372c99ca4911f90e217f0e6a9dd2f4f42149e7d25ce646d772d555ca7f3b5094c6864c8f4dc61b16ecc900b446be8d9421263785779f7dd1b18b372dd47fca118e728f87cdbbf6c92d278700342cf837f0c5f2a7ba798875fe33e59ee7efeb808608d97dc5656ee205f11dde0fcffb45de36b36cd5a916b0213cb4cb1ee3b17e47ae08cd7b714ea43b030a4b583c468f2f52486f1fa2220e26806a93ff2fb5977f9b527c6ce883a2b7a7e58e4601581e7037f7307931c6708f5bd6ad8fd00f0a4afcef4223eb69d3a793013c6810cfaf4aa1e34c597590e0d1677840e9adafa9215737e987a8846110a164edea654ffce482a6de6149e1f36929505a233ae09eef2237061ee0f5eb69c08d4ce9c2f817a6c82a32bfce7c637fd53857522be064ad777860482b5396cfce02c7d9932c85402eb5f49b2145dd9ff63cf8ffdc0b3a8653939c7764044dcd40dfb5aa55e6dd11ba9bd4fcdb4e650ecfd384c6189b11a01455a2e95171d7f3d1881a6e35aa9b70eafd65185e14e567d919f52a450c2d4251f119ecb66ee2681142633fb2851b99130f84d4eb644b98c6e6cadf1438917767300c52e645429c948f1b05455cfb8a5929a87dab1ec88d2824dfbfb1d019b80a96f80925c74b5c4f8a87c54c0513012df1c7433f5842ecfc2a21a51e7ce1a82389de4ed8fe65c3162ce9bfa80a6c2e8f9468627964e22a6f1d37621f0e8f252a81fe1c6430bdd4002cb339850cf323ed7d01b4312e5a84673a56b470582254266a957f1bba2b2fe8822cf42133f4eb6a0d143f3e8dde81c517c1f5b331d09daacb55966f6debcbd0d07951c9698d56072729c42ee56d941dac070a9eab4a28666dac3b1dcc69a5a067061742207513ae91302ba9b8ce59d132c2f963e23fdf59f8bb32e39dbaafc7dd2080bf54c0e7241471cfa8e32b1abc07a4aa50330eadbf26703d33b62eecc348eaa65c5f33668a33be61cc81d4641219388d7bffadb22d72ca10f346923b3ad807a4ae58b3da6a0f2eefe65803f00d969b156595c3a8fcfa5f7bbc39f2bf7cfc75f558cfd835b4b67ec88c58b1aa78a458c18626340810f9af88cd550db76cdc3c2b0a3e98be7dea0d17a3e0f7ae975769d35c5e29ff22cb966b91e93373a967867911e877a25155137ac42dc32e6da18fd94322a43ce12794ff6a64e1222d29ebf027cd6bab65fcac05b2d50f71d9cd4e265852c46d2451211048131dc2c69a927849b72e3246ba0254bce7853426b4aa002a600c5d81e9fe1d3b1d16efe16290012261f3a60a3498180d455581d3fa1a8eeb3e00d2501d4daa597f910cc447e27dd1aa03b310bb3c4f20f7afc676d0dd62c1ec5a32899c58a07a8f5a267eef2478803445893ef2c0b1e09b5ce8e8ce29523cd2ef704906ded87d26a8f457ab6fa30da304ccefd7c65399ae4bc043732ba37ef4ffe8bab1c9dad038a61e7e036bd0ea11f97cc6ad53522760bb8bab45833b5117171a4a60b5d242a7ac2c03e7c07983aa48be98b3f5f9012c9b47a2669a657c37e62cc58db9c3f3fdc4d09de201a3a96e4bb8cbb4d6306dc3ad020c4214077632f918f8ce09808e8e700a02a823a684f393a14f6cf36c819e4d74e8b65fc6eb3f12ef3c0cbe4ebbff903dfe8effb4a8002e719f53a880389c676c978140e5502cbc36d5f21ab20167a329809b2ffac561be3fbc59e0048493af8859d1bee7c5c550c1e0b976b87d3326a16fd204b4a3d082dcfe0651d0ba6fc1773af76f1e6a44911c92e2cc70e5c5c0f1183fc8f313b1a0c7010f83bc3178cfc528a06c417365ebeb39da524b313a6f63da716e8f0d83a100fad64988c9cd34a22514eb3f0e1cc0429cca4f151d16ea18f801c392b2967a38516f18a952c48cf56a054be19df6f2fae691436f3d52e3e3d0eb4fd3b45660f9878ab7a58d3d2bcec903e1d3b7b0034122f7df9c2e5866a29f939983d5971269594193f76b891360b2991bae9d58622c0abcce87053c043dfc17b46db256946b19e99a2df1c8a557f5f756bdb0e3ec2b48fa1bc70e05fd6b6af47c2747414642e450d7c479904132162bbd37fb89a24f506731ad6941be7a02a417ce25e25d9f3f3cccfd741b7b2d45a763b2f5c856735a475e9395b972fd6f5acf9e0faaffcfc16fd2f30a17180fa949e705d740094227b460272f5207976fcfa17f015be82112a7ff320fb62f19c1d52edbaf6c12bf2f47b52a6afb5024b7fcab64774712c3442075f657a6158c11152d809248b6c8cc8fb3024319d0fdbccf351a667d42f73680893f4f6a0f7d776caa1d9864d31d1b4b1d651d1e66e6bfffc43de748a712e937cf0788625bc03f79d28f1345c46b48f9ebd44aa66941beed187558076bc17fd1d0d35cdd2ec5c8c07a2bc319726aa7d6229f71dd770925f1778add11c579719fc16029098d01e295a82cd67489bbde01fd5f2a71b0139c70e7a9fe0b5a34ceb10cfebf0155b275d609994d657b0a8731389b3cb54025923a1aa34e8ead18cd8c0acbde90aa8186bb347919d47d19a7900fe180db13da2d842159bbe4e5b824a3e74b315d7d2789567952f6b569ab68b60afaccf7d3f726a618d860ea7c78e3f5d59af630fe2a1460c8fa6c8113616f17a32b5519617cbbc3c18c980835aed92b7a5a85dcfa91e3e0fd9ecee55d937540e1978f1f5a3e655b9e1643816a2a77a9784d1e57cf4bf76ef0119d862ffd51d2eb64e3b29c286b84a721a5e14ef1b692136523e1c025bd5d7c8a980150f31296443ab5fa4351704f81fd2350623ca9421c6ca4a59ee0f1c7d4171a672319ffa8595602a459fa148b59206e1a77426e84e0c1c0cde1bc7a9468e847949ca242987904c87898520e7c50cc342ea10b47091adc7b5c64dff7e3c58becb0bc35a03f6009618f5213896d901f59b8effa6b34302822ed5d19824b1b103eb4014339710b4eed67a1c13e2f08cce0a2ce20657d76fa62c26761a37a0c4f8b530b662cd58f4712724ae0fd53debcb72ab759cf502382b41b11b130546acb17912520ee8d9032e584434c23d7b20c2863ff7b0fb2321d403c1d41d9a78e1ff5fd9ac0826b00a67186feb8e979232206c17fc9bb1050a178c3a3a7678ad1be9c9cc27c2599eb88929e25699bb87008f272574afd4ad01477da23c21fdbdb19698758da4203d0e6f262bb7800e25deb8d6ba7d4bfbe68f3b77b11f58bfe037cafcd84cf49a225fab4b824d6014002a4e3e41241b70c12cf1ba183b298201531a8ed17002a833421c193bc8f3846a1ab0e1690b867aca223ec7b19045efddb1c0a25c492710ef52bd584cc277ca629230ae54f00609de0ab6531e72597b24eb2e16f483014bec2400bd8d95a4ec0645acb1e59a704e558e3f2d56ee02d3b34f1292888460eeb6af5d11e6aa838b39823fefac406399613e42e4389a5f916d763db467d2b83229ef46c2e24a7238920e82c297f32cd59d324217a683b701df07c39d6b62d3dcac3475a31c6f5b97f1388349c3ffa17f44882dfaddcfc8c8b19095c7d6a92229d8d071f29d87aaadd37c762096f370d0891334d82eafc2b394a43c741fe7c52dd032e5c21d80485b009b61ed025b4650a3d5db7ad9a45b6562b0deb6d44dd07352a5a5c2249de42c3db0b144492508c5b3abfe0bdf449928d56cb7bb724b8168db70896bf09857a75c4dbbf6c50498d0d0ec2c6f36d057259e6489cc185947665637ab2355ffa8a0441fcea0e96d0b372b4cd34daca315f389d63a8265983ef3e556e74df0787b5f3dc46cd73e2c67d59cfb06dbb67c4e0e2121ab9cfba61ba8d999cf63df0413e15cfd894a8ea0a55607871e479039fe2e3f2f7c0b435d82da496a875e006f4ee4ae3a81d56078a8c95d9971fc31adca7bfa5c0d3c119acde44adf03c5f94d40976b2b80da53f83bf5225d0661087a0948ce37f625f2b8a621fa2194202ec0fa449d6ad6bf48d61ee47d85de7e34609ec20cc4b896d55cb387f2ad85e3426af7907cf7a138afb36d41ad3e00b06021b9535f65c745a2d1bbd932625b23bb676262fa264a0dd9ac44b224092f07459c7f41e1ca801a64aebbb238abfd87314f2ffd7493377fc18d187c481a1c42b7a240afc7f2642ae30fbbba2f549c471f37d3ba3496deaf1e40c12d021714493d8d374eaba8dd9e7b0afedf2efea67234592ec1ef8e4ce06e18a5bc9492e536b3bf7b640b0030efc36c7642cf9f1fb7e634d1fc0edd079c59617999438975db4e09a3927eb835c2bb98d7cdad18bfb8eed19e3e09d2e1db590f252ca72c3cdf3d13acd81d8adf5b3b3bb6a5319931dc973c2f24df0d427514064c5c0e536977d05b666af753cc2419e0bcbd645ae45a78b8d0aaf4503d07dabe06a32e6158c356a469961511ca8eb921c4fa6911f53ff4f8cb92fadd9f178904df55a368fefa38a214ff0fe4c918195f1b048b84bcd17c369002f699734e7060a10d3cf99840b09d9f670702b390ea3b03475b4809abfbc5ca6c35e8da0c60ffe046d20079f447619ccb7a4f0bc33f0c6284f362092e75584de6464d7a51ed275faf192ee4ea96988ee10f91d2d36bbb5d7cdfe4672f2e86faa6db92a5cbdea0c9877e3cf0da55d0e35bbdc8386619d443271faf913d4a761a1d7d6d32bc10780c60d7642ac3ab5f5643a251dd14efaf43ebf4ef6e60881d9a697c14cd1a354c2fd9bb4e36169869d9dd6c335caf5") + require.NoError(t, err) + + t.Logf("SPHINCS+ scheme parameters: %s", sphincsplus.SchemeName()) + t.Logf("priv key %x", privKey.Bytes()) + t.Logf("pub key %x", pubKey.Bytes()) + t.Logf("sig %x", signature) + message := []byte("i am a message") + require.True(t, pubKey.Verify(signature, message)) + +} diff --git a/ref/randombytes.c b/ref/randombytes.c index cfbca17..60ee77d 100644 --- a/ref/randombytes.c +++ b/ref/randombytes.c @@ -1,7 +1,8 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64)) + /* This code was taken from the SPHINCS reference implementation and is public domain. */ - #include #include diff --git a/ref/randombytes_win.c b/ref/randombytes_win.c new file mode 100644 index 0000000..68a883f --- /dev/null +++ b/ref/randombytes_win.c @@ -0,0 +1,20 @@ +//go:build cgo && (windows && amd64) + +/* +This code was derived from highctidh and is public domain. +*/ +#include "randombytes_win.h" + +ssize_t getrandom(char *buf, size_t buflen); +#include +#include +#define getrandom(x, y) RtlGenRandom(x, y) + +void randombytes(unsigned char * x, unsigned long long xlen) +{ + ssize_t n; + n = getrandom((char *) x, xlen); + if (n != 1) { + exit(2); + } +} diff --git a/ref/randombytes_win.h b/ref/randombytes_win.h new file mode 100644 index 0000000..d4c0909 --- /dev/null +++ b/ref/randombytes_win.h @@ -0,0 +1,13 @@ +#ifndef SPX_RANDOMBYTES_WIN_H +#define SPX_RANDOMBYTES_WIN_H + +extern void randombytes(unsigned char * x,unsigned long long xlen); +#include +#define ssize_t SSIZE_T +#include +#define SystemFunction036 NTAPI SystemFunction036 +#include +#undef SystemFunction036 +#pragma comment(lib, "advapi32.lib") + +#endif diff --git a/ref/rng.c b/ref/rng.c index 36f5b27..90c0a98 100644 --- a/ref/rng.c +++ b/ref/rng.c @@ -1,9 +1,12 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && openssl + // // rng.c // // Created by Bassham, Lawrence E (Fed) on 8/29/17. // Copyright © 2017 Bassham, Lawrence E (Fed). All rights reserved. // +// #include #include "rng.h" @@ -208,11 +211,3 @@ AES256_CTR_DRBG_Update(unsigned char *provided_data, memcpy(V, temp+32, 16); } - - - - - - - - diff --git a/ref/scheme.go b/ref/scheme.go new file mode 100644 index 0000000..02b26d0 --- /dev/null +++ b/ref/scheme.go @@ -0,0 +1,9 @@ +//go:build ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package sphincsplus + +var SignatureScheme string + +func Name() string { + return SignatureScheme +} diff --git a/ref/scheme_test.go b/ref/scheme_test.go new file mode 100644 index 0000000..0095b7f --- /dev/null +++ b/ref/scheme_test.go @@ -0,0 +1,13 @@ +//go:build ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_128s || sphincs_haraka_192f || sphincs_haraka_192s || sphincs_haraka_256f || sphincs_haraka_256s || sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s || sphincs_shake_128f || sphincs_shake_128s || sphincs_shake_192f || sphincs_shake_192s || sphincs_shake_256f || sphincs_shake_256s) + +package sphincsplus + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func TestSchemeName(t *testing.T) { + t.Logf("SPHINCS+ scheme parameters: %s", SchemeName()) + require.Equal(t, SignatureName, SchemeName()) +} diff --git a/ref/sha2.c b/ref/sha2.c index ef73047..3074beb 100644 --- a/ref/sha2.c +++ b/ref/sha2.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_sha2_128f || sphincs_sha2_128s || sphincs_sha2_192f || sphincs_sha2_192s || sphincs_sha2_256f || sphincs_sha2_256s) + /* Based on the public domain implementation in * crypto_hash/sha512/ref/ from http://bench.cr.yp.to/supercop.html * by D. J. Bernstein */ diff --git a/ref/thash_haraka_robust.c b/ref/thash_haraka_robust.c index 005e14a..f0a61be 100644 --- a/ref/thash_haraka_robust.c +++ b/ref/thash_haraka_robust.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128f || sphincs_haraka_192f || sphincs_haraka_256f) + #include #include diff --git a/ref/thash_haraka_simple.c b/ref/thash_haraka_simple.c index 1040297..99fbf15 100644 --- a/ref/thash_haraka_simple.c +++ b/ref/thash_haraka_simple.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_haraka_128s || sphincs_haraka_192s || sphincs_haraka_256s) + #include #include diff --git a/ref/thash_sha2_robust.c b/ref/thash_sha2_robust.c index 67ca3da..33ebe64 100644 --- a/ref/thash_sha2_robust.c +++ b/ref/thash_sha2_robust.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_sha2_128f || sphincs_sha2_192f || sphincs_sha2_256f) + #include #include diff --git a/ref/thash_sha2_simple.c b/ref/thash_sha2_simple.c index da58896..7e44e64 100644 --- a/ref/thash_sha2_simple.c +++ b/ref/thash_sha2_simple.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_sha2_128s || sphincs_sha2_192s || sphincs_sha2_256s) + #include #include diff --git a/ref/thash_shake_robust.c b/ref/thash_shake_robust.c index 3589fde..e771395 100644 --- a/ref/thash_shake_robust.c +++ b/ref/thash_shake_robust.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_shake_128f || sphincs_shake_192f || sphincs_shake_256f) + #include #include diff --git a/ref/thash_shake_simple.c b/ref/thash_shake_simple.c index 7ce5c55..2baab10 100644 --- a/ref/thash_shake_simple.c +++ b/ref/thash_shake_simple.c @@ -1,3 +1,5 @@ +//go:build cgo && ((linux && amd64) || (darwin && amd64) || (darwin && arm64) || (windows && amd64)) && (sphincs_shake_128s || sphincs_shake_192s || sphincs_shake_256s) + #include #include