From 6d7217f37a241c688e4734d7b8f6904299cadd2b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 15:40:00 +0100 Subject: [PATCH 1/7] [varint] Add LEB128 decoding + tests Also make tests in general less spammy: Don't print [PASS] for each successful test, only report failures and progress. --- core/encoding/varint/leb128.odin | 67 + tests/core/Makefile | 8 +- tests/core/build.bat | 3 +- tests/core/compress/test_core_compress.odin | 4 +- tests/core/crypto/test_core_crypto.odin | 1766 ++++++++--------- tests/core/crypto_hash | Bin 0 -> 621648 bytes .../encoding/{ => json}/test_core_json.odin | 36 +- .../encoding/varint/test_core_varint.odin | 81 + tests/core/hash/test_core_hash.odin | 4 +- tests/core/image/test_core_image.odin | 30 +- .../core/math/noise/test_core_math_noise.odin | 30 +- tests/core/odin/test_parser.odin | 45 +- tests/core/strings/test_core_strings.odin | 66 +- 13 files changed, 1138 insertions(+), 1002 deletions(-) create mode 100644 core/encoding/varint/leb128.odin create mode 100644 tests/core/crypto_hash rename tests/core/encoding/{ => json}/test_core_json.odin (64%) create mode 100644 tests/core/encoding/varint/test_core_varint.odin diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin new file mode 100644 index 000000000..0c314b3f8 --- /dev/null +++ b/core/encoding/varint/leb128.odin @@ -0,0 +1,67 @@ +/* + Copyright 2022 Jeroen van Rijn . + Made available under Odin's BSD-3 license. + + List of contributors: + Jeroen van Rijn: Initial implementation. +*/ + +// package varint implements variable length integer encoding and decoding +// using the LEB128 format as used by DWARF debug and other file formats +package varint + +// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. +// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. +decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { + more := true + + for v, i in buf { + size = i + 1 + + if size > size_of(u128) { + return + } + + val |= u128(v & 0x7f) << uint(i * 7) + + if v < 128 { + more = false + break + } + } + + // If the buffer runs out before the number ends, return an error. + if more { + return 0, 0 + } + return +} + +// Decode a slice of bytes encoding a signed LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. +// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. +decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { + shift: uint + + if len(buf) == 0 { + return + } + + for v in buf { + size += 1 + if size > size_of(i128) { + return + } + + val |= i128(v & 0x7f) << shift + shift += 7 + + if v < 128 { break } + } + + if buf[size - 1] & 0x40 == 0x40 { + val |= max(i128) << shift + } + return +} \ No newline at end of file diff --git a/tests/core/Makefile b/tests/core/Makefile index 1c2cee6bd..fac5b6203 100644 --- a/tests/core/Makefile +++ b/tests/core/Makefile @@ -1,7 +1,7 @@ ODIN=../../odin PYTHON=$(shell which python3) -all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test +all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test encoding_test download_test_assets: $(PYTHON) download_assets.py @@ -22,4 +22,8 @@ crypto_test: $(ODIN) run crypto -out=crypto_hash -o:speed -no-bounds-check noise_test: - $(ODIN) run math/noise -out=test_noise \ No newline at end of file + $(ODIN) run math/noise -out=test_noise + +encoding_test: + $(ODIN) run encoding/json -out=test_json + $(ODIN) run encoding/varint -out=test_varint \ No newline at end of file diff --git a/tests/core/build.bat b/tests/core/build.bat index 6af39e688..0227ac6bb 100644 --- a/tests/core/build.bat +++ b/tests/core/build.bat @@ -35,7 +35,8 @@ echo --- echo --- echo Running core:encoding tests echo --- -%PATH_TO_ODIN% run encoding %COMMON% +%PATH_TO_ODIN% run encoding/json %COMMON% +%PATH_TO_ODIN% run encoding/varint %COMMON% echo --- echo Running core:math/noise tests diff --git a/tests/core/compress/test_core_compress.odin b/tests/core/compress/test_core_compress.odin index 73c69445a..51952a568 100644 --- a/tests/core/compress/test_core_compress.odin +++ b/tests/core/compress/test_core_compress.odin @@ -30,14 +30,12 @@ when ODIN_TEST { log :: testing.log } else { expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) TEST_count += 1 if !condition { TEST_fail += 1 - fmt.println(message) + fmt.printf("[%v] %v\n", loc, message) return } - fmt.println(" PASS") } log :: proc(t: ^testing.T, v: any, loc := #caller_location) { fmt.printf("[%v] ", loc) diff --git a/tests/core/crypto/test_core_crypto.odin b/tests/core/crypto/test_core_crypto.odin index f2e5b48d9..636632d71 100644 --- a/tests/core/crypto/test_core_crypto.odin +++ b/tests/core/crypto/test_core_crypto.odin @@ -1,15 +1,15 @@ package test_core_crypto /* - Copyright 2021 zhibog - Made available under the BSD-3 license. + Copyright 2021 zhibog + Made available under the BSD-3 license. - List of contributors: - zhibog, dotbmp: Initial implementation. - Jeroen van Rijn: Test runner setup. + List of contributors: + zhibog, dotbmp: Initial implementation. + Jeroen van Rijn: Test runner setup. - Tests for the hashing algorithms within the crypto library. - Where possible, the official test vectors are used to validate the implementation. + Tests for the hashing algorithms within the crypto library. + Where possible, the official test vectors are used to validate the implementation. */ import "core:testing" @@ -43,1110 +43,1108 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - test_md2(&t) - test_md4(&t) - test_md5(&t) - test_sha1(&t) - test_sha224(&t) - test_sha256(&t) - test_sha384(&t) - test_sha512(&t) - test_sha3_224(&t) - test_sha3_256(&t) - test_sha3_384(&t) - test_sha3_512(&t) - test_shake_128(&t) - test_shake_256(&t) - test_keccak_224(&t) - test_keccak_256(&t) - test_keccak_384(&t) - test_keccak_512(&t) - test_whirlpool(&t) - test_gost(&t) - test_streebog_256(&t) - test_streebog_512(&t) - test_blake_224(&t) - test_blake_256(&t) - test_blake_384(&t) - test_blake_512(&t) - test_blake2b(&t) - test_blake2s(&t) - test_ripemd_128(&t) - test_ripemd_160(&t) - test_ripemd_256(&t) - test_ripemd_320(&t) - test_tiger_128(&t) - test_tiger_160(&t) - test_tiger_192(&t) - test_tiger2_128(&t) - test_tiger2_160(&t) - test_tiger2_192(&t) - test_sm3(&t) - test_jh_224(&t) - test_jh_256(&t) - test_jh_384(&t) - test_jh_512(&t) - test_groestl_224(&t) - test_groestl_256(&t) - test_groestl_384(&t) - test_groestl_512(&t) - test_haval_128(&t) - test_haval_160(&t) - test_haval_192(&t) - test_haval_224(&t) - test_haval_256(&t) - test_siphash_2_4(&t) + t := testing.T{} + test_md2(&t) + test_md4(&t) + test_md5(&t) + test_sha1(&t) + test_sha224(&t) + test_sha256(&t) + test_sha384(&t) + test_sha512(&t) + test_sha3_224(&t) + test_sha3_256(&t) + test_sha3_384(&t) + test_sha3_512(&t) + test_shake_128(&t) + test_shake_256(&t) + test_keccak_224(&t) + test_keccak_256(&t) + test_keccak_384(&t) + test_keccak_512(&t) + test_whirlpool(&t) + test_gost(&t) + test_streebog_256(&t) + test_streebog_512(&t) + test_blake_224(&t) + test_blake_256(&t) + test_blake_384(&t) + test_blake_512(&t) + test_blake2b(&t) + test_blake2s(&t) + test_ripemd_128(&t) + test_ripemd_160(&t) + test_ripemd_256(&t) + test_ripemd_320(&t) + test_tiger_128(&t) + test_tiger_160(&t) + test_tiger_192(&t) + test_tiger2_128(&t) + test_tiger2_160(&t) + test_tiger2_192(&t) + test_sm3(&t) + test_jh_224(&t) + test_jh_256(&t) + test_jh_384(&t) + test_jh_512(&t) + test_groestl_224(&t) + test_groestl_256(&t) + test_groestl_384(&t) + test_groestl_512(&t) + test_haval_128(&t) + test_haval_160(&t) + test_haval_192(&t) + test_haval_224(&t) + test_haval_256(&t) + test_siphash_2_4(&t) - // "modern" crypto tests - test_chacha20(&t) - test_poly1305(&t) - test_chacha20poly1305(&t) - test_x25519(&t) - test_rand_bytes(&t) + // "modern" crypto tests + test_chacha20(&t) + test_poly1305(&t) + test_chacha20poly1305(&t) + test_x25519(&t) + test_rand_bytes(&t) - bench_modern(&t) + bench_modern(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } TestHash :: struct { - hash: string, - str: string, + hash: string, + str: string, } hex_string :: proc(bytes: []byte, allocator := context.temp_allocator) -> string { - lut: [16]byte = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} - buf := make([]byte, len(bytes) * 2, allocator) - for i := 0; i < len(bytes); i += 1 { - buf[i * 2 + 0] = lut[bytes[i] >> 4 & 0xf] - buf[i * 2 + 1] = lut[bytes[i] & 0xf] - } - return string(buf) + lut: [16]byte = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} + buf := make([]byte, len(bytes) * 2, allocator) + for i := 0; i < len(bytes); i += 1 { + buf[i * 2 + 0] = lut[bytes[i] >> 4 & 0xf] + buf[i * 2 + 1] = lut[bytes[i] & 0xf] + } + return string(buf) } @(test) test_md2 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1319 - test_vectors := [?]TestHash { - TestHash{"8350e5a3e24c153df2275c9f80692773", ""}, - TestHash{"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a"}, - TestHash{"da853b0d3f88d99b30283a69e6ded6bb", "abc"}, - TestHash{"ab4f496bfb2a530b219ff33031fe06b0", "message digest"}, - TestHash{"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md2.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1319 + test_vectors := [?]TestHash { + TestHash{"8350e5a3e24c153df2275c9f80692773", ""}, + TestHash{"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a"}, + TestHash{"da853b0d3f88d99b30283a69e6ded6bb", "abc"}, + TestHash{"ab4f496bfb2a530b219ff33031fe06b0", "message digest"}, + TestHash{"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md2.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_md4 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320 - test_vectors := [?]TestHash { - TestHash{"31d6cfe0d16ae931b73c59d7e0c089c0", ""}, - TestHash{"bde52cb31de33e46245e05fbdbd6fb24", "a"}, - TestHash{"a448017aaf21d8525fc10ae87aa6729d", "abc"}, - TestHash{"d9130a8164549fe818874806e1c7014b", "message digest"}, - TestHash{"d79e1c308aa5bbcdeea8ed63df412da9", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"043f8582f241db351ce627e153e7f0e4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"e33b4ddc9c38f2199c3e7b164fcc0536", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md4.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320 + test_vectors := [?]TestHash { + TestHash{"31d6cfe0d16ae931b73c59d7e0c089c0", ""}, + TestHash{"bde52cb31de33e46245e05fbdbd6fb24", "a"}, + TestHash{"a448017aaf21d8525fc10ae87aa6729d", "abc"}, + TestHash{"d9130a8164549fe818874806e1c7014b", "message digest"}, + TestHash{"d79e1c308aa5bbcdeea8ed63df412da9", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"043f8582f241db351ce627e153e7f0e4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"e33b4ddc9c38f2199c3e7b164fcc0536", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md4.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_md5 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1321 - test_vectors := [?]TestHash { - TestHash{"d41d8cd98f00b204e9800998ecf8427e", ""}, - TestHash{"0cc175b9c0f1b6a831c399e269772661", "a"}, - TestHash{"900150983cd24fb0d6963f7d28e17f72", "abc"}, - TestHash{"f96b697d7cb7938d525a2f31aaf161d0", "message digest"}, - TestHash{"c3fcd3d76192e4007dfb496cca67e13b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"d174ab98d277d9f5a5611c2c9f419d9f", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"57edf4a22be3c955ac49da2e2107b67a", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md5.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1321 + test_vectors := [?]TestHash { + TestHash{"d41d8cd98f00b204e9800998ecf8427e", ""}, + TestHash{"0cc175b9c0f1b6a831c399e269772661", "a"}, + TestHash{"900150983cd24fb0d6963f7d28e17f72", "abc"}, + TestHash{"f96b697d7cb7938d525a2f31aaf161d0", "message digest"}, + TestHash{"c3fcd3d76192e4007dfb496cca67e13b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"d174ab98d277d9f5a5611c2c9f419d9f", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"57edf4a22be3c955ac49da2e2107b67a", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md5.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha1 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""}, - TestHash{"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"}, - TestHash{"f9537c23893d2014f365adf8ffe33b8eb0297ed1", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"346fb528a24b48f563cb061470bcfd23740427ad", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"}, - TestHash{"c729c8996ee0a6f74f4f3248e8957edf704fb624", "01234567012345670123456701234567"}, - TestHash{"84983e441c3bd26ebaae4aa1f95129e5e54670f1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"a49b2446a02c645bf419f995b67091253a04a259", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha1.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""}, + TestHash{"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"}, + TestHash{"f9537c23893d2014f365adf8ffe33b8eb0297ed1", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"346fb528a24b48f563cb061470bcfd23740427ad", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"}, + TestHash{"c729c8996ee0a6f74f4f3248e8957edf704fb624", "01234567012345670123456701234567"}, + TestHash{"84983e441c3bd26ebaae4aa1f95129e5e54670f1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"a49b2446a02c645bf419f995b67091253a04a259", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha1.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", ""}, - TestHash{"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "abc"}, - TestHash{"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", ""}, + TestHash{"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "abc"}, + TestHash{"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""}, - TestHash{"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "abc"}, - TestHash{"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""}, + TestHash{"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "abc"}, + TestHash{"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", ""}, - TestHash{"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", "abc"}, - TestHash{"3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", ""}, + TestHash{"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", "abc"}, + TestHash{"3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", ""}, - TestHash{"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", "abc"}, - TestHash{"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", ""}, + TestHash{"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", "abc"}, + TestHash{"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", ""}, - TestHash{"e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf", "abc"}, - TestHash{"10241ac5187380bd501192e4e56b5280908727dd8fe0d10d4e5ad91e", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"fd645fe07d814c397e85e85f92fe58b949f55efa4d3468b2468da45a", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"9e86ff69557ca95f405f081269685b38e3a819b309ee942f482b6a8b", "a"}, - TestHash{"6961f694b2ff3ed6f0c830d2c66da0c5e7ca9445f7c0dca679171112", "01234567012345670123456701234567"}, - TestHash{"8a24108b154ada21c9fd5574494479ba5c7e7ab76ef264ead0fcce33", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"543e6868e1666c1a643630df77367ae5a62a85070a51c14cbf665cbc", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", ""}, + TestHash{"e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf", "abc"}, + TestHash{"10241ac5187380bd501192e4e56b5280908727dd8fe0d10d4e5ad91e", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"fd645fe07d814c397e85e85f92fe58b949f55efa4d3468b2468da45a", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"9e86ff69557ca95f405f081269685b38e3a819b309ee942f482b6a8b", "a"}, + TestHash{"6961f694b2ff3ed6f0c830d2c66da0c5e7ca9445f7c0dca679171112", "01234567012345670123456701234567"}, + TestHash{"8a24108b154ada21c9fd5574494479ba5c7e7ab76ef264ead0fcce33", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"543e6868e1666c1a643630df77367ae5a62a85070a51c14cbf665cbc", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", ""}, - TestHash{"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532", "abc"}, - TestHash{"565ada1ced21278cfaffdde00dea0107964121ac25e4e978abc59412be74550a", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"8cc1709d520f495ce972ece48b0d2e1f74ec80d53bc5c47457142158fae15d98", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b", "a"}, - TestHash{"e4786de5f88f7d374b7288f225ea9f2f7654da200bab5d417e1fb52d49202767", "01234567012345670123456701234567"}, - TestHash{"41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", ""}, + TestHash{"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532", "abc"}, + TestHash{"565ada1ced21278cfaffdde00dea0107964121ac25e4e978abc59412be74550a", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"8cc1709d520f495ce972ece48b0d2e1f74ec80d53bc5c47457142158fae15d98", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b", "a"}, + TestHash{"e4786de5f88f7d374b7288f225ea9f2f7654da200bab5d417e1fb52d49202767", "01234567012345670123456701234567"}, + TestHash{"41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", ""}, - TestHash{"ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25", "abc"}, - TestHash{"9aa92dbb716ebb573def0d5e3cdd28d6add38ada310b602b8916e690a3257b7144e5ddd3d0dbbc559c48480d34d57a9a", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"77c90323d7392bcdee8a3e7f74f19f47b7d1b1a825ac6a2d8d882a72317879cc26597035f1fc24fe65090b125a691282", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"1815f774f320491b48569efec794d249eeb59aae46d22bf77dafe25c5edc28d7ea44f93ee1234aa88f61c91912a4ccd9", "a"}, - TestHash{"51072590ad4c51b27ff8265590d74f92de7cc55284168e414ca960087c693285b08a283c6b19d77632994cb9eb93f1be", "01234567012345670123456701234567"}, - TestHash{"991c665755eb3a4b6bbdfb75c78a492e8c56a22c5c4d7e429bfdbc32b9d4ad5aa04a1f076e62fea19eef51acd0657c22", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"79407d3b5916b59c3e30b09822974791c313fb9ecc849e406f23592d04f625dc8c709b98b43b3852b337216179aa7fc7", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", ""}, + TestHash{"ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25", "abc"}, + TestHash{"9aa92dbb716ebb573def0d5e3cdd28d6add38ada310b602b8916e690a3257b7144e5ddd3d0dbbc559c48480d34d57a9a", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"77c90323d7392bcdee8a3e7f74f19f47b7d1b1a825ac6a2d8d882a72317879cc26597035f1fc24fe65090b125a691282", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"1815f774f320491b48569efec794d249eeb59aae46d22bf77dafe25c5edc28d7ea44f93ee1234aa88f61c91912a4ccd9", "a"}, + TestHash{"51072590ad4c51b27ff8265590d74f92de7cc55284168e414ca960087c693285b08a283c6b19d77632994cb9eb93f1be", "01234567012345670123456701234567"}, + TestHash{"991c665755eb3a4b6bbdfb75c78a492e8c56a22c5c4d7e429bfdbc32b9d4ad5aa04a1f076e62fea19eef51acd0657c22", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"79407d3b5916b59c3e30b09822974791c313fb9ecc849e406f23592d04f625dc8c709b98b43b3852b337216179aa7fc7", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", ""}, - TestHash{"b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0", "abc"}, - TestHash{"9f9a327944a35988d67effc4fa748b3c07744f736ac70b479d8e12a3d10d6884d00a7ef593690305462e9e9030a67c51636fd346fd8fa0ee28a5ac2aee103d2e", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"dbb124a0deda966eb4d199d0844fa0beb0770ea1ccddabcd335a7939a931ac6fb4fa6aebc6573f462ced2e4e7178277803be0d24d8bc2864626d9603109b7891", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"697f2d856172cb8309d6b8b97dac4de344b549d4dee61edfb4962d8698b7fa803f4f93ff24393586e28b5b957ac3d1d369420ce53332712f997bd336d09ab02a", "a"}, - TestHash{"5679e353bc8eeea3e801ca60448b249bcfd3ac4a6c3abe429a807bcbd4c9cd12da87a5a9dc74fde64c0d44718632cae966b078397c6f9ec155c6a238f2347cf1", "01234567012345670123456701234567"}, - TestHash{"04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", ""}, + TestHash{"b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0", "abc"}, + TestHash{"9f9a327944a35988d67effc4fa748b3c07744f736ac70b479d8e12a3d10d6884d00a7ef593690305462e9e9030a67c51636fd346fd8fa0ee28a5ac2aee103d2e", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"dbb124a0deda966eb4d199d0844fa0beb0770ea1ccddabcd335a7939a931ac6fb4fa6aebc6573f462ced2e4e7178277803be0d24d8bc2864626d9603109b7891", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"697f2d856172cb8309d6b8b97dac4de344b549d4dee61edfb4962d8698b7fa803f4f93ff24393586e28b5b957ac3d1d369420ce53332712f997bd336d09ab02a", "a"}, + TestHash{"5679e353bc8eeea3e801ca60448b249bcfd3ac4a6c3abe429a807bcbd4c9cd12da87a5a9dc74fde64c0d44718632cae966b078397c6f9ec155c6a238f2347cf1", "01234567012345670123456701234567"}, + TestHash{"04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_shake_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"7f9c2ba4e88f827d616045507605853e", ""}, - TestHash{"f4202e3c5852f9182a0430fd8144f0a7", "The quick brown fox jumps over the lazy dog"}, - TestHash{"853f4538be0db9621a6cea659a06c110", "The quick brown fox jumps over the lazy dof"}, - } - for v, _ in test_vectors { - computed := shake.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"7f9c2ba4e88f827d616045507605853e", ""}, + TestHash{"f4202e3c5852f9182a0430fd8144f0a7", "The quick brown fox jumps over the lazy dog"}, + TestHash{"853f4538be0db9621a6cea659a06c110", "The quick brown fox jumps over the lazy dof"}, + } + for v, _ in test_vectors { + computed := shake.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_shake_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f", ""}, - TestHash{"2f671343d9b2e1604dc9dcf0753e5fe15c7c64a0d283cbbf722d411a0e36f6ca", "The quick brown fox jumps over the lazy dog"}, - TestHash{"46b1ebb2e142c38b9ac9081bef72877fe4723959640fa57119b366ce6899d401", "The quick brown fox jumps over the lazy dof"}, - } - for v, _ in test_vectors { - computed := shake.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f", ""}, + TestHash{"2f671343d9b2e1604dc9dcf0753e5fe15c7c64a0d283cbbf722d411a0e36f6ca", "The quick brown fox jumps over the lazy dog"}, + TestHash{"46b1ebb2e142c38b9ac9081bef72877fe4723959640fa57119b366ce6899d401", "The quick brown fox jumps over the lazy dof"}, + } + for v, _ in test_vectors { + computed := shake.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", ""}, - TestHash{"c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", ""}, + TestHash{"c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", ""}, - TestHash{"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", ""}, + TestHash{"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", ""}, - TestHash{"f7df1165f033337be098e7d288ad6a2f74409d7a60b49c36642218de161b1f99f8c681e4afaf31a34db29fb763e3c28e", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", ""}, + TestHash{"f7df1165f033337be098e7d288ad6a2f74409d7a60b49c36642218de161b1f99f8c681e4afaf31a34db29fb763e3c28e", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", ""}, - TestHash{"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", ""}, + TestHash{"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_whirlpool :: proc(t: ^testing.T) { - // Test vectors from - // https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html - test_vectors := [?]TestHash { - TestHash{"19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3", ""}, - TestHash{"8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a", "a"}, - TestHash{"33e24e6cbebf168016942df8a7174048f9cebc45cbd829c3b94b401a498acb11c5abcca7f2a1238aaf534371e87a4e4b19758965d5a35a7cad87cf5517043d97", "ab"}, - TestHash{"4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5", "abc"}, - TestHash{"bda164f0b930c43a1bacb5df880b205d15ac847add35145bf25d991ae74f0b72b1ac794f8aacda5fcb3c47038c954742b1857b5856519de4d1e54bfa2fa4eac5", "abcd"}, - TestHash{"5d745e26ccb20fe655d39c9e7f69455758fbae541cb892b3581e4869244ab35b4fd6078f5d28b1f1a217452a67d9801033d92724a221255a5e377fe9e9e5f0b2", "abcde"}, - TestHash{"a73e425459567308ba5f9eb2ae23570d0d0575eb1357ecf6ac88d4e0358b0ac3ea2371261f5d4c070211784b525911b9eec0ad968429bb7c7891d341cff4e811", "abcdef"}, - TestHash{"08b388f68fd3eb51906ac3d3c699b8e9c3ac65d7ceb49d2e34f8a482cbc3082bc401cead90e85a97b8647c948bf35e448740b79659f3bee42145f0bd653d1f25", "abcdefg"}, - TestHash{"1f1a84d30612820243afe2022712f9dac6d07c4c8bb41b40eacab0184c8d82275da5bcadbb35c7ca1960ff21c90acbae8c14e48d9309e4819027900e882c7ad9", "abcdefgh"}, - TestHash{"11882bc9a31ac1cf1c41dcd9fd6fdd3ccdb9b017fc7f4582680134f314d7bb49af4c71f5a920bc0a6a3c1ff9a00021bf361d9867fe636b0bc1da1552e4237de4", "abcdefghi"}, - TestHash{"717163de24809ffcf7ff6d5aba72b8d67c2129721953c252a4ddfb107614be857cbd76a9d5927de14633d6bdc9ddf335160b919db5c6f12cb2e6549181912eef", "abcdefghij"}, - TestHash{"b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35", "The quick brown fox jumps over the lazy dog"}, - TestHash{"c27ba124205f72e6847f3e19834f925cc666d0974167af915bb462420ed40cc50900d85a1f923219d832357750492d5c143011a76988344c2635e69d06f2d38c", "The quick brown fox jumps over the lazy eog"}, - } - for v, _ in test_vectors { - computed := whirlpool.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html + test_vectors := [?]TestHash { + TestHash{"19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3", ""}, + TestHash{"8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a", "a"}, + TestHash{"33e24e6cbebf168016942df8a7174048f9cebc45cbd829c3b94b401a498acb11c5abcca7f2a1238aaf534371e87a4e4b19758965d5a35a7cad87cf5517043d97", "ab"}, + TestHash{"4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5", "abc"}, + TestHash{"bda164f0b930c43a1bacb5df880b205d15ac847add35145bf25d991ae74f0b72b1ac794f8aacda5fcb3c47038c954742b1857b5856519de4d1e54bfa2fa4eac5", "abcd"}, + TestHash{"5d745e26ccb20fe655d39c9e7f69455758fbae541cb892b3581e4869244ab35b4fd6078f5d28b1f1a217452a67d9801033d92724a221255a5e377fe9e9e5f0b2", "abcde"}, + TestHash{"a73e425459567308ba5f9eb2ae23570d0d0575eb1357ecf6ac88d4e0358b0ac3ea2371261f5d4c070211784b525911b9eec0ad968429bb7c7891d341cff4e811", "abcdef"}, + TestHash{"08b388f68fd3eb51906ac3d3c699b8e9c3ac65d7ceb49d2e34f8a482cbc3082bc401cead90e85a97b8647c948bf35e448740b79659f3bee42145f0bd653d1f25", "abcdefg"}, + TestHash{"1f1a84d30612820243afe2022712f9dac6d07c4c8bb41b40eacab0184c8d82275da5bcadbb35c7ca1960ff21c90acbae8c14e48d9309e4819027900e882c7ad9", "abcdefgh"}, + TestHash{"11882bc9a31ac1cf1c41dcd9fd6fdd3ccdb9b017fc7f4582680134f314d7bb49af4c71f5a920bc0a6a3c1ff9a00021bf361d9867fe636b0bc1da1552e4237de4", "abcdefghi"}, + TestHash{"717163de24809ffcf7ff6d5aba72b8d67c2129721953c252a4ddfb107614be857cbd76a9d5927de14633d6bdc9ddf335160b919db5c6f12cb2e6549181912eef", "abcdefghij"}, + TestHash{"b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35", "The quick brown fox jumps over the lazy dog"}, + TestHash{"c27ba124205f72e6847f3e19834f925cc666d0974167af915bb462420ed40cc50900d85a1f923219d832357750492d5c143011a76988344c2635e69d06f2d38c", "The quick brown fox jumps over the lazy eog"}, + } + for v, _ in test_vectors { + computed := whirlpool.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_gost :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0", ""}, - TestHash{"e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011", "a"}, - TestHash{"b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c", "abc"}, - TestHash{"bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0", "message digest"}, - TestHash{"9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76", "The quick brown fox jumps over the lazy dog"}, - TestHash{"73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb", "This is message, length=32 bytes"}, - TestHash{"c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011", "Suppose the original message has length = 50 bytes"}, - } - for v, _ in test_vectors { - computed := gost.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0", ""}, + TestHash{"e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011", "a"}, + TestHash{"b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c", "abc"}, + TestHash{"bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0", "message digest"}, + TestHash{"9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76", "The quick brown fox jumps over the lazy dog"}, + TestHash{"73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb", "This is message, length=32 bytes"}, + TestHash{"c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011", "Suppose the original message has length = 50 bytes"}, + } + for v, _ in test_vectors { + computed := gost.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_streebog_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3f539a213e97c802cc229d474c6aa32a825a360b2a933a949fd925208d9ce1bb", ""}, - TestHash{"3e7dea7f2384b6c5a3d0e24aaa29c05e89ddd762145030ec22c71a6db8b2c1f4", "The quick brown fox jumps over the lazy dog"}, - TestHash{"36816a824dcbe7d6171aa58500741f2ea2757ae2e1784ab72c5c3c6c198d71da", "The quick brown fox jumps over the lazy dog."}, - } - for v, _ in test_vectors { - computed := streebog.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3f539a213e97c802cc229d474c6aa32a825a360b2a933a949fd925208d9ce1bb", ""}, + TestHash{"3e7dea7f2384b6c5a3d0e24aaa29c05e89ddd762145030ec22c71a6db8b2c1f4", "The quick brown fox jumps over the lazy dog"}, + TestHash{"36816a824dcbe7d6171aa58500741f2ea2757ae2e1784ab72c5c3c6c198d71da", "The quick brown fox jumps over the lazy dog."}, + } + for v, _ in test_vectors { + computed := streebog.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_streebog_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"8e945da209aa869f0455928529bcae4679e9873ab707b55315f56ceb98bef0a7362f715528356ee83cda5f2aac4c6ad2ba3a715c1bcd81cb8e9f90bf4c1c1a8a", ""}, - TestHash{"d2b793a0bb6cb5904828b5b6dcfb443bb8f33efc06ad09368878ae4cdc8245b97e60802469bed1e7c21a64ff0b179a6a1e0bb74d92965450a0adab69162c00fe", "The quick brown fox jumps over the lazy dog"}, - TestHash{"fe0c42f267d921f940faa72bd9fcf84f9f1bd7e9d055e9816e4c2ace1ec83be82d2957cd59b86e123d8f5adee80b3ca08a017599a9fc1a14d940cf87c77df070", "The quick brown fox jumps over the lazy dog."}, - } - for v, _ in test_vectors { - computed := streebog.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"8e945da209aa869f0455928529bcae4679e9873ab707b55315f56ceb98bef0a7362f715528356ee83cda5f2aac4c6ad2ba3a715c1bcd81cb8e9f90bf4c1c1a8a", ""}, + TestHash{"d2b793a0bb6cb5904828b5b6dcfb443bb8f33efc06ad09368878ae4cdc8245b97e60802469bed1e7c21a64ff0b179a6a1e0bb74d92965450a0adab69162c00fe", "The quick brown fox jumps over the lazy dog"}, + TestHash{"fe0c42f267d921f940faa72bd9fcf84f9f1bd7e9d055e9816e4c2ace1ec83be82d2957cd59b86e123d8f5adee80b3ca08a017599a9fc1a14d940cf87c77df070", "The quick brown fox jumps over the lazy dog."}, + } + for v, _ in test_vectors { + computed := streebog.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed", ""}, - TestHash{"304c27fdbf308aea06955e331adc6814223a21fccd24c09fde9eda7b", "ube"}, - TestHash{"cfb6848add73e1cb47994c4765df33b8f973702705a30a71fe4747a3", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed", ""}, + TestHash{"304c27fdbf308aea06955e331adc6814223a21fccd24c09fde9eda7b", "ube"}, + TestHash{"cfb6848add73e1cb47994c4765df33b8f973702705a30a71fe4747a3", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a", ""}, - TestHash{"e802fe2a73fbe5853408f051d040aeb3a76a4d7a0fc5c3415d1af090f76a2c81", "ube"}, - TestHash{"07663e00cf96fbc136cf7b1ee099c95346ba3920893d18cc8851f22ee2e36aa6", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a", ""}, + TestHash{"e802fe2a73fbe5853408f051d040aeb3a76a4d7a0fc5c3415d1af090f76a2c81", "ube"}, + TestHash{"07663e00cf96fbc136cf7b1ee099c95346ba3920893d18cc8851f22ee2e36aa6", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706", ""}, - TestHash{"8f22f120b2b99dd4fd32b98c8c83bd87abd6413f7317be936b1997511247fc68ae781c6f42113224ccbc1567b0e88593", "ube"}, - TestHash{"f28742f7243990875d07e6afcff962edabdf7e9d19ddea6eae31d094c7fa6d9b00c8213a02ddf1e2d9894f3162345d85", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706", ""}, + TestHash{"8f22f120b2b99dd4fd32b98c8c83bd87abd6413f7317be936b1997511247fc68ae781c6f42113224ccbc1567b0e88593", "ube"}, + TestHash{"f28742f7243990875d07e6afcff962edabdf7e9d19ddea6eae31d094c7fa6d9b00c8213a02ddf1e2d9894f3162345d85", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8", ""}, - TestHash{"49a24ca8f230936f938c19484d46b58f13ea4448ddadafecdf01419b1e1dd922680be2de84069187973ab61b10574da2ee50cbeaade68ea9391c8ec041b76be0", "ube"}, - TestHash{"7bf805d0d8de36802b882e65d0515aa7682a2be97a9d9ec1399f4be2eff7de07684d7099124c8ac81c1c7c200d24ba68c6222e75062e04feb0e9dd589aa6e3b7", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8", ""}, + TestHash{"49a24ca8f230936f938c19484d46b58f13ea4448ddadafecdf01419b1e1dd922680be2de84069187973ab61b10574da2ee50cbeaade68ea9391c8ec041b76be0", "ube"}, + TestHash{"7bf805d0d8de36802b882e65d0515aa7682a2be97a9d9ec1399f4be2eff7de07684d7099124c8ac81c1c7c200d24ba68c6222e75062e04feb0e9dd589aa6e3b7", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake2b :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", ""}, - TestHash{"a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := blake2b.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", ""}, + TestHash{"a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := blake2b.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake2s :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9", ""}, - TestHash{"606beeec743ccbeff6cbcdf5d5302aa855c256c29b88c8ed331ea1a6bf3c8812", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := blake2s.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9", ""}, + TestHash{"606beeec743ccbeff6cbcdf5d5302aa855c256c29b88c8ed331ea1a6bf3c8812", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := blake2s.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_128 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"cdf26213a150dc3ecb610f18f6b38b46", ""}, - TestHash{"86be7afa339d0fc7cfc785e72f578d33", "a"}, - TestHash{"c14a12199c66e4ba84636b0f69144c77", "abc"}, - TestHash{"9e327b3d6e523062afc1132d7df9d1b8", "message digest"}, - TestHash{"fd2aa607f71dc8f510714922b371834e", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"a1aa0689d0fafa2ddc22e88b49133a06", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"d1e959eb179c911faea4624c60c5c702", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"cdf26213a150dc3ecb610f18f6b38b46", ""}, + TestHash{"86be7afa339d0fc7cfc785e72f578d33", "a"}, + TestHash{"c14a12199c66e4ba84636b0f69144c77", "abc"}, + TestHash{"9e327b3d6e523062afc1132d7df9d1b8", "message digest"}, + TestHash{"fd2aa607f71dc8f510714922b371834e", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"a1aa0689d0fafa2ddc22e88b49133a06", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"d1e959eb179c911faea4624c60c5c702", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_160 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"9c1185a5c5e9fc54612808977ee8f548b2258d31", ""}, - TestHash{"0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", "a"}, - TestHash{"8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", "abc"}, - TestHash{"5d0689ef49d2fae572b881b123a85ffa21595f36", "message digest"}, - TestHash{"f71c27109c692c1b56bbdceb5b9d2865b3708dbc", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"12a053384a9c0c88e405a06c27dcf49ada62eb2b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"b0e20b6e3116640286ed3a87a5713079b21f5189", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"9c1185a5c5e9fc54612808977ee8f548b2258d31", ""}, + TestHash{"0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", "a"}, + TestHash{"8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", "abc"}, + TestHash{"5d0689ef49d2fae572b881b123a85ffa21595f36", "message digest"}, + TestHash{"f71c27109c692c1b56bbdceb5b9d2865b3708dbc", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"12a053384a9c0c88e405a06c27dcf49ada62eb2b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"b0e20b6e3116640286ed3a87a5713079b21f5189", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d", ""}, - TestHash{"f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925", "a"}, - TestHash{"afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65", "abc"}, - TestHash{"87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e", "message digest"}, - TestHash{"649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d", ""}, + TestHash{"f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925", "a"}, + TestHash{"afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65", "abc"}, + TestHash{"87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e", "message digest"}, + TestHash{"649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_320 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8", ""}, - TestHash{"ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d", "a"}, - TestHash{"de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d", "abc"}, - TestHash{"3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197", "message digest"}, - TestHash{"cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_320(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8", ""}, + TestHash{"ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d", "a"}, + TestHash{"de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d", "abc"}, + TestHash{"3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197", "message digest"}, + TestHash{"cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_320(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e1616", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a52", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c62", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e1616", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a52", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c62", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_160 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e16167a4e5849", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c517fca1a", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a0b11602f", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651890ffbcc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cab", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e16167a4e5849", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c517fca1a", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a0b11602f", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651890ffbcc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cab", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_192 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c517fca1aa55a29f6", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a0b11602ff37beee9", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651890ffbccdc49a8cc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cabdfd91bfd", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5d2c5b075", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_192(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c517fca1aa55a29f6", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a0b11602ff37beee9", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651890ffbccdc49a8cc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cabdfd91bfd", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5d2c5b075", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_192(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b92", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec62", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b92", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec62", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_160 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b924aa8313f", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb8555", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b924aa8313f", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb8555", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_192 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b924aa8313fef919f41", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb85558b4976d8", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8d9bdd3df", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_192(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b924aa8313fef919f41", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb85558b4976d8", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8d9bdd3df", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_192(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sm3 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b", ""}, - TestHash{"66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", "abc"}, - TestHash{"debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, - TestHash{"5fdfe814b8573ca021983970fc79b2218c9570369b4859684e2e4c3fc76cb8ea", "The quick brown fox jumps over the lazy dog"}, - TestHash{"ca27d14a42fc04c1e5ecf574a95a8c2d70ecb5805e9b429026ccac8f28b20098", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := sm3.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b", ""}, + TestHash{"66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", "abc"}, + TestHash{"debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, + TestHash{"5fdfe814b8573ca021983970fc79b2218c9570369b4859684e2e4c3fc76cb8ea", "The quick brown fox jumps over the lazy dog"}, + TestHash{"ca27d14a42fc04c1e5ecf574a95a8c2d70ecb5805e9b429026ccac8f28b20098", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := sm3.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"2c99df889b019309051c60fecc2bd285a774940e43175b76b2626630", ""}, - TestHash{"e715f969fb61b203a97e494aab92d91a9cec52f0933436b0d63bf722", "a"}, - TestHash{"c2b1967e635bd55b6a4d36f863ac4a877be302251d68692873007281", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"2c99df889b019309051c60fecc2bd285a774940e43175b76b2626630", ""}, + TestHash{"e715f969fb61b203a97e494aab92d91a9cec52f0933436b0d63bf722", "a"}, + TestHash{"c2b1967e635bd55b6a4d36f863ac4a877be302251d68692873007281", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"46e64619c18bb0a92a5e87185a47eef83ca747b8fcc8e1412921357e326df434", ""}, - TestHash{"d52c0c130a1bc0ae5136375637a52773e150c71efe1c968df8956f6745b05386", "a"}, - TestHash{"fc4214867025a8af94c614353b3553b10e561ae749fc18c40e5fd44a7a4ecd1b", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"46e64619c18bb0a92a5e87185a47eef83ca747b8fcc8e1412921357e326df434", ""}, + TestHash{"d52c0c130a1bc0ae5136375637a52773e150c71efe1c968df8956f6745b05386", "a"}, + TestHash{"fc4214867025a8af94c614353b3553b10e561ae749fc18c40e5fd44a7a4ecd1b", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"2fe5f71b1b3290d3c017fb3c1a4d02a5cbeb03a0476481e25082434a881994b0ff99e078d2c16b105ad069b569315328", ""}, - TestHash{"77de897ca4fd5dadfbcbd1d8d4ea3c3c1426855e38661325853e92b069f3fe156729f6bbb9a5892c7c18a77f1cb9d0bb", "a"}, - TestHash{"6f73d9b9b8ed362f8180fb26020725b40bd6ca75b3b947405f26c4c37a885ce028876dc42e379d2faf6146fed3ea0e42", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"2fe5f71b1b3290d3c017fb3c1a4d02a5cbeb03a0476481e25082434a881994b0ff99e078d2c16b105ad069b569315328", ""}, + TestHash{"77de897ca4fd5dadfbcbd1d8d4ea3c3c1426855e38661325853e92b069f3fe156729f6bbb9a5892c7c18a77f1cb9d0bb", "a"}, + TestHash{"6f73d9b9b8ed362f8180fb26020725b40bd6ca75b3b947405f26c4c37a885ce028876dc42e379d2faf6146fed3ea0e42", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f", ""}, - TestHash{"f12c87e986daff17c481c81a99a39b603ca6bafcd320c5735523b97cb9a26f7681bad62ffad9aad0e21160a05f773fb0d1434ca4cbcb0483f480a171ada1561b", "a"}, - TestHash{"bafb8e710b35eabeb1a48220c4b0987c2c985b6e73b7b31d164bfb9d67c94d99d7bc43b474a25e647cd6cc36334b6a00a5f2a85fae74907fd2885c6168132fe7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f", ""}, + TestHash{"f12c87e986daff17c481c81a99a39b603ca6bafcd320c5735523b97cb9a26f7681bad62ffad9aad0e21160a05f773fb0d1434ca4cbcb0483f480a171ada1561b", "a"}, + TestHash{"bafb8e710b35eabeb1a48220c4b0987c2c985b6e73b7b31d164bfb9d67c94d99d7bc43b474a25e647cd6cc36334b6a00a5f2a85fae74907fd2885c6168132fe7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"f2e180fb5947be964cd584e22e496242c6a329c577fc4ce8c36d34c3", ""}, - TestHash{"2dfa5bd326c23c451b1202d99e6cee98a98c45927e1a31077f538712", "a"}, - TestHash{"c8a3e7274d599900ae673419683c3626a2e49ed57308ed2687508bef", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"f2e180fb5947be964cd584e22e496242c6a329c577fc4ce8c36d34c3", ""}, + TestHash{"2dfa5bd326c23c451b1202d99e6cee98a98c45927e1a31077f538712", "a"}, + TestHash{"c8a3e7274d599900ae673419683c3626a2e49ed57308ed2687508bef", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"1a52d11d550039be16107f9c58db9ebcc417f16f736adb2502567119f0083467", ""}, - TestHash{"3645c245bb31223ad93c80885b719aa40b4bed0a9d9d6e7c11fe99e59ca350b5", "a"}, - TestHash{"2679d98913bee62e57fdbdde97ddb328373548c6b24fc587cc3d08f2a02a529c", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"1a52d11d550039be16107f9c58db9ebcc417f16f736adb2502567119f0083467", ""}, + TestHash{"3645c245bb31223ad93c80885b719aa40b4bed0a9d9d6e7c11fe99e59ca350b5", "a"}, + TestHash{"2679d98913bee62e57fdbdde97ddb328373548c6b24fc587cc3d08f2a02a529c", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"ac353c1095ace21439251007862d6c62f829ddbe6de4f78e68d310a9205a736d8b11d99bffe448f57a1cfa2934f044a5", ""}, - TestHash{"13fce7bd9fc69b67cc12c77e765a0a97794c585f89df39fbff32408e060d7d9225c7e80fd87da647686888bda896c342", "a"}, - TestHash{"1c446cd70a6de52c9db386f5305aae029fe5a4120bc6230b7cd3a5e1ef1949cc8e6d2548c24cd7347b5ba512628a62f6", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"ac353c1095ace21439251007862d6c62f829ddbe6de4f78e68d310a9205a736d8b11d99bffe448f57a1cfa2934f044a5", ""}, + TestHash{"13fce7bd9fc69b67cc12c77e765a0a97794c585f89df39fbff32408e060d7d9225c7e80fd87da647686888bda896c342", "a"}, + TestHash{"1c446cd70a6de52c9db386f5305aae029fe5a4120bc6230b7cd3a5e1ef1949cc8e6d2548c24cd7347b5ba512628a62f6", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8", ""}, - TestHash{"9ef345a835ee35d6d0d462ce45f722d84b5ca41fde9c81a98a22cfb4f7425720511b03a258cdc055bf8e9179dc9bdb5d88bed906c71125d4cf0cd39d3d7bebc7", "a"}, - TestHash{"862849fd911852cd54beefa88759db4cead0ef8e36aaf15398303c5c4cbc016d9b4c42b32081cbdcba710d2693e7663d244fae116ec29ffb40168baf44f944e7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8", ""}, + TestHash{"9ef345a835ee35d6d0d462ce45f722d84b5ca41fde9c81a98a22cfb4f7425720511b03a258cdc055bf8e9179dc9bdb5d88bed906c71125d4cf0cd39d3d7bebc7", "a"}, + TestHash{"862849fd911852cd54beefa88759db4cead0ef8e36aaf15398303c5c4cbc016d9b4c42b32081cbdcba710d2693e7663d244fae116ec29ffb40168baf44f944e7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_128 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"c68f39913f901f3ddf44c707357a7d70", ""}, - TestHash{"0cd40739683e15f01ca5dbceef4059f1", "a"}, - TestHash{"9e40ed883fb63e985d299b40cda2b8f2", "abc"}, - TestHash{"3caf4a79e81adcd6d1716bcc1cef4573", "message digest"}, - TestHash{"dc502247fb3eb8376109eda32d361d82", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"44068770868768964d1f2c3bff4aa3d8", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"de5eb3f7d9eb08fae7a07d68e3047ec6", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_128_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"ee6bbf4d6a46a679b3a856c88538bb98", ""}, - TestHash{"5cd07f03330c3b5020b29ba75911e17d", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_128_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"184b8482a0c050dca54b59c7f05bf5dd", ""}, - TestHash{"f23fbe704be8494bfa7a7fb4f8ab09e5", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_128_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"c68f39913f901f3ddf44c707357a7d70", ""}, + TestHash{"0cd40739683e15f01ca5dbceef4059f1", "a"}, + TestHash{"9e40ed883fb63e985d299b40cda2b8f2", "abc"}, + TestHash{"3caf4a79e81adcd6d1716bcc1cef4573", "message digest"}, + TestHash{"dc502247fb3eb8376109eda32d361d82", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"44068770868768964d1f2c3bff4aa3d8", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"de5eb3f7d9eb08fae7a07d68e3047ec6", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_128_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"ee6bbf4d6a46a679b3a856c88538bb98", ""}, + TestHash{"5cd07f03330c3b5020b29ba75911e17d", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_128_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"184b8482a0c050dca54b59c7f05bf5dd", ""}, + TestHash{"f23fbe704be8494bfa7a7fb4f8ab09e5", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_128_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_160 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"d353c3ae22a25401d257643836d7231a9a95f953", ""}, - TestHash{"4da08f514a7275dbc4cece4a347385983983a830", "a"}, - TestHash{"b21e876c4d391e2a897661149d83576b5530a089", "abc"}, - TestHash{"43a47f6f1c016207f08be8115c0977bf155346da", "message digest"}, - TestHash{"eba9fa6050f24c07c29d1834a60900ea4e32e61b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"c30bce448cf8cfe957c141e90c0a063497cdfeeb", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"97dc988d97caae757be7523c4e8d4ea63007a4b9", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_160_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"1d33aae1be4146dbaaca0b6e70d7a11f10801525", ""}, - TestHash{"e0a5be29627332034d4dd8a910a1a0e6fe04084d", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_160_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"255158cfc1eed1a7be7c55ddd64d9790415b933b", ""}, - TestHash{"f5147df7abc5e3c81b031268927c2b5761b5a2b5", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_160_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"d353c3ae22a25401d257643836d7231a9a95f953", ""}, + TestHash{"4da08f514a7275dbc4cece4a347385983983a830", "a"}, + TestHash{"b21e876c4d391e2a897661149d83576b5530a089", "abc"}, + TestHash{"43a47f6f1c016207f08be8115c0977bf155346da", "message digest"}, + TestHash{"eba9fa6050f24c07c29d1834a60900ea4e32e61b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"c30bce448cf8cfe957c141e90c0a063497cdfeeb", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"97dc988d97caae757be7523c4e8d4ea63007a4b9", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_160_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"1d33aae1be4146dbaaca0b6e70d7a11f10801525", ""}, + TestHash{"e0a5be29627332034d4dd8a910a1a0e6fe04084d", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_160_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"255158cfc1eed1a7be7c55ddd64d9790415b933b", ""}, + TestHash{"f5147df7abc5e3c81b031268927c2b5761b5a2b5", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_160_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_192 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"e9c48d7903eaf2a91c5b350151efcb175c0fc82de2289a4e", ""}, - TestHash{"b359c8835647f5697472431c142731ff6e2cddcacc4f6e08", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_192_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"4a8372945afa55c7dead800311272523ca19d42ea47b72da", ""}, - TestHash{"856c19f86214ea9a8a2f0c4b758b973cce72a2d8ff55505c", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_192_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"4839d0626f95935e17ee2fc4509387bbe2cc46cb382ffe85", ""}, - TestHash{"5ffa3b3548a6e2cfc06b7908ceb5263595df67cf9c4b9341", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_192_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"e9c48d7903eaf2a91c5b350151efcb175c0fc82de2289a4e", ""}, + TestHash{"b359c8835647f5697472431c142731ff6e2cddcacc4f6e08", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_192_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"4a8372945afa55c7dead800311272523ca19d42ea47b72da", ""}, + TestHash{"856c19f86214ea9a8a2f0c4b758b973cce72a2d8ff55505c", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_192_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"4839d0626f95935e17ee2fc4509387bbe2cc46cb382ffe85", ""}, + TestHash{"5ffa3b3548a6e2cfc06b7908ceb5263595df67cf9c4b9341", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_192_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_224 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"c5aae9d47bffcaaf84a8c6e7ccacd60a0dd1932be7b1a192b9214b6d", ""}, - TestHash{"731814ba5605c59b673e4caae4ad28eeb515b3abc2b198336794e17b", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_224_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"3e56243275b3b81561750550e36fcd676ad2f5dd9e15f2e89e6ed78e", ""}, - TestHash{"742f1dbeeaf17f74960558b44f08aa98bdc7d967e6c0ab8f799b3ac1", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_224_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"4a0513c032754f5582a758d35917ac9adf3854219b39e3ac77d1837e", ""}, - TestHash{"67b3cb8d4068e3641fa4f156e03b52978b421947328bfb9168c7655d", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_224_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"c5aae9d47bffcaaf84a8c6e7ccacd60a0dd1932be7b1a192b9214b6d", ""}, + TestHash{"731814ba5605c59b673e4caae4ad28eeb515b3abc2b198336794e17b", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_224_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"3e56243275b3b81561750550e36fcd676ad2f5dd9e15f2e89e6ed78e", ""}, + TestHash{"742f1dbeeaf17f74960558b44f08aa98bdc7d967e6c0ab8f799b3ac1", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_224_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"4a0513c032754f5582a758d35917ac9adf3854219b39e3ac77d1837e", ""}, + TestHash{"67b3cb8d4068e3641fa4f156e03b52978b421947328bfb9168c7655d", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_224_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_256 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"4f6938531f0bc8991f62da7bbd6f7de3fad44562b8c6f4ebf146d5b4e46f7c17", ""}, - TestHash{"47c838fbb4081d9525a0ff9b1e2c05a98f625714e72db289010374e27db021d8", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_256_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"c92b2e23091e80e375dadce26982482d197b1a2521be82da819f8ca2c579b99b", ""}, - TestHash{"e686d2394a49b44d306ece295cf9021553221db132b36cc0ff5b593d39295899", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_256_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"be417bb4dd5cfb76c7126f4f8eeb1553a449039307b1a3cd451dbfdc0fbbe330", ""}, - TestHash{"de8fd5ee72a5e4265af0a756f4e1a1f65c9b2b2f47cf17ecf0d1b88679a3e22f", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_256_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"4f6938531f0bc8991f62da7bbd6f7de3fad44562b8c6f4ebf146d5b4e46f7c17", ""}, + TestHash{"47c838fbb4081d9525a0ff9b1e2c05a98f625714e72db289010374e27db021d8", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_256_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"c92b2e23091e80e375dadce26982482d197b1a2521be82da819f8ca2c579b99b", ""}, + TestHash{"e686d2394a49b44d306ece295cf9021553221db132b36cc0ff5b593d39295899", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_256_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"be417bb4dd5cfb76c7126f4f8eeb1553a449039307b1a3cd451dbfdc0fbbe330", ""}, + TestHash{"de8fd5ee72a5e4265af0a756f4e1a1f65c9b2b2f47cf17ecf0d1b88679a3e22f", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_256_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_siphash_2_4 :: proc(t: ^testing.T) { - // Test vectors from - // https://github.com/veorq/SipHash/blob/master/vectors.h - test_vectors := [?]u64 { - 0x726fdb47dd0e0e31, 0x74f839c593dc67fd, 0x0d6c8009d9a94f5a, 0x85676696d7fb7e2d, - 0xcf2794e0277187b7, 0x18765564cd99a68d, 0xcbc9466e58fee3ce, 0xab0200f58b01d137, - 0x93f5f5799a932462, 0x9e0082df0ba9e4b0, 0x7a5dbbc594ddb9f3, 0xf4b32f46226bada7, - 0x751e8fbc860ee5fb, 0x14ea5627c0843d90, 0xf723ca908e7af2ee, 0xa129ca6149be45e5, - 0x3f2acc7f57c29bdb, 0x699ae9f52cbe4794, 0x4bc1b3f0968dd39c, 0xbb6dc91da77961bd, - 0xbed65cf21aa2ee98, 0xd0f2cbb02e3b67c7, 0x93536795e3a33e88, 0xa80c038ccd5ccec8, - 0xb8ad50c6f649af94, 0xbce192de8a85b8ea, 0x17d835b85bbb15f3, 0x2f2e6163076bcfad, - 0xde4daaaca71dc9a5, 0xa6a2506687956571, 0xad87a3535c49ef28, 0x32d892fad841c342, - 0x7127512f72f27cce, 0xa7f32346f95978e3, 0x12e0b01abb051238, 0x15e034d40fa197ae, - 0x314dffbe0815a3b4, 0x027990f029623981, 0xcadcd4e59ef40c4d, 0x9abfd8766a33735c, - 0x0e3ea96b5304a7d0, 0xad0c42d6fc585992, 0x187306c89bc215a9, 0xd4a60abcf3792b95, - 0xf935451de4f21df2, 0xa9538f0419755787, 0xdb9acddff56ca510, 0xd06c98cd5c0975eb, - 0xe612a3cb9ecba951, 0xc766e62cfcadaf96, 0xee64435a9752fe72, 0xa192d576b245165a, - 0x0a8787bf8ecb74b2, 0x81b3e73d20b49b6f, 0x7fa8220ba3b2ecea, 0x245731c13ca42499, - 0xb78dbfaf3a8d83bd, 0xea1ad565322a1a0b, 0x60e61c23a3795013, 0x6606d7e446282b93, - 0x6ca4ecb15c5f91e1, 0x9f626da15c9625f3, 0xe51b38608ef25f57, 0x958a324ceb064572, - } + // Test vectors from + // https://github.com/veorq/SipHash/blob/master/vectors.h + test_vectors := [?]u64 { + 0x726fdb47dd0e0e31, 0x74f839c593dc67fd, 0x0d6c8009d9a94f5a, 0x85676696d7fb7e2d, + 0xcf2794e0277187b7, 0x18765564cd99a68d, 0xcbc9466e58fee3ce, 0xab0200f58b01d137, + 0x93f5f5799a932462, 0x9e0082df0ba9e4b0, 0x7a5dbbc594ddb9f3, 0xf4b32f46226bada7, + 0x751e8fbc860ee5fb, 0x14ea5627c0843d90, 0xf723ca908e7af2ee, 0xa129ca6149be45e5, + 0x3f2acc7f57c29bdb, 0x699ae9f52cbe4794, 0x4bc1b3f0968dd39c, 0xbb6dc91da77961bd, + 0xbed65cf21aa2ee98, 0xd0f2cbb02e3b67c7, 0x93536795e3a33e88, 0xa80c038ccd5ccec8, + 0xb8ad50c6f649af94, 0xbce192de8a85b8ea, 0x17d835b85bbb15f3, 0x2f2e6163076bcfad, + 0xde4daaaca71dc9a5, 0xa6a2506687956571, 0xad87a3535c49ef28, 0x32d892fad841c342, + 0x7127512f72f27cce, 0xa7f32346f95978e3, 0x12e0b01abb051238, 0x15e034d40fa197ae, + 0x314dffbe0815a3b4, 0x027990f029623981, 0xcadcd4e59ef40c4d, 0x9abfd8766a33735c, + 0x0e3ea96b5304a7d0, 0xad0c42d6fc585992, 0x187306c89bc215a9, 0xd4a60abcf3792b95, + 0xf935451de4f21df2, 0xa9538f0419755787, 0xdb9acddff56ca510, 0xd06c98cd5c0975eb, + 0xe612a3cb9ecba951, 0xc766e62cfcadaf96, 0xee64435a9752fe72, 0xa192d576b245165a, + 0x0a8787bf8ecb74b2, 0x81b3e73d20b49b6f, 0x7fa8220ba3b2ecea, 0x245731c13ca42499, + 0xb78dbfaf3a8d83bd, 0xea1ad565322a1a0b, 0x60e61c23a3795013, 0x6606d7e446282b93, + 0x6ca4ecb15c5f91e1, 0x9f626da15c9625f3, 0xe51b38608ef25f57, 0x958a324ceb064572, + } - key: [16]byte - for i in 0..<16 { - key[i] = byte(i) - } + key: [16]byte + for i in 0..<16 { + key[i] = byte(i) + } - for i in 0..JfjWMqH=CI&kO5O0Hk16T+`GB8{y;RN$Rgad;G0}q1(gB*h_0~-Sa0}BHK z15BL*lm(*~FoAS1Fu-UI2$z8ws_y|*{s9xj1Q;y?RR^O%ZUPB`Xpns%HUvZT!Cc@0 zau5Rp1B_-6fT#lLV+ApxdFc91Lsj7HW6wyyyq&(PowRtKYJT!3(4G_pRh zQ{tdL&hvmMgwh9FA>0d`AeS*P!1RHF1Efy?s!sr_9!5WaDu>Zf)4_27a_1kA0SpWb zf1u$Bqg^1@F~De$T96RPS70{OJ_e|La2lkDfq@|cO2dLL;Au$;NZ$hkhzlMVK>P=z z5$=F!1gQnF0-u(ofcyty6N6#)1wrj&z~xS;zZsx3G?*Clb25|6O!RY7baOKEN-K0L zEX;JxO!SKL^^Cw_Cc?k~PK)k-p$yM{pSHcc=$W(s2jj%B0JDH7_oRs+cZ1vjG7qE% z>q#UU<_L);mMxC9RI6b1$c1uXWe;ZP6qJ2rP( z<516yL!2QeGbtGq>}Cw96`3UrMX8B7Ir+&9$q*_xHMcmmgdsOIH@TpaAvq^MIXgZ* zwWK67Hx(q9n_rg75FZaRBfhvKv8W_IH!(AhA+0Di6=ZNO#Nhb&^xXVBsDgL~cOOqD z=XfJMLlXqk9L_Y-GX(_$69Y2?6BvTZF&K-1fsuh39Je60|OI7CrB{^1H*@WNPYmNbx<0D3N!pb5(mk_#3c$K>OuJtIV~w5iNn$y zNRI}RI4C`W#6Z{pNgQ0>fdm;C7%Y&)L3Tie861$rAvqZ$FkO6A4zPteDUjp$#P1TnN z!2DAnKB$TMas!xu2*d|9iC-=N^LK&xpr-1}31I#v5FgYue%S!#uLAKwP1ctM|Ns97 zx!3TmXXnK@kIqLP%}+iAgm@l5Frm(!!Q=Qr1u%8I;FlZ2e^H@$4u&riKt>G8|A zfSk-QVaJKj9t<9~AhJYw2S^O$WzPK|f&UNECLB&fC0nD-nd7zz#J5T|dbF2HVs}91IMl!l53WPhV91|Ns9OYw#lu2FBRK81{kG zzwSb~A=EJ}*l`=9hvj$vmWiNojn2;=oqs*L?LE3nIXt?BJ-WR)UbHhXFsxuKDfH-e z74Wcj7AQ^k=&qIU=q^?8=nj_f==N540qXayU@Y}vSUrSn6yV_fWEe)$G)Xm*yUyzuC(QF-9e z8KQE*qti#_28esWqq9Wi1W0THNNk6P<+&1O!vlvsTEA^z=ptU_QAvQV(AXg=7Sub z&4)NV{vY?TJYIC$;oC8m5-G=S&Q2edHICgvogpeKEH9Q$@N7QF;@NzN#o^mArV?dG z{_UJ;ojxkd9Qn5krFDj=EJ?Gx$lsa{vbXsllV|fGCWmjw82MYm|NsB**v08+#l_$1 z`Tzg_mu~<6|A+b)5kDoK9@ygM^}qlBS1^_k4%0(mg=k^Q5b7B280Hx27!u5{VH=;r z&cLr}`+|*=;W+C%HcoI4)pIW>b1^V5aC!E+T6=V|K4jx$@HozTkByT-;j0IT>CMi` z0P2{#@N0-_=dd%l@N0@HKjdII&Z_y418j)L4p5F|U|?YL=wwxR$icv`!72!{O^|ic zLk^G`(;sp$fI5iBS*Jqv_;l({gUC&O$ia~C%>$(AO*T6NzaZ;hhy)WTl`}9f9A{;K zvOIRNfRYIV1EWW$==X;l3~9$%zdZyQ>~Wkm`4I}h%lwWrsW&!dyI{w3JUAUTEqU~j2Hy!8ws@%kk!EMC3@Ih}#QV<)HtV_;w~ z^5}Ks_2^{1^OA#sKl}i{Cacsd4hD}MyBI)Y3JeS$ove%?f#a<2UUD!ffpYY5*4r;R z7y?ScPCN0Eg8@|7c^qfm`jUge0V2BSB?rTS|6m3EFF6=M9deK3tRVLlmxA2KJ2eXw z?7X<$w*yq7g2rY%dMkK6I&DGj^El4>(~6U!;S1Q{Wp=>d z@#JIx#r{o%x;{Hj29RexjE!3R+*llVH;ec*3lI0ZFd>8ln{$pu{G+6Jqo}xWo3q9VQCN<6<72wwocUPQc_K z?gz3Ae2_qz_JV_9WvK^) z3%>^MymV0EDaZ?QlgDvZW@xc-oRtyE^4uW~@)`q!h)*Z$4~Pdq_JT@BkK?SLKqqj=Lqtg~7pLU$p2$n|Y zzl4~}uW9?>0jO+y_5hk(jijo|o{#GfoBt zPB8PS87IR52=kE{Cqn`kSoA(f8#kDF2V^b}n0XUq0)%-DWCbr+^fJf%YWK#Hz~4>%YqAnC2|0SALLgjxN7gFypa7>I_Xf>Q&?M33XFuO7fE zpck;%?XBYS=(GjNryXZ~0=9%-LsS={%?}cR!SFgf5L$)UCARtjC<7)hH{%3Ly(l@NAIBan}FloD3>u;KcsMgp+~cJDACc zQ1H&2lR*PwHao=ZA9kD!$5;zN=JIQ@GC@4Z4$V*=kXTtD=m1I~H^C8fob@!A2B(k% zV5Y}$*0m2HS>59}>#PSH3=<%=OglofW~jrTX8#YQLZhZ`IW9{U9uVJ#S2`J3Rn zMd2p6X1aQVgTVk2QkQOUFn}s0kK?T8Z*VXyfCSo^8}QU|@&-K39J>KeNr!Jh(w7Ur zhUx7ja1m?z8)WHmR)(9fl>QIyAlCm7xfo-3+Nd<+gtdy&%s3fb!D-`#10-$O7;`c> z`~b&aq8U65`I&Jt_=Dn4P}bj;6BH>sKw;R z)1RxZ9(#B$5|D?q8`Utdv8E%91UK(L{JLi zReuahLAsBjDX6y+R8eU?2Bji5L`5C>7@UftK;p+)`5$vI6hK0k=P?I^Af(*je9Xb1 zzyeOFY>(loi1{%*6)`-9r=q`)AgPF7gZEehDEN8JAx7Ik9dex23d-{6tpGU*DsN)Q z$#4K-Nudcmy5meZ8JfyGKnY`!9ki$rGUQ}PU9C;jPeG3W(NWssd$s_Evx#qX>})*$wJBdmLxge$2t}0b;+zV-8pi!1|bj z;Q&PR(<4|1S9W(CD3oMlAciDDjXusA4`q4uR!Vww+JfcxgVu^becTO6?L82Eg^wX= z)#Es893lmKBhob}%|JVUs-T1qX;le5hBr(9KjL7JDfeLD7Zfdkm{|&S!Ex4ND9fX_ z0^}BuJijLEMTiS_L8!$L3gjMsO;(Uzeoe4j_%&JGAqK92CP{ul-n9^sO;Cf6vu=R0 zJbEjoJvwbc^8A{t??B4-gJ!a!zP<_)IL>+q;oap3KTZL83=*r2k2x3`IKas}59BaN z?vH-V!Ju6ZF1Rb8p#+NH0}w-xLY;7&^)Qs>(OUs>3`m||lU4Bvc$|Rm2`JkgXJr7> z;G*s;*kc~YS-GHM9>-aqgT=tP^9;1=U;sGV$yUXH6BHnP;@@T z%q3749A{kwWqI^g%6W9!g5>!%Ss#Fu?e{`B={QK>IO`TfY%hdHn+L={(25{+gex9`5|AeA zBZy-_ZUTAB1L7{IXF=|QItCQZ(3}Qx7XzeE0&*8*+_XZ;6FVrj=&KZBVb$5}bRa^Ph56f6d2 z!pw*I+X0dSVe#Q{oOR-34u%Wy;QUetbHQ=e?8h7o6Cf!t0wL=9n1f*hBn28FMCBiI zFhqb-pr9-$&3PPWoeGsa&I(H3;N;s|sp!#Z3zpySg9zdMkPrstGmqoovSR@x=@lVr z?tDbV=75-xq?d_EdTEHHkqk{R{DPt&KYAQzT?uy!sJwu>MaiSn79`KF$qEW9kNv&~ zCxP;;2PD5jV;huTp|K6}4>Yzx`4t-5pnT#0NqV6C3hM8AK=SJ*NV&QLl7jZa-2%#M zP`4<1blQUD_xm9n0V+fIHCbOk^qqzJ%HudID6c}@0`d>kEokK*)GeU$51M^J<=+8t z%F|#?jsUld!DXEXB;7&EwPR4{dGuDQcy!u=%0hlkR+cBA)|NlQZLcAYx`A*M$X`&G ztU|=lbWn>6(${W5#3rb|dH{)IP<{dV#f4vx^%}&`+mAV*W5YM$j;R1S1|-j~$!ZSC z2P)vSew_DyV$(IL-=6YmhKTD*x1= z<)6p?AVlDvgJcMh8$FJ*g2IiV0$go@>NU`akjHUWP(D?F1T3hWfhIywy#|d0P#p{k zSdZhZpnL>M#xDFCx?N#lN9ls%$m2NcdU#la>RhnbdMnjEI&DGn{F=! zw7mq0BT$|N8R>DH6;!W7Et-kQk8OxF0BS!l2!KnMgvapqm@g=0RDcU*T~ONbfYj@d z5CWA2U<-RIK#l>)^9!k^!iE0j;9+IL;al3TDWtRS1X)DHj6~@!$ta=nzp*dk_?7 zphge4{>Ron@a(MsIR+{ZvKut62QAMPD#6LH=`m!q&*L~Ns9bJbzz0Zv&S$60xyVxaLfuoyVuf$}i4TL3C& z7C@31s6K*a^?UeiGkuBDheuR1j4|c1eG&TQBZ%R1C+!xc;5zr z9SHmpmrXl zFawnrpwRc+V*+v-14E)urz$8eJ@#uO;s8|E@N2SGL3HbbO2;a2ZUeakItr!Y(x#;v`T$2Bl?>-bzsV0m<`gvfcwJ+nI4)ZqIcO-@Q~|rkoa-dn5P^J6CepM@+sWxu%{dh4#B0TS6+2+{DT91Kq&k?n#IHGIm!U;v41 zIfN+pQx1j?kjVb=1a9urCmakvAdw9U3yzax5LfY`V=-UUS$Uwzjz8BrrHShp$or;>`iZQV_8=68F(O8?inm7 zWu8GadiK^jcy!uA<;9+HFn}!Q*AQLr4T=NN28hO1xW?vZASW>}c=p!Ycy!t#$%9L& zg3UB3zdHW)1e{i39;4dIoP@W&tcB>eGYN1$6nB& zKLZ1Ujz_1i3rN*|P_+uSy3@A!IXFp{fW(ipMm~omD39Z;ZqMP#%=kGx@hLoqCrMrq zQvn?6zn;O{x6hw(F#M|mw;)-=A%@1lofHLg5_n{mfq{X?qtiAJqRQ_%2g3u1ao*24 z7#bA8Q@J2tF)$rxb$Sj7!nEV8wqPc|hG>EpIJhT5^iPA^G6k%Ffx%-pXe5+@fkDut zQ??tTYQb}ORn+^OgJDBB*!@)q(e&pW3=zSepmkmi2S9nc?EoYgJ$p;pJvvRB4}gRD z#{tMxKEH{`dUTpX<@ZD7LH)qz91IsA4w#7$ZF|na zkO6Xlpze2wk$<3)$60?tS)RQ`CLW!pAbEaGRtwNNhkX|CV#ZV+BygOS2fAbgw9W_- zna>cBc^MRgkY?$D=Nt?Nl)!-jaw#+fCJGLVu{xaSRw|m#{oH} zx6s|A(-bVfuMy$Z63}WIP1aI~z9@u`-4UxzOc1M06cMXU_&|$qAS(`jgYp2#lH;r| zo^voPsRlKmbPXX+3W69N4tG*0NFzvfZvn_jAbEaGR_HpL9Wcq`tW%-PwBxK@VCHew z8ZZqmQ47IL(EJ0!b>1M?C4(aY6sOR-UiAeB!v{!-Duht`|2YT41W1Yc1`(q-L751W zq>dp(H$UfKC;%lX4c#7ha5&3CJf#Hplmgf}pqi`D)1%WAEWfV@5zao4aQ21hV|u~C za1RoPAa_7l>VVRzgDTkhKM^VG8^Rr*5vlM4w4ia}7c@117-|Z4j4|9X1t7T!Ih(OZnmfr_j!3-AcH2n>UP|%t#kK?QxUvMydfkf!K7aR=G zvDnq1Ht|<lU@)rz2i>F>kXpmzI4fwq9fKw~{z2}7Hs(7KVcUi% zz?ut{gf|$7;?v}N1w-kWf0+Q#~WaWmeJ{EWdial^@ zehUqawBxLgz|7;USHLtl(Vqk}J&v<(gRVgIIL^BGB?p5+3fL_Z5Tdm&IT-#!5`7jz zG#uofIIvn5gs36N)JU+X972>EBpL!XP{3tHt&U!B+&W5#nU{1Xi~Vs?G_a zZn+SAWylmEP6iXm5UM6Z!89TG>f>f1P6lg;0s(}JT7@{lvm~JLeIZT;XNZFDe4Gpm zAY<(%2qz~BaWeQo6x`#3yEPf%)&QtmJ&v;;1u1~6;SLglFN3ld;$%1h853NCP~a#8 zU%ag+#K~|8qF^#e0i=s+fUrUqVMP@}fjq(l9wAPK-w+cLK?)#l;6u3Kw;tUZB?xzeJ|8EzN&$`M2*Q1FQ;?H^5z<8!Lnye7P;f$!lYtwe;4d#c@=qZYY!~EY z5QQjs!V3?{or3UKUnU5Nb|ell3l0*}laHCmjI^9B17K zHOb>R>pX<{Apbxcl@$oLq(0+dNYDj`OVBe82I%Ou{WA`R1>lm+bOXf9t#G$&hP$Nz z1I_aR2O;EN8;+uB3Z$SNY zaBbdO7~#=r3YOou91*0Tu;kZd-2~AGiq8v>SO&!>=$sFaXPpgq%S=Sbg4_a<=htNY{tO(l_rO60+6Mt z5Tf5fBRk-b)y;r}5GWsjD!1dT*>K+!MtO9ag5~$EMuhBiNdB1t(dYY&gW&@tWI^!> zUH#$yjDz8UJ~(x{fT9-C26aT_A3H?IT0=t?)CR4F7z!F|fjFiP?wA6QV?gr!nyhyq z${vEl4jiKUpv<)6te|ubYD6tX2+aaBJ&v=2(hsyIZTnBxphI zf{JQ@?1KcYC@Abf{mA32OrSyn614B1!uPn`0S*5_cBpthgG>YSYubY9_T#Jt@Ww?^ zl1Ha$?n`hA$pKa1pwao8(54w^c=IPKXj9gIR?r$s&=}NqP`A#b(-b7`ah&xVD<^pK z7${w_LN;!J_9w7$g4ck847jllG!Ala9Vi^ZL3Dc^d=FH>dI*zW({|$*kh1MxAj2gd z`$6mJL8tq8^p=CiKfZ7<9AjPmg#&Da#8=2XFxdRHAdUCdLd^H+w7tI;JjU{5EqqY) z;#v-dhM(XzwB0&L>x*C0R(=CWqv{5Tjh@X%Iej{Hl{SD@M)E#31yupOM+8ADL3x*& zgL%gwyyXzy2?%c`ga@j#_%(P}LwIK(a%&;HbAsS{=dvIt186jtUxT*k zbgFv)=V0*I2TDcYvZ~Xx>OZ*hsRoH3XHEFe!2mj=2(%yXKL>+BEjX;K{zF39<2bAO ze+~u}h^WYa4h9Cuq!{CW$Uuw7an^VLI2ZzI!DBtFaS%h3p|ZzW6QPdr=-t=>O0u1% z(GctBfK=`Sjif`J)eI6i&g$@=gCP=Poh`xJ*PoQ;
ENDSC_# zwAet?_8dgi93pxF#M4y0385Z=C_!7{uV5#F${SGma-3D{D6f;CfGF9Mejh-vf>>?wa314P@T%a;N;P1I{zKmOp*7HQ6YX!*{k0{if@01D()=@ z^_Xvb2bFj?ze7qqw;vF1^J}U;2OIqsW^||RyLTX!@83aG#=M8Al$HGfGFSNr++2Q- zPE&;+Ak~T>LD0HRgt_P6gH&IA4_D3P(P?_=JxKLskRZQ?Xp9M{AQZLz0QP~?2Z*na zvpRf$Yhw23GzG~YW3>YbdK_n6{Q>SE9k7FpKz4(&S8ut1N2jSi*g*zAI2b^~3v&?; zs`~(PPz%Tyh-wy(PSeH@AO|&l;9y|l7Zm*ramf$3OTNKWH=k$q=(GjNA7lLjQVnWn zeT2G1!*r1`D4CdAgB|1ubI`sfNHno{^wzO^blRHy;9zh8?PulzO>FC~{S0!@=Fd>i zcA9Sa3`)^0Pl<8*U-Ib1d3AKEQo9Jf56ZYs{b}q6@#E>^g`Ao1eh^z7b>;#DW};PE(M4+HuykAW@JLrJh0xEPhSf z-(b5K!37{__`3*H68(eN1=>Z=08*a?wToX0aX zeofgl@N94ne4?=kT>&;96e=?y7R-eY!_Ed71qqcBk4{sNeA;o==^#;1 z#)XaNf%Jmfo*u_pAHru%?;|YB_2@JO$)_D>y$!a^<2b7av_}AH&%L+<3Zi#+Aeqdw zw+z%meSHU9p}hi&g4W^Pg+u{J!}q%&4S(-KG9wKaD0Y@`vP77>9^RZH&PE*jBe%f(XHdufaLw5^-Zh>OMeh0l6QP z7(I@&iv8qZ*Z>h_{>cG5)u7-fWF&-NgEvqQRABRZeFJ$s;2YHAjVD1RwofNmJncAZ z`8QB}A7{-3)8IB*9GK~GoYfo505@zbzQOnIs(#~OfOf-$pr(TMkACG~C;;_KHFzbo zKm{Z($V89hta;yH{>_1@ZafGoAw4>I)4p*qcscX=XZ8FBPR>2-AoGr~wu9(n ztc@Tl?Ko>Ch-Ns(S^}bvvF1Uj3<#A3p<*CZ7>MH6WDQ^k)tRi3kT4KZ0|$jRgff9p zu@EW^LcNDjHz3qPHE{LF_ltw!0A#R^`5(M*`{6GKc(BgnIP2G+9I$b@Pk-SG?*HWg zkIQ)+XT1YTPBP%2eE1h0*603mFf4=&EFS*J!H^&aR&e1jq+awm&bs$62g6E;f>j7B z_Wy;a<28Rd7&br@O#BI1fZ=hRb=_Y`j}|m8^Ou8RD?~vBLc!d>@TDqUe>oWTLlnd# z6!ahzRQ}~)I0I4O_LGBQfjroe)d+89{N-S{2~nW?lY>D4G6kRY7m`Ln<>X%uhWii& zBA{@93=>EGg-_DC{pDbI0a5V#2Rz?-AOgztF9*Xnh=NByI2aTlr+k?Ig=9dF~(6KkzW~1i1m?oNIsJ(Q^0?Jk&vr zQs~~&qkrH@W78iFhKmp@#1STJL0GZy4+p~yh=PCLIbb{67yp5$oe6(9z&qPLj=@D^glW`q?5e;|DdkK?Sde>fPJAmd@P z5DMZER``GngD7Z3DDe9OA2qQCF(C>vzQaS(_76OPYyIJ1P=qM(|IWdXpaD*vI)C7i zCHaSgK^vmL>^nT|NF&05;|~Xe6GVY5NC70exeyAz|K?zDhbUk{C}2dm_up@LpuYai z0iFN?^>;zVCnRaS{S9}{t=}9BNj2a-!3UW@#hk}+)?=Vb0Wz9#`8Pa`9Qe(_kPESP zEkeN|go5?IIT(s-K;!;ZAd^7r2@qDU`VB8;rvK((*bP<}3{{tlP&er}Jk8br=3qDs zR;L41=ZjERg|IjMHwVK@h!>ba3PGcF+6a{i2orswCVCua1=VZN(-r&?!DRytu4Alw z7$H*}pT5Ei0Q2AQSXTMX0iKFVJI*>8q!47~1%yi3-|*^*>o*4jBcu-Bj!?jZFzV+o z4hG&@P^kHUO!7F+Ivt_z%P)9nJp9GMAP!ci3RPGB6+Y;6=NCMhPX6Lxhy$zp2Rc6h zRNj5%V0hpQPKP01A%Lzc3;}gJCvU9eB3Q<2dV-FYro86A_eRzc?6HL)sL@|2V*hmLFri z4jQ8JIL>+!G-Lp25iWx=(~h&w1~ZSd_JV0}8>$J+1nob02T$5D?>HC)Amdz~2vM_l z91OgWaV}+qsK7f8h6>0y*Wb5r6JEXLV0Zu-=emv%J@S@=p#n0_W%v#<&IQ^>A`5D_ zfE#bOLCh5JnFv2XOo#`*%5pFqNCb<1LWsVXcT9n|^oyOs@12jwk>Zf>gx~OD$9CuNv0G$;FVif#+0%~Eps3fR@ zbRBn5iFi=&!Qjy;q5?9H!=v>Ze+$H*92E}V*0=n9Aj5n+k9l-E3xJL$^kIDIVR@of z(X;t4=T1HPI#+uHyC zeHcM9&Ky3P4-8LwSi7h=@Xt92QlZi5qhjFE9in33(Rc(DX7FG=40Y9UkgFbvvNNPj z0H41X?9u!t0(`n(jfw@xb_b8{JPwZ?%?zL;-$94Exu__B0?Yui^~yy>;}bOGBw!&Y z01mmtPFVCPQSj*Y=5Xn-;qdtH%wc%I!!nzLf64)m<|7f& zkVFGE9^^MRkl*;_T|iDRQTYMV{=uW$jpOhHkH$Bk2nC5GfQ-)Y*a6z$4PKJg>7t?m z@}&gWE5}__6kwh+U~7OR6bn#4&!?NuquWiwquWmb6y6-5v?Ac!da}e95=*TIN}N4A zFM*sd0QQcHiUY{p0MIZI=rB^B-WU}HkKP&;k6ob7>`sulBj{{12FD=B;4B940i_Ct z2Rs^&fE;@`4RO9F$jun%PbU8Z<$(_%cl>ZQJYaahqw|_a=P7QTYJzWb(fqpb`Pu2jI9kaNI@Z1jyNtxIl9!I08CD zR8And6C48%KymQ`6a*Jg!WAiXfWo)=jRz=kF95k=g-7x~Xad~8uj!(407P5>5f4Db z2YyW!6%a!JL@0m=1CQPkl?^*U(_oO)BMS=C2ZjecT2FfLdxFcChT|^a@|WSYf=B1U z&QsrSfl}&EP>SOBy8sGnP^rw&8KTkw(%b=Z@&u6MXLvLp@j!8|15$c`r4Qur17%Bo zR>K2`^ad`kz~_Z}G`_K5WMJ^@gp{ByDxf5n;?ZoQdgK59{|x+nKR{=y-uB$10=B+?qV={4J&b|NjRS9s!^dumyBPE2#8{fJPpq>;)wmaOu(c9i!L? zcMOFU8!t6MX6*o7cmfJOQ0OOsBBcOiHHeV`agU2i1jLapDghvur+{1q@-xU)3ZTPk z6~Mvp0%Tk#iwcV9s^`c?9fQP{GBo*`o3R5~w`TKsr@{uW`fI=JO0S%A`IPiFYKm0%n zzb1<+$U$HR=qP9~17tCn0SZ|#19Yl%ipOylRZv)h1t)BqssNT?#&($6uTk05t$zR064%X#Q|dofTZ?=c;G{4 zU(8}>VDRX!QPBWJBG^oDoh$I75hT%EqoTl2=K~572XG_mxQmK~1k6krLjWYTAH>@S zV!dz!Y3;62kpP*g0CFePOkH*chW(&M#EZwEvr4%qcr?G!@a#P4*?GaE^P@-SFHo@s z)*#{8?Wo|ci^_-Y z5S0&|7Y@DszU1XR*m>e`ipIGPrgRaV<&^a(km~( zDcwiqhv7+3W%t8_fBhv;JpS%RDLipG?X8A0p)@Q_s$=x|LYkT4nE-RbWwTnnP0#~<;Q3KNHAN_Mdby* zo{P$dB92BMl@|;Q4fT!BK>>8|xd3MkRP_s_)W^JxBH@4>(K{O)>CSn|8x^l1KU@6mkN z!K3w?2fynL!%I6rwUCGA4G+mnF1;TAJ(_=*d30X%Xuio%qwCRm(4+aIxd-P({+6R4 z1HgPU56+9FY99Pc{xNzm{(rd!REUHhIK0tRHZ3bU{=X<{V&ewKs2N|Gw z5L6#9ct~FGJboP1IPo}s7))J$4YH{7mM6dKHBWw*`*0I(FnIDi-}B^mzUHC$$wTqC z;eQX#%MScgkNa?5_vyUX`J?#(i^stiOdgy+Jem(MdNf~S0A(uvB?s+1_?H~B^*H## z+_5*1aRs9XzspA#e%Di=oCK;S85|oyMP`HJ!G|J_jRzSRKG?f*9`pd62meAr_5Xi< z1{cl~oh~YWI!jc3d;%vbaFhG+1W0_92><=(frHIqw|JG^9_a~U60NS9?c)jJveW`q6Ne^^WeOJJz6ee ziI$5V&7f$x;n95Izh~!9PyV$ZJv%>nUVi0jc>CKy2VZ{IQ=q6p3RGWy=gYqQ&ZnW# zauFIWH$0CY1IGtuv|RS&cR@rfI9hId@;hI~h?es{o!5wrmHJ@*m$B2r5@uXoUc z-}#{7C6w&$zyOx@=se_c@RvQfz25vr!l&0oh2uq#38bSHlA@HB1;7VD15REd@Yb%Y(n|JvvW#9Q60 zKQv_&$$2z?XEZ$E!TBB3$^3r919ZeWNPmMz^DTzM9=jkG@iTZRUhwF35n%La{%Kq; zvdKi_ROdyH%P&0m*MIQ%{@jD{)8U4LXACd78XoZEUwXjf@`G;&9ens*4|wpq9`fN| ze;lFEhw%_fbb$J=jc*{e#TIa*#-no&xJw19QXx%zaGS+Nr2y0p0%a`_4H^Rh(V&JX zhz2!6K{U7ld)!5(fZ>%B11OP!mk@%QuOOWQU)>-LUyvs~dK(si+j=eFwmwJ=$W%~W z3}S=2r3bP=gEx@oE=UWg-AHUV1Edz*Cl-J?1vJA5c9R0g9iUb#xG!!1vC&1v0%Dzu z3g{GH23XJK1E|sL08;$`#PR^KUVvBzAl3yC%L2r@0b+rB>jywA4UpIgehn8DaMx!8 zzXqry)B=`^!$;)-zh)1(v5y#c+5+wf zcyvM=mz_P}&;$9l0A$JnkOAPHwE(ETm+)x4RH6zpPXOH6-4AL!LHb?bzAmDt1@7yD zB8dUk`2xA814myMe6a|)|Apw!gS%k@9?2&`UT*+37&|~NY5;L3bi1f@bh@a_=yp-* z>2y(<1Cp5la_bC_#v`Eg2QObh?KMOj?M3Y0|NlWIaDco6DikzO60ifP3GD$*q5>YB z4?t=yKq=3G5p=0)hm8tIL;xfr0TKZ>Nj*A`zhHqH3~t{VfIE)h_8quQ;L-Tz0wV)M z=WnpdEGj;|B`N|woh6V#Dh-f9$6Qnd)O|WlR6s^^fJDGX`*ePPvGULV|GmyXn}3M# zwo#@m}^Zf?C=w;M@oj z1!)2GKxaa=Kxmj25btF)R10YE5~c+drz@aZAT&%1i1!lY7m&%Iu^X5cP_AAC)dHbm zT0p#)UqOuv&?qNFy^Bi0YN%oe4O0x_y#$RzfXoNgc@XuGF6(@#76=W~0^+@#3N|0o zcCKgbK9$jE@KXK+zTSO?Vsp0E-IIDPsCBP_cgml%^ofn&#i~{Qc)3?LScF z1s7Ewpn(LC4;&l{K`RWl{q{Wgo~8LQKS(TKGuT}&DiILJvZ%lWAZZ4~gE&wNWLdY1 zii1-Ziv=tJqomyq7f@=(mUQ3!gbWinbg@W~ruF6HfB*kC|E{kO#jY;~mzC8ZE5W_; z&JYy~P{Cl}(Fq!#bpZ_(yQpxy?ECls|8W-;aE}=@XbP$e8h`(1XJ9DT@4RvF1sl(S z4i^=LhR5~|ryDwAR1~{iR1`o)9EZjpI9y(W(nsU(|NjLT%0(J~Gu&Wc=)6(H-}w9g zeGsdhb;sZT3=EwIK}r}H$}JAQF2zk&OYRN^sHyH%&lZ=qyp;=mbX>sPO45 zQPBXEFz!DfrJ@0-RJ3@R`xkVb4yfhEz~IsN2INs_B!E&52P9dssDM(HN9RwE?>9a8 zea?fD9b`xj#Bu-;0U#m)L}1kR$Dq})=g#yr2=M4U;raa~s6~D7g}ukYUrZj1hddZB zdGxYO^7wuO)XVH@VFX#(0nzFR?l1B8L^3ci>;sibKHVZJX%k?^T!fqSlgWeepii&c zf0)z-4@?_6Pl4KW%|AIE`M0qMb-0+w`*a?w-{jHyzmn7Gm*9!BJ5Z?_V_?tji9`6S+!Sg<#XnYFlxE_4T?9m$!33XHh;epM+jYX`(#YWzv z^M3g;kKP&?1;;(0vmC%-?4fxN6k^aYUh)+w#E`2=P+(c%2(0|C;J^}rr(UWA7Lh^3 z-vpYdfd>pf>^`m&p5GDSlTT#$ya$Jmj)JG=8*rfbbf&0C_;fyd(enjQxM<=Cm+&v( z1Pe-@NTYb*_6kb+-ND1a;L-ZO#KoiYw?}tBs1fb)|D;FrPpR@Ok6vem|0-usfLbEG zdsGtG85nkg2Fg4-kA3!7>d|fC(Om#e@&=$JZ}Hj$R5@;7V}PFK-J-IBje%hsv=TCa zF)ToZ-hL1dT>QOQ`x)#~kVBANx}71dvjse^?a}Ql;jz;RREC4@u(CYC-;$sJy8kH+ zS*Q&x1Zq`*?yT~#Ji*_(1|)R6MP&h!lV-3nFzkXk3C4gp3B-Gu0qS8KZ&4`#Up)Oj149=>2ehpYx`7HbV%%G!0vsi%0B8Cat3HA1P;QTd51GN~7&Pk&s=h#FA*ei-fMt6FP~In0@PaxDpa$77NV|!_ zV;@q^_xSz{CFjF3Dpyw%$hHoM9%#1jS72ZO7XzTdSOHl78PsR~{tTY~V?pT~m$97u z+gQXqTy*q3I`5Vrdua!akpwmd=(SNTDiLf93>RRb3u9P-_E7Ez@%DjOFFHOB&JfC# zM-Cy#crOLvBPS0@aRF=$(3=igR6N)i7;eDA2ga}f<-`3T-aZiPMaGB089u&pR1Keh zve29c>KuSd8w)lDhR5K*X;E=tV*u}u0Oc41h@guKNCCrs5bvdx7z2aH4%meX9+u7$ z{H^yyAOUWGl-)Jh7#LoG&2&*QfH5H19mIR-Ed$Y`fK;qVurV;ahv|VaAjJxZ_fqip z|NkKO3c%giqQb$(!0;KS2gZQ77sPwnB?=mNVgU8rL0xh1G@Ls~?0AdH2Uh6KFvnX| zUVzw*9^jD*14bwVT)ONB@gPNv`#Vqq*`oq7>7|z}+~f_=4&V(|1_oxZ-WHVyAU3#5 z<)UH$5p+?3cm~9S6x-k4LJR~M@bV`pNV+`)KvR++n?1TYJh~k?Ku$LRSvOg8aT!vf-WkMkOuLbYufZX!e0-jL<6?UMG zyGJ+Fie5(rkQiwG4Mc;kS_B6?v}W*V-U+JXg!o&HBtU`SApvqTs5kBbbw5}K!u_DJ zXpj<+fyY`@KvPwWAOjaLGB5~0{jq|Pfk7D>U=}cj0Z8_xA;cC)$S{FyM1%~83kn$~ zsE=G!3_vYK1yGfaT5CjugwSdYP^-T14JZJGGIT02Wvo8Y%E9!OJKRY1_jn06%8f^hL<9c zcrgG)EeA6wUIH{gV`iYXi$`~W0*L(s6hYkq5+L>m2wMQeegS3+z*6`F5Vv!R$_*w4 zhHnQMODsXjBLI}l!AYV;#eu^@>!>5Nf9^;on= zXAER28kEN%Z3mCe`!BLzK|BU>$O}0{zrz5e9@U6gkPuqffQ-<98Ugad%O9YE5|IN| zfc@8_vH(OMZ&9&eWngdvd#6Rkft3NY;t^8zKm=V>EI`Y2_k(!*K&%(1UqajmGT`Mo zaKOVe!3>b0ojocOK=knz6%AGfh5)GH2CUGvUdLTj3?PCo;H1v5AH)Oq(O=|24F?(U zvQUD7!Kb@G!l!eK$_-G#1I^Q*VHBh?=>$j$w0Z)xSflwLV+mx?19z)U16!-@%L{0X zwWtKJgY4Y{w$r!uKYt$|8%SV@$^no~-E&kx4lsQC5_HDi1fS0LFDgLIbI3XmAIrb| zz4ur_Nst+|nhca86+qfLTU0=4+N1St9XLrfz=NYjrGk}#!2}#kE-D5v2B;KZ*bm}C zf+qOI|Np+-I&VCh_o#qOWTxNW*4G=cCimCv!;kmN_#O>@+$pF!y+{wbgunHVMEh+{q4A7fdT~rJpf-c~) zfnh(02Z^f-PazHf8StVR)QCUcqN2b8%hxR`5-bc18^9*Is2IQ)kQ4^uK~h-PQ>gb_ zR1Cm5ZHo%Xp}wu(`1>A#oYuWY1>{u2+pi7NCV1Ucvb zVUOmc0zQ_X`FodwHM=r+bo+vrQ+0rqx2S-%x8APX0xHS{kemw|4+dp0aE5>}AkGEx zAkMx0oBDyRU5Pmf9ghz9kN znHd;PLS0zF%mD4PxTqLF1YJ}h{S*)n(oZ??7~(>ZK`)BmLrRM9uHpBC zcrWXDA^i_GXuklMh}LUjG*%ax;->N=|%yRZlFm{0>TEjZb3_-V69uw z&_7a52%1^~Y5f5WtqK+fh8bYDw5T+&AoZspg0TJ+h_?@Pz4eRt5C8xF)}jKknvuT+ z*2phlLG%?2e$(5xlMrWec%44c6r(W3H!85Tk=Dh3ci7ZpgTfOwEl zNw^P6M?K($w;rHXtQ~9&4A4FwBY$fRn0HXYqZd>tcAf)|heF3RkAufFeN-GgdJ7d` zT1p+Vqe_GL^4yO!QtSEs zIm$>a&iDd1Jo%eI7mq=wB1%*Qkk&teCo`VI$7`YU5vYd4hJiujwV?SLeUDD)e1w4` zxC0I*JT%{diWF!s{L5`f^{s(aH!3g_Q5@_BY3%M%0mT{(LJ{g;eDhnNu?qesUj_yS zq!2?I-v)(!=S2_X`7MIs1)bkA@Ptfifk$yPd^*3qICBdUP7=(BF*^Zf28R3Kl;@&i z0AoPvd=L-PdY=r^*u4jwTwf-G)-NA#QE^~Fm;xFq1GNIcX%@zSm;&OxbY+G2kPJZU z#j(ssB!MCnZ9w3K6xiayHy;6-zz3&x@O%XM-K>|}pn(Y*F9tPZK!w2%RtAP&u;Ex3 z12P;7;(-h7mwuoQ#PJrD14x}@(AE?lSX{ywkR~gL2X3;y^k-#Y04=R<1dTp=H2+{O ziS}szA9ESM{4cTEA6t9CMM;*Y)^+ z8rQ(&!)uVNz5*${7Z4NPD?l2%w}1njrojs?9EVn*_FVn{A2fsoY8*0@xPkKO45aX# zz|6p~AC{hB3`lwg@gV8h17t?`9`Mq*7rzNNov}4PUIsq=|G!}mcnW|4!A>un#m}upvI_Z}6HIWO+r`~UxC4%DayqvV(E(LCgl5$ln4Q+5$Oo1ClRS zurM%yMs>g~QWyi`OArs@%iZTefj43Xd(NCA*xLm+%+XunQ;_uGm=~_bG1VCf)7qlq z03I-3qH=+afx)-+34b4G$OSY21e&Sw=w738f{lT}@b>Fm(6IRgP-W7+MP&wvMhu&C zor9$32}lD!9V|pl4P89@|G#Iq&HWc0H~;_lfDODqu8sHTMhv<`ENf8#Ti$w`zpn^1 zbbh==WdV|PGl&^yN;>=h|4Wnqh~NeV4|psQG?B&tnjEeL3896wPv`fSr8hwfVnItB z89@8SI!ja#M;bs*F#wgc9iWA76F^I7A%_E`@xMQi#$WHEvI0!b@M!&35)ay>0NtC> zda0xeJPgIj$iT1zv`xfuCx|TJ@ZsNk(i5~Ht@T?82W9rfk2!5Cz&*R|5haeRb z48K9md?^X;je%WMqcXvx^A|V_UV*}ef9=0-H$5(cx0`GLr6BNLsTm*#gB!LW258um z!3VTc*rz*2clPTTk-0>izrw|K;6(|NnzrEe8s} z8K7uA0a|3M>;p<8J}L{Kc^l-A2@u)VlO@$2{CiHmt^#LUP`Tv6zvsm3dPnePRj|`f ze!mF{)DDn0CwO#T_qhBVv@!GY16RY_AQyY`JO2h1S}Q#Hoew+qRvv&R#>?-T|2u&8 zhI;ZlfA-)!1PXgZ#(A0g_y2!zA?0!Tg&}BLBFO81ltWmK@<9~lC zjlX`1$_5@#N27j<$^sZ;0*uiBTC5BjeF0rZ3hs~8PXSNxfi;4r4#A89W~d3E@p!NZ zsE-I{fI8z~251xn%m59bfEl0x7BB-e0t04%W*oo_(99c{0h$U1GeA?=U6LcOPWzh!H9d8X@|K18Jev`rP%^Z|JUGy?_N8|2ZQ1KK|nD&W!WE3pqG z;@SD)1&=Wkc+n+jYZqv_7pPAL%D4rfj8fszJqOws?}7HkkAsiXx%HwX<^TWA!{Gi} ziwbCLz@xVXqO=pr2TiGistq=f(?E*`p^8B*X}H%rw?O8uJ6lvhQ_xT)pydr7y*?m+ z^nlkofQ$ewf`H0{rZPNwr$85JIYGCsI)VJe;Bnju+%WJs4%!ID06J#`?7Yqv$g->M z78Q_VKqi8hV|BMcT+rPEc7aEy7l%hD6G$7_72Q4H)fXO}UJ@RiP68lXL5r_IK?QaN zXo(mzViN#pE;s?2>Os@X2B1-Qkib3=YbPjifkK@vjfuhVf6Hyq;Q<~ym%tBS=}`go zqCl|*>Iw-!lM|>nWem+Gpl;qos0ANj-KEZB9=$y(AT1!nHGSC_Kn0BF|0ABwf7tnZ zL1PU*oew+?K4A6e?qLC~Kma8hP%{z42j}X}9&lO&@j;6SJi1$0K)DJ~ z3Qmvzhde9~@%NU1rM7^#I&{ehcFZvWxdL?X49EtL|HnYXNnmF4KY`MdKAky`Gs8SU ziOQ#Qjfw%NZU@CS69edQ5(Zz(|HV!oy<1d3F7>qhT5M|gjbEO@k$+o^DMQB`6OfmT z=9qxI*fGZhfDGUl z=mDF+AAW*gum@sF^DzOC6R#P5GyI=6!SF4reh2<-_xQJM(E-`(V6@p`ojZd=2ZZbK z|ENR5UjvB!4h;Vs{vCH{_%FoYwB!H(|6Oxb@(-CMvuHT)0V-(w_W$G`10|F$_c zAb%Ro1sT`@;duN9>4*9UIj&x||AY50K*a(m;z98QUIBExMFq4f2o$U!F>o9nZvjup zgT=Zb+fh84fAI77>oG7eY!uKqi11@a4+|vXpvwLq0GR@bxE}&F4~U95kKQ%lX!GdZ zqXJ6I#g?9yZ;MR~52Q_S4U0fgIN@y7~^Kd=G(0uU1*@dq)b`G7$44}sEah6fB!rcFR@?1J?3Z~MT%twjW6 ztx+2|upu0e|A!iW85BKWIPvdb!%rdpCeT?WT|Ll9Yk@@CrL+k~JOcdNKJstt5dp_n zAJ_;82W*5u(Or+uHIP#pp~q%{gB?o>_vm#M@U%Q$Y~x}1mcJQP02v;bKrnc2!-5Ag zeu^GG`~ogS1(kn{I-7jy-Gnsp!=)OrHZpw<)`?m#PPExHL% z^~AR55}@jdZP6J()f3yIV}PnBwncZL#e)G9exL>&hz7OiTtVfrPv;M6)UzNnK_wGX zH4831LG>vUXoV8I_62SI2i4}Fem_VTsIUdmpi&YOHz4b)l=_lh<5n6F`j&%R99h z-7PAhIRhvDZ9b}?;uB;&RP6tOPKadl4~Nq8pt=;f&Y~*OSsFpwuUzIvrG>fOe;V+DDy`auAfDL33iDf(`11UJpi(<{uWv zTEMkO1Ans#0|P_zPYaLUIp7+Azj+!11A|v@jRxZ`&_&0ZhdlltGW_; z`^Q1uJgA;x>CTfLy?b~-Ufl)i#=ta1goB0))<6mnXx)bH&61v8kKsk*G(Uk#pZ$Ld4P*Mb~7X#IP`#}Pz zT^Z|0v)0KG$Eq8HrW#SyzK)J;8|8dXe|Lpud^I(UI44#_u1Jnn^ z)|3M6q}7xU+92wQttmG^)e~D&HbB)ATT=!=)e~D&Dzss(Df#6g<>^qXFXtQ^Wc8)= ziNRD~#s-j4Uupypt}jiF54QSp(XpXiUy8_6QeTz@jMkT+dJ!}x39jyrx2OLUqu2Jqd(AT=O81)Y$3541c4rXFOb162G68v_IA zA~TSBkev)r@fS$ugWPnX17gk%HU`kaz~HrPpydGzpyHqv0WkAHeky>9gH{Z{#`Zye zhK=omj(LHp2Zf0PRQ(J#2I$rDEh?ZeQ-F$t7DU0+gTnL!)W4wK66hdpko!SlegP^D zYEr}0gW_ZXR2+122sovHwt2BJFu>*}Ksz>I>OpZ@(2ljf1~uU{H*K+L*}Wz~Go=W?%qCBFI&s9+DL28lux#%5Q(AqzcpFxoUwFcx7kRhPa3lNQMlmry6pivQ! z>HHe3Pxe9TZScT}2J2HO7c_nXnqy;TV7PWL=@h7+0(L2$9&jyk510d~{|g$Mf%ktw zPV8<`0f~Y8zaR!t{omEl`W!Up1nvKV^n$zr>;Hm61Qa3Q5q4<*R|J%$(E7h1F{m35 z{a=v78u*(*hwL=}wBT=U!`kni>hb^o%WQBT*#Xwi1?fcT=N5PnuD9TOso!D0<$ z9w?STV_P8aL7jRK($59?ALL08-O-}b&&U$3U9y#juk3qQ<EvDg{{7OlE$CUDzFnY5t`2{v6GDfH085^3AFhWwEO~bpO0s^ zD|q(_s1o$-b_MS~0abvW-L4Ft(2eqtiVrfq4VqX5Pf&t09#ZuOIxqm_Uf4Q(!Q1uRGfLaM)2B_%=W`NomU;adroh>S$y?xN)72F7c7q5F%kgHmdYdpKd1w6a`CH8?h zzMVf_91(<+ui(}L=#CoDbTMe44wOYYr+}Aw;a*Ll=8ROnf` zfY{suKI9OTPe3ULG+GH7Q3SC;W2RV!7(ros!v(nr{Y2twiI>m<1yqEB7Iq^Qp&-M5 zYeNc&&s)GW>+LOU44_6`^HBxQ=07a_J-2@U{|{aI3K?|-r*Ba42xfrFATR^ei~%!1 zr5Kn2D(1ipP&o)@fEuJ=21q-|*PzlB)C2*sL8U80H>9-0SGvN~gG~JZRgbT9g{cR* zYXMY!2hy4qki(HnSD1Q`&jPx^E0-YqOu#M&&2)hZQ;=(24gdRqRuy^f0k5@TU|@Us zoeBARfV2sq-T)f|L;5q$tR0ePA4Kn5eY079S5F4(Y<>;a{>^NlsdAMqp!ta@Dn~$6 z4|t7sXN$@iq~!=$3yzmB{B>~`9H80ET_6HnaJ+nRSsxs~kS10de|`^m6Hyv}eGj-3 z0`?oIxB!cQ3T?0msK5X-Kt%;u3e*;ZCkJpg!%<9t?Dp&q74QTtw*ql|J72t*%S%Zy z@!t+qOu%giXHv9+0(2)9sCWP`(JnwtPL!w=fX-O00DA^hP=HJUO{Rgp&k(vrED$sNa=|01iKql@$)gZKS088ujkp2bOP*AlCWvA>$R2PC;O3Vxl4$wHp zSI)xJgUZrHU)3ufTR_0OoGmb05d@6M}Qfi_7|7| z8h-#YK!@shcC&kS`(v#51IvTDCg(H9G?$at(nH3KSc%PcyOZ_?bh-Hy=I?}6^q^t})MNuYA2hw})42z-kQQ`;8pMN; z*=_B!9fPDj6&H^cRu~DDAbRb zA{RTLqv*ipR%Z|RL;z6n0xCmr6+4C#AUPFBvGZI8lsZ98Ttv~+>xk6ECBC&$-=YFa zN#H<-R&FiO%B{Wyd?*rF3VV|SECo7k52+;q>1XtS7j%K;q4g`|v}&*jv<_|oXB;H0 z;Ot7c5dt;?l=;A|5ueWIhTmSa>Vx;HLs}s%%RvX6?*O%BW9RNZjVM?^4O>}{t?v99 ztSL*u1&c435;a@O#_)0xaswAsSb;5~Njn^DGN|OrP5OoF5=eABZq^&od0me4y3sVp3;lwEg0_4?qnfDmNFWi=Jkp&%jNtuZkZcHDR|z_r2~;|O z#yvqa&UKb{djJ1Bb{>bi0n{dh4_~-|1}I8Y5CasjfB@B|ps@nbG1s6rFU0ZCt_-Mw z3ib%d2@DJjAVr`xkzhsO1|zW}7$C>M8<#FB6`))V8SR9Ojex=%WIfUbG4KdQcMo_- z6Wgjvu>Hp&`^~_m^Kr;tGuQ|QXf-CN(T-(RM((FDyYW- zE8o#~h*?5&A*fpdI`{)=%o7xe?BcNU{itX2Uk?6WXJ$~)y@0J;r(|USIOM_U4(H?u zWQ+sk2T*zijX5Jtj(BuK4+d|6Y*OijbW^~_f|5T-8)%pxstqRq z8~!O0>J93GHeY}(1ns^6GeFxfzzop-3orw;0Rzkc?Z5!}1$44B$S)u^XbmYSqk$EG z3Ii|$G*%2|fZD)d257_<%mB5b!3;b@%>-NpvKQnim>WRug7goe5zsvcGI;^p1OQuP z&<#1y+5>cmg&U}=3Evp-?Imc_EoA?X=l^4#miKBkKno*G84P+@K;H8Bf55{Uax`|$ zJ)h3!FP=?fVK6-K`V#2AGpMnkjW?jOq!V;VDd-|~P{4qq71W#nIT|#`1rqCmnE4HI zNH-&Y3uvCS;UnWq&}`d;hL3EZ?OV(Y44&Y_u^1Q_*g#YJAa6P~lqmdf0NI~5jfDYp z>J}&h82J0z!B+%AS}ukskq2BDK>K|_UV!fRvF-tHdail#GWgej#54h@<^;zJs9FUx zKxIFeL4{E^usLMc?x1!%DEvTf41kss_-c2UdQk1&Fa=UuOr-;0aQJ{+8w4I zRJ%Wz3^5;H?G959s@*3*)#Iz(Vd_D(y8~1`zSBDAgUz*d0jJ1_%O3xLW(^hy|% zali`bpAQMvwJEB#>pn7luarJLnKjHcp6egg^My`KBV$`UA zpY@^Czt_pAe-{sx`WH6s1FC;7K(jo)`WL1iRR2Dh4yhmU)xR+Hp!&A}svckc3sVoO ze;J_a@zuXD_2Bw<8pJ*L>R*_8Q2na_RgbU!g{cSCzZ<4P%*R*%!qkK6Ux%sS`WHTp z=4$v2wD1`;A@;He(Vqr&oxn=~Kz%9X`5V|8uX;QKs*q+OxN3$DXrav3KzoazAz)B` z1a+txAX7;m-O#gFKz%;ww#DAJkeV6XRqUJs-M0rb1Gfxfy!+=^DpuLKq-ZnU=gAVxWYysbf2hk0hJtww94e9HG zECC;w(hV7(1@U3sYOo^^2du!(T>+2HcK3j-#n!C`P0WA_Owjo%@NP9LQVq=t32!Xj z>OKWf4GlYYB@3y7CT6n6aRwwcf<{e|dexwTR!}QzBRi~uKIYl{kAuHg7F;oZK<`yU z22UXeLx6%Alsd7kw+Gd#AbC&)01kdo$qQyc(;d=4DyV`5OF@VKTflRRh((Ox(G4Hy z=nD1`Q-tCc$m|7Zq!g5AK+E|cIi|h^d_E1>B2X&@%%D>h3APJVM}ir+DsE8L0xO`C zt3c@xAO7zYFkKe;eQBZ>f6!wU&vvxa5)jbDVb%X2!oo|A(zg#?2>TB2xB&fa)fR+IG z>T8&KP<`z%2U23-tFK||LG|^9*%0;k>T8&KP<^ccRgbT}hN%bF*Rvqz>Ou82 z15`b}`WmJlR9_d&gqV-7zJ{p>)z=SZVAR(yK@}I$kc$Rnxdp!lWVHpq24t}XzXoK2 z6tt)nRG#r`LJqJ3@j-kZDuc zCI(P#)QP|T2UnY*Q{l;N2!N(c!G_SO?giTgs(ir=P^|>2jnTXEpzH@$Kqps$+yHVE za*M!&=oWzkQi}lGe8)VW2Xif&LOVS2K#qk#KCcX)CA+;4~3ldB{XhtOgDh^tg1XB;1axs94 zgSH^S)Pv?^80La&F|;{d$GxDXY~UU!+zm7rzepzasgG=fvLlLe4!8&L6q zJX7lds-!_FoDHf`Q@A2&_5F`biPX*Zqnos@zVp=7vK7i>4=R!6HhK4QR6VT*A z9XXJCr-l*>&>ZOh7fF>Y;KLC>?f|>L7kct=Cur{hXa*J(njmvP;}9U9f@WYrVulA= z4uCQ)f2$m5VN^Gy%V_x4@W5*+{%w#0J3Dx^L9PVdqVtx&_Zz5Iux?QSxuE8bPv`#^ zPbyfz%_+kJug`$Y0>>Jt@CGwLB|De_DsI6HPOt;On1{6**aNC6Tn)dy3}#|rKwi&7i}^qJ>P(QO zpml;eH;JhP)_@Q91ub!bY*2wL34isXkBgK_05m)VT7v_cpJW6rD1k0k?}Y3>1jiDn z@CU^&Xq*vy1pu0F0!{o6y}}K{~Qtv|BcWjho$fb8SeiXt?=hV?Q>9E_(Lb1 zAtw%i;|sL149oycOe0kQ$n^qP9%bqeNg+l}0a}d%)&ZaT0~KLlk-<=9fHDr)F?4bj zsB}WFGKih}0~OVvLpi-by#`RJ3|dCG2fVc!Z9LHcKAs5j7N{hKmA>~trEgj>>Gg$C zF=l-Mid#^N&;fK{qX#G`(d!G47^uDg?;GWBeG94xkSdIqYM_OENbC2p)E`gzd$)nK z!F&L&Kb91MeQ*I(wt%A#bT=EA0UDkMGe8}AFatK$54y_|JR$(voW_bcQU|n21GZ)p zr27CgSAwp1gNcI-W0(&u@Imc5u*sl?9e6G07Vu3CFF_YcB8_Fqqpbe`O)`P5uN=_z zoIIC_sUL9N0+7ctT0ekVYs4??ItYk=$bVU6R9@9T5W)|ffkH_ z)S{ev0pD;T2w%t6UgBhbaEXifY7TJ za0Gx(S^}jWJgZ8eRSSQgH&`M3%x74C0#?5e*B@ca1((j3(k8(4gVGq-4pP>6g2L?^ zG$2b@K{Hm&koBD)3CteNgdE6F6sRZ2z~9#hsx-PG)Axoaq4yhr=BGfq5$icYs?pbT zQdpV5dI_LR768q{pvnX$4ysHR5Ufn-(SJZ4Ndi^Ypu*+(8A>V%&wu~^cOHgT%%Gtf zydy~?y%PZr@BfSpi0fhYkXT7Pgr+deN`n76S|!0vgGvHi?1E|uFk?ja9|lWdPhvlU zzt0axVGkOJgsta4;z@Y?Ni3cC@*Y&kfLbP?{tKwa0*xwx#JV5@M!% z_bBTJDJ<_{OVU8)J;MS>lMPhf!^A=5eZc~7=K*P{+FQ_REuhvPsE!0J3VJyWwEPC% z8R7@s2L@h04(evmc>NmEfdil+8&JfYfUjdizDNwTzywrg9X`PJ)(agp?S%4?CLJJ)$-pH{0cZdmX*V#44{BYEu%&IAe}d`^*On)c9b;!m ztTZk{lPPAUaq9tErJ;ts(twO}_prcv7N8Ui>S=&70dmg*G?M_z@1T|_I08W#AIuz%_rt-vhc|3pCjYih>ts6F?Qo%VYmRo2x+OA1G&oZGfJF2}()e2~NW6-9QGy zYZKJnhyxlF_c}mK#RI+a3~dSZs~2lN{`=o~ zbhO@qEUY4NNi`_=tv`e69fy{;kb371iS-WSB1rQHsonui4S||LAk$-S!73lnnrbHg zUQcl41E21O4QtV&@*#ee74g*(q)q`}lnK>D+G13k6oZfyWzJN^I!e@4{{VJaVbDECg?yAkk3HkpvDj^ z-a%&sz}TRqw*jgibRPjsJt!r@?o9wK2?ibE4>AX|RM=rLB;$kbJAkPNoi}(8Dh^t5 z3_5HKq#m>s`2tiNbe{rDJ?L;^*vX}!CC#wO9MDqdge4I3LH9Ml)PoKseh3u@Etv-G z5C@qLT1x!^Dh|320;V3c$GUJS#2nC)Y*tW<=6H(=Xi&8QDh`Tln0nB12F7I&^`LwK zItdYEJ}AEkK*d4#S-{kTPG6Y_6$dRTXNQ`vz|O$104lD*&cFau4?4a|aXG|%3w8zu z&=F}M^Fhbm89>EBXH~(}gHFZU2o(pNT?JY}0#Xk;JnsNhJOjym(D62oDmXw?hv z2OHk@?fi?FGxO-YL67}2#FzEMa7C>LXtRn>ca2H~Xw4p|L;|(4K_!&u!RO3|mp~U@ zfX;Voe#*W>o`HeErSm8JKGV)~oYzWJ__u8VAMC)t?I+`P#_tXtd%)a-?>P>>{~rZ4)Iq1ryL5hZy!^zaV+jkW@!-L@27JYWXY=tNp3VO`_}iv1 zFfcgrZ)4GOO*?n=upM?Q*q$J3Rpzr}Zxwi%E1drnmAP+Hk90wJU3@<&v)dS?d zGgrg6u7=-yTmP3RgRBAtvK#+46AcgtWWP)2r_Ps`V6O7)WzqL&{=r@@;lsEGY_?B# zii!njHx8)R{JM662h`oWK{k45z6O~Cb~NJ+nEO37??b$RqPJ89RQiM3SucM0u`qxR z(gEv3bvwv7kh3~(I$nO}(y;{`Rxr1~&ff#+1r14oEJW^$f$BAo7|4^LVh5D6z+&By zuj!3pv%=)@UNb-}>E06wh* zb|0Nb^AGuYOPC{ef(9ZzAf~H;`+Hc-hp2&?4>cDgW_SR!pR2nElCBtE@^700&J`UY z910-cHUCiH@3{j?RGsf%l=yRJ3>ydgTkr#Cr8Z;(5d;LI2_dbY(P6# zkw+szaqrn3q9Wkg?V}>G55)E9eDB-&;DzZXN;-wpAA?3CVaHTKMjt^ZOMy1ndY~ME zin_73cMbGR!Znb4Jv$+1j)Gg|pk1w?x(<|CV9TOGVxYz#=-5%PBGA@WPznbfOXzvr z4SFc58)%UwgXeKKP#$OSJPvABfKNmPy9d7T88Rjc%5c~=*m`#Qad>uu&%Oa$3*BJr z+36?Y+3ALIR6ocSp!`a5Z}7nj-KU`5ApG2_Z%DmC@VFr8G7nY;2H5%r&}swN`UX%} zZVt3@02_Gtdi%inYD`~Uwhw=gg;OaN6B zrl4!0p!Z9n))$u_cgz77VVJc=+OPlro%pxO=)v-S=PgpIhtg^A;&i1aC@Vv1FG5vA zEGYX!>lDM=yFe!w8h(2rejm~f2bInnpg{s!3Ia;tpojr26#-Q(AU0@O2#gIXAQ@Ic z+E<`W3NZDc#j>z=IA}F1tQ`(oUmo0Pzwm$RzS3CK`{s_1w6ppLwZ<1u?ymZ^nnJ@L8$;VfDTFlpxh0bAOp#RS^(fu zgW#%778Otd2|l_TQuOqI??(n}Mq9TDSBf&W4qDd-Rt;Kj17?8g3NQn{_6@XV6)XZD zqYz+)9`>yOV}ODHtj2+r0d#j<0H{aBz`(Ez)WQN)@t~e3;UyZK#>XZ zH&_m|W)HLt2HepG^-Vo?fJ#MhiUyrb23kZ9N}8Z97g!CbpX#v#v|XPEl=?a$2i|+^ z0QH5y{mV|so#-Arz&o&^YCyeJ53pU3Wmb?w@gdt@KxTp51M00pbb-tQiGcd79y>s8 z0r%uOAqVGsfV!IC^-Ul(p#H1J4v<^Gxdc>tgWS9mjCyL$o(KSpx!LR?J)m=`m_*NfNTM&0rhMlAqVpfsDJALUa{0pw!C%aTjC(KO|HjZf{Wm^?N;bfcypu2aqmMR6uM8#WqL; z)CY#d3Czu)o-o8;;IgK(MFrF!2IXg1X2SU>wts-EObF5As|

AUA#H&)*{gik39~qA%QO{I4H;=C5BOa3S3jr2ngM z8vpB;pZV+82wcbpi+qz#Gk^USfeZOyk?+iD{I7q1=C9u)aG}_f!K3+*fJgH$ z2maPJP&48GL67DG4j#=v1^9bZK?0C&dk*M~2}s8Q)IJ7vviP_4sDO%A!vh}8Kjj_w zfMNsG_T+B|HH|=*>43Uqu7*$2Cb(L>;csqa0{4_l(Whng#(78R&g0o`v1Sy2v2K+xlGj<-+py~%yL=?0CZ&49pWnggZbx~1pv3SAX%m&(E0zG@fr+W+dfDTXq zy%vJ00rB{oAAv_Z9y;=GJLA}S#G}`Rm%*p=lZWOhP&x#6bvqG9;DUpqa|$>pz`h50 z63l=E133M3n{;$;fp~uk#QXmlKRNJEI^GH4!o2^Bzvm(-j(hj0kP`%3!%%{Nzggw~ z|Nqcncq#E8G+YfCj{y18)#6QYIjGqSN);}h55HY>VR*^E?PPBtWAiVCBGBG}FCM)% zd>*|y7L11fJuTn!H}3}@1++%Rkd=YKgYl(Dua1F-oQ+QtF}k%cJ#Dov07v{}KU@)=MSahTmSS zzWfh-ZYL-)qbG3wZF9h8AAHOVk_JaG{1GI$~H1YxRJZKFCYPx@MIE00PaSk}q!xKCx^FmS&^u9gN zqHQ+lxN+|kuwsz0$R0yA)}!A_h;)FMA6Xa}Izl=?;~71lAZ*ZhM$cymn;DuNYEFRHJ%Q2%c-<4c846uq z2)W@8d?pusEy_;xUmrv*TDXm1aAI2;j#pr#u* zth*iI_o{kyJHqc(_2_2w==S6QDT8b=fgQOA&8U!ETaSAOBAaKo9|vTQ8T9JZ7BcTc z+cg9118C6*zHDmV*?*wRra<#ljGz<^YIcK~5FR@ip}@1#-NLie-N3WcUBk1}UBR={ zUBa`|UBI)`ox`(}{aA}iB0B>E6KHAx)ISHcwID^q{TGa>pka3G*PMci9oTJ!FFMjd zd!gay{v-AY)Ap)D_&6%aF`(hL4|5=8Ah=ot9T))`pa6APK?#rGou)zOP|84XYYD#c zzeNSiM_JJcI-df3`&j|vT2pXl0F7BdiohPoL5QG>{J?HN+gR)|v~D(i@Z#TjmL<+flg3mUCM)jah!dE`Q)Pu^Wfb|eB;47bC>Otkxfpy^W2|im4Du_Vk zBIqX4-ZhYR5^NN{J4MCfr4y*sg)gB_n*a(^c&^?F&D4w@ogNk*ogM}rogNwogAQc6ev`Yb2qph3cX9tr}O;_9jjOrHObdo~|a@NE9i%-^dDUajT^ zuFXNq>^!^Oz_mGOeK-8>QOG47ptd9^(!sF>s{X(X&^R`j0ljvt1$MSx3+&c1T<4b| zZcc^P7o9ys-}{8D7o1l?E5Bh01(N?jTg_OYNe5Jhf*lDOy#}`od^+D7etXe#^xyw) zEh>-}K`&$&n7?%!=$sSK%`TuZS|$dDmsGeU8o5Y??J@@yZ44VAMI@+51rNJHn|wQ= z;-DrUOg*SbZGeh{id4{09jL?uHTf!`;-DrUOg*Sbb=UwdQqh`xu(^F#!zZBC2A~N^ zP+1FV^nq52SitAYq4$qM_7%H=QwB&8BKUh$a5nTnP6PGVK;u)Ot|`d5;HebQ86cnm z2GGbJXgHDqJX-)Bon~NQfTudp!89n1K#+mpk#>j%*yS*A4Uo;BpvEVtQ3j50P@fW{ z4b-KCx&vh=F=%ZYSRrUJ8<+tZM67R70ZjmaML_G*zzooWG>~DSaY2w_$6CN6_l*1+ ztj!i|44}g)K_dbD8mui)E@)^7qp{cvZ07wS3UmNUpP*)nX-~yH-KrL~Q0#F2@-yH?Y^XQpf(05QGyCRTusUS(82*!3_`~3k0F|pKVDp0!^+_K|A+_pzUx2C{5`DH zZ9;tpKq)_k~sCFLsZsE;7O7gPx0lMd95-$2AE=wcb0f(HUu^m=Vc8-4V z;^9H$9PLD6j@}5(7FcuigBL6-L5T@;#V70*duIM#70`eP$rbw0yu}_=+`y{o4U8=Z z_*)hKfUl_sWpB{co|xCve=uNUcqv2Ok`J~e7*z5dfJPaqn641yuXvyWsxCp(mgcVes8< zA12`0?I*DhwEEk(^TUhi4ruK|;;_TvohbDVc$k6sVF%FkADP1q#Iz*Au0d)^f`&X0 zElJ1%R8YGSGz*2?o&*hefW$!)IoR5h;0c}MkQ-b;ohwkn1I^~Z4o?S7Ab|oFZDs}( z&dIxxYadY89c%!RGc$~vAw?5tpaH2p2^nbk@S<%IT6=OTb*D^VLx!MIRRHP~e5EQ( zJ*ZSQ*aC4nzV;+cJ*ZS&uo<;f1$C1__CkBkpyuAoFwiI@`1}Uc`{==$6!|{-zgpmH zqo08((eqlU_tAsayMgYb2el~q1*fQh)<%Jn33#;{bTb90X$hJe2NmvM<2&EKcz%x+ z_oeh6kg>_b;BEeRvj2dNO@gLG!A-5>kRg9?gT5R2914(#Pv?8kyq`r2c}2v6trQgz zNM}%xSyYhFP$i|rKx(cc7Z})@t7H}!pinp3j$B~GAvITt8JXM&&2?A`43OcW^FWmo zsJVIsGBWvxnZNhQz>Q2I9V-FpG7vv7iKG==XOl2432st=GBub1s`4iE$7&|yHA6PC6G%!z|Ck`kFDIsM=VIr_J1X`sDo5%(!hfQRIb`ro!WsvRz(Da0UOhUj`aB1D5 z(g5n$gQw#`qc^=%RKN!&_HI$(04*5pU84e8wg_HZ>~Zh`Gsrujc{EU=4k~uw``>&z zAHen}f;KRK2FyGlV{h<-P(TKQ)^UTJ1zN`qaw^C?&=L=jdQhGNdlpnxfEkpGm@|2F zdx2Ma3veHF&}twEqFR)CaU&p}+%lQjJIJ0sfW>kOAGWyY9hbsmEKuJBL6X z_vy@05%A~*U3=Z>qr%~FoJ9pByc3kV9l?vsK_jmqU51xj4Nv~R&;`*89^M5B!=2F4 zqH+N=IU$L(9|kUY3?j(@8tnolye+c$D^M*2)&a6X6FQvRjhLke$%7&l)Sd;oAEXu}#;@t3QUJ076s|8tLAs&)b<+63 z7W9DE2Y|f4Ac-!>`s@x5MvxCc zi?A(faG9F+W^<)N6-3(sM-R&gd(H*1! zQV(((Xbl`_<${OhMGt=eQy#4+cY&hIgWvxmXtANCNB17coN#vweAFAXd=J!T1M5c~ zIA&mAcoDT4oO4cs+zncoj@#V^9?b_YfZPGvs13^M9QfU>;n5vr08$UO7q)VhTJB!7 z3gK=A&{#QWJRcO&{4LYLDF<|g7HEL!c#8^bvIU%oK*pb9OU;t%oP?~$e$-n@~?T~fCFg7TQfYiKf1nn0~ zJMPTH$oNv9gMk6uK5y6qHVwRxoD|ba&3rmdRQ7`m-UqU2S2hC!!%iWP7k2c65(EQ- zu;)&Y-3$y2MlYTUf$xeuIRTVjLB0S*3wSCDDVcbHLaQ5+FG2F4Q0r<@0V(TnW`YGT zIOssTctD;8&GUe40}Fzp8O)dfGN^fv3N&CrXE?!TaY0f@0SivapnWTh3=GFwR6r}F zzyS-|&Mo@r*GDb%toY{Hk;46WSKqi>f!50!8 zj@V*|!=w4&50H%qK-0yb7=lb+_NaiSGeM~pG`|VY5uhp?oFhJfY63)#NCWvB8c852 zcqBn;caQ}jt;bqaelS3b8U>`HMuSjMQwB~Vp!3Tb_JEB5#}_F^V8j#6d(PIs%ztQ3(-I=m=y%718JjWJMJ*=m=zkiyVAm(c#FBQs#k{7=vPX0jRP8 z2XH;)GAVEjUqFrF6i`S(V;Cfb6vLo%EkWJ~HFH3f2`q*UkTRnMq0CqUZo@b*fa(uW zasxSx6az5gw-S^eML@2`7Qah*km48QaF7SU0RpN&Kwj@`Q30*H2E`}HzaV)~Ky^3^ zpakLvP?kL2qQU@LKMe~+P!kOth#Np9B`lkiCc`QXkT6mJf?9WA^C6W6sErCP%{GA6 zeb<2+-YqJio)oBF1ceKz`2%BvGCrtcd07k&Kv4LB^n>#UDf%(OuL^JYrE(*MAILi( z_k+R!6kZ_jgZSXE>285v%Kd|bfuXBKg^?3fUkHL4%`h%xa4n51|=tFH9~_^g=;v<*ZK_6VQ-SKqouJ;3 zC$>B>k&}%9+@1n?2kd@Ocyz;hb1jhYLAr-Lf|G&aTZ>8(Cj$dx3CFP(l~e2>pEmCS zZ|!8@?*pCR0$OOe0b~$p&nYMLET+yiDxhI>P+|rRp@XZvUPu?jquY_gquUd_5UK!_ zxj=_NfavC*^*g`{`Tb9z_YzD&y#%m{-7Vl<9U$j}lSTIy6|gBFagZsXYz^uqn9Tq8 zALO(KP?I0DMT!gJv|V5;I`4aQzI$PCjuq611MN6v1Z^JyZ@cYmQCR@hvw{n{6{vHL zN&?96<1H!~95AsK6fc6xSkT^euw#z5s8m4J86IdkP-;u6^Ff2upy8Akx${8Yn4_Wq zb&>|mNxdy9Fy~Hy%FTeubQO{|Y=7LxLfkUrE1r*j7pboi#C9IE}VP){x z5ypTBJ<$3{Py*S&zyLbG0GtCr>n9;Y5!m}A;0`aS5en|$ZUEWW9in34(G4HfF#sjS z&K?yD*tiTR)%bMxKtcqe4jfO=r03guvLq2yuz>|z50r#}I-j5z1TB^YTLm%&;esk7@l-BJn;Vl$V~94QTG%T(5Mk;@^Rg1 z(BvcJ24~11$Z;2y3eZqJD1n39>7caB2tB$1e$yOC#kUslUTH@D7I2b2?h0!0FnAny zEr8UouApuVh!2|L2GJ2vanP}TAU^0MKoAWw3`Bz#J%VV^gcpd`fT{;AvH|hIr>%HE z*L!&!hphMVfUfs~WL<5@0+!hXxIr85_NahpPzsjd2KNVBR20CB_Xj|^1>_shXbeaUq(}oS zSKp!%z|Ft_8b$&wru8`P1Wj*F;Pr(b$DKe$EQ7~!@R%Vew}Rb)G${;n1;{+e^1>E~ zBf5K3K#o9~;sIOR-J=4s7TXjL*cG6yW!%uscA&9GZp3cA72H^N>w!*V^`8p~_6Z=5 zfI0-+3=D{SDzcHLd@g_*8^>EzKr#1 z0a=#R!ph*&`3qD;fi9V8{=>xI)As^&4m5PD7-;w(TzG*7*1-(W`8#4Bt-h=)|~!sRPuV>P8%t4l)Yc`~awB0ZK=pf);EyXwU)70Clgy3{Z~_%z$*= z;I+gDa0KE2eV@+npz;tj&<`8Z2Q~WPH;^L@=}%DsO+0`i3^eZms-{5f7c2}6 zunHBlJqp&X0L@l_x)oq&g8N0sTU0>(A8?ru*`)%x4jr_H{J4t>q|yN8evp4b0||`K ztPLu1!N$OLNrTR+ffxfF@a}}}egKW_*MRz7-CMv5n!&n2vo0W)f+k%+x}d}RJ_Y`W3#OnW`=DcD82DSJf`h$91*8DvI#5>hXg(m|(R>hmjw5Q93$pP9l(#^~R(N*1 zNqBaLDS#R%4xqUs4-f2P;>Mt6E-3IoZUgBA<#X`nhVBv-2hb^+9x#y?QznD+33wDA zbZ`l7H%fRkAAAAQ2kIVy+yv@cf%ssXI(xw9NqBa=O_lG(G@I8X(_;_@MEGt`-$g5JJc6L4gYnI4oUt zaF(d|Q3-$tD1U1lxRVYJR2P*1q!9H{@c<`Q&9;6Yzdup#AY_^>>0o}mC0NOHC0#?=o85ZcC0uD`ZBN|#0 zg7P0^lpf52jM9Uc$fNWiK5UeJ4!9TwM+mqJ3u*^~4tfFw2tR0y7E-nLsDN9E@CZqP zM+it9B|<<=N05s_Z9~uyEo?*zG;9Ei5YW&8-Uxxsmw?)y;P@a#H%5HqgT@y@GwWE# zqFBEp#RtgMAlHKf12jGh4%ikI(CK!d_yBnqB!7SlJiZ7L?r`RS6~^Fj1b6$7x2QNE z5AA`fWUwq~b`+`90CkKJVF@~O1i2^%cO5|u9VT$%hR>aXhFM@?2^wm_8oZ-3kD{^>(=J7y>{ee1epzwt9L1QA|@PzU~fz{QbVhJut zI8nkAG{yp|CKe!vC#cy14o}deD6a4X$)Ti8P{Rildm!D&Q>LKNB3O8WMvRCKPtc?* zI6O%)0V6y?sU3HCrhY*RPms$&J^%*_(tIg+c?4)&8=780fz{QbG7B7@TqxlQUO54p z*hl1Z^!ZRosT&VZn4szhDIl>;hk}NaU_l5PQoG^QnX`)AILb|;in3@ zi5=7)fX;`4LjX1(3SL0cjhGJ&faGj%F3`*YH%iEX*KQndQ4v6dTn~804xAFfQ*-bV zG6^1dAaSI?!#zz2S_K9RLeNSud_nlSC=FC!fu=aY;YW&IjPL`E|Kkq7ryr5hA8dXS z927|Nli=knNb{4RAnIyS;Q@yt4@xM4mTG|V^9SVo44M}Mhaz|a3>J#~t*GTAxQT_- zRK+zN2pZObg(PTv313LQL@6IZ-9C`xNHGB;JV6tTxWjYm2c+->`5Tmd? z&K4EWiWqSD2<3wUtE)xjEjT~(qJ$@CsRqc&0muz0(7YHpJi!xYIKmSohmtaJ%?>_5 znjHiU_z@kR@cBVfOuz_FPz>$FIlt=q9w|IQ{sx67I8c!013?R6K;a4UGDsd2SRKxM zC;q0z+rcXKrW|2%jv-p30h5z)M9|FCxJ#LNDd`3LA!N8;Q`VOTKxlC zy#^XphD9c5P#14xg34EZc~JYS12oJ7avCZ6Ve_jfT{uw9iFEtq3tiw3Z`!@Dn(qd`PE;bGkZb71RB6$;P1N(Du{YpR6qwLgA4!< zU4ssS;D(I{cYwyBJaA33f(->Xr^n+Ch%M< z==5XoT`#q78S6oK=ZGx2zB7~H=xr1SRi7E zxmK`hBK-iLYh?uarE`vo0uSV}Hw_+$v7o78m~#c7auP5((9|#}pirC!4RY!^Ev*4O z*9s235>4a)2h9wCqMw5Y68-Q1cixCT;R+fb1t|rsYKM&vgN`MEjSpk%rGv*)LBk8+ zaYxXCED!VvS5P7cO}KJ_hZ7(%1)6Y$!~uNB9UNKELKioC3Q~$O(F#gdpovxx-Fg3o=?2I|D`@NHW9^bjs8LI%Vnr zoicR*X<+a;?f{*_a)3@@fhtH)+5&lq0h|l9TU0=2qF6#sT`y+;-=pHf#=xKn;U8}S zZ(##Xi+*cS0hbOX+{ar~eApNmK!Tuz0NT?6nkxkjFo4_(iba&1C$$kgR|={m{+&4R zf(brX3LB;akJNTU2Ha7nOI;Wkx=ki`noNYvmc9euGm7Pig%eq|pZ;K4{k(HzX!dCp19;37YI`^@Yr=T>z=>oT73AOt+{cfaxhJ86dhF zy6ypb6sJcgY(n#S9m<5J14wai3uH+E=)ijrA7w(*12)$qzy_Vrgces4ux-j8z{wpl zp$TzBj|xZ(lyrW8;<4=uXBn@1rPFsCa9hU zt?va5%7eD#fRZ0*s|0L96Lf|UY(f)sc|+kg$b=?nvn=EobMS;FNDC;AC#J(EG(oov zHveVf@45RJX+je;4F)cU2u!De)qwWNfEl1mIlznqu-Ui^FvbHI19Y(lSPf_;3YY=9 zIs?p5U;&j%&^bJi4X9!R0eKyE z0SV|X1ekhI*a$$?gZBS|V-qwJ$jrb1yWj+LeilqUXcN){sDDBGe?iMzK<)?aQi5He z0y;knrXIA7X#;GI7*zj&gA`O$fe%Yv0zQz?r+1GEsH*~+E(Rr|m+4HP$qUH&+n5Qw zM@0fOt_50R4W@fkK)oZ7I#7QclwUxGfh_{{BS1UTK@CZeGeHR!R1|{`!uEh2X$%ta z>HH7cMk(hBN$=oU?9M4FkaZET7Wotva5n?zsm2XeD8&qDUK(^O5{QP}9KgW9zy@+4 zXyzI;Zx3-KD+2?}>mcQz>I|d^)S!ba0@qu;Jt`m{fwLQ^QP$a_0@?xrR|J~GCSm;q z*j-4)4aij>i($nL*dg6LDj ziMFR66#V=($XjH4U1*6 z0nh(OJ)8fs^Y^xaugZllKcM)U8Bnr=uM%y69H9-Gd;#ymHS_Ea;{esukincONEgh& zYYSN2LSVltzXq$>YgYJSX+E9LU$Esvnm6F805oz<;kPq1KlRqxdyVW3wkcDPv>*clFQgUR&ZhmmHBBN{CS5#w@tXD z@fUw!Haw8#!k^EY{TdWa`J%xf+J!%#Hw(hh5G@2TT>0PMMy%*cn~=tze=Ci@=rePg zBY*w_(9IIeY5e(b(j57-UZ*+oCp}K%&;JbKfrzBrY5e&=()cg`PU9~)?U%-%ehUi4SS~m%n`C7x)O3IGe^_ z@DwERB8~s@n@{`#FVh_PLtcT1Pig$=UqOstAmUaUfBOA2{`Ajj{ORA)_^)kY0fk_i zEC0WPX^#B=E_yT{;AsBA!QZM0>S1@T0q^hwm0F+ybkOL?E)W3?N6}nRC_$T4phk+} zfi&>?f$kpgS^AwlEg(_I;rT2zFG0luSfDdRr2y2tsi(P z{cBLx@Sv7FDDXiw`~zsgg0F^$sRz~Y3_Bq;IldYmrXEzoU)TXrkFSP@sRz~Y3!v)p z)$lO&pc=jasvchr4^t1S;T@pr@zwA!^`IJFU#XfmTz%6@ga^5Z}`vRP}=$0@|qovKy(V0pfys8X&sUOTwem3FUZ3 zuq!~LKb(lAlb|IB@Z)qqL)r`s3|OjukrL#pAJkz2w?&Dp`Zb|B4yo$*>HG#+O7Dd_wctb)1aybaBK>fyOl2(O&)@Z9@3S?U%d98|l*@#vJ==Lbsz6Vev6xT39A~bg) zwIx8iRzO-nG5R_PR8oRY+5!(FAQ}?asXUwjYDj?VbVySdGy(}b>x((ri8V^35|6hD6hK@;qMzhhzBtY2% z)P@CD4$uY!Sgd=F3g`k@@){7JzA2;u!3|zY2|7;zcl+T#XgtEVm{9xS_AO9+=ZhW& z(V+IjEeJzH^dX2b+I|3sBWn>Tl-^%T8?FZ0)99a9I0a{|=Yd^r$gW3-V_CneN z_}ULJ^`Q1c0#rS|_5(~ksQthIRgbUz08X>Xfb~RNRI%h zy#n3oqv4|x0B(STHb{Wo37VpX=OoZvH%P#va}W4NH&FD0j_d&s#h|o4Kq8>J%HIIe z`T%t*K_hygp?8p_pnM79gJusvtFb@}rNLu>;G!BfYq~KJrS$=-k3du3V8x)78=&D8 zlvz{IxhU`v3D6J%XgUK#gY3jQrU7wC4|od*ND(Dt8esP!O=o~y12PjfodI?TUB@&W zl2Kb9;C%(4L-H6H7+|dr(B1>sBnD_Bgy23%UI6WiN1DU{jm3guG}jAU&cY@!5Ume+ z@RgSslNq43=b*ilpczxpyb&nDgZQ9s2k5Lt&}1ekkU;4kBoB&Qks2eQwlv5j(5w;IBv1wbGe9{2WD+QQplO24xAlPM+rVl;Sq{tq zFRySlC5Y(i(Ujk{;fLsSs2OdTPjV!V-Fo5zLNDREV6x5_)fQog`0Wa|& zuSo;CzZ=q|0S*51%cG2kK-OJO0iVC((+RGJZA(}gu+OUqUjn6^e9_+*Ss6eRExbY? z0T+G^QArR3)Q$m-zYgR16!6?BXq^@#WL+0@J_Q_Zti_?tc4=zai1uW1x1!cS$oGL)~`+_FqK%*ca8os?2R0f0R13~LwVCkj# zr{)f@Hf*h!Txct%091igfYKXib_kSK!R8<>4hM<9(2Ih$VoX8$cDFy=ba>0sX&(#^ zfOLX(VDAFuD^Mu{E)c*sdhLq*_aEeGkca`aGy)Y9;FcBW^c+zA2=WFfD3REpnl=Hd z9(fG_^4b988XHuTPk^dNUSj}SxB**xfZQSgwG<9O)g!NAKwjH`+~NSWL_R>(Bd?JF z4fw*=P9V2vKrJ1G{gBcZc?|~g+6?3t6R0H>09B8?#shin2Xc$d05pRNRd2z9SVQ6f zT8q~LvDbrzfdSTX31DGh*Z@@@futUEXe;bg-wYN82GD80h*}rcMFb^APzwh%=?B_> z4_aFfntlP5r{E=4(D7B+{S}~vfF9i>+)oBF5PnoMY}(MX+uXA|96ZkrD)vF?8?*=r zTxf$_0%m}^k6;F<-~}^4;2TFeG!pd8Q)N{ygiA!t03UxRh#SxC7JD#k%)et?Vt zjq5}B_kB8FzWAok!T@S~fSXI8wFuBT?_HoSqDSX_pU!U}W%E;6zzsZ*(?AV7&^_^MD>H7W(5fz}FeK!S<|kOx3R7@$T3sA>j@feHZ7 zEn8qk;5v)=*(0!XkXl-xq6TChq@@Mg?*qEm3u(y+*urkuCLGLpBe4C@Iulf)fC3j( zxxwa*KwBiREExfX^PNaY8_NS;xH<4oJ?^pd4s<{e>|anz6|~2I1<~#TE$f7}yFiB| zT!iK{(6R@l3mHID^dM`#Iw0d=TRKcV31jukuDeBSulas$^~8#kFQ8|fT{--sWA2UiqrzAdQg!HQ;)Am zT>w=NDpFzU@fE2Tpz1+IDoj1TB9-AF#J`{-6{a3vk!k={4=Pe&>hTq+2~hQ*A{C~d zv?3MMX@Q?_PImbT>XRW&^nvpss0)KMcZgBEf)#4)BU36=l_ zT_@}Ybm$rwaM^~mtQfhB23ZR)qd^={jy6`Lq=23pG+ID2BG&ZbDWI)Guouvv*aanF zP#FqZa|SB&L8UFMV~k!vcS7?mjsiNw8u`W?PX3-`oTc$iKSXJ~0BS0zGzQf$AXk9; z%AnRhhz(i}0Aqt1xDTM}L8UQFJ-*Ud;Si)W1C_=w_4rET1gLsYX$(`3w={;T2bIP! z_4rET2T=8((io;5Uumpx7~+0VX$(`3uQX18st1+EF!lIK;{{Olpwbwop0v^!l#Y<* zr^zmlLFRyB95fRGig9pB11gX~f}klFkRbLF8B}6{RDnt|h$`GgGN|kVsRhl#_@@#2J%H_X4qvbMj=b z?By~G?3&ol9{7o3_{!yr&>W1TT;5}fRxU?V_kKv&s03)V;sMktpiu)*uNaiRL4|F> z5lA5hDuiL`L8A{2P;tCqqw1M{~EMUmS2O_av#CcWSRoBGy(5KLM=@|onS;i`{fI(FfuyXTL^Ws z!DU6hI3;DpMUT<4g1EAx+zWeIAw*(XF$bFAKxGBegFNUpM;h+ zr*|TkHhaKpPtiv6G-QbCPhJch$o}MGAxg?3SC`SUh`6%owJW47f(-M4ny94oA}yiW z7)J@jr_0LVu^%=~;`#rGNApny&*neOkp3iSAQjyH1(hIR2B@zHW`OcMm;q`)fEl1t z1Iz$5LBI@7C|0cu@pg_??E#JYsH}r9neiZxVueYwSm4g=r(~DeSnu`>_KS~fqG0R-6v25 z8qY_#4D#%J%7CO7yIo0{qH;qk5uqL|LD8}`hFEqP^UP8iXn%Vw?3UuL31mh zHVn8(+NTF^6m21@1I2g@(y~A*l0X(TYoHcI$2^)3D|j~lW9ILPKyDU+@+~;Cfu_O0 z3<9%hU^Va&2hj2eun6XLryv7C#TDpQW!Q3TkZlT32ZPSQfOVTdSG>czSu5BeN0ET^ zf=u0T9O6OH87eUKAZuaWEYQ>*%zTi$5}@iqn^R%ppgRKupyHtW1YqKzdBOuw_keDB z2G<3kA#XOs26oUb&@lC&uqikOEe=5oQow!(&sFwLQ30*Hay9%0nlA;FjG&{TK|7JK zwa-9@>cZwrLE1dJT^T@kV1TECx_!X~C1`8~R8WFuA;I>5+Gt<~sM-QEKqVxY0UBXK zy2b*s$*V^NvLLFy1-#%3tPnIl<^J}nrZ-5krpa9_4VD*7=L3I~sJCKYQs6d2VvIp`TcvThXAQcYij5cUq z5V|@5w6+P{f9{^60vgaHX9*0bY69gg{&vt^fsmyzphYpT`}0uN_ky+~f%Y3Sg63(# z`&x26Sr~d*?t(_zK(Pa!jRj3KGC`AQ=S`1;FHJijho5+WdAc1vDi=XBhG3p*M~})S zI8U~tN98h{C)&}Yas|%g?dVat3gR7n&Dt?X~XeJkQ530uwP*8&IUj+v_@?QA&kh}%j3lF;Z2bAYPd*M6ZLc~EUS0MUI zKqm>;s5tPqE@5Q^&%1!CG}v9F-Ow57&Jd6?9~B4C*|icKf}nd&z-)nzKt?d9BasP0 zgYKJy93BihK?&qQkKRHSkLE*v(6_mFx2S}GEQ1(c0y8|21#A$=CL&Ge@Mu2t17tdQ z!Wb0O4B$PXpavD>VDe6c=^Uh*&g0R1=nKen(9|<%&K@+Y(cPjFgU#(cq?#_^(R}Cw z$aL^Bq)y0L5}?bMu$eAEs_7yg&4=EAOa~uz0XnIL2^=yh*i088)pQAu=0h()rh^y6 zLC?hi9j}GWbO};Tm+@#m^aNx&csU)&?JQuo=U_8k2CwO$1-GEm542hrRQQ1wb%0u? zpw+sdf)gYU=EHXb^{9YKUXVISQJfFk@}mKf0k6k}7uV1N9J(h3X}S@#%N3OOK$iwV zio6`qwM3x;9^JkY`#>U~)tmcSAnh~oLC2j_AO{?GLNDIxoB}=Odk$o99<Tgj2^HJ90g3kMex8*>G*MiPM0nwmR1ax>UToQaZYcKSMw9XzC zFduZh2>5IY=qNtu_)*W}uAr7DgD3PFAW!HuK%UTRfI!Qi!43gc1E6MWcMJF`Ca{fA zKG+4Ig}9*0sXKi+JUd;%(+yxtK?jR)F)(;``bv0qx}xkZ2H6h^W6-guuzDVJgePp3 z2$!4Iruq7p8t=58r$GT0k|jmkCne?=XZ*CB!X&VP*8vh zKG5MCAU3GNW;g+HF{mdATSo@!elkGUmw`sWVd_CW$p)x;P)`!Hx(Z|tsEL4lmJdul zs14z80@`!}1rxYI0rIqO=R3o<;6-Ji6=vX86?{)W=tN#{hZ1xE6o>=vQG(Q<9Qg=Z zB?d|(pq3asRf2LG$VH&+2dcqACm(_$9=y2+x*z}~56Zz%`5mCebl_DH?4I5J;CtS| zD+8cckbs>GDgZ#*Km`I+8wb=_i~)DB22hCt(f}$^pc*1Tp~b+!uuFmo)Ykaz+xgzN z^Q&*?Gf>+R)JXQ}d~W#dMVF@%mO3-vT==NEVJ3#A|V2AdBdJP~yA8S#uWMg1>z`w0UMUf5M^soS*UH1HiCb(Y; zzJVh|#RJrcGj{_u;L z1Nj_u`Xi`t?(PBa^#KhEfC3XdM+gcmaHxTUxf523LZhp*MFkW^U+| ziU#;FE@)W;o+(5sUy&PbAjiSGz90^$yOi=DbTxSk#jh>6?myGQlaXif>>4uDow$W3OYI%mL@?h6Ho#M^$EeA=!D$43W`_I zX*^(`gBlo~$K9YMsT*jlQ{@I1~2N@Jk)y#*jm6F|;@otq6=Vb=ma{~EMm z1GIwAv(t~mvy%-}@`5Y}34<*1?DUiH>~upZK|%I{;u+Mi0i}2l8`KXQRMN zGT4$+$gLen6L7mY;3$zD;5$An;`*o2Ettb);t&Px} zkE76fB!V_uX^1>52g>Z=R0L|Off=B}0n7k3u)qvZ@d9RmnrL7KNHHiYf!cMTYdb+~ zkVyxiPQh1b!PJ9HU2uwUp#@V9a+kp=XrTq#q6T&exYg9V20TLmIy?-tb<)-FiRXS; zLj`UB0O-;fSosA~i(Gzz*2#maGEjX8svE%;Kw5hBE#QrjU=h&1FfapDkboJWfi*A# zwD}A^ItHqrJ0X|TLC!3PD1jVA-l76(mBZD-8U#HmphfCng`ma`m;q{Lff=AS6qYh> zqZ*=&1CNA*?&$#y96_68pe6mF#v7;|fLsZ}nrxs-5Y}V^Rf4c48z?;?HQ5@llx$_r zps9o{kk$<77-MiN=KhO18%X&E@&l;h2C6_oX#`{ysN&uQB0%Mvr~|Zo1E~ZbZ2|FZ z{uC9EZ^65pKmi3V#84XZU=eu0L!)Af3MdA^fdz>-&?zzCovWbj-eAUi$d!lS22t-G z6_7H}MpbZ=1T^Bt0Li8BG7#iaP#L)TE2Inrw@o^yfH$*&5)0U%PRKcl;619KAOP*4 z0@3i3eR<{ojNpB0}jwR6XVxV>w=t5wy zZ$O9lLffODJ+BbQz^*_=+NTH_vLM)!gSrE$OAK-a$dj=49N00SV~atT5h2=h;Ng~T zh;`W7b0FJ6(GNPg6W*RGj=QKhKw5Gx zDjtw#9OxRg)1WfN1$^W(1GoX_qv8NE>Lx#ESL76MNTN)cKA>(Z4s;$A$hV*ZQ2^|i z78QI2B1}D~Kr}c5a(s&lzE&JeJ*Yrja2j8M=xX=`)*SNeypG(UV}P~is97E+z>*|1 zH$pb$f>SX(TPlE3PB*mEOGF6?)@{JZzyNRm5nWV*wSqdUkTSFLzTvkQt%``U5>$AA z;tAAegS7`?Wu*s7N0)+96I*-G!47+=>0yq$)C4u%;b-RGw<1t#=Fd?9c|483evS$# z@bH$SpjjJmrKH&do>>AbhDO*N6;OnM&4I@56ctGQhbUQFz=bHh!UUH=I7(KKFW@CB zhy%)(fgdO-SvM;ZE?JQ}#x1BNE2vHc7iyqu^tRGfjl1L_-tebdA@(lR(< zfy%TYS)v9hLrPRw$pGmom%$sIxJ%ZJ;KB(@$y(2a*2J7g-4Ycxv9g{1LBHqUN9GR703 z+AuoTAa{WJ)=+nVM%6$}$aT`-BGpI+Qlx^W)4{m~$Jik#tAQGKAQM5Yy@Fau#DE6# zU^nDo8!-f__h4rLjjDrhJ91!WU;vFkfy6KCNL3kK^DbGx1}PNPB(34SrBN9W<x_Zg96fmZBYUBjUbKK78Ou8tN~hZfx2NJ zUxS;nJ>aGMpjwlg6?_uJ0nh(OAPfJhs9WZOvK1(;gG#FfP^aK)#lqBs%iMF2tc|Y~ z3sVm&b3foHb3xNIpeYGZ*$X;22+@L_K<)AtT&IHyTrdM|h!R>j5+0(2D#R#7!G?m0 zQE<8G)A`@<+lyafh;oz6p-GyQpgx_y!0RiwsE}WN`gHyWm7m`&ahIQEdyYKf1Qlc2H`bWQ-$5^2y70*=1@ z2?UTh-QXDd z#M7OJmZ6~97uE^|)xPM1prEP{)CvWkxdFPsn;m*P$?+EOJ@lYK8AL18r}Gn{uA-nl ziaN6D)A=1#sxCBvl&av?Xy+DiivZ+2kQYEX4LrE&)A{|y3^Py`$Zt^rsRWm*p!Rnf z|KJ;3^?Lv*dBKe?k_T5e2qKld&_PV}!Bsp%0I;0X3B7`Wtf2s+o2pRv5jn_;)L;dT zN`NNKK_d{@?lS@nNPv<78H23$!pH?NXqJc2AS=TKPzmOuk^pa+LI+t(eu2^)Qn6c1 z-C`G%&p^He6}t*xN8ld{fT;%+yABsYjwXI^b;AX0#V)8Z+PejOBN%iw5qN$a^J)fK zl(*19xEAozJ8)498pQ-Npd)rI;1N4`sS4__5txJm>jsSy!ZndG#A*Rv%M2=$m3R*7T&wAaB~&$!2LFM!KGEQR*|FQ9b! z{s81UOJ@EaJ>)_gbdCzRi~yY^2xfpzVgWNiXAy!KptD@S4A5zYU0G01x21o={gdiVL2yzjwYbymVLkfB1BM?FE#dU4v zgG&(g$VV)Kd;>dr5p-e=sILlg1ITk5pz4v2a0K}k*R_=mQ1zg`0W5|=Aptu&613D6 zWMgMv)~svfiy111g%ybl+lmDdDV6CK<@?wz9osuDpXDJ@`X!r&n|&{fN@MTwyE4R@KqYmytR|NeV`HsmmXYy!%fWJle zGI*Uo$nsu~zlN8Zf3WgTIn?} zz%SUM0^0A!ufbXb<${*cg04MhU|;|()n{j50M&8eFz%kB0$OV6)A`+_^W}?&pyg=2 zTU0=y4I0%31rf;opx^;D=fH&`wZr{CDnA0WY0B-l76J&>Lhl z{N51|2ebw~^a`{N0dGH=q5?Y%8*EVL6cy09;U3*FDg~hJ6cvb@lJ~Oy`|sQN#j*1k zXrd0B=D<6=dcp0T78NiDrOgjH*BjJj1zidT%?6-jIU!rvS`b^<%u-Y8JGG6`+v!W(RFGIA-|YwdI>{=QGdFE8t<69iXxdTuy5LR{aKDl+*%I z+zHti0=oMIWj6?D;Se~yL8Cli#s=8Qv9K|8P`4LW@PU*&KpnJ#6}r>!c#8^1cL7v< z2P*?;xD}kwK!$<#5P(evb3gUm}uWwO- zmY<+tMJhkRq1`i5 zgAMAOqT&Hcz}?V0^5An{uzg#Z4FCT7bbdxIQ^EU?Ktm~@lnc6n9#lM`6sw>eO5jv@ zfCF?r^d1#ZA_q^{&bZlJ|>phO08A86MHln-_U$fIC!_)YX+Ye6?ggRJkJ0$GX)Epx1*;@fH=(-~p^?eZa`T04iF2I-h}J6;%9y0ui)K6;!%1zJ!;qpaqEF!nYZ; z2Oo4XeaY|t|3RfHtPBHd?rc%90Eajsgwm71}|kng%CKwYygFF?;Mo^P6A zQq~7lAcIl|cp?zq9<2Z`4TH2tK_maA`3 znE z#6iY^T!?b@0vDoOy@9*cI`t0&1GrEHH(8HB%GFEAhXG$wnm=- z-CNYV20ZK!zP#<=0cmJg0JN1B+|=%lQL%uv|2@0ikj6{gkj6`(YeZ1SOF;c(f`{U< zsCah!sDRh@fhti@a}m^v2iH-ceky1;IH>0a-d2pH7}UQ2DF*d7z=}bOEI`wipwSBk zc;Df@;kOrQUqE#m$Pmy>GbqP{20fbhfV(^_peh8EIbd}hXt6XnU(ukB<8Kx}NL2j> z>b1e@H_$dya0NwXzkv~{-vDZtfk$1|901pEzcUf_8@~qYA1D{vYXF5UQtbu~a`>pr zdymeWFS4PFyFr1EKI#HG>m7XPyiX@st-KX@IU#5b45)DnUICL2X|RAJ5ER>3Pc;Um zBlHvJ!DD-%UIb_-bmtyO*8^1ga>6dd4i@m}_LkTOa)oE-jTZ+GL25flBOTgn096K{ zS`Kum28iy?K^v2K^+NN@-~T?HZyk{i<^uOvU}G|14oW2l>d1gS1nRKBvJt4Y3gUxO zAE*NZRsd?~!^UL59s;eW1y?>TDkxnLP_;wUlED^8cM54t2ILx$rLZv>up>aXfq?vr zsN_IS0abD!Yq8D4g8LkxUIWsY45-5a8NF#?aty!GsS>(O}? zQo%hzs^GvGlfamaC$yx;JtlMG#pye++U>Y!^Dza_=Kt*cJ#J`YGLTYmjS8sr0|h@g zELAdV3``uPdjeD()SL#DMxYV~WEi}+0LtB9 zlR;xLpmG`3`~g?i-D^}bz}-&BA_!N*|DdC=Kr3Rf6w#oLDQGCs0=ymrRz8EqXFR(h z;@YE%D1>mX;9|@q!`q304oL+6xd7Y1MfhkG-!keoESjopRhA9AeYjh`T&GGebWp+U(T!G0 zOYeo0(vTj`6mSm*lv=?Cbxu(M4Nia>E}+y4Dy~2^6m0zb)r;D97-coM>x4Ac1LmU? z*Pu=n*aM($2B^3OWf)L#4dR3Bt^ki-fp+$T8IV2+#6dlfUKXfD1(vICQ33a+h#%_# zy9ZPqf;v~-E$}WL=+qlf$pCf)Xm28FaSiU=b@zZfcc97vw3`&EPXZbW2K7n6jyc|< z(t*?`0ri4lr8cMsgrn4E1n*zMEVbVvmD=F7cA#zvs96E)mM|i9OF+XI(83Tl+yhE~ z;9?HcCjrTK-gqH;9lg|M;_op)E43kIB&2MFm)f8~8*t=-Mrptd(69`c0a_IXDtSR; zJh0Lkr2GKXL7*`nm^euH2dFr4V?3bw!~>u>0ZmSUXn3=E3wU7~_EH<-@ipMlA#kaU zww?}FenZB8Amuk?{0G{;#xni`%I~11d!Y6$y!>WiU;vfhpwbjH$O$?g5qz9QiwbBW z1ymw~CQ-oQgjRebwvM-`fG1)=yK-T@a!>(+z4T^!2`arobqHGN4e~O$jSZR%f|cH& zgB594dNXb(s`Lg;L%~XK&{Px!ZEVoQ7g#%}3Bv&yn+F{_0*V{{mhNrfQoKJ7r4*k4 zaiutHWE51XgHr>@#h@W^aO)gaii3t( zI@dskTR?4WE-Y20yIYgE+pWC^KSe6QL5q_?!3A~<=zdb9X7>Z6L8TYC29<8SaCik7RC?>%`P8!$I;ivwx%39P z7*u-W8B~I`xgVeoDuKt_K?OKyS#;-(7a zP3pLa;A4!oHh3sxbX){H{|jqj;~5v3{{$5Bm@RB(*u*T6YgHyfi$Q$jBAZWRDWL7p zTG&{}MLL5@H8zv6Y{QxSCvxN=H;b1EWjf;S6L2hAV zme-(897YQpUS5+jJ_73Cf{I*Fj~7(rf*lBICV>PUKqV;p&@`mCi!|4Yx6}qTy+93e z_;?B^>x0Y&l?fmVkxK13cR{5#s8tUxcLsEfqhBIM#6z&>SE*rGcgp!3_8+b=XpL(1aqav<4|xxDIJu zgYMyjiGy?}K*h05Sb|Lk4by@d;I%N_YgBNJlYnf&UW$VT4M0P2ps^2dDGojF4%Xf# zWqbsj*O3N8z)k}f(MY4-DD7yBArk!MH+aIPM+MY@2b+zj{JwJ?RDOd-Nzlq~kca6# zO0txw@|(t^B>XLHOTguKp)X4LT?FOA%5M&o_1{=VM;=NM-|C(!OKkaF03OW-Em(mu zz{v?zeuIZjkVi;BBj^PuNhd@h%}|0WAW(}M zG)D+7k-q$$edEh>mJ=aDo*3T4O~DOe+V!GF9(1%6f(WJeEZEQRe7s8k2_1V9}a zP&a2TxjoCT|!R7+^rnxX5rAz37dA-KoY+f!fis{|A2b#N zDonAJ`k;CUHscAZi@=GACaVg6&mgMQr}l1|CHR-PQ+c?{)To7e95jsC0mj0D`siL8UyXoex%nI!*&B=rKxt z?^&R-hum?RwWl%4{?Tz7(9kFu>sbuXf?@)*7SKkj1&A4^fz<-|#%Wx)V5tQjpw$AD zjMKnMd(a5V254yy8mEDYgT`q-K*gy)PJ^fgK*JWWt|WMz26=YW1+;JwvR<5$@fuKl z04il+Yg^EVZa^D_K_e>Y^#R5x4$<`i`hX5`^#Q{%P<;S$30i#s3M4v@?Wj&Bsy?9k z*v_g+;QC;yHA;Oj4a$Yp2L#7}Z?zG$w1UZR?xtFNY8dR;&bj)T(54f~`Zi-S`zkqU~r8VI(n{Z~_r8Q`? zHS~O3@XB;evkL0gUo^bZmyCv601SIS4K5@Qux^Uja&MphFyCdxMzxd%VzQPbnFjffcf#v6%}{2Z6?B zVB(;$8HHPrLYcg=8K3Sw(7i!xpsUQkfeK^L-XPF&W2C{D76uUT>~;n3*MyA6xPtd< zf)sgnyE1r!7lcCwyFsHDpkfnTN`e~LU{K^F%5a)9(e4gl&=0j+-q zD?llgQI?W}XU5P5S-@J53T4oxtvh#t3T1GEAFWUZRROR<8B`6>YB&W_D1YuCs!#?k z=YSQ;@RJ0{+^C7=fEQ4#g5ra}rM3fHIC~kO6wcmIF0^pQJGAl~v|)4CUuFgm&@~3& zz}*5qaTC;F03DMBDh{EAGgxgN11Q4~TR1a9*H6O}3&`Ez!_Fb;2zdyla}CN87m&p$ zg)($8Id3PZbRc*1B!3rZG5K@H&Li+<7Kx)LpwI_p7mv<0&{GjwR7U1*pwGKOF##^8 zpZIqE@$9?~nJD!_DyNAVJ%N?e_(o6I7lV==sGL6L3AwhLiND7Pt(*ppo`4SI0qvB8 zM=xkN1YD+o#y`LetgBpL#c__FfJ!5<72q{0y=%bZg`gc< z;MFd$-9X)YR8DY$ju6@czRS_@Hf$?r8p?P%Xpj-MUlX*>5WapKav&C{s09@?VEaJh z;a~=Q1QRrX4Hf})QIQK>tV1ARm7qp5NTp}z8xL?jfMc@{STRxw4Vvy0-wGUR!)1C3I^uC`}T56c>#LJ3M;VfUncyZ&7Rpm(&ZiP)h2BP%f;b#y{u* zI&=Y4Tyy^*s<;NXrT710CjM4kP*MR$E1_h9A-O|1fCZy+`wJCjK5d zP?_Dk2YkB7F3{1XhTmS?+5jp%4Egx(y5G((0u^lF#_Nv1>31d{wfs>65&<0n>aior zf8|Zih8$jyhyiGq)DGRc-`A(5rMH4aK-tJ+$M*I@^#@bb&x1r9z-oGz%{-eDS_W?Q zdVodFJ^mMw=XUZmNKF7(#QY*-_g4m{)gX}wut<{1vDnPA&;Kt1f0 z2uP#@Eb{JCRo{eD%HKgE6Tl)*UH5q=p3+NhIdyvQiu*ekmeL7!X z&dLOdfN!wbG3Rpcv=5sPdV@qZfYt0xtXwX8GIuvfWCvJe#=AvQpJJ}<1Bn~}iyTk4 z*4uFU(*=;o39v|q-Qven(}Tf&zW^3FaW3X;4>QjSkeVA{ktypvza0x$y8|Th04(xq zM{C!;Ne}mcL|%YJK8x;--eGz}93=7qEVA}|HhXfSo<2zA2Uuk3N!jIVR{7ooi7#ZzkpGIw15uEO1z2RuVo{EL|9uTX zBH;Vfb~IWhX?~bc$pjJst>W?6;mh-7-qS00PJu)~H?w){h$%MCD!Z|N7DyxlY|e${ zEWz0;?f5_<31E>)kr98cIq`sfkpUK2DSBx33ASQz$}9kjOx3RZyoYPq6_Bn9u*fIb zPfuiBO@D$!8o(m$;iZx+{lP0iA{}56fu%WL@1LD@8zeFTEb_XPGv@4!9B`b@0E+~! zJU#F9VxeasH4DHZ)7G#3qw_57I7nm#SfuD*(DW$hly@MJ4PcQdG1pCHS0{nf;SR9K zrjpZr``g>OKxz(vMe=8FQLuf!xe+9C0xa_C&8EfNN-OF?A{W3SGgX$@95f790g2oI zi|lRgwOYTwcRNVr0a%1vO3Ntqs?;lx$P2KDa6si^WtnFQAdwGXk;&Q`ZcnbWrGZ3# zfJGiojE~v)W=Rf6gaI^7v*WYsw3vmtN%KJ>9AJ^~_)mQa7Sc~aA_8EMB3HK8K1N+r zK_U|1t<2EM4Ri(`=(J2xWmX1{;|D(c|NlRYKc81j8FUGmybA*Z=%_aqPyv<3|L34b z^8o?=)|dbPgU{mto!tZ~^*}vdpYAQ-GkskR|AX41;3HFCGJ%TN?iLl$x@r&O7I6Cy zM1$8`8@H%{FH{7b;tC#sWMDW3x$=Pld{HT=X$oe5RfCRm;Q*Z*_{77yMFliS>c~Ik z2v{CmJN7~ZLH+~tcYw}SWME)m1c`uZS+G)21@8mesR~*dwQ~w+e1L&L05qryIza-g z1k@M+74NWqJ(v%g3;|Di)K5_X_31#}N629`ZlJZT3?9ebKu5}fXz2ZQY#_5iZDFu$ zK(2>|1;{NRH^C000XYfO5&${CqZ4$)BO6#7Xs`fu=mCiC^po)D1Z}N^+77yOo)vM# z8fbFP;5KAX#eI=E? z6}I{Zw0{>o!T?%t0@@)9wF7ke8_2sZozFcw?|}jfv{x5oy8kptUFiA$xM%Z!2mW4d zcBC$`N4GD7Pq!x}we&=!u{$Dxl*YV75tsPE&x|20GUPWE-e;4Qg$J zTnBEp!8R3ws#S1kclLlsgg_AtI`IIk2$YIIIzfpDqDV(&7x+Y)-aX*-=+pVnr?*E1 zWb%sz9IOmoEh-?j;2nq{&0teNR&^lVdJO8|`?mhC6E!>liaQXugN4!K{{bJ%A2n~i zx?BE$attV%K`9kvKPWkY?eB%2Z3w#@92A!z--73M^CA0P!FGbixfZV(Dxh8)SPI(bo1y~BqF@ow$@CyoK#TRj?f@P32O0nY9rg#J zK}i%GBRwjhRbL*>KLtSQL1&Q`K+ir09b>8qQnTX@1L8n-*dY_3A-@Gsm7w5QB&|4A?Z##spRd29PcMtrF$np2IX5RtA2}78Q_3Jev1_X(q6Hm>3u?Ky3j{OZbD` z^9ad3ur1V}c^;U1Kz700gZ&aH7Zne%QO8|W96;vtx2`P%9kdR;8n7E0DxgL(yIMem2Z-z7(d_^p zJp}c+!AT9IA&o!(L>m8l-j%YT!neK$oIca|-?OfO2tZOMw2)*3YXc>cH2!+fy@b%E zdkP;R1pz1$!NI%ZEmGhR6Io4fAtr#vYC**qDA+*(2sRBGSs+^=UC>RXpkM+ypxZ~q z!=pEl-J|uS2fybue)TwbOu)nNod@G*kAufVJq+)8Fdp?dctFs@@P)_0qY57X5BgZ1 ztU2Lhc-zfnn!=kUI=dfZPTu;6Wh)8rkw_ zJ?R5#JTQXNq5pT#GF51Vb?<>RT)MY_8!DjSabaNaVEpZI@HnrB;eAN@_y9>C$B@&< z508V#1w9Nw9#8;Xy<&M5HATS0rXSQr=zK=oiR z^hTLZXbWH`ba^NnsOtIa_*H80dG(5=;{L1uwARWdO!SV6@> zb@v32c;^%qP;mk>5p=cys2K;Yh`<#P{BGbD6)=AX=n4P^1_mP!)>6;~O3=|hkmaC? z3ak-SErL=7SOe%p6;M+YbXX9`X3$hKh~GN}df4|A6|j2HN@GUELH?jI#>!8S0tqzZ z0UC1ynF$gHMIlHGWGSeg0=XPiM}bP%0#JzzT64vKO*N=K2dM@P`Gd+RP$>iodr+ec zlW+YVh{Yhk!q}j46{@5K+^q-c19i^9wJK;^1(NGQtqPFFV=XEmC5#}opsqd0 z01zA0N&v}wv>qs7_h_#0U?}B)ss-Q90g~s}1Q)I~Dh?jqB`O{s-BTbl7NAQdz{O^Z z3ds4Oas=dj(4EN^9-S;IFM?JwFz|;T09B*lMrd~nBz{3BA3|dQe54`hxD3z{JH1O( zKzz^;5?DQGRT&c^CO{36G0?@y-jgDQN;3{sB@$R+$5toubF%^=Y5GrtCF0h9}p z1*J4l6B-ngJ3xMCU|{e9nGb4M^J}n9fvN?yp!hXdr$V`)b_Tx&>oh1AR1)%Quug|^ zK@}0d2I~wc7u0&>*I=Cq<$|hheht=HP%h}G-!#xl5oQL4c3-gjL1_VW*d53mkIous z8Ylv}5q9)8hy&^>nB;*vBG4q+IYk9jV?ddS&YLgvw3txJB+x7^qlrrFEZ!;{oi>MnwUTxF%Qr#f3Onhg+eIRDQG4i6zQO;98hZw zW(k@Ajfs~sN4Y2y;C6SI;W_B z^@BE6a6&6?P=(LI!0-T68G{O64h9ArP*)x#un)unI}79lr+a3Mdz}#E)NtbtRMw-Z^@_ zMdbr41H)E5Xney~LV>IWoxcgbpar^14V=PY=Wl{IAm7f;goG{Ll~BD~R6xN1%3$E- zPN3453sEM31EI4Aa$gJR>@rRU2GBqecxi#-4iM9)^E)U*%#}tf3s5S1N-{pE2myN- z)Wd2q&p>2+QZqcbZ~_Gx6D)`JsGw$e=mZBS2z@&LgSP&HX751$vsGha@aW7@f%K3; z3b5sG^$cj3gIa{3`)t5;iwZ33fd|dH*QkIav%3d;jU8gztaB!4+UyuK!a;2qPzDF9 z1!YT+S$h%f^HUu4W0?N-IHs~Z*P`2I=5RSd8U4jM~?WpGf%0L$Q@iUgX$XEd>ZcN2md z)1VRWvcP4r4sDnGAMFo^GLApRW5^Mn|xv(-Y7=lay z4VJJXIvk*!2rh{_A;}0FbfC^Kq$&iL;k_-8+pj_K2MX10$mLw1SO7N+G+k5*_`?r? zid(RH(+N7w{J4t>q$hB^1>6FL^(R104p0*TWD2tqFt11V9u<(IK(+<(IpJ7~$|5!fhNYlB z1E^j3I21JTG=~d3*x91;feYlJ`W|o=1zo)d5&&I{15RSlqysLUpj`>aeIOo~@aVh` z>Qg*Ogp``#q=Du)b1i2T~;{tW{z!IRDJJ8TLD2E8}w`L@OdYN0m6*DL&gZh;|y^ygn zaGm_}#laIy44^Rt2aoO$6%VMO%vmM|P-ugV>zo5=LW4pZIw=9YH1t1crl<4ei`w&` z`W$p`C#X~f1s*7hK=}&fKu|FP76X+Cpyn=U+#E!ALM}E3m64#vCunw|gx&D}OHNQ> z-3=>`AgxZ2Z^1qUZ!bZsfepXC><7=YygvXE19iJ6eCE#=G5E}%A7dc!nLl5}FpdBHqcr~4 zM?UlChZqW^@xQ;E#{c@1NAocS{?-fN+0oZ0()bGw`la!|KA6T|aN=niKS(71U>bkX z1p$aCXdJ)rA_qjK?woJyH~tn;P!%W7z`spK&`3tWf#aUX|3f~OpK9JY@NfI~|NO!C z@}Lj|m38??+@a_EZVonug$_^5+ zpd|{ubD$>z$3RY9F-c+Y4#Gfbs%(UJ+#}80dywaEO8Wqab}Ay*{9Mryj_i zxu5}B@WempHb77Vws(pOxMzCY2~@u_cpL{cQNg37V6#CjFHjtHx4?Vb;0`S)XM?nZ zayE#D-k*ZhuLbv$L7~Ed=+}b!x(U!^4LWGt5Y(>)3G4&0!2McKVD(Rc1Qz&kD^S0l z1Jvw=_iI@YknwSXtB!8U>hxWEk12p5lnol=0<~s9Y)~2nB#5X1poKm>58FCCz`iJvwjHtN_(X;1j|-=cs_Y;-EzcT+jjp zTCaiYCXdd0pgjEqRJnD|fn5FrYI;M}V#|{|A|c5Pd=U_6>=CrCvJ;%CLsanONrmpe z|2q%EeF_>p1C=nK3=FD^CQ?? z*vvE1WvCs{$`foJXw(ZeKf=19VADaZ7cNA81a)l}K=UK$4j^Yxegp~Z1F_)w@qZ5_ zpg_G=&`=hr$7=Y$xuoWBcA)QgMNznUiK|=*lJ}4o8I)>nuDHW!; zKwVPQ2^Mf49ceKKxH1KeR)Xe;K&zKQg*m7-3Z2p+c8Uwsi~@xtsM!H(dxF@Y`Vv+! zfSP{L9w|r(xJL?VkHO?Y`a$w&Q(Pdm;3+PUJb1FlqZ`zKCT)rW&>6(Kx z2ecy!8qJ09r$C05K<#~Kc!2x`nxuktJVAW}P{jxm2Q_M7;-KLNusC>C2dEJY_9>_h z3mV7<4Nie*^agL|6qFtVNDtW8@ZKnBKn)yDpg008Tmv;1H6cB4kQ=}O21-rPdJbd) zNPGaoAKZ5I>9kRK@g7t@bhBza0nKHB%Fk|A6)3v`R0hK)s6YqL!Pwxj;R6Q`9R@XH zK$BHag-4DaI}RPf1NB@%-E~l-64XfN*I;%1%>tgu0ZVDHszJFR6&|34nhXw(PR<|` z4Y(OVlNc7<3=A%=ZtnaVtX_X0T0ylpzXq!}lnbiW`88O5pj=RG&#%Gi3*~}Z0sI=Q zeo!u`g~_kM>JR0D+L`$3fjSXlQ|RKIk4mP~*K5dV(@EWrLdT zaH~KZkX4}h0dP=(6Y3OjHyFeR8`L>P1vCr@H5=3i2gL-ah6mB077B<4HBdk_sObQr zK}`h^4Qif%Xw)ef#DiuDR zH7W+6RaqLKCbC&30YGBAMacTn-dh!}ka4Tr

lf;C(~Twg7BW1GHuhWD~rmhV}Q3G$2JLsCfq3O$Eu3Yrq%QgQ61DR0G8ms67T6 z{_b4^T|Bc!1tbJg0&1dxlz?XrdU3WX!8RbZDM2QKq7v4o1Q`b!MFAOybSV$4O$jy~ zR1+b!DM1(3H9(^hbS<|%C@Mh$`#>ysRIYA<1QU28YUdR2b#I8M{E8HnuvJW;Dh?Kv zpr!|`2?y%p!J-n>#e+p9NWBLnD)(i=qY^yPsM(?do?+B%Q2|daYPP6s08KG!wy1!n zEO);G6bmz16@f6O17Zu=s@KSXxar-et{dj(DDnk(Gw!K2C@*ca}DG|aL_5S zToAWFOSBvn1yHdj09ptHD$F#%h0bvo75t@|4`{mm8oX3HunbNmut4l^LK6*v&iXHY z1AzqgfmrYilvNMOK#*OwQ^31x5gF(=JZO7VAX^k5>%(9{3mQ~}1?>vZxE0jG4NMFS zu%HDELP9f8Z5j(h1LQuxrJ(p109Co5Dw-RX-adm$9R;Yc1~+ES9RQV!;D$_)gN6%1 ztu#=uEP%?b;D%Jqpzbs%*@MiS0F|2ol><%cLRt|mDhfQ1Gd47MV9o$nA?-Hns+cWLWd{N?)-s-Y72N*0w~--;j;pC zMlCGiG9V>f1_p+GAfw?Syf+y#r~qoyg0=*Kbc1Tu-5~pWdmxwab@o8IgPpLcZ9XKo zz#0^w#sa7h12O^Bh&Tl@0j+TX>db=O+t~w|NCA!VfL0bmr?x?T@Lp)24rzcDd`Nm{ ziwdY61u9%XwJfN52dzB-X+fUdhVnrJ3ZQxi)Ib5%J0L9}mx1bUNY~Isr2sO~?V?fv zndJs|(4g0`Ie@AM50Fk!#}lLzG+_kR*^N*K8Jh%^XQ1&#kZMq^2vQB&5CBpQaxSR8 zh4*7Y#WJiP3o6E8ia_HnAdR3&Mc6pPK+bG~JOY~826+TjT)a@OgO4SEJ8z)C2Nl+! zfi(~fiZ4*1jb$tWtR7UDL;LL@e}aaK;9~|1ut8WC6$gl*iwYFhWcRR z;h>GlFg8eS!2?KH4%*ZV69<{402K#qh=z%S?7DCtq8_xF8YT{MO9NCKG{guK2PJQV z`ySx23Rou@)@cS+UWO+@RUF8rh>>E{@$}9f70`NK&u%vjPy+&VkMm5vq1WsphN6H z=7W0gFB+ldgE(pY`8_HiS@38H$QY1uU}GU=C1{ivBm_D+2Q+>F;)AL~aNiTu6Jvt4 zCf0ygOM@CG$b}%NfeosGKt}q2$M!*Ebzsp>6_tG;2Dl@S+?{_>zZ2fz1?Oqdd^jiv zg6xCN;(K<7s0es=`>05O%>Z}gAG}C>W;ZW7Jc?2Wf+13}Om&b#wO|a3=%QOa#R$ zYysP?7bl94TBV@rJ5W;x6xkpn!2HfN-~*;W0Ro<0Ls}mN=69|^U6u-Jxw1l>1Q|pMZ*c(69m6#h~pA;Nld1A1v6R-92E3f;QNK2I!D?#DY|V zcEp0{PA?6QPA3IW4G0>k1EqTKT3AreiwiN!1sb5xhDIQ0@Z!J&4~G39VjoC!Cuohd zZ|8#-5+$H%M%c85DkF4jZ6|TFjIf3Ps0#{iAaouB_1-|WBFJ#-Xm}SCbaogh3P59f zAR08@45C5D*!cAB0WTrATdyp2;*7NE7 z4+`JcwvcoV9JQn1gY;7MgBo#$5~6eG!yALE{&ogajJ90IiJ!8`!-CYTzE| zGSDsH<)a|=AZLQqgYLKV=sfg-DIX~pgGV<&ml1)o5~uV3&Z51$78P zxf1LGQ2qkD6rL-=ws!ZZfNb^X^pf!CbP@n%J4hdKiVD~jpcS5I_r`sIR;Hi<4I^+z z_JIe(J`fAMAsrNR3k#65oeomABW5-cmhC`e0!Y~o)cyn+ek2?;7yzkDJ^ml`Y(8e- z(fpH%zi0Lj$UZwz1I^$eG;1(0FbILl3DAYkAi5K>pTl!MsD}p`NZkV&n%`lH)HeW4 z8h}zes0;$P`$5b3nV~%z(3C4P1A{Zv4p4E%4>cRqOq+ZX`TyIPeS?zEh?Z61EhP<0$I4+ z-2)Z_xd9T#Ju2WN(is9>4g_k^gAxqL6i{6TG6AF-)Z74d6(G%zDb!tn3F?1BDv|0oU_6R5#SQ)_El|j8aP*(vot?AR9qhjIHsiX4Zb0M^$3hpl9UjYk>5J)x# zZ3PE4L|}daH4q>@f)?=fGpH^Fr6^F)!^AsnGG670QY-gMKE-6Id~QrR3m`B3fjaE%8g)$p{<#0Jy22r3L8+b z8l(Z-i8u~f^#C#%v?f3R)bap%1Ju3e@Hoz*0+Io>z(K0P3pN~gfYP4fC0E0f|1Wew zwDW5~R`-F71-YXGvZDXB08HQ*L;!R;2B@hIQV&uGcDzS(jfw+9i668e0~Np^ZJ;ua zU&BSk0mK2>4oawC8n*5q+ExJ#Sb_`$YXJ347#SE|Geb=S1s_NfOhbdbqXoSB3uG=R zZVhk06bD6!Jm^4f2GIWS#@}G&y&9l6(14U{Ak|>oyCIuZK&cB;(9-2o%z6Z&H zZ2>jS8IOBt9t4>U@;9j51XTtg8my{w4|ux4qwy~&c=rAO|DVx=-{-4G>s$Ul&_N7o z{PLg`tqcr1KndCK5w(Hiod>_)Z2rl@-}3bT|Nk!)4M1yxA^vZ$VBl}L{|~gk z9a6wI)G+>M;BPte@BjY|jIWst4}elB$PJ*~V<0xjT?wGdYiBsT%Ig8|V+P5B!V;EO zK%H$^UIBH6VR;4ANd{GU{M&wj(j`dCK9GsKKvwv6zIY)Yz{23M!ybN;1|*e%j0g38 zKw3d;P*)dbBq(rTR)K;XGVDKm$mizyswnP+b8U=kaJgz~9#jTBOyz2Rvr%)4c|~`59EWfU+Ryge_1b z&Zm0`c!1c|@Y_q!nHtdhfI)VH(izBZ=xFqR(18rykQ0>*Z-aVppc(xMGWCWdYo6^j=;UokL%&PHiID&S+i1w0zX-+PpSfdRC}{y3;D1Mvux zM>nXOfSQFsX&00UL48(G!^NW;t_@vV;hfk~^n>&yVt8gpLM6SD1r#&Vg$C?iTPG@0TAy zf>KPBnSvH_TgTJK@oT@S+JX+tDD1b_P zu(!LnfR~c*;sS+o=ga?BTMv|`zm5f;`A`xEs$Q8G7`To>!jcPJn@6`hc&r{2VxR~I zg%~Ic>;w_Moi9Lv0Sy6AIl;)l(0Zwq!{a|BG~l%`#3hghG$_Z&fsY|-Jy0TwZlO=- ztN#}~_kfHC?OylT4cc+Yz`y{jmO(>-AcuhHf=7^I26Xh8AjtEeXqi4JBCC|APRpy65= z811JzYcASD&m@Py#E}Ni12x?q{XQ_H2N11`@$lo3;;Gzs< z1E|0Ol?9+e1ay=pw2=fZltEorP+AAw+Xl)K;Q3-u*APpzsOqXxvaAUOzn{5Fa!I4YCYWnu3>_g4Ta9F@Tl{fDQ3dLrGeXV6q6b{^bizuaIgqXSp!IA}J>Vg9P?-y@Ze3Iyz;z;Ma1fM( z!Sb-81Jry6r*ddz0a5^RG^h>%=>io+ptb%WF<3DJVuSR9IQcVjs4ixAhc~D@1 z+yN?0AoLc<*g^Lc$i55E>R3?G+YKq_K+Q2wZwB0-UYrD((g&sU1)$IawP+X_7+_~1 zfhu6o_62O&@wge@>|0~t%{1ns~<%7{LQYzJx(gGv`r?gS-R5AcCs;KCNV5*-wp zpbQAgm>?RIw@~w13-mBbC=G4a`SjMBfb@WpHOLHbegjPiKwBYT{!Und4zeHA&;zLi zC+yx96 zE&&w>&lh+ecLR-OFnAsZ7sLD-J}L#^NhVN<-whcA@$7Wt0A);2xOjGg&%*?H928`r zJnhlx2$qHf3L{7*$giHAZWfyxw^Hn9IY!P-FQ3V3$9sDO4qLziH~Hq(L9qz6)#?m?|AdwW!1xf+r@*QkJ!E-02j=@OI{L6t2i*Ma$+ zYf$S+(7pjsy6J^X!-CQVD7}L6Gbk;C%mJlSP<;w&qk!bWe3bkQO4cBi;8cv1pTT@k zMFOp9K`EN*`5Cf-8#zmZ0sxk!L4g9z(x5yG3J>Hg4G9x)-UN9UmZd>K0L#)K&w;cd zXK8Q{K(aI_$HKET$iuKK4e~4~m4LDwEK7qXm0?*Iw4Df?bwNj3fhL!s2^O>{2Q1z> z2U4hmnvl?%7nFrTW`LproOQcfAls5ayDdS{*a_Q13$hUuC7}8ro}WP_2RPq>N(r>1 zB0x?BEr11;ogg--gn;E&Q0W2EcMLKR2F}me@;h371{(*;&!F-E<`{5Y4Qh;l7EFR^ z=uQ>TI&N@X?V{q~13KFioTdLpK}Wrzbq=WS&dR{>02)}JKokR+LP8%v;W?z;KbZOe z*h-`%J+u-D9P`~%AThq0<%z*NDXpmuR^RwGRN+ggCpopTZ%@4{gkU|O69O=wK zZG^yzBXGfn*7N|SYjD0nYx{$WBT%jexec6Uk(w7^K1y)}%IF}Kpj-?pxM0l-Fu$`0 zwIdLIlIkTAYIgy&`=bI<9J#0zK+7WV1PW-6A*dAsZC*eE1Y8z@{0b|JASD>2c>(en zD0Gp_BC!74IH=tV(gJEX z!^$F1P(jlXpdL0T$$$ooK{V3F z1W=L%Wob}y2E_#^se&>ptc3yQqhx7N$_A+fSG-6q3^0GR#{jJXK}9Dl>w=mc;H(R3 zUN9oE^k|O(*3bY==gtd)H!ncr0H6#9q79(=8Z^2l2@PD(2}7^~3EvRoffqxgdBLoP zRu+Lg4k`gbp7z-B3#lw3rg;$n4Kh&k0^A})8d6+g0$-8_E`~tIVS;KTr2Sx^;S5mC z0ZPK4CL_o(pbQUgiJ+W20v=if&6R*UPQ5MA?hlBA+R|uIfwVNB{V9xM3(+|S)v%!A z2vqBW>;x50$i)$uk5U|=7hIz)3~)g_+QI-OT~Lh;N=9V2FgX1nEeuc|D1c@wP^OfI zmPGhk7`jS$b2Vt88!01`uv`slVZd@V$bX<=j7tWP76!q|7XXoS7LI8L*82B*@{- z%xp}E9c;vmNy0KSXiO58nL*ttP-bS;g;&wwekknhAP@(Xfk1U6D1$-z^^iF(50rWt z+@(ct{DW2`gF6S1V{1TD3ZS}^>RoPX3<83@2`(3KjD>>o2dI>Qb<9C(L4$-KeV}{; z3LaPw2F%}unDdwdIm5QQ1w!}sKqdpBJ%6z3PDYSH;7o_q!2$C@%L+gP1)yaG%%JNg zpU3mg}Xp1 zUc^If1PPP2Lkg6_Kx<2&J$=wrHOL;&dJDtbpxrcJ*8dm2Hh=$v8bu&3NC8NpM-s?39YNZR0 z$g_r^txupb3mP#$K>Xe*D&P%OpcAG*e9+t=2WVCeQqO^okb%{0pdD5Lpj6qt2XYEb z_ZIMOE7&rk7yR~+y)=*wVN+B<8^Yi|0B^7Y4FrR1>4Y9ygHq*yt|9Q)A%;{9g2wbg zDFYNKuu(J6x*yo68L0Zo1-S@18wft$q8n;9s8j^i%H1vC3l2ctQP2P=IA}mqC!i5c zFpaiN0-}Hkbeu5ZBf>!|z6Rf339uJHL!Z!*S;%?`@Hi@T;Rk4Z6|4%JgF)FJX$d80 ztsF=JDCj|pzCao&T|xM=(qt8-P@va0z`u{G?<>FvV$A45Gw(C z$OeesknYI<%5NDw5V-&-?Eq2(%CKO)Eh+|3KFADEhP43kJLjl)fM`%A=V4#~n+00( z3=->XQ306+N~sY%(DpN^+Te!Vm;n+m;AUX>(CEPc@-2uB8WgJl+Xp!?8njR!G@}8s z58TNI6@joqsJll6T@NTnfb@WJ2}ln(Btf&ftPuM_#Wg52;du`f1)wYhatvr50u*l` zMW9j*BnB$wU_+7ERwq-sQ3>Q2P}YOcTOdnayQe^x#v)GZ2YCdP1i(oGl=b{=85lg8 zZO?aucF^~O_PcsC9$6v6z!2>i;~480=NKP*xcR4AX*KBhvjUJ;KvrCM0cp5^QW9vd zfyWNem@8;o3MjNdo&~7{d7c4!5fP|J2i-ph5(gFO8c=c2$Ow3EUhfp}U1|G4M(+cg z+3llZ@j|};?|-n>(7GICy9cbR1LlA?tAO$d$ZC*-K;aIW0|K=Mz$!rV8K4pby5Je4 z4t)bZB6u@Fh>C~DPC59E znyC9Bh!2h)aB#qOfS>Z{y!k@7@9%$*r@)KC;jOPVDxj0OUTy)6-GJ&rP<@Clc^XYJ z0Tdjd15!B{7+zN4lbi^W>|CP)I!fr}Rj}Dm4(LWzP}K-ZQlO*qEM8om1=>*A0$vUd z3S`hm2G9{cpgqc}>!NtJv@)oRZ2-;A9F8L8E*#O!c zfn+@BB&nAR@JVimN`ia_3RUI zS)!r=x@b-TRGx!Q1p-;T0n`Z!KftfSdwvDz=uaP&0MP0+0T0G+9=m!O5c~c>i*Z0@ z0VpMbI!_=rsDS{YDh41;2_2x;k*14^0BCoE zhA(JWh$Sd^yM0syK=(B$7=Ggi-Nz2TzV_gI7XEE6HUS+hh5XxCjG77v9CU0s#oq#I;rsN4UwCN>iY0l5=Kl#0 z71b~mpqTLK4PW^ZwDNa?PjC3i=Ks;Y{Js~O|2z2d`(1G4-&SMD2r>CE%;eMjtx5m? z|A&}%xcNWCw9^p#JbL|CzI6Zp|3AMxgGaAF$UIMe-xJOM9X$E{PQ26w?=IQ)Y>8sA(1MNH>!&utps)v-Edfg20{kt7b+nk`(|M2I{0Ucy#ipc=Xn&2>5{3K!TI7N9Vy8#ogc}tN_|wA^_51&;hC;yIoWa zKtX5W(dljA(dn#Vc)-KjTY-P-0guKbpn!`$3@T7S+3ZEb6c$i^hKy960A*oNh=7i+ z0ZAhQ6>OjZC{QgtcIChWm5`?ypew9Eo(82QXmI+d2=KR@0|n>KJh)jtDiI(Ld%!|3 z01|pGDhUu%TvRf^Ms)jYcyxywfYxtx*=J4nSrIH>Ma71@bQ2|A$4_G-= zibn;MU^qZ~3_X3iMO1uSFO`7rbmf4i9i$*{e#7C@8>12c3U>)`kc0N_GB|?lWC(B! z&SG%^1gOVyJ!4!D(mZ$`PVg;NOEkLQwqw^ui4GN&h z03Ghf01ANu@YM;BJ2ZVeKfcIV0~(*tm+)wPTVd(bodPN$V^kzu4d13s0IT=ude-zy;c5A{?wV(}yM$+_yM-tJdUplSPIm`zSb~BG zsdYR7CHz1ui9I?`dv^W;C$nBfPyl__}&II*@7#JA9@#E9^+y@jeH(x{~fG$xfQBeRDpBg@$&q3|m%_$H;1CXEv zR8TLSiNVM6ZHa)#|D(R$c@jRBZ~6Nq|Ns9FI_Ao=(+w0kZVH~AZji_Ug&0!gfbJtl zi62n*03{y|a0;KI0`eZHI01VXDW1TGqiXPngW_rT0?c>6mG7Fx~rKq9PFN81lbFB?5%ActT$+b!B4kXg=cLYxxzNs(ri5C44Qv z)-_;H)u4bu3OGc9ngA{yz=Z>-6!Gl*-|&l-zrC6fG_7$C)Z+%tPVsL$^k3!Zf?jt9 z&*SdU?HlZ%aB)25F2M3q0<@ky{D5!kN&c3}pgs5CE31#Ys04u2@N2Sw590&{1%qev z5BA+46Fm9-Z}|46$o=>1uKeNITO!B);-l){{~o;_93H(P%6KMovFEGioqU;YKz1X_5~0h`sF52AFI>( zhv5O=)^9%i9v?sreo)E=HTXd(9dv2~s9Njpfdoi5Bm=wz)p8)uBbu%B3Lim6l<@hW zOdx{igUT0Bl)9)SY+!u39ON6AkHHn7C%@-8k4_mCa3=3?Q4wf4P{P*Xq7v{L+yw*A zx_0xZfQlFnkQxV2Iql)8d8|$c)F|-)MZbdw^ymffd8a<0Te^ExK=Eq$&8PFz3v1=S z|GPj(x_0}3D#s8N56{kU4$n@0#}0Ra*Ptd1aty?%B!Etw%>XsuK{h0Stj<8v;nVrU zqwxqRZ-Me(oMZf9kIqLPoyT4@cZ2F^h5$&?5mo;CAKbnKd2|6E*fq~%yR2)>!Lk>YH zQQ`3Dv{B)2*$B${&Gj4%X`mz%01B`GP|GXAV}}puC<<_tv_MK$&_OmZD?kYmW(BCQ zgINK}C}>v1fvo6e2dxN}0~rmg5&rvhegy4gJ`CFb-3lt}LFF)bHyPa90%_plr1RN+ z(BW+_>J&j!JS-|8w+eV+5(>c11aHPRYyA#x94*^|n@bQIQCkq3jum{zbu=EA0 z+I>5Zdv=}!B`s(ty7hlafJe7`0>}aGpr}^>xkAII^Cu`?z^9~vk_@QT3+g9;3Pe!6 zclJQi1GK;a)sd}Tj0_Afdl(rQnt#>T2Z2II0hB*9K)KQb6lM+}0@C2z2|lr)^#Fg1 z6{w8sj)?GRz0Ke943yToYe22L5)}#lZI?jqxZHUVJlb^JMFmuEGIU;lv9gDe!2>iH z08RXzQ^12%oh~Xophhtd$hn}<0X5pet@CadP}2lFbO3IBm4H%92&gFv>ISqPC^7Qr z2A@Juq6rEF0Z<@F_;&sP1p=s!?hFAH8ZIghouEcEXm8AG2~bi6Z-4}~yukhe4VM@m z0EH1KKY%O;t#eSF&EVSdgumr5I9fpA0P-QW z_}m5df9rvgGLLS^K?pJkFYN*i6oYd5)y_k$2TFrqdqI5fb<9PjK>e7DN`N{-G0gt~ zAWwqpFVGw_1JwT?KoJrG8Ub=qQE0tX%I@*sMTNugQtPD>MNo?400%xJ0|V&lF>uP7 zq5`_4`K1XT14FO#&*mQ@{O!M37#RMm9KF!%4&FKdYRiC&Qc&}jnSo&%=nxg8PA#Zr z=maH`<1Q)%U`bFZ2-bn33X-xxsUiWUDg&$vl+53Q7JWdH7=OznFb9^*cY#!c_ZRwh zg8c_dtDPWEGJ;l_bRws^m-|6lK?B>c*$&VxZ%hmfGx0eZEJ@JOFjWXgPXSp5b96hH z19vn?HL;FP0ciytl!xSK(Ak+Q@HrYRNzl7m;-k-NHwvJ4hCrjwNsEB4Z56QK0Zf-B?&qjrV8O`4UlCpM@xe_ za7Tkw6YJ<7pygnoX-gzWgI2&S#ph_SBtb{RR3RLF7GxRB(V#o05as1AkZNKbJ(rn* zq4~EwNH=6~jlW+F6a=8_9gzGXz{J3?8RU=78c-Ek0vRbQ01Lrg-w6t~PEbX9+(jh; zCI@x%fBqIxkino+Y(T{y2bcrW(Ose;{+nE#S?^pq3W2A_MKa zc$v)(TIGY^a@&uXOj%>04BnB;@CWGjg{zRAz-p&JaGiawf$Yfn)lR<0y zpnG&d;S6eiz5EJN(CeeZ(Rs_a^TUgkpa1^{wXs199YHNF(Egm(OZ+Y1yb6miP`{xQ zvfvVA4ygO^axKUl0)7YWkbtK#&|N^SCy^R=pn=HF9{7R?(BSRMa25sz(8W!lgSen8 zk02vMpaqv8LD2XOXebHPO9rhQ0XNH%FN1PB19a>SG<^p-DAO@4i{ZcNxAiOx|4m=4 zXJL3zox=zkc>^EF{{R%;ol{g^fN7{LpvESsiQN2)iN6KpPmktbjQlNuAT_O*_*>6` zViQz^!6qL-N7^znFx&!l%25g@q#_I~Nw5fmsRE@D22d}$#T;ZStgg@kbKvDJNHwuV z7&}-ixY1t%>HL5P?jt}WgplqHXm2@aD<8<~u+9hMmOW5^L;%#Akbtz}!Mz_)Jph_) zgqN?+K^o!ZD-n%f@DvVGc=@QH_bXxj5dId>q0P{~2!G3U6q|N|dTsFj2!AUVsN?z% zq=Z1qge*M-7vDYL6Z=4U2ee`V-t_oMdb$r1H(&D*9Fuoz*iT5&WVSo zdC&?Nkjc}*ra(&)Q1897N96`sYzmlu84rr0<_Zsn5^z__0MwNNk9R`)uT(imUtG~KfZaklkPE@xLeRVlbf5rK9_?UYV0aCl zTm{R5h6_NKO@aoKp}qx;9Qd~WFW~^i42LHpKd3X!3|UGAUPy)9pN7u2b%1-+#~^)a z15jUD0~Gh*k?`hUG5jr)K?9!K4q6`OZvl*~P%X(D-{Th}{C3X9qRkG(aO120pzmDgvFi3{Qflyi`6w3T4pBc2J=V zS}@Xj3FLhN{+55Bq|(`<0!mw*Q&b=+8A8AOC#pd7^t$0g z@t|9Dm=L{gm?J<#ZJj=ld$uw_J!DWYf*RNiARob0fhM?oR5(C#5imudx)V|qvVdAN zu%hrgs6vOk7Ni)pBm@^#3LcE$@gWx#3-Hm~pb_DhS3x?#+065pi%Le!F&7n&7`Vq_ zxy%Dp)PY-{pb8Xiz(N63B1*spECdh(76PD{0#zoRQy{0jbwlWvF@i)#3b-_eL`sPz z++FX(t_9NAd5it_3;)JP-z27=b&r=V!wPZ09rK&DoETrVpK9ZVpKff=8)?@ zP&5gY$bhT`U4;j_0S}ybrl^4G(3dqJD?v+A85uyg_ks>=gE141ZAt%EWA)MTT?BsGV2Nud8#l$)}6r>Y0REHGGpjIMi!~v(1!IFfW3{!+~vNp&r zSSZVZIWQ-K6cg*@KhQ2LX!r;g%AhU|XuJWZlfjaNoD5ThaPlRPT`(sf1#@6d1}P@i z$%{cckGH6RhUs8V2KDzqqYXHn43;G1WSAm^lPf`X!JM1}=D?f`QcSFqy}*MT3jDoy z!A2l5KWJ93(*@Lqg%$&d`s_S7PQfGA{4GUb4$Nw_`fMo+1H;RiAQhkj6e;b2`hB3G z0i2-%mLwD^Fhz(^0o}w1Zz_X^!{8+{mXQeDl^1Lz0(3YIXe2@bHWHx#9*F?AeQtpI zC*7cWw6jMAGUzRM1Jun0 znH&bv2w4-<0v`?)A?m^)UqF)Aq6c8{Od_*2B20=q9Ad~-qR)xb%26f{>w_ZX+ z12h2i61fJKPww?+BDOTsRmQ9QXeH4{8$s|1ZE$&)xX@|9=LC`dG)#yU2MEPp$_w zgFIk!j^1E*qv!g|ps6bU);f@tMPL;~l_$2K0s_($<8OHYE{D)fhPID|LFEZMNI5NA zmY^Z6&M7LOK{-%*0?{v-z^!7UyyFMZGpz*E`@{Te{IU;r{K<)ktcqvS7 zyBIQ-1#b6)2Cq7&KrXQFhR`oTb7lP74tpGY!P3>h0J_KxG-?c*IyL}xFu=FCT7Vbm zc7~|HdS)kKgVmX!L+JTi!oWos)NlOTF2Fki{H>i#3=A)8LGlQnm4bX$N==`E2EjU~ zsDK77KwUJgpXu);_R%z-9} zU7^tA4lRs)LCM__tO8oafksC_;{+fdcTWNDo_~1~oN7Qp>W(!?K}#kKVV<;#ygu*pY zA)A91fpks*FE|5v3^da8vX+s7!Erxm2!bN9PTf&YzcmI5z(WWrw45&kiY& zSw6(zg-_=reA%It-?RDnAO21kP*#`-PAAZ`0~*%??M(-ZO#$Ch`4Y4V2a+ABn0CNp zd*G53G!z9IL4jHc8isu>3u+C3S6Wv)+tyxf+23|wf0Sk;BjW~sHy-cRf5OKB|Mt?F~AG2K+3=~PT<4}TFDP? z-h=KU2DJkUKrI4rudf1RegbHmHUqRVCjolCKI}4!9u-jf0C@*w5Ga;GjX=#97L(cI5nF)>gZs?lH?jA^W-U&Ie9~9uAXy*?WY4Vpj!(V(IP6eysg1{_eWC;9snl^7U2I!}Xkgn$yJ ztKomcx1dH#g-`b$6_7`Ly0?HQm|ly6uKfY&1?_dQyzA5XmcRFfB77ngH*mfnn?xeVPHJoqM`&E{9%Ahud0FBAf=#DO^{Mh=z{8L zP;LY@WhyJwt*5xcZ&+dnb6J6mUsDkpMoV^K#RZMA|jt(p23NK8;?fAPt_8khM(0X zybV8VOE@4QUGv1J^QDL8Oa8vqAkEAwCHVprNe+;t07y~-B&h(N%#8(^3mX~(6u@4(>M`PS3&ZjI^7Bl3`?B;fVd$6ZuFmvQ|E zl{*HmhW|lHjib{=MZu@LL`A_96hc!#>bqT3Je<0CG(7(wZTMNs-&)7Oz~E_lx0ctl z*O$?$!A7Ijhu`HT#Ao0UC0Kt9NeDcp3EJffniBT<3%a2Y+Q(cE_HT^}#EZLX!Q37d zuqUs!9^h}4`TPI>OOWRfQ3Q6I86yKj!_R8|R$WF029PtV`CCCfdn8*4Ib`1-B!_f? zZH7Cf8q7s@$b>)t|G#VoX#q7I`CC9t(Ckp{F&CAHTBK+KErIF{Q31z2c+D`VID$+M zA>t1bZ=EhG8ld$8<{)GLLsI!mEf5D{hs>Y<|3P+CgY2lL%#I7c|Nnn^`1k++pv__6 z;-nK&oHYDY7i3Yc~DSc?j%CCT`D zH|SC#kk~PZ$qcVof@8OX1(MoCLCMs^sf$I!#;SzFrk1}on+;3^wJZIH=qQ9pDD`tB;BYXtQkqxFyj7o~!~D zd7$MZ;35xH!T0Wgi1%&*2LPxpuJG-A`Qo4o=>Fg>5XtT};8h|nT`iEAJ&=38fvs>+ z0l7zuzZJ9s0%{NV$|=y$GH5eBSQTW~5U6McHK@Uv8B{Phcv_z0?==IRh5~A5_;h~s zIQWpoquU0QXE-=OQ_dWqr56G(oV!4) zv?mLEHBaXn@PMK`O>pGj#$xEv{KJZW(m{{rANu^$4=J2# z_{CT%=<)xUM=#HQkKP)O3qF?D>aK!z0)m!*gWB(4{oPYkAaoDd1`o@Z{PPd+&xah} z25J+4)9Cybm8qcp?B5PBmhiM3DB(B;sZ|&}I?wuceg`KXaZp15RzJ)>dZjH7<8ZzD2zeZtU$sTZ&JDrnrS7Flzz11NlLT82H@}#xHkft#|7n;TpWo5yi^4=mkWzFXyO2iqb80tc}U^_OLebN0WFw? zMm}i93Y6YKOG=1H@BaLRBcG!cPkI;PhetEGiwHW34Ia&)HEG>Bpk>oJpl#khDjc8- zPa{AZ;4I(P`+=$!4$$?HAe}y)ulVH|9Qn7|2zY>wwU~6kqxru+|MY_j2OEBZ%dUND*l#fU=F+u1ya2eq!PK=1Db~D1XWLrkme4!nnNtT$!3KIHMkoK8pweM zwF{`G#;7?!lSZJL!y8_6fOU4hBQYO=%mL*iux`+ijNovFu9*hqBgpz}aEB7qvYy|f zG7Vh5ods0_r4gXM5xC+8?G^(?JFG?F04=LP2g`wzD>TuA#ZeP|p$sU|?@<9ub+1wJ z0BHqPDw$HCGz?lE10da@3@ zDVl?S8w3Bg2@Y%B85)0qT6aap&5sy6FMhxI|CHjP#)qJZHqMKnCF`$UK=XMZJ}6y) z7c+wDFA2i~uWda#uX!AN$HKpTiOwN`x10o($<}+oTOIj(g`~Uw&M#BTXy>*P=4l?@kyZi&?8c^FC z)D2p}%)rpmqp|^%%Ru+JF@U+CrXYXoerOPa4!h$8<#SMLgN=cK^C{?YX5!B%}pUyn})Tt=I3P zVgTB@>Y~EY=>wYmYJnc}3Eqs@0=+;SRN{7`jE=Z4FhGV!te_(!klsVhE04|>KAJCl zKw~1H3J`RUD=4Tz8-bwJHh3RX?-mt^)D{&me;0U+iGhI))Hpc-iiloFCllPKgL(6X zg)Ad@?`8$);#z2I6tFTdm^b3C(m-+`kAn(y)Orso{9%f~opjJhq$hL@4(Q+>ctQrL z+6gMaU=9LpO9hvOFYKgYQrPZ&~hy+%EW1>*IgOc~j8A=i`t` z2XOTPssXUHEJ1_&sP!Odn~Mj@^&rR`P(29N4XQ(+^&nUrQV)Ux3lzDa_Bp6CMO-}y zS`Gv*h@eppUT)mGM+Gd7S`TK5f{Jpe6sTta8U_T_gEAu6>%kA8lml9b52nE}gIo_n zq(Oyn>&ZG}P?rL;9<;zTd28Wh%GcbS#hg3m>L#kjKAmfB&3_wMKMi-z1P~h%O z^UMGLU#d|-ffIIa3ty!SN3)+dy%D@0BH$mwyfE7}T zqttN`prID<)I|oUkOh|;APp#rkjf31B1E};5L7I|%Iz&+4!ryTsV24D?gSY@Oz4A- zX@!Rz=$uwiOB56eprX0;Km~`Z;enSH@Bjbz_P@~}@D*!a4;mZ+rIHLtDglj=fC2$jbanJV zTJWt0Dn&pE10)8@+s7a+dj^mHN54UsjQp*#Um%?-2{r}>(2Oidg8&-?g94r=6-W-8 zl0X`8r6ial1&|_eYY=om3$zyEZ&?CL!H9+|NcB#TO5$sxmz9hR4DfIcWMW`|gtI${ z1qXd`R8MOVhqX&Gw0$Jg__a`KrEm#rZY`{vBaBczRFi4Iq zK^k4(MMfCE4hF?D!Ge+jRD8p74yd8`@)#(a5R>T?!1)YX#%i!KFua`n;c)&U4;4?PPbIp(JIX`uVs6b{VK&R{M z01+?KK0yttG;jEIpxB61173@PdNl-kd!S|0pi&CF02#FUv%5zHM1gvHU^!6rJ{>&h z1Ud%=)W`vMb6fH|F%mG4gZ)*m7taTBYVz6 z@OS{Vh9JF_#S9D#E?w?St}O@nJ3-URjtxH!6j!Vh~&wzK(I|Dra_R`BrHQ%Id}D4*c7`LDK|CGY?er!3S)P zoEMs(*}HHagO{kFBmqtrxT7^hMFO-K5fn3!MZKV)2TiDhnrX~yR6v5wd%*Y3*7CRP z24yo)XOso0Gs?oiumDfV36cZlD7?c_Fhz*Ys5&URAUT@91+oGTUI&9zliC@5&wxBU z0GeO)fe#OW_VIx#0nh=@pzb+{J%NQL!vjZ=y#*RbLA3UEkuyBd3o?(GLgxTz{0LTF zfsQE$HxAS8|Njp@_zBd|0Hsr(&R-q}AF+6Jn}E(E7T^GF!v@Xl!|JFPmHdnhp8t=7 zb!&ihgBKcu##WHh1n9;b(1-y_MTyid1IZCg6EH=vG*N=JKL=7pVp_o6pF?R1gYNYK z6?2egENGwl1hB7-?*0G&IvV7Bf|W!Aa-f4IK*0uly!-$EYbjU5|F11S!D5 zN(1af^R$PJ)N zj6gnxZ6(NHfe$1HfGb_d0cN1H`VKx|0o{QFPPm#sL4_FTSS-*2jvL_W1$3+yXh9BS zm&_a$&|W!EN(b+`fNrS;t;IJHv4gb3u zK6z;eIvN^e7D&vi+r+}FJH!H>T~LQSTzNow=7?wWaRDFe6qO48UU4P{2JdbcTL$lL zA6xJa8_=dQkOx3JKzv)D@b|rgmbDQqkc%!rg;D?u1A__pat&7ok8WSs$`shhKUfMB z%b<$LqZ^?HskZ}D10Grfw^74E7QsqdFE9sQ(t=cjH*q1y@?lWo!nzIub8N1-wE9p1;6FVe=jpkoOr%_(ALIKq11w-#X(Tq!sDG!oUE&)&ev&$HKsH z2%PE>end*`U@1^IfYoCU2bdaAV+@?igW>ITH`FiysoV)N2@wXKoyQ1<0q7bI?EZHJ zon2Xi7670{rZ2C97Swbi(kVDpI$OZ^-hqk;SULqM1|=5I(Gj3@VZnm9L&|^!GM0uM z|43m28vg=03p|vDtOhBKz|?>ShrnTjwd4hT!gTIS|P9^W7nKR%<-iRf+d8^pR3>$GF(T{Gc_uE-DK^P6RE? z1)F~XG+}!K6a+6oj(q@<1T7b408J+LLDp)-s65yYnF9z>S%3&W(E21DYmer?R*w9W zj(Ify)#smn*hS%U!*B46{&DYKnMppqA+Z;HERWY+2ARGBwDf5KC=eHTbmyq7@M!+a z$Upxu|9lsf4IY+fOXXT_mq>a1KMx9#&Ki{lP#AWAf`ako2T;BC{~*YDp!N$mcspKR z{f8Q#NcRDNR!VzzUU%&L;?eorr#D~2r?)%+RF;9-d*B)$)Cy-{U^oG;84(BFdw^_( zoL&x=0v-AWR*!VZIwE^(z|?>i8G}oIduYvAVg~XkXsw!xz%Gy~aLWLCvMFre73knn z(2i~RLI6l>TLRP-2lZ_KL+|f^>|qA)00Hfl0;Os&2NaK<-L;@AeK}k@ANh2C^zHod z;`0j70V&X-N$7?g&u&)+PjDj$F`Wz(0o4rP#$@Y(k^<;iLM2j2&IdK!K_}E+Z9P!x z4?ES=4K)6)0op{Qfl!LFiwJxo3}|@{WECiy-&-%0GJF1K^XPVV@Mt~Y(Os?K(Oqo7 z-vXMG2Bj9r;yw@X3A+FP|7Y+}JYjg!!xprH(u3dcghww+r^mqutRB4+9(?v-fO_2{ zlaT?u%%T&v5(jj!6R3+0TIfk!81T2)flFxUQeDW(P|x6YI{d$PBMSoqREa4_ ziGUC1i&AaJE*BN%4i^=6$73!k%nY90IVv0;t#A4JmoqXjbb-V>TvV7}wu5?Py~Y1L zFP`&k{>RSW{+XG9VFzf7k`Mpl5B$wfAh#NTHbsCpDriDh?t=KB9fcqov=$LWgVrd5 zXiy^>M1$6|f@sj{QVBM|ZvYGbwp$=B6C=ON4bX<0 z0FT~1kUhnndmtMpK!a_dqLYz;s-vaKA2LCTnsQ}>@{h*2U z<|7K=>32{A3Uu`xm}0qWL|=1Iz0cos04WaKkjMyp1)WAAL!-~HqUN9aOI-`N^J_B z-B1DK68tQ5$3Li@04ue+LsVp7>Gl8R)&r$0UN4*g$?)@BI&xIlKm;phhGzw>*9UJV z108+A%WXg9+{oj@$EJ zb2x6Vdd=*(y~49MM@0jasx?3fAG}Z-<{=l51b7M?*-y1T-Qe|2B?<^P?gE`|2lEto zZBuF3Yk!ERe2=-Puz`+=V+9`*hgv8Q@2OH&a2y~yem>9>xe+2ruHE>l5$St5V z#~2tGK({)A+CHHDBmvJrx7mS4szJl%pnfr^K?Q196)1qDK$Vv)C?kNb4P{_pumcN1 z_I80b?145v7wiX_vJY%5EXC`|`~@$*1P#oAE2O6w<0BT?DsAFOPEq`GE*#~aH z9EUVdAXY-QLc(kXHELkCf?D1XTc?0$TK9vD+XpruX7N^O==~BX``0YMx7VKs70$4! zPte*_(1tZo(FAfGs7L~p7N8;kbbKpl5k07Qa&0+KVgkJ(yQ2lXMj5nX=%dH?n;w!E zJX$Y#fUfG`_dEph3`AoOcx&u8cUHzywr}oijG(>x?i?Q7{sJDzg?bk|0|Q7JT=|z+ zcyxa7;Ji?3;L%(!z)-5$<<8vUqT+GPoteR-J0DW6-vo`Zfog~@9~F-d59XH=tPBjE zz5f3^E}ryg{>jeYzLyPJw0rO`KEdC-4s;(XsHG3N@f}puf@UZ|H0Us45Di*)0-`}n z4?#3&HVQ<8PHh6wpiw0d4I2Lg(V%e@5Dlv2Ks0C{9f$@sc|kO2a12C)_qu7esDP@J zZ|*FNC7fOE%-}Me2^4-lDi!?OPJm1GZ|PK{YI>^!M-uT?KaE1Ju;`<(R2s*qRCqN1W-pieuX49wf;)rLu@)83rmCcukRudhR4N*3RM;8$ zTm3;B)}XSwFJnPgfD*P#R|S*fx9g4#&lw#LJZEuiIIrN-TcF`;_{5ce+xwT0!BJ46 z0H24*;ql)g!1MnRPs=y_y^sH()QRA2#}@E95mID<5(0RMM(cr+xPXzdu7hNuGt z7pSTSHE5uh<3O$i0bQpD+O`Mk9UFL9p7Y@MJ7;*wqxGZ*zyC##)=PEDp!&|j19JV0 z3uxmq=oS*lR&f`Vj2HiQ{Q+MB3^CmYv~i#Za+wpntCpj}@y(Tmv4r=VD>EbL=I~kx zh7y~uSmtA{pdxV#L^<>-7LU&Nuqb=+h?{|-BNo)w0u}p6Z7p!p+~>G0>A%X|4WL%Y zHc%^M8>khst-_->R>Py)Rl}p(7u*Daq#uL`B*Z`=0!=`WlT2Yv5jFJW0B?|h;vLc; ziGCdluH;LCz(>{|b5YSSK-WfkDk^31`0pCv(ar49?G0`X!dwm&z~b=jpz#yPNl+yi z>DZBf+cj8Nf|5UfYsbI;|6j*~ozCA<{SVYWDNzY<=>SJ5WSuH#ZwEMBpv&$^$po4p z*Zg-4c&PwlfLiU0h(-#i=K*S7cd zu%-$l0|V&%9ndaqkb2bC3Mh77GzddlE1(le!L5nokR6bq=7q-&Pz?!M4gks}pwTdp z#h~qVFpEK*AehCVjuFga&m!nlV|5S$Ic7j zuBBtI!`$W{!sYt^RgQj`;LhOL>!T9j**POTL{SJsOXIOa^5L&^f*@t3bO-LB}kC+TP$a4?eFI-1Y{aYYZL> z0FQuy&tC#hnF;Iwk3zMcEXnrhjs)FbR3Zk->ySn@{LY)puYDlrp12-!QDFz&cEbj~ z?FOO@mdM#aj)g2Y1l6kGqS6;~8_Ypaz1a!wefg*axElU%J>bYc<@j+I6;K_((E0ww zY-LDy8dP~{sk>-0l5issZ(hf=v?yB08lf_05tvrzGKV-#B~4>ka3s2 z5O4hldyl^batO711ZZjmY3Kuf-0y|g6`ikkf^PT$9Sr|r87T0fd+$1@sDL)WcrqS; z84hZ%HP?GEfK4p{hXv@oB(@lk^T-T~<{yln&DX*8AL6Dd$h}CQ;uw6$2Dk_S7Y5)v zwz6PVodm+(U9h9fE_WV%?Fr7@B~GBo0v-6pR)J7RL}XnB#bX4hRtsqU3w9m~NHWmmrsWf}9M?6yT90@W3f}4-aSqZ|ljDG%Wc6 zdNda(h}|Li!2#5)>u@2_sh9x_YQ2GvS0N$0LJkhYmR+w>H@iZ^(w7l*kqT<5a~O8s z5a@n3$Ys5t+~Nzm&-b@uufyu*AFBNA%%F{fp!<8j{8u?TVWK;OPdD#nKNbf5ZKpuz zZ!)}$0=H7`yL3Kt={)4q`4e=m5d&nVGR`sn<@#U$|GTz6;qL$)$K%-e2egQizZZ0t zIH+q2>cTL97!fs~I-=WI!=oE?hqH@H1*m=p6~`di46y8R7x2;t1`i}<(4#6qL$xq9 zpzaT7#Gk(fGC~a9xdJnPyvwM*Ze-+yd_WpaE%2v%(wG{WB7m5WM3AB7yn-U|L@Uw1XRXC z9dQ^GL?Gipo7@Dzr6*|E64bYIQIY6`4%&EtnttKiGRunS}(#I>LyNCv1a zyuK_9uV*07CxNDKz||qh=V<8zG->MDdCjvEls*nj0;iA7J}jVdzJohKCrrIe!k<9; zehgd!c>{`B*o^OeFsDX^^aQdOq!UL1`Tqo*KsIE>;M$%0df ziBC6g0ZarGudkJSx_RSZA|Ml93;1;N`oKgG3B{-L6DXlrd9yIQXnjYGg!0{s1#&|P zB%y#T0FC`HfUJ4!#lrAKM)cLjfDZ58+j4gwQ<>~sv4hP<` zfL5O(Zxxl`-xedz=wR`=$i*T?MY70lHz*#O|1ye zo&=DWVJGk)VQ^OjNQC@H}QNoka6G|yxKZbO3-F6iV15C=5;^0J$Wfx+;Ar{)pIZ>|iC{4Jnk^E|=s2ld6^y9zA-~zfcM1?5N@V8tA+XpR>!6^m4!h#4-fs0hos)c+pwb#t{(>imK}~;;}K9Y0abL+*+18=QYOc5*Bl$3F*+W2#^Ts;PQkag zR>SbNBmcHzoh~XauLVHizt?$p^AAJ*c3)6;vGa?^PBsPx1~vvJ1`qzl2l<Upvd&6%pj;#0t+tUfk`=D7n@OjXk zdsIMEW1!A8Xb8EHk%3_!i1^H32QhnB8YtCu-t_H!0J`@jhXvC816_gu>i&Von_&eC zh!3hS()iyWNaL>uT_XMe5NJOx_$YGFX{(@)8K?yD>C90{=xR{`Il)G^gu_OgzZKLC z1*L}sP$JC$75e{Af=mXD4uGl^$VeH;P|yWWj^GjNR?rOS%lV*e4AKr7ECz>9QL@KQ zP-P0jknmyyt*-6e13rljvbL-9-)E1dzMbhDX^zL;nHd=zkGV54csBoW;BQd^&0948 zQQ&Xkg|GzpTm85g7+(Bi{`=pBfBTD_!}{Hz>u3KT@PGtAXaFA+{Gc%$Q2vEn8U_u1(D}eGgP9o^ z9FMs&XoCeobG7b_jHSHbxNNY{E@eK(py1J5qmseI-vhpKz1u}4q052M#;=6K#*@Dl zbeNZCx4VXCw?DYrECBVVE7JJ$T~rd%`0Jtld(e^WprGi6tfhu%Cb^GOZi)F zffYlmpR-^N>}E3PSO@6RThN(vo{a9`qQU`uvLfgJjhCQafFo#vq?8ZTgGgww)8=n^ z2tK9Botd$u$Pv`EDarQicIWW0c2UWwO91<}i@~$oU&FII9Nff#4B;R|zzaY@8=yc( z&l`b8iXdl7^S4|Bhds=B(B3O}Z3{Q(;C3dk+7i%p>>(-{FS|jiL3Izb4nn@}5fnoL zo#0F7TU0&6&#>t1fWI~hz&ZJasD&VzIgNq z1<8V%5Fl9)8&v*-bU|Vg67`7dG7TWgTvR|;0)TpWpe^y>*eo#zRZ);j$992KL3?)K z+l+C?DWsJI8kht1oRGr|d~`!+3;1|TP;g0rG8CvNY5twD12l}{xKp9fgTaU2@bT-|q8}y8fTpKGX#kvMK$Cp0wLt{{#0=1h zZ;)&OnQ)#0o|Xnj{l^!NKS6q6C|T+-Wc10S15$`}fCh@;E{3(Qz+=Z~?JKk*s`XMS zi|2p$0MFid4d3o`4j=6ll?+g`vi}meWD5b64L&Lv9{&%4i|r}k3j;yLHfSIpJV{Xu z9_lLqbxA6~l>ta2^yFA11z5^b(CRlx&eKKYJTwPlmZ7-w8%ltKI(+Z|2Te1-1kI8- zcDXZwCan)VVBt}4HGJFQqQcL=?Ev(c6i}m`se*@d7HNq)-XjlUJqDh6K=K*h9>4^Imb z;IwcB6s4fk4M8oa2t--{&-TGDO#$scDaD%@5Gv@M8bBQkcxnJmnZ8{4=l_3FQo|o` zY5@5FwATo9J{sssd*r1;&^o5|K*?#?_&oOX09m572$CM=Q!PD!muPu{dr6RURbcx! zLG#uPppnrXiI<|5cq&L2X!48!s;?JvnDKs)ar;2# z`*ePMA^79Z{|S)!F6jBvpthZF=P~fO%@oMQE@<4Q*KtMj4+Z}AASO_2p+qGDGy^u- zox!oom8ru;#oY0jD-#2#kOx)gpxqRGRp9ebb5sg^x>HmtzPYHFGlD8n&>|!L7RZfT zE-D2+y%ieGKP!AXmw>N$;BQ^X!oXm7+ov~0h0UkiG}D5G!J}I@%YudBCFnv&$8WBz zjQlN?OrRC3z8oIbkg00^zJ;I$CuGRt1sg~bG^_#{vVa^-4jN6WKnz(xvN)(T1l3BA z5e~=*4Pq1qI<^ct11S!?We;59@wWtmIj|uDc&P`T>9N2Zi+O1YRu3xY|2qWm%QJxX zK!H14ooiG;eIrn?9RLk(Z8MPow;UXIfI2BY-Jrnhd=G6weEeUc5)u01{}pHx;{Ra} z>p9@YJ%2ABXfsCZ?YgD#o-J%B04{*k)#Y!g0*y*_zJ-klsDa9G$Q;-%P<03{D?md6 zpp(2?eL-D#8&Ki|o$~?`YO(qcJ_ndx0koVCX*>Z`efe~zKsWS*hReWRFrUsxpn;SK z$e0x*oIryEpa1>;|MJm4&=J7zJI_JdpP=-I=(3M7?lXbXarJv_37LLPOpyq+e~zj z6DlH&20Mnoh`j_$p+`Ne*ML)K&7POp;FehkXkKRuc)c|!?}2&=kl=*my#!EGBm)$y z-~ltxg>R7U0r2rtEV+}WAqZME395a-!3pXByaaXnT@Al^bn8Ab28EpJRWOyKQt%qQ zY`*}s5(*{!JfQg;RLFtzeRm7Euyf+yW@3Of93MjRy6{CvNP7N1=3~7D9FqLKN{kE) zzOCQtR>HG3zPw)2U_STgyvyGj3d-l8oDHtsKte4}c=9=Dy(xIr0Oa%zL}u@H zQNhURKS4SD9w?`Go31qi1)J?WFol`m(k6h)M^L#4N^hX>!kylJ20MnmczYfaN}$t) z;OVUkR3~+~GQFG+x(E(baDlI=W>*50SV&8NK_wP0pP=PJ*j-E-;LCGmK&b*ebssj~-iPB&~x6=;q_gPnl^bPW~TODj;`IPRiCFh7I) z7_j^dS|;n+?aBeVjsaBb`e^tchi$lgkkAl@|{_wCo%HO*N zoUK4N1Aynv5h(~Rgj8RY9D+59kWTeNswgglPOqE|N5G9xu#3!s3 zgd50E+yDRnLuMmdFHyZ}FTpjzf|7(m5ew>~pii(6j4)994U|y8#Rq5&^GkkEW8lAw z3OE(AKiX3$Mj;JAJQuD>8#s`$4FH20t3HTZF2pRCOIB3$X&IjaB4)o(#`J4PeH-lq8k`;Vb%>+>E z0dhSGc;*XypA~4dAH4VnHYf$Eo)I*P7%t7 z9D2iCst!H126lYcBYVzM@WXFFb9;~@YeM4L*YCGxWR~kT%d6Mxb+R z*f>vtPXD?_%2_o&;3;|VsY9Tg3J!Eo!x+?n@1CLpqCC1G7mhUk0taC?=+2q$5|xb7 zP><%{jHUjdwNlXiYn`BGC}^28v`zD$zXeoedUQh;Od(B8AQntPZk7Zc=k^kGzr}=| zpq373@zmx<$l@tT=Wq)6gl7+C@Zp7!iy>M9|Nj5~QVi5i0!0p~do0ZFA$KOQJ4fz@c>UK*s$1Ybo3 zzEZ9<@U;iH9)q|M+e#{O+{g}gBP_o$fRRxqOR4{BH^=~y8}{W%)bdBIHhHD#dnIH1I#;mH^p0Lty4E;^`$ z2kmX}Xgq@2>p{Bv33UDlXnhuFF)FB%_v}39(fPaAX+`r7CH{8M2?L&;-~X!|{V@f+ z^2Sq>g#ofG3v_{K^RKcJu5ZpPjQp)4p!qP+<_ysAI;gu8un06jfV7edGQ|RtN&rh8 zcToWy%z?7n3OY^#D$`+VK-U<7#^U)~n!p7&xQ|>?2}&f;@pzC*)bV%@@JXxCg;oaO zb?n_fDi*J!JUZ`pUW4=lL7t6v1g#+3dl0;WCQpNf0em>`>u{fL-UJX2)JuNt>C?>{ z1mb~K!MwKiIL@L1?G|ysmO^nrx<#N#5O9ml0UTYR81nGx<`o5L1}&;_+~EN70%*n6 zKX9kpG3>wTe{~jy7hOle1G%6XX|S76B8b7W^Q33z50BPw{4Jo3`5w*tK)n}6{#Fx^ zam~jRe0oDvR(N!N;FkyaiUGVV%BSB-EQDTY!f`X`8>Mazyo?6pqaA< z(4v|a@DAe z$dBD2Dl-hf@ymmbpQf-LCQNI7sZHxuBGGP@a%Np z@azK9@K~f-LeL5ithxaFvuSGi-re08h?U=nBVUpWCQ$`28J&l3?AJ*4HY1| z`KNeEjYsoOM*db~9tH-`gfHlzL2z(`!+Hz&;zLmT4PtAH3S>%s3wY}mNE~!7pGS9q z1juDzx$YhnkQty|Eud{8l5tpQ&o=+SwO zUmlXaJv!fm{RBOn3pokhhiYbmZB-~00~x}JF8Q0Rlq?q=vb#(%EmB)`iC&|pQvYa5u1M>m5<=P?hEqz7D94kpXLouTts+QDNS zV6FVyA?8Bdp8;y{fkV3WHh&Aa5Nh6yl1&dQfDRV}x9mFaffEcYeCL3N5ZCI(Fii()1m^Qw?HR>_kj0C`oQlctWmK5odW`Hn+1UU76A$d1(28q zC@DZ}-vS;20tE_WBEZw~Q;D;y;Q`NHM{wC%;oDmn;M#J)v%6Bmv%AoMzXfyzm`~?N zPzTT8g@Za|u>$1mvMJz`vR-zBhcqrZZeT3g0jf9@K&Oxhcv!yYZ&~{P|9{`k%bo{c zGxN6?Gk_MSP4MXE2UVS*$n@wgWdP+)(3)Ql%a8o6MWAHfe4N9h`6!3S{{udjH;OJe zemlfcqTJ2i3EA-9?aKh_jx#baSf1c-1zn`<(R`f6qxmR{+AvF7MKQ7EetW9$)ouwljFBTjQlMu|NsB*Vz+W-;BWl~8szu_nr!FbE7pp96_dcmR43p#|g6BIh2wcaSBO$JaCK@D$6 zXh6@7fF^&?oGobID0sOF=sXaRZqRtUCS(&aNDefy1fs!vRv{TlwA9_B`LKdVw==l+ z4wmV52CoDFcaXZB!K?W|I>D2rpen0o_3fmTyr3t=$1-Ur#3DHJ6TvQxD=fA;cN=sA}K&QU?be5=qw?crUK?B4U0E>6Ws7QGJ zKLU<;P!2EfXg-Vm@}qBu9X$A5 z5A6dr2R!&)uX!~72IYOw)tAjT89ex%uX*r0AM;QKZEjQsO?z`5Dwz+O{p?c#c?fjA zBopHFK~SR>bRZyV0tYQ}>I5xv0;LZI==p@uo%Y}+GmeB0Y6^o*1Eor^LeO+k6{zy* z1~-NITXI49qO(M$z_arodeYtn(hF`JgLAY`=T+a%`~NTabbbfjdRgGx`P&n8%chTt z2l#?b&`P0B(DXHQ#K?!y0@NRb?p1J6ad-(kuMaKbyQoNjuhfK;BH;a^upAFc6yID_ z_!;?IKzltv2@{ggrhpTe;kOAMme=@uK{o}0>d^nkJS=4n^0z(*m4w~UL<%~=60#)N z$fLUoJVp=R% z-8{er%NZ~S;&f0x0hKr)Zx{G2GNk zhX1B-rCAtWG~8fd09{+{(RmS+gCR>Rr$E+cf(8OXK?A!%xO)op5*XO+z_7Yz3wRqG zNI$rq?Cb%rpaRuRV6Sw;)PqXbPS93Ta2f-zfdUmPe?Wcu?ko?`fi^Ag!JHaUHV3Ob z1df6KSHXu#f_IRCMjPSj(*RTk1b`M8f?DViFHeHB!@9+wK|)ByD;0MF4H=pWm@MR70~uiP}v944^p=SwCuGTQZ}My zePZgiW^jfE&l7?U5P?Q4tZoC1qJa{L0cg&&Gzzx2I1pN^fo^0Cs725EMAT}aOaU%Q z1)vogMzj7fC{Zn7Vqg#jIS_Pq2NMIs1yIj^$3)oqx}7a5pc5iMDnTbiz!nU6FflN| z77T!njd=#rb-YCdv?U94&>?7(E=c`;ka7FK=6Cz37`(W5{SVSveW39Pl=TCkOySb$ zqY?w^BtddK==|Ews~(-7Jv;w<^gNlj3l~+= zi)XjLgh#IPy*<3I`DHTR^KP z;32RJbRsq^g@Vd7{?-Nm|NnnE`Tzg_{PGOotj6Ec3z;0w-~*^R#yG|&9f z6l}T+XnoN;5B~KfDit1#_n@g5RKJ4yd0-m0?7MRcxG(C{`5z?-&)o>RRlG$7wB7-h zR6z?NK7p4Y!w=>HFU1BQ0GI)i!JkxNDiBH49n{Z*HSwcU8XDMm}GprQv-x`65l z0S`t-P!AfKPJL7iUJ8Is08baRsDL6D)W84_4#O6=clt|!M)CSCgF3-)K?|fjUV@JD zO`8C!SwV%B$N!_A*7*|ry`WGcHvS_(2M6GdfAI7!M*Npd1QoSd;vSR%(Mws-`X5-X zMFa(C2@vR9vX|DNk-AUOv*f1)LVa4cmF3GQN2acwspMq+)RF zJm&$P*#ZqD9&=U#4H$yuJruDFD#8X6|AUU1lHzYS1{E;9(2>T@IpF!j|0-uCrn`d& z7$1l-K*r<1gK^LW?cl>^7#J85JuFY~x7<==VDQ)p8n0zwU@!s;eOCbqv4ZLts8Fkn zI_RP^NUrke=J4na03Z0C0h-S4oT5?yqPsl=K*_cO!j=HB8^CM_a1Xiz#O}Q3(HpJd z(e0+;(d`G`s-Xd@>EGpouLqInlzcd7C16^$=ia4cR zLKJpNJ7RM>)XB$PR2)D@e}c*m(6v)2b0v^XF`zmVR0TtnwSb)q3Rlo+7N{rELQeJB z1yTq-N)*-6;OP=1$3m8Xq4o2?cff&)mH=4LbhfB)h=M`}VmGKMECAv+9s#9P!~pSO zq`_a%LF^!fphMU}@d7GIT{=HBpI~bKQOw^ul@Daz8Wpf~>s$Vo7LY*mUeGuMqeth< zQgx5sQt-S&0Jw{Tm`X^%I+ei0-|7T5;h+L|3>Z2r+g!`Q$lt2L2fsG~a??0?L<)4y z7kGUiG?c-clsa2fAWB?77YVn3ZzKox7a@XE!2Fj^;On5>3_$(^HBG=N5p>HTC?A1m zR3J@Y*cdseX$+ZHfi|NNW8|O~G{_iGrQp+>t>MuNIywNlJQq5%2A+LuISRV*8FUA^ zAYvTigdhWh@N*9aP;4QkC$P|Q7Zs4S{+4@b@JIsn&pNJaYkBU;#>3V7bmIDj+=|K3KdHx={hN zBdQH-4P?d&Hq!te2RsK&Sl7YD8t7zOO|k z0hD_X=`sSu1@-zsG%V&iZ+dh~c=Tp!c!1^@R)~Pso)rdoC{KY@HQlug9^IfV03fG; zMy^5AS-+suS)fb68z56!h%=oZyeQ#kWPt831SJ#&sCBTpD^Sh_6@Q>h3Iah1{dkKC z=;(LQ5*y^j_t3=OJw*ki5>z;YRDqfa;IocAAZkHw0}s-HM%AHbXM-vjux+3*w-#Zf zU@Zr8Kz_ke{)5NLkyCpjST!_>_j(6-C<}N%kG%$s6G18+d;#Ly`QSwwA4+I2poInp z9|Ob7HtKw%X(mJG`I*cLE`!y0~f+h!SXRG6Nh)TT~!| zQ&d3wmtU9|7`oUxTEJuTFTp+qPsX>XfJS6s^~MkIC9&`T`2gZ}wy3-iVPJS!47xP| zTJLm#(+p@bzeS}1!Uj(zx9MEXnMM(6Ec16p#aKgprK8VZVzy) z4m1Mm0d4JpIvd~yp#yku6r3NS3%4D6-R3m^5aMsIFlAua3A*weyifgr2|N-&qjn&t z!$#>K{2oZ_4pal&O#)RkkQ#u$^&*%Dnr{Xd1+ZEGwo(DDdGT@)NI5iY6F`kmXxv0V z*x;~*T*d?sTMv*FXvHPyUiRjHW&ACnpaugdv48XFe1w_U<>!MEJERTaJzFGqkXx;^?s2DvuFM^s+MWi*KtiUFqC3q`F{#Hd+ zL{Nj%FSL;B?ok0b7FWUt-A4}URYriE54w~bl=~rqQ&hlwP=H|1{p(Ku|Ifdj4K#%c z8gqSV4C?Xp?osjJVqnFzf9q)w7j%O?*c1+MLvK4s47xt4R136}1hl3pz@w8u`2byp z!VM~bKvge)YbnSiP&&C*3kt>-$kp)O44@@9&>%_x2N5)GI=85R`JGc#GT0dyUWS85 zaUg{O_}XbiqYQi{HR!T7P*#N}TJV4miwg3IX3$g&a)qiS$Q9sO2mY2L;3hddwc3DZ z6(52|JosDxNH8$G{0vqAS`!9cHv}#1K*v7AYa&o)L^uj^entyqwGXuS0-h2A-NC}b zz;M0M1ANOp=-NegP$Gmo9K0wPG*r_)MFn&@C#cy5Qia@X1NE1S@ps#yeHZWLO7)jhK{Qfk0F{a$ouD!sxig>%=v@TGI(Mi zy7v;S2725(xZ{r$gwUuy&Y}WQ<)Q+*4GA(7UIAXA1TCqu!5nzpgH)rA5r9Kk19o;D z(y0}mAf1@=ZQyYNpWb2(@SHbjA`x6Dz?wQB&VOeKXy+Al+6-cJ4!n31KDr35he7k^ zp!Avx8cBkT(DAphf;n(EgC;$EI-%*+MU8>sr3qL8v_fKTQ2`YU&`bte*#K&^!mdyU z)7>p9ka7glXa$`p42mhR9H{FLPTDOhU~$m07APNlEDHFf9MD-Epy93lM}nZ?Ezsa8 z0|NsiSZD<(tL+4xEejKB4YB~`KFBf)(2BCPAbuxo0t0;7IXLt{K9`pUsfFg$?NT5P z+~=U_D!9+TNii_Id6d+Q1}39D0D)vuy`;gY_9yd!u0!6UvVx0&!L{WZ|C9sZYP}P5v`V+PhDUcW_>310k4_#H z54Zq$Zx!hDTu`9ZDKRh{c)-dN4L`9$ObI!$fLGK*Gf9vV1H(&KurxH2bVEm9@ZH;?jG4#=L;W`ip9=B?+O7i7Ou&NfwLRwIH2Pz#}5AgTxQU&SQq5`@#8C0Br z@5}9Mfv%8PqXNF~7POoJ)ZhU1g~9W>dmt-wyP;JlY)?KYLxSbkKs#kUkTtfT;t8am zfBgwi{Q#OHH@yAY(xZD0WRchZ!=R~N(0s5D^BNWKeY@6kAd5)4A@i)DJPbOyn!mS2 z02FYy`TL%MD&*rWDiOShLB#-G28R8Oprdx+^IS+-2qXg@s|Jl6Viw`h90XAX$w456 zprLBit1}@r^DdA=A`5=(P;u5VRupCz&dCRTKw@1wBR(L6JjeU z9w7ZlXgq+H9fKmQ6B1s&t^Ywsh=Ib3zYlaah)?HhSHrh2yFiQj5G zVzUCYFcVtjegJp>=BR+_ZrD&RWWDtdkX-j3@C=Jb=RMFwo&~5auRE22!Snx759T@G zea*g>fBAcr{{8>&+xoU{1!w@w11W+Wcp+=ckU}3RffHWXS)KP2^rQy-3gNUe?=fOrmno;1PneHAH(D;TAr~+z!!{O0+-?j6j zW5|ntcforjUVtjLwa-Df+`6csg+92o0qVsCAk9h$fQw;>FF+NI1egyG-dzQtnfkr} z$Xu=m9|Nc+12;w;_!t-E5MCG{_q2>2TJE7?lYNk%tgfkG@q`)iBJ!kt_E#`2TdV@ ziV{$%2wENsJyzovI4$yrA3$Vi(4;ze+q4;IIfZ76iU4>dVheae2{g$9THgg~Dr^81 zXUAJq4uB4k1XU%V<%-}lTRy(f0*&Elw5Wj8fYgG__y$qRSQ3TsE7o(<8oEjV zyA7nT7i4hf9`JH&P&k2>e1n!)Vqa(J7y?>lIrS4W!++EEPs|K2q}GEPRG>@ez^g35 zNxKue{}nW54zi+i3S>aFdkVxo-CMx!0foE+sPggvrD*WdZqWKlkPZx$uvu%!Q4XL2 z5xSwS^-_teM|YHmN9*kp8_-MuIKI1K>JEXT`7+2RaOVru32pd#?fd^+mX$tHXuqffE+B(5nd94724pJ{^gCMvG4oZ3x1QDfuhadw3=W|eV z3|3;mya+1C96(Yah6kv$hxiV3LKVCafi}n>%1}!C5+B&P(9Q^7?gA+US5ZElkHKC> zDH(A3S{mdAY=x>%=VMs8S^@Sjv|McfbGCq&m3s28|K`CA84m+xM+Q)F)44?jOoLVx zf(rpi3yK3I2Wvrrc6@qv-tp|b@#1wiq?Rv0njX&(WMBX-q(TlBq>2(G1#&icnjBdT zYAp{@1_?TNQ)vfyJ2W_v@VBf6b3nxhXr^!%NCR?H39)p%2XgEdD9<4!nU~FA{Vm|8 zpGT*&1i~%&3r9_G7(%-(2SIImMB#`sR>AQ!k{Mo}R%2lB+`(}2rqsXx z|LZ{&KWJDOysxiCrGp6`PywL69B4ccG{6AzIIKwByLrkrwHMraf*#-Bf^N+@_`=@f z;4di;#tS}-2SBA6q}uY>z1^#`h|N{+kjMAOpq2dxUkZ5adYkm)#2&V6OOMVI9^W5% z9DK#^k@*R{ks$NXMk^);56y!fyG};&G5l&=^AxJ6^Mc307yKRvUkQ3>Uhv5Nk>bJl z-6QkBnmz`o@(ibm)0=ZQ!<1k1IQWjsBlFl+&?q#>JoEX5VhNum(_soufXuo0!h`XG zN9Q4rgReL|4!+>>&^+Xkc_1ufU<(g#3 z7{Uk8!m92z&_o`1gLd-|asC#2&=_Cy4`Ke+DIiww9+eExnmp)Cm?LP8v31Vl|NpP?4S1@<#~N~rGJo$;(6t$@|LbOh+8LlK0bHelCKm)?qY7Bt8KC|@$PWZ6ONcT^ zNeVU@)FoyB<#1T95_Di6BDxTp*Pth59Y#(&&~YoqhyagH85PJHOBWT6m&ZW^3!sfU zprG!A1hsGH7g*N_cPAIribfvdU;y={ky?oy{0s~)o4^LNsN6sr z6}rI7zz~3Y=o>5r8qxsA3exa6xVVh~r3O%LfhdEx7pxK#fAydlW?1|cfjO}3z6+!Q zYhwpvR3H$f5l67WnjJSlnH$#ZcmU==uc3gpgy6em;SF4n0|UV$+~A1hZ+QWl7eF+G zK)Vvay=71@Q3Es{E)G(?Qvy=4gQsp<9yGa=2vGs9`dhCcsqo<6 z$MEuz9BBDl3wU2QXrGb?$hF5?R02d8800~f1*nYy$}tfj-aZgvc+zv%*)tH}2=0Cx z-hM6S(fPvj`y-Fes~!j6GJ^&SntyZFT0%t+zGCude)P|yS7Z`sbK46K%?l3vQ;&Z; z$mq!L`m^(=L&JZ@(!DGOjvX!r|2_Vnd%dycWC{3;{D5OF2LJUu{+|Om&I07P&Mhhq zA`A?kJ3Bid0BpxYkAtsRJ+cqkcyzu5H4i`w_dpx}1Nd8%>_DLsqY~iJTle3i^90D5 z2VXJwvIzCEG-w`dIB3w}WBea#X3(4vzYFBw2Oz=d-NXea`-i%KIJk=w~BoRPbE zNTWL3?4Z(>Kl}jb_`86Ypc{2TfsIzgf;(QY#PtK*%7gYlKuu!MfH-(t8~^&R$o-E8 zpc1uniwc-V>wkcofUtEGFG}md4LaztfuI2*{@y~+ph)Xm{yuQS50oO1x+ETgG%96F zunw<-iep6XB(5tbfh!!*izW+j_XAQ^fXX%pPzP4CMdbr1__{Giiza{q2Gk!#8Z82g zb-sM@XUG5lpe{Rz4{BI}%=p%#vVe_&frQZ_ZBQEmauX_l%VAJkvm0Je!A6U~TTz%m zC%J>R*TF`!JQ!agY7HVri$DWvpy_*1xru9_$fxr^WKS++tSIvVXsjsu0W-skcXL2> z%jj4U=$BDJlDT$~_c95$o^N`j!I z2kK`Hl2IdQSfFP<4RAOiGM@n`^MxM(rAGmz(IXC8jUMs0^nw>6LpuQtU=BR9!AFt6 zjcuaJotL2?BM^}d+EJ;&Ma{YcJWvnY`c|T%@md1ZJ%^4Uf{XBM3I5(q#E;Iy4|)e5 z1`BOGg7!Uv+8dW!55U@^rHfuq1#ftS34k}g;TWig9^i!DYw_v)1P)6?^B8569+8xx z4JCvCN=wP(45G;^hX`Eo4mgmj!MDRGpZWj)bp+VO{4HWa+1GgudsIMrz;l4a=_$4H+-U%52pV}d zpXBgpe#7AjTF?R#6W$Lpb|1)+T~pZ^74qnXLmgZ{L8&JfXWRo537-PJ^usLP~D@t-CoG7+!7yDFhv(SmNK| zq5`_9R)eD0gKT27@c7T*(_5|K@!wgZ%bBGE5|=9&`CBeYgU-x{Uy}x&W`LhBjgkmg zAg^?C26N#4K^eEKmu6siSp-r*gK`1fU;oblYEy!iH!|?|eFCp)X;E1L9%_K~vRhO( zK>47d2v^XN$Tcb&uN`nTlRP`$!16h4MFyw^>iPeukM$ZAkX8J>pu4R+ATx(IAv1^C z3=9m&`?*2uQ$e*Kmia@_0k-hDe`v~q^N|9&EJE76F}W_Z~&7( ze~4Nvfv%x=Y55;?DF0JXSb&e2YrTzFa4`|&HMEs4pwosxi%ESu|M>E+f9k`(evb<1 zbUDzfjQJ>`1KK~1*^vYdr#IQK>+3d;u?P`UKlT zAkZuaC<{Obgy2e0#}go`Ak7p|!S2xt?yza_x9t4`stTY!*Z}6h3jvTWaJR*?^9|G! z$df1#A26csyX^oQ0a`{1I{pf@0+s-0hE(Li_$^q542Jd%y*XX_UT%rO#npMN2vqZ(fL-Cs7Nsq>VkiC}vA3b_mwt@Cq?gO9H$#{&v>)7k7%>}!Ud{xm1r2zB_Ab3B$@>5QCG#QBZ3z{i{{qyG0xez!^XI6XU}0bY)g%{KK&yV< zz62d73o54228KYD1=`sA9`MF`XhaKuO8w3?DqtE`fIw>m36LCYz`gSwXk7t#5no0w zxKcojxvv3F_wx51hE@-YLDj z)E#u-EyyJBE-(-9;m5~XRCaKK*5HFW53I1Ze~Sv})>}~X92EOl`T-z4;C=u?U5m;B zxPJ7$16n_TA7?*c2O9$e_&m0N7vZxZ{Q%IY0?5()8a*mt?`up^0efF#jtb2CpowsP z%^nrV#P}2y$VB-Z74XElMvDq8c)%0t8Z9cYU;oY#flk$hb=yEE27{9I0Z{FZ=(Y)4ID;PCZ3F26M;CE=(4vbCXLNyfb?h`_U|B) zEmmM*2Ju0QN(HERh6LvWPDp~j0HqH==?zeN0hFEqr5m6-fIfgm2tXkPI;8{@CD0D= z0WPR{Q2GIs{s5&xdmBL+LjamF6ri*LMg{?ygqlGtU>T$V9?C5$74XnUPwe0j2k8Na zI6_^E3PL}+9<&h0ok4biGKds7#LZ?PLLBUk&K4C=@PIN5%zNNq1})}-dKVnr8Z9cY z-~b1^MvDr_)1VA?0Tf&sQ&hmgr!hwb5`1%1Aki{K1rjYiDk#y?Tnk#n`4)VQ?Gnh@ zN!^gh1`TY3I~3h5Dj6sk-2Xlsm593p4RkQ(A-E^)|0n^8W^->&H{dR zFKm1iRF*n``WGMuxaE(e1hwT4QH9d-FL8&hII}~HL?C8>K@BQUxPbaB@a8^v8u1{a zsgG|10J!%DZlmMv{pErOX21d6T_E7W_zv6=e8R7}MCAZDku6cV0Hq&5=?_qv0lHjC z0KQx)M#Ta)C)qni1+nG=A(VBBq5F#g=^hmaFx{eJ0H&9y8~{iE76=WRr~=KfK$FG^kX-K`uv&2X zfCcZ111X^Pbc@Oc0R~WDf%EtZ0R{#!@P29Nd@D+fgJnRI$Dlm=7zLeQ4=||1BaQSLH^+14(gE*=n%cyhSVXt zyN!w+q6ypn{|7aVU$%o7JNZBz0|o}h*IXXpF-Q1vG#k*mAJ}rVZid(P9y?Q@YC$X5 zT4j*r`L{E?miO411d)eKbN`70P5DA5!aex+gSS^fs=EMCdg|Vz0-?94M1c4^lh~mv zRXclBIKcZvTU35|2ho%44Tfb4FD96`cR z;`XgYMH8}r`w^&|0&Us__tsesB5kDxA4>u2tAQrCL9XhYqT<2M!0?jiAZVRMi^>V4 zogW9_J3pwrd7`8iR=AZQ6>gwi7U1Qy(8e}uxduzmJ}Mlq!$5naszB?dz}winT@L<0 z@}~jFUr7E0^E;=gSb+SgascE{;yTD1&=#cZ04+!{+5$45MP&t2KrNtEK=HREfY(w$ z%YH=Vp@SBQ zE#L!!K_iUdL(f5j`k;h~Z&QI!=L66wivgf(8_}nWeY#Ek4l#r7&GbLS%z(bjz^C&$ zWb)Xv^JqX81L*#q7u!KQ6PpKg+Sttla)>kNUV%N3BUX^N7`*s@6*TMw9#{e;WpG%6 zm;RBo#{e|h3A$-V0@Sw#U!fZT5()sFClb&N9peL4Ij}XnpeszEad82>)TKq`1c-)R z*9|Y)p;3uEN?s2eB?n)p1sx@~0CB3>bOs)Vg=PKL zOPJ}b23&DN9YRAlfp(pNXd==Rym{SnXC0!+ zAdW~dyEGwb>*a~>&|x(GmW}HmZ3RtG;?hK@C8iL2@$x*(pprmPNl1;Ea}H2e1I_ih zwtNE>UZ8flOUD-QR%8Aaf6!pte`g734`l)9L@dn~l?R})2F(_g3sCw1l->ZP7l2yN z-CI;PfVya)9p)U+9xs%B0Hr@bX$EMISpe2!h7Mqs%7B+f_wG?Sz=1fL^jM1uNFgJr zp$!rTcLqTwfg09edX5UrWROchqb(4ZO;LfkbPmMjpw1<<&kpj@H>kNK0w9wiI$Kmg zeg@SR37|$#CuFX$s|CET--emLo;)5hV8xYQON))@16qfo%vk+;qm{} z%foEoRb-%^!2~f#`wQ7v(9xuQ$3V&N_)*YKO7Ik9ib??Pos8hZ5>_^Lwx}qeEh5$6 z2Xzy{^O2ywEq`wY$n@?Ol?X0SWBDb@9b2G<)DqC1t^$bufAkw<)|ZjLMED|j3;>4T|2aQ=WK=gyUQJ`rH&_EifE$9JjPue2|1;{w?%osK&gKA3)^m90g-;maT zmP$H6sRR~ja8GqlQ30n0&=F6d)BxW*0QOutcvb>(+94?6fGTNliwP8Ptp`f%V4gBX zc!~;M0e3?|rx=300A1o)0pc8Q0UwA1T95<^U;$Q0e+BGVf3RbrJHkMj66Bxm9u<%x zP%{Q{b|hHo0Qt+O^DE422_WCVmPTiQIW6D=(Y(4@UVw^-mcO7dZr%afI>PADd62&q zv>Vx@w?F}QpPEnSa~x-#LdMrQ`CCDE7J|Ylf}a6&f+l!uAb_8Nffu|35nBQW$$&?L zKqnJ{!wM3tsG~s;Rgkd(kV3G7mw+4$o28fz=D_;_APwO2iHJ`f1)wqlRKR+5o4kat z=Y{lM3qbv+&Mhin8ahH!0T#QDIyka87<_UVXx535zvcR`|NmcmfxL${e*|7wj9$z- zKw|}zi$OyY9{k8=b%WNo9dA(q?T!cM@#8Hj2K=xoc5Fclng$2i4IXI28MF{pke~&d z3mUF?1m02z?P6U8bKpS>(m+}n@)EMc5qCBA!lU`nUr>GrRVN0J_5jl+D3Sfve#A-$EgsvoKKA54!wKqZ(1Q5Nka?^7YBh**GDM63YSv5=Kvpsd5+D-N;*PfIKUR7ZhUxPWNn zme?;g`iRZq=>|Z8jbyj)L`QP`3lxx6999N8f?u66dLw`yNitct#yd? zKM9}-X3Z9r0MN{Eb43Loe=GFVWbnzSAZeua&=DY2ojqXH$68b}n4#++EZ|eSEh-N1 zDPQy{+n1nIYasWJKzs5IAoH3lD!BPuqd+s@pzCN`R6wG~T2w$sOn|5DHIPgBs zw>$Jc=Y~CC$AR0E#5u0i1~g}nw7?p)6lW)>Ktn9QMl8(^c=4(dGM5bT52yhF4noke zY2Za!Eh><}YEkKc^1)#VS|S1FPf=+A(@Y+q^OSi&BOHkHl=)jhgEk($MGC0*Zxd`! z9|2_|(4qALi1zdkTD7MmL9qvGPy2v5uev=s1Lw(FeIK?P~*8&6%xmg`)-KnFTvvX22y|N z0KP z7vR)|sH8veGcdgT3R*r#qyY!e3^)NYV9US%|A}d?fp#2#I#c{DJ3k>tpVg3>Zjg&6 zd%%laK+_xit^J?=|9{y8QVyC;<8P_|1R0D5-8rdIi_l7LW17EJ7i5D1$cF#k5}>L8 z+@PLv0NN$&@MiJ&?=9ik&F|SA&H<{>!RMdC`6$PqwoU*4A9Va_EcEzO*xG>-8H7v0 zN1%R$_%3Yv|NpPUJU|;^_**=u|NrmX`GK7MFz920|E7V$7t*SJ`ElC+|GO9%B*53g z6pMjJH@ZRF%)23nlJ+%$YE#e!9LHQbKlxxg3q7g^G6%as1TnO@LWF_gE9g#5_(mak zD-YC-1xtaJWq`Z=NNS)RDd^xLL>VMSf>nY#SV15M!O9Zw4TFdkq96_60Rlpk)-P2+ zrgVPy_hLs2G6h z6Q19Z_Mo5h&^!iO4-f&}gT4}U&T%(*4|@K8kIoOMd(e+LG#oQ<=qRy<>_UI<(Rr=( z+RIju9wKww1ho0^8KC)arKzCvDE~S*@iXu@{|6l;)Z3z>3-)V^N(ac*$6Hh;h(LxC zLBnMgA`A>aKoJGH`WY61uoHctTlqi-bb$sP1Rx4sz!&f`7#?UjP^yPGuMHASppm5r z&`qTRpl}7BI2N%B6n8Hsv;Xq1XaG`RJ7g<0+3$ z(CJ8^1DjYpdTorr3E3l=WpBzFcLop3gEc%Jy*@^apv&qaUUPsX5$IXqLJg!~*pPKxn-f6QKB)f>T8P~}MFn(@6sQP{0Lgcw95HnP zH1`BLARD&d9+n_M2TNUppM>;J%7gKk592Y=p63AYxk-;b4!#ob$UM{#$jAWBjvqV@ zzF_g#*_a>aYojg2>GA!cN9T2qgYTI^9t`lvJPtmHRr8n!($NwhJifm~IdF*;bl?*B z7H8056QEpPqLKi*uNia(FNg-aw{r^g#GffDH$d(O?aBgsd5g*e5Fd1vB{(CVKtCVr zkPrAkCx%nAtik74K!zK^QS%nm>;sLjcsBpy0^RfsItIBW9-MAZ z;qv_@h=iQH#RPJ8^DoZ&$DlSOctJz26ZqaZ3y;>@9^FnF9^GCB{C)qyv$|8jCocQ+ z7HPcJ^67-|Ky7D`KA+w~4Ub;XeSx4_quWu#qubK}>;}-i>b*HC8n2~6*&Q_O+(8Zp;ZB(S+Ruw|Np-X2JPMGmC?)8krUd+BaTsXoX{6kfpRY>u|iUjPv>jUGMN9Sm*;>^Gyk%PB)JPxj=cm;`ulYL zF5UQgIk+hE>HJ-?6qJUsmuC2mP(WLX#ornQD$RUB`=vm=AIJ(C(z6CAZjergMVUe9 zo&sJr^%$-Fpt?MB3wX&ccyNL0xd`M|ST1@4$wf93K)Fb7 z0yD#lgFb`1h5_{oN$ufw&jBBe;G_AOHiGw1d^&%kHpFiG z^nyAma!g&dpi&Pd7SuxtK<%MW<0wRU z*70cm%>~Lkphb`TJ$X!^t~&>)?*|_m^XRmJavmg`K=O!0FDQ?2 z^)fTOnCm&%^9btBC=$Bvpy>q*HU`i}O7LvC0UHCu?`NR^o1NC1uJerqu!9wE98xfM4uP?LKrj-51Zg^|t8#?9HdZ1(=GibMqO29D}i~k0o8L`g4;4_mSLT+bZ zEr~kTq63-+%kcPr7Bmee0h$EqT%)1@rgKyvQ(hjO?_nd0VC|q=9FUJ(cI@!6_zyC^ z^%CgJ<=Zb?K_ma2?_ZX(fUcI@qjEwNbTDGA$;}_bgdBR;Q#I(74!=LKtqki z;JaXPuHxr!`3;)#hs_?o19MGejlB@V|%U`C5IC&VL^Nk9%0Md@6kps$?QO4nAY?=;kr-=yoyS0Hs+0kTDX+ zTvQYoU-N?3R=B7LfVd1G^^mK#!3%g?R3t!E2*ut(?p zoyFkuA0E6Y_51(-Wl9BPCOJWr0Tfo?QX@i?fnft^f)YMUjQy%%uo}>901QyQaP{yx zhvO_N5LGTJ973RQZ9P!p04qGq5d#CeK&p0vRKSx2I9Xx2Vi>YV1$0t71NwDw&4=Ol z3wwZ5EI4XfR02fdd!`CN8KApG1$;;rXcGvS-vim53W^>@(8LjBivuHnt0g-V|5CQF;f(4Xs>+QNKpKc$O0K;#d`{C!l z?*a{q8~%SS3Z5r_4nOz(xR2%iS_`Nk^0Du?Jvu?hzVlB#?C|Xv=-BsLo%b4kGnVcL zpZd=E-{b$u*P9($zQK=u=lHMZ@&6>Kgoyx`EIld-VA=;(!nD3Eu?D5;0FT`;XL=*Z!N%&!0R=)78b?X`eM=Xp^111ak`{u{uGE8o^{mE6Z# zz*GIYAQin+Y(N*J>;#XGY5oLH!hv1VqapyJ!D$Op)Qb^|dfwWcr1MRlTH-XbKbRiR{gh$F>#BY@k z0hw~VMdgDaVin>GK?VlUCE$>d#<)ciECpIy0^Y3yjwy&5XhjQMTLMuAsnfwKK@;|T zAnRbY10$FNs~vWMG=TT@5Q?Xl4?yJ~==gjggrhx#Xy)iyAnRa`?gewmaC8nxBaVs< zJY(D0qH+VAuAt@E0}$tUi;4mp0|OiMa10GL=n^2v%n7KffNoyto&r_~YT|(uA)0vL ziL+u@OQ=L80+iW6qY_A)@AzA;gNkdIA5VcfFh8P42hJNwSA(=+`Y=RA!tj7=%YXhU z2f=gvpdHg7ufY~T9}ouZTVeC;4udW5Vo?FlaD({ZA`^VS^#T4CNfri%0}ojnPDVp} zTKp{=K%ojBZ|C235jwZc-};7`f#KzSkTj-~urAL#0d^E5!GbE*3!p}*QQ`mph9_Z{ zTUUTn>=qSBy#hIZW@jd}hHVC|20GrN;sCm52^F`3yc8<{6?nuQF7g0vG1UvuVydh8#2at}t*!R}baCAj z5)7~apWTUwUI$QPF&Jz>i;4kKNuoi!lH?#LS-^7H7BB~v%Sb5xCWADBrzF9LYpQ{! zU69ss5}tN}Ck;qN2)pMB)OSM>;Vm=tK2B(w#}__FdV@i8WW7T^k? z0DqJVJ=vhdzr#nxp~FXo!h>1hLls@#EFRsE+kQcFmeAXNJ0NR)z8z%bZ(#&)HHV&Q z3tcY(E@=Faa~i0cf|Q2fbzvoCNcAep5#*rj0A4PI#RY%M5>W;Q(6|oS@c}y8wKGIT z;$;*ltAQgJyc~ndr#AdYoZ7Glyi=0DB?NT*0^-z$1P;jQ3kJLpS^-K6Kxqaj{Q;z{ zdyC2iP>Wl$MMVL6Hi7|^c7W0WP&xs6YC{3eQyV}g>;#4KXOE@FT2w#^!KXHW#6hPv zfKAqzq5?KqV~z^UWROchr#3)bHbn*E(m5(%mus}BfNTaGq5$&IH>kOgQyU;UTU0=P z1|2GULlm^*rp1z*fuRd>mVpVQ;oEN)I$FT1&%paqUrTy)gBIUFH_fe40cqlIW(6Jb z*7_E*1r;>^fxHEEgD|w_2CbwLhV1J{N_@~-9JF>9vbhv~E&w#Wf-6FBO#oQ}1W^Sk z&OpmQaaIT*h2SN-MDNprR0!DiXo1=r$XAffK&vtrz^Zacj)Hg!v;`Fux}a5rC|gk3 zJiE(aIS+fg#G?~(Ngb^Z2j~F%1KRGIfb0pp#l)c5iV7YkXi?b!JtCw5RDM8D9sw;l z?^_NYRDm85@}KzAK{&wS0!d_`YF_{pH2;r-?hFL2ndI;F0~riD4-+)9)cF(RbPxeh zj~aA$4~RzIlL|Q<q3OQ2{AJbiBYy2gqMOoo``%N)M24V12CsFsB84Nvu~l&kyif&7c-ui^>Ji zo<7h~O`t9lWJrv!G#oMj+M@#Qa>K?zTU2g<6m|B1H63eF0o`5;-v9XlY5(UBocljt zXEp2r>j4iy5~rus3~gKAF;)hKo#LRa?eIHykT-pPwTEo*^8j7i0d{SR$^!5d;s&OK-EFE0WyIa#K_w{wLmRC@ODqo0rCt)?+1jPpW+~l7__huW`Lfb zf}UGI4FS-`OwhIv(4J-naB6}iJk)U(h$=`K4IgI#T|WUG0po934018Nk4(mX&(}4e zVTBG*t-_DF$@3?)_6Y!mUT2F6n1*fui~x&aZU7ADL*4+m@+T>0sc1mcFznn517T#d zVnHXGfJRM_N?HkF*jXyrf*G{y4;;*(W)#j~hNyxBGe{w*UTxX(1GLi%ItI5K%z^jk zKpIGEcfG9r0ouw3bt9hI&Z8UBEaGpe`TGCAPq#yaZ|eb+bFq-O@;Uy$0NRNY`1Sw) zmoA|G8>nZ&-{Sa{+I#ulfBFCa<)bg4%|zZ3FIy2umo326E=dFxoUn5<{zKZ7rnr4#L_+f%S$#bGeZFok3^e5fi+4lfH|;6 z3Cj;~(fSRPC=o}Nl`4UbD+3P=5V7|jR@WXt8rIt(M5DTP8px%vLA_2e2VMz)DrfMV z2JxNmBv7P*>RPXElb>j3l{tW`(=94sx*Kw7kOx={?X0rzYzz#qZHO&NS3n~GR-)GJVDlmZ(GH=(z z*s%h>T@Q3LWdmenkAZ*60ncteq^T7i6*wPh?|exO^1k^J3B-^mc)vX4u;Yl=e&D_G zS0R`P`%Po=fL1pU#gj9?1XypT-}4;1j<9k4hT9-ib7R zje|wTj^A8V7#T~oJ$rpr0zA8GR5U!hOH>SYfo`Vs?fmefa>c*@pZEnpmydyKpb!-U z6k|K(|NlqV3z;?h@WOV*zyF|NMF~(HrQp$g#3I@;#xc$@{;*HybC=G4KAoSC1Yh#~ z`}ZGl874e@LO~(a_@)6o6?e?B^SnprZ+O6*21PPjz-(s(2aKD7waBzY`$d3ce z6!^q1;0Fp`9~B9o-Xvy^)=NJ8o{u~a{$cXyyzkTb3>sV;<>0~Pqrw3XFa2-MjEtq4 z9=+ZH9^KU%9^J)=pz>P|4k{PO9c=|5PgkIr87ueyzfW&ALMJGod^%r(!dY-RB&-rZ z+A_fLDv-vn$D+#7o)B0muXk6ibVcEzL$)ss*)F0i;F4qwxqRT0yBI z7Mw1?rx$?J1)9vukH7!@pAZT<5Z@7+AUK#A7<@aAd362;&3c26%j(>s0?HL0t=~#= zJz6i7WOSYdjS+ywx_eY0YP=mhI-M<=|Av61KtlYj@}N|-3v|lz|Ns9PK-B36~1 z^4KK^xh#Xr!}0=uYdL6{Yj+F8rfz|kWgtH21PCTX=f8ppbH#!KXa$%DXut`yEgZBW z0>lO_Zv}VlkrrDdfK+CHYIp^RG8YxlX-S}KIZAAxUH=keP(hvmTF{e$Jiqt>bYcmj zeeI%R&=~@{tj0&h0{_^5LMLdx4s_N4$UoiS%-*6>z{J4t60}9o1Dwei7#NJeH;TLi z6-e+v@K69PIG6wm#cmG?5W54y2A^Km0A@qi*tMusfViM_Q;ZA@&40`ITNg1fFhK6$ z1RY}Q)0?b;ygCIMY~52-3P2jWd!PnPQ2_-b$SzP2LUce@4kdtYN6Y{vFa=ORYJl6E zZ^4?O-T4P#PK^pA_|Uc&K-LZ+2i!~0jHw4AeZc*_1)8Klr6cHSMuHbIHiLoi2%i5=My$U(NCb}oPaa!?rA zf*j1>ZwF#G|KQ|ri3b_k{DYgn^(tsateZszToft`z=|f&*$|KjKwX*H%hG`4a*%8D zlNlH~LsT?ClMgRI7QoUR=sMt+E})g~pte59ec)Sa`s_i9c0zOMJ`cu&9?d^X`P-G* z85sVnoE4bk&fo!ZPq)F#WuSI5j-?@;prxOkEh-)$pLDyZWPt1sU;?dE0j*5|_w_*w zwL4u@3_QExLN1_FD?nO7bI7(}z2G@y{uaZmq!GYeYioYZ9yZ7{4L^cU895k!C{l^PC*+2h3^G6-{#4p$a zK4^-6`yLh0UX2$j5SbI7_yr&`U?rgYp+E5p_NaiC3xfA2zw`mw4h|9nkL~~t&}FI; zpwR1_qM`t%?}KYg5A;O+5_0k}=!^ttInx8ZHMK=WfsuiMKdJ@H=a1@v@C92`zy}oy z_Nahwm+##I=I;VkM;@IJTVB+D|NsBxZqU&)pkcKVuVXFXG6!_$j01RS1Eltu8pVwka9C-Wb=bs{W_!7()8MYaUWjtS5vS5W2Y0WuYI z3m+)|cTQ3H0iwG@R3O))fK))r+AZMyJD?1c0M^k1?reeX(}JlCQBeSuz8aurfdHuV zl>pVlmazSJ;9Uj^ph`=_qw^3baKL+rEI`T)U?``G?3l@odaIRf*3oSAjS6&Nb$|g-=4$>DZXdBGjzUaKEc%dql~|GAIP8GEGmYV z(wZ$8UN(ccJ3Am+|3I_~@VA#UgSBSNhLrqi{CNy7lR;}6ca}rSc_&cO-vT~rWhbb@ zXJBA(0|~VGpBq4{)T0jeDFfG^uK3E7`OMnh-`NS{K1HOH0 zp92E}!)qf*^$suKL8UCHECQ{%1nU6_fc1bx_Q8tsS3aE|F)NJ55C8vrfah>vwP6dm zeYsN_5=!jgAo;+=fD{3?P`4XiYOr8<$qeOr@b5F&3EIH)+8pFS{_PBD2M=&~@bCYy z6ExNFS`j4L&A@-cBl!b3fL`;1L_oDY|2c5B_2|40-XHKX7iMI)fJb)$hX?;T5B^gg zo%g|2$;(ElY_|cZhQjWxDn?Lek42>$8W&WHY&fy#a6uVZ)#Irx`F zg@3!n%VZ>9gKqQ%CAnq`hSwsnv{-5e@`2$ck7f%7{;7v{oPO%Tu=cgCS@BaONnFyM&0;LmBy9ZL){{T6ubBYQBR57Td ziWzsU(hyJbZ-WNBF~~X4fal*14R<+^V7CGPIh=uRc*(Kzg)g?$q09=g!2>NK3{T?H zA;|v!zlUuXs43LC3m(u6p!E3wB)I*@3po)i?IX}Fhc8%=Wk4HRKrN>y3=9k}UI`=V z0k6y1zDMO5Nag}uMgVfGC%7pE>ZyRU0LT=u2xvGAECSLE76A>6fg51pZcy(Q@Pg1? zpe**15p-N@H?$YsJq6mmfi#CO3xIFLEXS|9{E-`Tu{| z`TQv31)v4q4qauwt*{`SY*O<@;iU8DGLLGr{%Fa7T@l20awG5zS`vyzWko&(2piN&Z3eAN{!nt z@ozin+xg?gE%27-%b;Ys0h;$feT|nqbY9N*lKrKG-5E*#bN&>WiPyy7o z)9|o7;lb~J(D1fL>j4jb{~I2yx9h+wppg#61Rav70MY_(b_RHK-g;5E<@bLN#uya` z&*pjo2L6^(aB#ABF}%zLotTN_70@t6M~@1q>htJrfzY7yz(L*zUGl^TxgQtg6_8T; zdu7>Xs8@Wu(6-V zGE4z9i2`omM}PwU$0nF-tS99 z3O}sK@a_EgVhL#4uoGNrKt?E_n+jAo85lMgK#L4eBdnuE1vJ(H%4cA@6T1HtbRiN_ zJ_9MGe;C*(Eh?Z98$FQIK@3pnfy6=43u#MQ1KJ1X+072xEYa)xALM>;eGj_07Mu!N zRKQ8HvquF|V1S2-OF$(xsCr}k?xFb!G?)h-NG$-d1V9Bhc)%Yzu4;M8gWvxmsKB`7 z!S8>I$O7Z|I+)u#-}+j9kM2vN>u7WWqBPqvw%`1bl)DVEC=a$xeC;>X#SVN-}@5OOM#!3;?oH}{J8Ui z2jU3fUMB;_OT9dk95v4&Sqz%609jnaz|i5MQUkKL7G!S?$X<{nC@q7QGr;TxiM=!e zE#ifwe^5{LSc?j1NY(%p;2;J_FGw7u7c|8J3viGaMu5}2{&}t^lzu?!LE#D-s0KCoL1hg{jPh^=)o-NqM4m5)CVfb&3l^ZDemE#V zLA`H}&RZUhM?f7?qHy$3HKS0MiD0nm<`r&c#kgZ4aFZS}t|0-7x%y(z- z;NN$l^WcG(?60*APrf$v=sf6g@TI*+=OK^pw>Flo@Zk431X^&}0h;3K4pHIoXg=a`7~JCp4S9kX78k&aUX)=SQ&8UkBrd@4 z!h-?CkN{l(0AgquKt(_+v>8ArfeP#gY2F7i>ctmE$oiI0$FN|J#y6lM$fNT#Xz?3( zVyhc6&IelR4C-NlIwKq&oi-{SojH&}eGQN1-;DfyprCT;g4}BW%}uZQ|Mw5=zwV62{yOMkb!|=KZxnkoui_VHo>Fw14Kiw|9_9pV-U9GJ^pPj zq6{4_HvS%+=ZkMUemllkV(HO*_@Bqc(;m&g*~@kQtK4N+;LdQ&g~vbXwJ?aPdd&l( z@?W!ps0xq&CqcA<$N!U#4L=x5*+D$r*AkB3jxm*hIohwe9lsr8Dd7OgD0uuo2@W98 z#DA{~PryEK6|8v<^ ze!owKmpod(dGPyR^Ju+P2W~=udlDWXQ$am`P;U@)xQ&VhOytF@CBOfJjFkWl^?*b{ zjTulNgGQe`8jpaILbPLC>|sz|1r7Rw))|4=pe{fFC{67EiGXr2NcRg+E!CrSZQ%kj7sRD$qgm)u16AP_DHAhb!o?ot@7;7+$7< zrhhx9K-LTN<}rG59sx(V>pLHQmj@obdsIN#Y!_%K-tgOt^NW7}hnt%KHa!4LI)F(7 z&`3oKcyq$>W1vY15BTXfKAjJJI$wjzx6TtD-=BLNd<8pe22^Ks_?Q@a{6FRaIoawC zI5B`4KA@;<{pQo1qoTpz0lJnjZ31Y;4rsQAf18hqK}Qb@$axZe-EfE_2``g z4#^4oY(Sm@Ei-%d;sSV9?&uMZ=D#-e&tQS=0U95F^4kvW z<=x=|9{&%4hFBy#EHBongQ6Z3eIDA-P|7?2YRq_Q^Lu2UOaaaD^d^E9vUE;S0j&W6 zc^tHA2A1Y;&;R}3ySGLKZ^HM0rgy}#N}WHU{Z~+WM?PB#Bfayt-T*bdKxc)3@+K&G zw0`67PyzLI|^6eS>s@(t}UuSC8*kL5UlrhJn8YveeB5v{JH$mBF|5KYw2wXp*)0zb$A$ zK!LvpRNW)iY(mm^?;h~VBcIM!FJ6PTi#8uW;@SM)rv4!;bbUJifh5m?H+$8nD7@qc zxvm>BZSTQ&1C(w$1VL+fK!+QGF&AGO=Sdc$4!Ka60sW+A284-17E(^0xobs$pV~a zU@O+(@>{@B1RB4!miX*AA3ew)@bkek+_Tu3bi(hthTp!^GxU?_?5Vf+fNjyyo_0#`?% zvH?^bfn1V?QXhftPWEUT&Psnz1N zBmdL`78m)a9xf63cW^VK#l<2nk6sT(56h4Ia}K+<94M`9xy|1SnmPrIZd(2Thgr?S zm(y55lMk-{4G%bO#Ag+!3&>))U57j^5AaVpf9hcuj!UIdAmc&9k;ulcd1(%c zp8*7n$N<((D2KY zzcq~oxui-0<^R@`{CzW7KzhKXTf?CX4UZUKI)kJ@9tQ=z2dLiM0ur%?)SLXh%Rs!= z0~KN*?|`yb!%qwTHfxaR{}Yw3jzLNRLr|R$av3N~fs!AnLVTIU!oXl-!aw~$%K`ot z5zuMZaAT)2flf3$;qm_je+PJ292!dvKP}2%{W}P6cpU(hFCc?orZ9mDVH5u82U||^ zw@d^jH)}|R3o2!M!8Z;5KT#2dQA~eLalGt-&&o^#2pD@A$yOqzM#4osfX{Z9VDJd4j*M1rkn( zR%ABFI7m(f1&ar$mVF7TF+GqiHwT%HY&kzz;AX=faC$M|Zv}6VgIea%>-gWJ^`uAV z!TNh1{|~$brFzfi|A)a9aJ>wq$c0w9FSNNC7(APg+jutrKT`9=^ZR{J83;<}KArzw z@NqLRyzB-oIBNcTxLzJs3_wiiy#L}Is7;1mXoGSosL;O1#lZ0LC#cYdCwkC&D-U=8 zNrC(hb2BJ8gGP=T_V7R(*pEPd{D1QG9efe>S{~G(fd-vt=gm@nP|^h@S5U#`*?ALM za<@QgFX*CskQ``^9_-ZPkeU!QSqKsX`5j~is5S$O!CK3p6GK5RhP666TU0=c_CfZ8 z*1UsKHmK1I;)BIIA!C*xKG@7o7nK4K2V^j4F1rF`3#?&ncoI|ygO*`4@J~Gms-?l5 zO3)RJ3=9m=88y&89iLtom4eP&FM{ub4z|4vG6=SrqD6%Pl#fA&+k-2rgv>9Z32FG{ggygH%eexWgTBy^ul*6yTTgNLjtHlxdSu=0_rk=0uG#Fk3#~h0VI38 z1>AlE4Ss;qB`5{2fr>XUF);9eOzVYg5ZDhgZXekEZXXqm7Z&e8V=w|8hb-vH9P7pnIGNbd_!Dh2f-!6zR-0O|cNz)&vI_@Chh14HMJBL2qz|L=oX z<*YmY{%2t5JlF`@o5N6Ud+;Ss!^sC7J}P@U4<3BU*6`52;bcRHkIG&Zd!B|47nOZb zdoFJmARq!tvk%ZjdKI@)|Ck#}&W3bRPYFRq-rH!68S+SB?h{33t1w9O!gW>2c}2 z?xJ|yrSt0dtBPMa|1utAe0lI7bGM7i5s>x;xGX;blAVFu@-rZL1zeV+S=t?=a)I$? zXN<}eu;r+Bx^$?W>z*u9X!C?dB{caQs+Sz#e@JAKCqb@0<)U~AV)O&I-WE2HUdMwVix0Udo^t6trg#iwvMb{) zx85m&5LuAL7hOP_!4{w5`~+HCFTwZ&>TrGk!NbXL!u1cZwNU;1Itf<59y4 zh9`PkEWiQ>m_g(9GZ@bq9yGk@)Z3#87Cp%6$avlGl;NS?DMny{L);)`D;SS~^g6*c z^MfMf2jh8==H4Ddu+oEI6BjUEgXp&c3m)PG9iPv59HhOs#Q-dJfSd6&M585`e~{mi z@iIh{6j<10@#maMWJ%V(tOjuGZ_~bOAIl-Fe94@+;6bmIof)(>p-zSj|tMLB>un2eQG& z^YR1F|0g`Gw}TAh?~P($U~o0O-k22LF!;-3ExfsFU;b#Vk6 z57AR|`L#2sW!5qmJoE>te<4~uS}&EhdN3XU>GJr0?Db1m!%N@^=?S2F(49I=z(zvl zTMv|&cyu1~xctsX@qlOJuX;uXhPvw>t>5@tZvOxO|5*D(&`Oh+XaE2IpEkj%p+@|_ zL8++c|5HAl(?L%6ZM{_g(zo?e3GZQ_ZkR~vXOH9UAdiFE0*5`0gF_6=Myt<2JJ|y~ zJ1>CN{2oi=Ph!<(VP;6CrtO zjiXG2hlpppDdN{FWfTl#j^KlOR9fhEc@0u4qy8A()KAi_&w0&e^fQ;WD&7U>D0WS;#Z}p6Tws(-4I-vH>2ORC4 z1F-f^cfJE?Iwhbx+@;&!qubr5^PJ)}P*vywZtooD{N7!nasU(-JGx^)ZHyR|2F7>2 zYs@Q_WL-aal%4Tv=X=HLo$tP1Q#{A{4^&{Yg>66n;@|-u#uwc&Dkng*Gb=ieDZcAG z{{6b*bzj8onIg584b z1W-c+q+|x;=iWK;H)b?sg5A=2Pw`sk{qNTm&x1{Q0#dSp@k4J5`}*%L-C(yMyQ8~A zD?lwBsd}4@!&CbSH^oT zou6D3Z@F}S{(jj-@iOP-ZXcB|Ae9psPq_3hVV+z#bi{fKP#p{lo_g$DvR2tlS_n0TC z%6)S@c%0Rh@x4puZ^g^5iZ2~GZ#pu*aqnHC=&;%0faAd^MDE@Nk{0&n1nDep=bB@Xmx85z< ztB!Ab>3Hy%2rM)nxpY1TskzO08C2zVI5K{B>)m4=E1-W3;-c>m@4Ix~1}Xc@dD)fm zh+FRxuzXY|I5M7h>YZZE`ttG0gNImM7;ia(+RU&By6wVw z+J!kqWrbUBkMfVj@BcU+1T}Onx^|v(RlEldP{qqGoS#8WISW_Dr=aM$$&{b&c<>mX zE8{tr&d-XMU3zWAKtXYe^A;$2Bpew(JN3?y>hjU*J$P8eh4Hgv=WSQR&mh+sf?9D_ zPL{v^A3Vguc+1i7vLoX`_ue_&jo%8}9S-?c0My<#k%XJZ zU9e~WKF5QH#T^+hgIut~rI$wnW}fk}y4e~B53{&1-gfOZ5%B3e2s4fAm-@n22M=*G z-U3an8@TuS$TGmqG;TF`f5q|OVF5=*aGY;&?X`iJ>DIf2n^m@h#qr=VaaYEB9-ZHN zWyD+zKe-s*0wpoa3s-JB9z4$C%J>}=)(TF&B66;Vzg-PKJNC|zeme8^GqC4=gOctF z_g)?&N5gxrhW{LUr-=QiStJkkooDAUSH^#ihSwbp@4NTT;ZF@)a|GtU&KHa~zF&6X zylr?H6!tDknqLkcW&?+oj|zt)Xa{@BkO%3D63n2F9!3FL53Mryix+FYo^! zJjBm<2-MJ?!Fc}rMb3+c2YY)oFUGdC9y}<@c#-iK%oq#*x)u2c53n(waD*ArJH_b1 zGo6124{J+4&E&=v)9)&T@G4)~HAr-rfb;U}X61g?$5P;?hNh1JMZW z=9$5NveRddgvbBG&A$bT-n;Zh|8?p0{^8PjqWOS5|D*#hy}_ScIxjXKwCA66sJHk- z=SMK}piAfd=HvE`oj3TKKwBnT4)C|~F)}c;T;gwK1JNh>TmLaIFnIO4v`BdM?r8z7 zG z9+npz`6nIqwEXYLKk2xK5!-8FGv1K2R$r5@J~A6Y5B*2 zf6_76mcOMH4hpYJi(M2>mF77pd??NI>J0%o%4d#*XK%p|&)$kpp3Mh9jjsux`SV#C zdv(}8^XL1lk?7T7|ID8svPL3}|NRBWULA(d{P`|m-k~)9_XpGX^G~Gl7hRN3<1hNa zn8yG5;Aj4NmL`wp11!xy97;F8_V?}e_~6+a@Cjz_wOXqdN>xSPMk7H=m;BPty(U{Xo$bQ4`IPJHA+h0JM z{Q*Un()ja^fjYQp{7EO$`16jY@#kGn<4?Mf#-DTXvm<}LTR zJQ|OH@(5B6LTaBkzNr9B({@f#0WDewt^WfpC+J4=1K?q3cL&fAHfY^0Xs8;r)E#`VMQ01-DmT!b z3JeSkV6kq<0UV%N29P>X`w_ffAOTc?8Gu&(Sb)SLK&`(3keCBV%md_W&?q~|9>}B) z_{N16l?+f29dA)7U}gYKwlIK}$9jOS;QfDDL$s!f2aRAf>s3KIF{8C<$URAd|(Ke-rQJa|yR zk@2L9;kkpycwizNAdyZVl@hQpyGwVCii9KMbr;aQi>u*J$Abq2Tp3Th7~VQ~h{uuf zIz)&ACdA%dqoTlg-?j6Bqu~$7g9ij$8IQRbem;1Zhw(l{gaanR4jKnnab!Hwoui`T zV)*pnQ2|HBw=RaDuCXKI5wHjcOoZK$@sf+-Rj`_OE{31LmS1w|3{jB*3v+-x@5l&| zVs~V`?_&59?7OorhOZAE<^hRx)~HB;g*hAdsLqabY|Qww&>JXN`&i zM1sQww4m07@vLL#OOPbHBjXoW!v_$b9dSXk10q@2>4!I^2bSem_E^+`>6rjU= z8M;DL#6jx;4uA?5=s^qo8m!9inHcy5*+FRzyiXT2wF+_{Xp1+*eJn`njiJ*WyqC|w z16ntMk52>L^vDP)E>TNY2bNBE@X5Cz_2B9Ww6OwYJZM8G#CW8@>~`SjbeDiQrPl*o zLxE0}0I3JQ4_Cv)%n?%4q z>74?;_jf-Yb@umvME?`{cv6sCeLK&2cK!kNU?V_1 z*Z@%D)WN6IMa83GKPb=`zzt&XN}?Lja-tHI3XdJh4A8TM@)T4Rf)WvE$Ob&EAmG!P1KI-wIwu-(RJ#v! z=arA;i&|MwI}es$W5MkWRZ-`*M(2mbKeFLS|DRxS(- zo{TNvW*kVr259_5!GrOThvq?0#R4wzI(xt;=z&56x`({m2jq?r6#;}w&_YH~js=~f z08$A#sKQedVlz8<0Xn3)=)m9l8Zuc}Z`qr1<^Q`B=pKPEF27RDin?9YVJq|u* z1CJ>rQ^0$EQd;n!2urdYMmgF84P-*}L z0w^VbVo(88q=O3>aD!L?p%RpaKq|q9UV(xOq+9^h)C70Jpu34dnVw%WMkN8{oCJ__ zGC|^=Dli&X+$SecTZpaEF z&t4IJ@M$|9pxs|npa=GC0q=+c1txTZSL*@(K0k1C2^8_&A)uX~B`N|Q%|8_Qn?YH{ z@ISvi1OGM|J0lsZ4jD`E#pcKPdtUwj|No`vKhP07E({DFy*7*9x1Kk2w@%f(V32Zi7JL7pgG<NG1OTCx|p{{C4j$08k!RoJi22* zC!d0MBeO8-U7rP#OhgnRHMsr1_e^#RkOa#&j8^uz(!AiEtTz_yJHx0B0gl^N5jw z0hE?O4X6T8MkoMfgbI))m>J;W^zwGZf6SI`+!-QcKbQ2`b4px!McD??7!0`b8axD!0W zk)z@P@|J-|XO4=6N9$XU&R3rNepf*owfelkd8!6^P9F<1OG* z!9W*zg0dUPx%)xJ?E{(r;@45ope)#S{w6Na!d37QyWKvJLwOuPi4@%GhycZT0*DK_ zNfKOWA7^G@FgyU-Xz2m!)k(Yr-NTBgUMIMA8n|`_u()=5aDY0)j-3@ej-3Glj-4JN zj-442j-3%QuALDIpp4?!>7ml?qr&6Z>7mi>qaxzi>7nD;>0sd4SzzMYnPK7DnP3Bn z6!761%?BJjnh$~(v_mo$a3{vQA> z=JD{cJi*_~0vd4v-L2dmF3{~S(w#5S9WT@EuF&bC!qe@p(&?fi;L`1`(e19&>7pXi z?QYOrZsO9NZ{gCNZsWKgG``@t6EwQuxC=D4;J6Povf#KIG#2608Ka`$(jBA1lLi|f zb!5EeV))_U0Rcx)uNX3H01@E;iFC%O@PJ1X*c};9xfotMcuW9v+7aV-PzRm|CdL8b zvpX`rbTvHdc<`uzE8`0n!=nd}^1y{SU_zk&zpLRN$Ad=%Ku!?>&378!hKvG0#5rI> z?2e4*Tn)c~l)5rLa4|f1@E{Ldhyy0X?#TGc#qa{m4|l<~LPTJG5OFcQ3$l#o;8Au* z#+%^569GrY&n{4lAtD?w5q9v<$zPC1To~UQ{sNC@Tz54DiEy|uzVED25devTM-UWX zBM1uM5rozM{{MGuJO&Q*#zWv3Xgmmxj>hAlxN!juUx1SWbGQJrzX)@_1arKM3v;{z zC}4fS13Jw0Dj+Mss$7`eHC(_^U!x)dD&Qm>nJaWUYg9xWnH>xqnF~x@nKLY0nG@o|LyrpwJU=HI7$t?TknJ&fHAz*)q&+ytCW zjPotPS;aUVoK?W>A_EUlR_TOn$p&Q)4M@I0j1C*TTmU*Ux$y|7z(OwEKpj*D1_nE5 zIRq+c3qU2xj$`oi23o+?H>kH<0c-Ap2JB$fE2!xUD}+G9*N{ReM5SUs$e?{7lV4OE zM66%-fXpI+TEw6l3^e8pG7c2gEyqF504D zI?Kf1k?f+P@v@MKfuW1319V*U4)|fY%%E0F^AA@3b~Pr@ak)olz{A26K!2oJU;UaxTyH>ho9sRzx0{^&;^Dx{<@3J4;c+F z@#~!c8SkRv@lpw@OTq(k7<`KyNC0w3eCs3-8{8m)-O34_b8+|#y6FYHyj<@De`^*a z0|S3o3L^spSlosmBp3=71RVBk`Dgw^I-hs(fq5FznvGH5Ux5bfhGixZibiN zLHPm28!jpppq5hs_^Jovp1ykte@nqrF9L=K8Y~%JYZ{(3Jn$Oa?GpegXLv0IYQhK@9%!~? zc+CxEdo)`z@J~IkkrC7l1Qk~uu;bOHKqko`b9RTpi5`A#st3Q$f!C+OVxUyS4>>dy zWXplqTfoBn+ZkT30<%1l8D1}du=w{gyq*eSb~C)@gt8nsJorz%tOE6qK!MM{jo~Gz z;{=w4AHI6vWh6`i$Q3WWVLT81eGD&cVLYgM5B~iJUTVMuK^i<}yp#YfA%!o+1n*~n z4rjaoHQru;Mm#=%Y<&T$CT@UOA3&@Jh6g}_^}u5n=ulGz1_nnD%Zv3^9=kvT9}El( zjG&GC!5+KjKoZ$M55|ig%|Chh+d<{)f0eTzmP69m4gT#MFTn#8yG}!t?gO1K+WgC* zyyCyg)r1vLWgh(dIbMQ_3=i<$4X6$LEue#lJa+Mc3QdTmCDIG7pSrTodehWQ;NS`uNu_zcUJhXayDa?I|FEop@%s1vRseO zW8lk6N>mg;4IpqYI{=g%BEUx}gJwrVKwU1-O&XmgpiV&zs7wHFobgfd0IyRH10R0j z<^fvC+Tsc3z(&V>J71vOZ^H<^YzcA6%}WE22GBUK7<7ygG<+t;z_6{s1H9J=dde)Q zi4H1@B0!Ce1hC|B7x08Inkw*Nq7@)j4lq@q*}0Z(H@@GyWb;7H(M0N3{*`sId7 z1_qDL9u*HB1_sb@HE6FFC?30~s08pZFua^l$-n^0)}Rvzz{S6_gvU-NP@IEv!3qAB zCOrlQkDZ`%f+2b31b>T)K1c|(e;ATqPw=-M0||lloFRpCgct+EE_~q(mLwR?FjcT{ z=5JYN4)P)N_MU}c4lGIR0;wi4ykFLVw1RrDqR@#FP%A@}f#EbhM}s9njt2LYyFo1p z(2OmpEJI2hFjXF4RiIOMUVzWHfI9j%m;-k-NHut?AmK#va)&SjLl;8_q+tmvdccz> z8X)_@eNzKaIxYZlE5MCa&_?kVCPPq&Wk!JZ|F_ID0CC`!gQC`_^X31mFE4^5K#?fQ zzyK<_KrO8ZQ3i$!_`(A$2?`Ie4qV{@Q{@3x1qu%%a1cPlLlw+{I|-zECrBj`;lTvb zdb~x&L6m_3+yemZdKG10xPi~nU`ddp!8&j`8m7tvtP14l>)`t{p^iQU=D-~dQVnj9 z6XEFPLJSOD0v%ISz(ezJ`@bDxjQ#D=&nNb3&7%?Qrmfp17Mp0gU_c9fMvxH5BcM75B!}dDm>g*E6jTlKx9kR8Uk`KsIxq+Be2{AJ*;7O~ zzZ^q?rbOq%>0u=D^(#QcY}{ z2>@#ab%=VvH>r5Q`j0K(X>U-o05%Q&Lzsbq9qil|6$V(wg~t^r#F6|3QRt$Q0nWB4 zs*vIZrV5&Y5Ae4zf!za5R$uu*o`m}gq?*_ad3F+ z3=CqgAv2;4LeO-E;$kF!K@_@xZ?VGN?1QO7q_-BZd!YU*2Xo;50;wi8y@i0adKiE_ zZ~)wh3(x?~mF|GB6+r9_5Viz}y#m4pFVtB8W(z=WjB8Pu0pfN}QJKKQ!0_!LBY#V^ zJfu`M5JFV#8bS;VcA!Yd6(C?qP__eCFDR;zA{wR&QPJ#>1H~;gKvsh}@Bjg+CbpvK z0BeQb@YABQ0Cd_E=zww%4Vr2bWMFUuxgWGvL=bv2FN!OXA{V02MI{3~DUPBF$uBTf z9$;0VvXGG%$uD0(!P*V?3rO`&kV+y7lZ#-jaK99Q{LtB>k^!QRx2RMIGB5-{{n8)^ zo$^OWa@kTN4^2^uIZgO{X%j&N=92Sq5TX(J5HilEgU!VC-|pe%~Zw_r(7Dg+n) zD5{WR4yFo`Eqi21H(?p6fUS&+ts4-LyUpJhMB)b zPnm(ihKaxBHi%~AZv`FL2P%CO1QB<@N(eGAM1Ud~#REu@3YG+U6LfMI&K3qtl?PZA zD1rXgLh|N2FbD2UkZSNvtwcoXX|Prg4N#1M7ut{Wn_qc-B)PjfDdQ?Em zWRW5pyn42?M+LON66AN#aX>Rb{)L_w2Wm2)`U>jz?kOrDwV<(f(DESAL?-mcTS!QO z2O~hEf1RN9FrA38fdl+465u82&;-p5=D_?;gpWUgudRgm613VH=1cGjY^X0m3#*ZQ z30`mA*`oqlK@IXHXhG2`s4qbajli)2aX0w>T+oW~P9M;?PYfs57?bh zU)F;;B=|B7tO4T74sgcx0M9%$K-l1!hYBzoQ8*Pb%18S z85tNhLwyEXT?rcP!j($Ft1!EJptq61$E_f-jW3lpfZYc5SuvPHLi|O6H9%TB;8o0s zR@?&6yacF11ks>tBls8?4nch*zz6LpK-`C#8bO^eh(Z^Y49uK~RII{OAvy=3D}A5? zUHmPeBYuzuyFjXm?Ht?z?FK>k1#-fCj|yz@>J457hLcdgJm7_P?Q!`9qR>Sp1Kd$Z zQHA6em?}hfeiqmb(3t53b6_#E3#6LZ?tB(lD?I;z7Se)?QD`cwK=Mlit^A?^b_3Ke z(qIl*e)$2ubQe-yfH#al%YM){5Lm7PZw*1j9Rp~pu(L-6wg&{XK=?W|?m&x#F`JKw z@&cq5R9=A8kyKtx0=pCHU+|^Gq?8vqAl;RH2V z0%EcP)MOC-(trq)SBQW-4hsztNN8M70trG*?%)E4#sqK;KSc#Zzq|%gKp-?akWHQd zHMtg~5f+0L5R)6ACWGjgH6R59OqM`4SpjPDR^-qCo!kMs6Ax;#1L(v=B_d3Qj1xmc zB=*c7PA9UNejCxHDiMFm8^ z6d}Uo3}llFpeFx7HaP-fast$35dCsj0^!hD0UnKjx_JXX#LeH3O$ODBpo1YnMMd`% zl>#;fhL;IMn5=jS5#fasS$;t0F>1hUB&cp+|{1TKA`CWFSFI$Kl%peBRpm-C1)IRn|` z0;tIokWJ=*xEXv)ME4Z%Z4obBh%i|K*<=N%$$iKspI`=u#syHF3Q8Ny3=A({#ezbk zMTJ2W+Nc9HT}2oe9)m`IQKtmJLZEIWxLF52mlT};L1XGLIYeXbGdMv(E750Q4!qF- zQcY}Q?l4GeC+P0QPVi~vu%Ud!43vf{s62Z1hCD} zAPfd`;2s01CN>BSz*>bp4n6{Jb%V_>K-SlST9cslV9+HM1+Z1wAR4@EtQTZw=N`y9 zW>8mv5wb}dd;u@G84I}+9&$dJV`vt`f73g+nHc_?p1aM&@FH=>|NkD%M-)6dFM?V= zpygGd5k|=BXxOT9$VDokrDWhGY291kyEnk+K4pM(f>&U4_NahX`(ab*09pqE*>nP$ zr<4G%EGP#zw6Z+Fvy)k14tUKpX!CgIAyDt{Drg8AdKNBhmOlWp;KxTL;-w#04?V+f z!7WhOO}fRz@IrO^K!)8iaI*{=b~C{o(!#D5tY->%FcH+1Qvj`7(D3N>QQ`3IeDUJ? zUC>#?Q&a>%xvsNCg#(n~F7daRM}qP*w4BudWw^g1el#6WA=K{ROB8EAk7v|A0d8o{G^Cur4)5Pz$K z63AjmPanLe4LVW-)`94gfVZ!8_NagiJl3KDGKUdlAZQ=z2hdC^Xy%EDfdPCY%W)T# z3K*jRB>U0@Y|9iC$ov9gf`^9L(f0-@N!j0EVt8?B%0MQmeV`fjZfKI)2(3Q$94iV9@x1VX=j z3|24&GH4E3@{gKSb)e=ZK+TPSn%e``1~nJ7?-q2u3)pE>R023ar=W*{PvE}=zEGy+ zu_C0VSip~%Dw)C0z#xHdkQyursxvVAx=14sFja`D5(SWDu(?WMFb7nUcbBMC>;kDK zcBNG4}2 z)%9pTsNexQ4c(*j9JuyEEOG`f+3qb=fR+f1CHJ8$QBZvYGLOIYIM{j&*K$K$y8+bL z?QBt50cwq2;%}J++PnsDJU~JLbe9XrKoI>hD+Ce>knuOVlm_-!K&64<6()ukM8&IS85`W7&aGefKnxOl0 zI;W^OKpXNP`sLLiNTh&A+c3?QgPNNFH8%okE;l%BK+XLDYHUw|oUPvtp08^~Cn0Lmh;I-nWM zAuZO^L3#+ZyhVirwk`o>tQtBh3L2dUts4NXG6l78a8L2VRDotZKvTRWSeKxJ zR1rDZNq7nB4^T-D3t0xR|M^?k!1)pyXEz{W@BkVHAo``IKd4T{KRm?&ZZ*JC19;#I zDP(6rhNc#P2WY0KfasT({XmOb=cs@VmhkO-1MVEPs6aYWYg9lp)2@bZT@AmzE&>H5 zzM-)l$gz3=;;U9KX;4ap*CL&_ppD`OFAiOTlvx`<+CUYF5a^oMmIqjn!jZ=$TC>km@oPH;yE zbO;OMj!XsyhMlFLz4oprKt};U7Wje&Vk|%tb>Pt$ly&Bp_*>G!-H8|p!K%`3=F)`VsD2414Amlq7Ezx3K_5tl)Qx$GB8yhU{#>iF|WZ12^yXE zz#N!^c7asy1gQj#FkJw7OaSCD2@lu^lR;;QiUp`{w|Kc5q!qMfRRA#p`$B+$Ar7CT z!IB_HgU4cVIU1%4F{B8Z9f6i({4LEOo8eQNyFjXm9a03%g@DF9CI}!hPKN*kLoq%_ zgC#+Z#+z|qst_5+6zooDNQ1h3hyr*QNHwt;hZST_bEOAENx(7Cos7p^R07fvW_fhG zdw`Ck4**3K>mGJR5%O|v>qryG}UH6W-Awf z$KI!?fasS^ZlEHLp5urS$3WdYuVYLMFYY!CWP_gzJl_EA=KTdNDCs7x!T%7fXNn4V zr8j2j-+vNP`a6KCmd+Lx3s9|ciNEDNa^D-YG6OU?11^K7s04s!Hs6615U8&*K!(EF z8wDVf5Ae541!;uUE1;Djpt(G#$ps*jr+^fIE?WQ%FoG^=1??LIXLrK`pwa+*JcU4~ z59mlD5YgGA;s8o5AlGv9%g zt`Mt0T#!}!ok2+yS_}Vx)WQrPrJ(LB$f|uH1*BPJ0ID%MTU0bS!M*}?K~{k}380XNG>##2YYiZ!-BVOR^vf4c zpf-Su3iwDi;^OK6C`E$?6qvzQfw&;6jwAbO1*reuqOt*`6tv6&G}%^5x>ew*L6EN? zaRuUntP%tV7BsFZAjzTu8do6tr4Y!f<~`sJ3?qNbV@HrDTT~Vx^%Q3aF)*0pE3d(l zpz<1245F@GL#i2Js$e}u{+7>Dpo9c1ub+WA@R|{%8d{4Au(uWCSRcOi@Vy zdmKW))CKzrf8WmoJlF&6`vpLk+FWq}xe#iy24ty?0k}ssMFm8^ybMx6plIL#wKicz zg8-<>d4Rv=4R}ZjYVr?u@PsP^I9*Ip0nslji7^@3%>qz2D}Xe@@(c&W%>qz2gXov? zAO!^6tbuGYXa_4OF&(o<3JnQ}$&mi#6crHt@+e3F0h3pN$M2xwyg>jmWiAO8goZ{2 zBs2=ZONOSXfasUmM3{U7YzWlk2T+s6!GcheXFyC|05uszzZ4|GJoxewSQ3<%@OG$Sst|p%Y2ZW#%}bqN4m>Y` zR73k_1a~W^fwY2-!{SGDC^`5U7&hQ@G+2_LqhYELjHmZ7h5hz+A2v6}$`#SMbFg zSdw7O!Bin)?l!pif+n|fU=BRyK&pw2xz!-8pk3iejs|s|KxUxUBuFEZU`a9@jc->Q z$V_4#4c^rTn!H7-BqM|v81CZ>X|N>7(ReFKm?}gisR{}qSRMgQnjtzOyFjX;35Q_D zhU|7DE{_}m?KgqtkpwUY9=nJDf=+upQJ-U9_Ev;e~0*K=xB1OV6SG)ZgGfCu#lE`=Bf3_kb6KfcL2rw;-g{%%k}Y zhvyE^a1jFogRtjLOHi+ofx&1$XuZfj(CU$0n;01wc8W4EFa*3vXl7#YXg(qUx|AEV z1O>Ft1-vAsdx{EVrOFoYK2y+|DeyX&&K?!;x!0Xjz~^3r4k?43n+-bg0kmNaG?a4y zwsQ_wwty%kw22j_3Rco#pEv@kBC>=dJSVUMd3t99czTDwMG)L%gVw8{Wxbs(Dxgyw zK(#f9e)+)!R5al4Jam8yX=np+0%&Ce@;FZf8@PF&0A0lkqF>H30grQnwz)C#w-jiD z>}XK|)llF;FVKEWeg=jK_-YieB&hfS>p+POq;3~X6=ImI9o#j7*4OZAh(TOX$0FAlsbet%Qrav4Dea!30-|5$AS>tq_3&C$CV;H( zo&u&{dLt{SfGB8yDge}^7F&?jtl&9h7Znm0*kZ1&ZP);+FN-!XF}z^S9k}@6 zZ!rTWQfPgt3FhFbFF`Y}h-I}xVC7R(7{EaXp9qJo;OW|!%(%GVN0@>VFsJR^wb0w$~)7h((yjQlO3pw%Uy>zo7_Kw~=K%05GYfuR~-u@06573-KgL6M4em@3d> zLdXo8h<^DAbS43T82kYq zU4?}+)Xh1_CeMJlc>&bTAo}GDB23Nz6*aJME`Y|ME4WOAhBIi&7PP+zTn9~22>|U7 zvjdylqLRRe=*&j&F)-}GSL}c#LB$T<&MZt7qBFY`99qz<0$L&ks)Zq|UUq?06Wf_B z1(`!2pih9u`Je%P0XmXi2hs@3Dmy@nH(FEAQ325}w`zdewe;*Hcdr0d`n4;V7+wgZ4rHYdx?vvLFyn8T z4_aeE;$&_!NDpbfiw~eI2U^y{4sM@;xS;mgSCB9)f!qL9+AS&%z+zLt^h-W`#WV#K+1z80-Q2?4XZ$MJS1CY}0DJmfPi30-*7a&K4E$En}dIcwoy2KOhx8FZgIu zPh%f4K&qb!jRrz`0QiFB1}GF@1@HsVQ2YV@)>LSX4c(^%YO#X$ltqAs48Y;g-J=2t z7XoVq`CBqU4FuRwU<{Z8YiJPBRC5Mvm;yPm0@1{RwT|blfV8hBfa+Ax+%TwWy2Rh| zPZ?A!K~t#&sG^>tq5!R^LG;VNU2n(GEN*8pm+2GrbTU~N!yZ-A=2DJl=3 zRUU|bxfHBmiVFB_G)!~fEr+<*0h9qiOB_IH{}O+TA6OgI+#jG4eu@g@tQH9U(if~? ziVEbg2$I*!cVaG;C%ia*WBfoCuLr>OJ+x1?8O*`cr-H2}L)x!69jqsq1KJM-FA|0I zLm_u!k=G9e&xT=kMn5kE)k{woGBLcUh#Sa&TMqU&G~i}|Iiv+#9Y_!80xYDNf(lUv zhMV|i3c!*C8&@z@h{n}*a5V*OT%7`QV8z2OkZNKZSIa?K2{f)iGb5nX06usm08-So zYyfG5RXaaGMMaAW1GKjQqF-KuPLzU<`2)55pk*Sg2$Eg`$fKH8OXJB|41(mOW$TuL#gV-;vK=R$h zO?M@M${W~p*FTU;;myNci0Ljv(1E!vDvFHIlh$}4Ge;XilQ5uV^J0j`_77Uk9QA@- z3QZ57(wik%z-Cjq-8!&2``d= znGZ4wG2;~rn(>N7gaOqW^AeyG*`lHVO_3n_Y7n2ubM%p!5S; z$p%g76T#Y`l@|xd+$kyoP;)`_%LyO_bnp}CtW?mTH?*QJU}0c*DFU*)dx{G9I$_KT zId%cWPamKa{R?PCzZbkM1?r~=P^mCQB>`$Kh<>>TS-}lZw|a`o188d%M8BL3Qb1bk zegdc^0cyoS7Sn;apeDBhC`rId63`X%pgk=hrQK6h8bFKb48T^ksDSp9f%~?g^Y>}h z8*T)bm(UDa0_MQeIw`&3K#*3_!p8v=5TI5Q8@Tra;)24*6J!!Bd^8|4Q3fETpoO8J z(ENx^+LkD;`3fl3W0Np0H9kllZW^x9kvr_==?11Q(+dv8km>dD_PC!jg01dMu z&zyly6zgnJF#!8v3YdPGAPF8~eF+(2)d5vTpamoX44^fr;2~BI0S1N^d}AG8Nl6kTk>T6<6nu0|XNyV%w9^M}9wmT>X_1!lp8%C{Eh-nFWgLipxgE5IvUv~q zq-zHLmJSdXlv0He+i^UE85k__rBtvaD5c`vjssH#+m3_1V+>M7+0hXHiyB)EWh!9$~Y-5hWLKnsX?FbD1=Qs#ASKw1eD5EjTK zrvrM)DFGShQh=76Ao``62)N{Y1t~f2frd6fN8=)G&Cw8`(V7FuNCGrqPJ{MQBAVEw ztT_NLP=VDs9gx|J3E)gWMFm8^bONPI0wD)kO9riT8lXKL$YH|Jq-g;$*#T-Yh<*v# zQA%8o0<*spc~*pjaan4)BS0X)|UauOQ04dD3@L0Z?Ok8 z-eF;|0+flSsBC~51)^WtffSI|c=!M+1VQ7OkWCRFE~xRq3>w{oS#<-{&}&h708$DX z&jd9fFN0dU1cF-vIiV_m6Dog894LjuOy+Y1<@}nK_ zGuXi#cv2yyi~j@^bFhjZ);mF6TI_fAFL-Hj0VwBpwy0!)lKv&6T1*2J%u`ehz^;JM zFF%5&pqlrnfX*#u;BN^547=$Y>R-p9o7VwTrH zHU<}h%PZ*U-V`v0w8kLhq5$~TPnr!doPd;g7oa5`h<@1)F062_b-4gKgQs(f3iv*s z&K8v)ppq1})7 zO<%!_$p}y}IYlJ_oUS1B%j@8l75?e`7vT0Bv;h79?ZwoAG{TDZ6Odla1+dr@6%hTh z7Q`V?tDHbK`2y5r6_7@l$vYq>9{`I@Q325}l|dX@4Yu&NECDakfHoplfUMvq5|TAs%A*{6Kd59NWcCAv|kURUxH5m1+AA@0U03$ zjpTyX3xg)9KzxuKdtOA}@38G)tf)pUK25DInyeJLN0R;Rl|G!Ja+f zT^y9`L9-lw1Cl)+fIG-{85ZCcL5qq5h;F^j-v?WmAs~R5 zsNxWyNzTOHa;NITj31yv2v&wMfSN)F_*=U{euZ=|N+A0{1K{Es0VgD6X;$*+{d%QRN?PafmBhgPjv#>ix;3? z1fLMy-2%SB%A;H42B_eK40rf+J_H@|`>7RD$s7Rb22B)$=;osW9{&%wUgB>N038_x zYuI&wGRqW|3DC>}qF;J}t1n`TEdG`|-~t*_gx7#v0%>tTi*V2(;OoIEpe5uAkaaC8 z8=%&K=$E&V70iGrSO8T3qF?SpR1pC35hVdj-Vq z2B_me^lR{}0JxL@UHJ$alLp->3UUx=dYzep!MF8)33zD;hbJSuN9PHT#v`EHxuYFp z9Ah2h9OGjTr}4|XFfcfV1$#8U0Syg!cAf@pFasTO?9)93vazhY1-#J=RB%Byp3MQD zg$&wQ20A3wqjL}B^4ZQ16%C)x7!?DbP8SskpH5ILcFqAG;O*17MMVJ=wVf_196p^P zDgqwO{{%`cJeq4%3>5fV=YkyFT%)4E!{5pTQn%ya|NsB(L86u}Dgyky{vg4|BOoV6 zJH{Obtsn;-5N--m0XhW{bVxbqRNWnd4A8q+JE6;9Kv()PFfb&5WI?wwGcYjNL3M%7 zL0Koka+JDl?@CG4Eq&cdob(+ng62B_V<5~g`ja~O^_1MiFynS3U4sDH;>f@Psv`HOfX-9(>0Y7&S{Lrq-J=3p zF7DIa0$GR#xxfuHVA44SeDWcvg9JYOyK@eBKc-LT9Pn{}KAq6C3%Y|0)X42z0#3U= zoqJTkX&H2{3Rrv!WUj6G4TnePb&t+-9-X&*I&V6LIR*tdhC7D5xcLV>AYuTTjjQmm zZUHOjZ&l)gSMH!wB0&d^gDxus(V*jtKy(5V0|ST#-D3u#K{Yvu2HjByqCvN~foSkj z!|p9$_k)^{u;U6rn>;~22OZ$)(K`paB=Np)=f@W*N&o+Y*LSt3fRYx-6i{;W>D{9O zraSkjfEyN|-QCQPWBhl48g(9>_kBA5`E-7KVN?h=0hB*MCV=u4hz2Eh5DiL&AR3fb zKr|?)fYJ*n?}K`xps)mwNq|<*KyC5qU7`X~2e!?p^EuQu7jbxKA-k7<-3O2EE#Qdp z=$-?P7@zJOl?tEE=iq4g_@Y`GtkI+MZs*PBhy0*J-WWVIPk1!{5a4e)1ZplEhg?N_ zAl(y^6G7z#Xq5pp`+zb6NUmWI_$&x;gh1{d*rNiWA-lFbcDOS@+f|*=%cVUO-h!@u zbx{e>0~_X|lF$Sd0p07u0BV{zcy!jNSn#*7fmejIfKQJArCw0R_UL3$@##!a;Q%FX z@Gae~2l)HMK|6dwOIAHJ5BgX>^yz%;!S8p|qql_xeBl9T_bSL+ojs5xx!ocvpwlEE zcbm;o0pB3k>7pV4x%vQ9@_K+uUJuKg9{m2N4KI1Lp7h}Nzv$6=sZI@4H41>ztpwyO zD)15N-7YEyVD5|lyT3q*2&90+qnk&?gYl+^<_%De0-uKrnoR%)ri%)PM<mcXyX*fa`1E&=m%&4b_n8ZqH6eg_=xK8#DiK5y8gG7~he&aVlI z*6tb=0nipm36CA27zuL1OAiK6v5ZKN44_quppkhg zE+9J?z>D!f1rhiZ3sBx+VqkCpCGYMMl>*QijTN9~0BAodsOSMNL+ITDE_y)aPEIDg z)BqU*DiyGmW}tixTBQTE5>#k_3P(^JgV>-!S{NHtSi;!grZC7YptCuU^n&)+!_kbnaP7u4y{^Z_d193e%HPv^_QTyC5L56BL!awGgEIQce5kQnH= z0+1MJ0Y7Mas!wMPq@f48#Dc-2^JPa5xB=0zMr9%>BX+*nF8l&bhM~Uh4TzLT2!Wicn4ovbo8i92Qj-_z>RE=UJr2h1$-MY==ftM2FM26 zP9G%q_;kMN2mp6uJUR*(LFvuIr}L%9!IuIZ9!yAFi4G6&g-1|Xg$@rEBw39P4^||u zL5Bw$nCo%yl|@GYJE#Ey4yx`cDxjbOwX{Gj7;sbRAJWbQvq8 z!QG+)x+enC=5A2|jSKgJbb*e%Wr7~W+B-!Bq<%lhxP2h=L3W-oz|;N)-GG2-e}nEw z1GT?FSEqrhcF;MBKHYm%I>7DlCEzm?LGAAfFuz3wwB8g{C4$4Ka}OjMJEy3C%70Lm z2_B#6oTCD2)q+~#pc|P%t#DB5)(3Q*6B7f2Pv;Ww-M65m2;OJ|I)WS2E35z=je@=X z9r+Qh{S9&ee`_rd14A1B`vYnG^(`u(<_4GnYAk>mpz0sY0M+DR256B6m;pL49Lxaq zb-@f!LmSM19J8_o><3Uw9OMU3bqMxDcMIhH+#R5{E!ZG%BOIwQ z4!#c>H0us+CWD*D;A8}Dj4w?^G6dAT1{(rumxCFghB=r4YMFx>pr$#P0cx9rGBl{d z233ookOgfU1BrpQje#2dpf)*39oSMtn;di@C@ArRE-ePNzQGZK+WP(r8pP>@v^v4< zZ^u2L(gn2@z8lnB1^JDMfdSOg2DQ3C!&M*}+|B}RwgB~-(>)m)_Nahe3J)=GPV0s= z4nd9q^+i#e;sKxrj{~eJ?g49xN5Gompwn2uO>qlQQ`~^RB@8r0*A1&u*QkKq0B(xs zsDPW|ps@rGP*YqGr78Z>r}H(eDGqMjf-Y7C`3*EJ3!qruO>t$^rnm*D$$~U@^@8Qnum7Mz39TIt>REz<5!8wUSp{#0gS`N0hl82mcDNC= z9S(B5r{-NyW(BpnKuMv42~r1m^zKmsCk0S6LYmN^(}qAwK<0o_kZ1E>ftnalSRggR zL9H~9pFu4*m>KX!csZyX#H>j{-CvO7L9IG){{hkhf65QOt)LZDB6hbx)?xJauz(zm z+yV!+^FTfTwf#VS9RbW1xB^IA!vjkToKSF2z3}V5591n$<%otaG;lx#DKmJ*{EOxX z{GOUeK>ZT_7W8xuD$GFX97KcD7@gC39(auaES)bwO6SlnCn!d-q;uphCn(fGaRi!y z1Qp_-n#O~M>0IVK)zdk+zez+ozX+U?41KHUcoi{#~1rJklHAq zF%?h{V{58|)lQA-q zF?8U#@A3bbhvl)FcMkm9j{iS#@P&Ny4@Ul$E8toN+F0#wfi&eqk%bss=}0Jo=5T5w>AddL+!U|H-fM(Ah+c8kzyQ8#FotWkW_gZi09(lNcF5?ITWy(N08s55!B{}3>)L@j2K-0%aT|3Zf_WdB^_JPa?+4)iF_x}lw;f`UBA)q-s z(6kWf{)z}tyC}e;`IiEJ>v?7d22b#P$^StO_ih)J08r%)>M(&~3{+A<%1Ra$P@@{O znUTSTf13pVwg5(tgO50TIB)T9D`4_C_)Nfq^BVuQ0A`Pak0d-eKk;uXVDUKkOaUUw z>T&Rq23RzL&Ew!>1O9CV>>dZ7S$J^X^WePZx$n>a|NJ2A*&D~~q4?ROH-G~)gbkYa z0yzWJ*@ien1mO(+Z2=rE{M!OJeLAms9DK&%!FkPvf13xFPv5x$YwZsiND!?NS2A~744!#oT2mp^bK)Dhf0pJk_ zC|98)06gLVUfJYplT!W4P@Q8zf$HCVY9TDuHTPZm}ZZH7F0_eJR28WIk6%Ln< z5EV|B4j&aR&(6;togX|qzd7)4yXJB5odigp+wYZ7yfPkJP$rp@jUoQ#+MTm z5h6aEm-x4psDR>|2OJY2Dr_DHAF+TVs6>U;<-~><~EW=|LXjT<8)(px_0v^X%R3^Oh01vWrn1ge+i;Bbvs0iq?by!*HqGGU# zvE>qf%OQ}eZjcp_n}a<7;pw15Zpz|#c1Au0v?L8j~j8T(?o-0%M$osT>^kH2`M&BTB_ ze~Tz@K%EKC&U2of|3Lxe0V;JI8tM}mz*!4a&~(?R1b~7x0=4^I0CHCX%v~7}ce$uk zK)Uac-V69{qs|f)SPz~BRA_>N)TcW|#RD>h*2$vc+3g+y?$7)LT`L8STI4A-&t4aH z4^RRCg`Y=fj|ymz1lE}Wk1KS-T4$hUQYU!BC}=@KXN-yj&Q3d0FCFAN#B`d)3;#n{ zJ2RlRGsqdBXanVPaHk#YcE%f?o$e9fxyv5V*n?+pxd(K@47rR3`3&3w^y&N$>7$FX zF)(-@cLygDP-nCz98?4#^;^JYYv&wrMeGBLBIx|s9q=kTjL9)@7U_h{9V2zk!CjWR zDv(<}dwtkFko)7{9&YCra3TUVI~71FKm%n)3_1{kt3Qq>Bv}vs`tQq_9s#Oy85tPh ziN7~QB>`0Tg=#V}K-R0k>p##WJ~%!80i{PsEeKDKkhJd64VeuGjVpnDydwubqt*gR z9iUnlwE6**qmH+zfKm=5g|?`GF0Su{ii5`8SV1|kvjj93YNNv6@(VO^(_EtxA;91I z4^;1VgJz9e57b5Z_SUF)I39Ch@nG}>3-)?2dNlv!uNU#`t>N+5#Sbz_^N``U7w7i> z`VZ<7fG2)IJuybeC=E37L6hguvy(r(5Mp6q`0U7^@1i0BqI^^g()h2O09oMR$?T${ z@!65T-bY2kvm1QP&?%3DuXH?_LsS$zK=tW6Z4bs{h?aqm;z5tj51^9Oqt~XvgYmpa z=TDD=FLgX1Z3j@rpm@lG@sy9^agWZ69*PG&4!+X%P(0?rc+Io3Mn%FCw8F=;vqVJ$ z-u{GiFa$iiOH?F0djtM>XkPQ^{0K7CNAcLVn;qb#SfJTS$Qm#o6%YPxCq27kR1`ck zPkVxW$?)Uxv9-a3+4!+m+P(1AL?Y=`t4Jg24R181^XdIvsJ_`r_ZT~^u)bP;! z>BD%^qw_pSJzO!!Z$037cu@ZZJj(z|yZqaFz=fg5_nRJyr#u)xc`9B21yVIG}St3i*0uQd3#UGiZ3)ZwEd(2=7e2y)56cLE?Ig&=GR5L?*e;7f%L9~F@f7ZuTt z6csU#&V%6T5+4u*GLqxPT3&&R`jjaHpoB^5QBf+2S?Bqatt1gM?fVGqGXx^?&yOGryVMg&H!lK zUJVqR(3!~zpu%HEK2kLet{I?9(I7P>d8FF7UxEyY0R&MF>&a@ZLdJV814t+)p_bVi`t zU&Dj(r4OUKgb!o6f=8#nhDW!%fJZM&gU9!WAgjPta_1E2Dj|0c55@x!*>nw%G`L0q z9kmaNa*$5Aw1Q{nVb9L%9^LF7-yv#2(?ReqP&dS=@97Gjoku)6FGJKRcyt~EWjByX z-_s>LI}dqwUiAQ}1@jJqw1Zl-5Y-Ys%yU#gF7OeC3~qQb9`+Qx?#sXAK8pVj`!Fwo zRN2CFz(tJV0bj-|{F4s&FuwL+-U1m95$*x|(eRQF<2n9Ghdh{jz>CU!82@<)Ui9E! z@=?@d7re)yc+H3Lp@-mM5B?>mMLiTRdUjs)=w+Gh1DcFD1S(KH7(c=5oO2#K!5Trm zQN zk9&hwyMZTHTfifPpvhM7WNh;f1^(83pvf7~_FpCj1_l0B&;_`lTa!TsDe$*8iGkNa zfR++~rfWbnc;cnEMFmWQ4ygo{5XW0oKsyLQB?u_(gC-It0@0wOc|Cg9sDSt$ooiGapw0&k&ww4$xkd$SEoe3#w0Ibl zn7Sb$2Z}au$aR9!6)52~|C9$!34$uE+aCP>mqAsN9`P>Mg}5B#F3?mShz89bf@sjJ zD~JY7ErWs*G;Izl(!fP2h;RT66BvL(8#K}eQUW@I0p*Nv<8knz2v|Hs#oOcHBOVXVQy?{79tR(=cyL|-sqyqU_)wpJ zTZoE>$H7PHUrb6f7R2V&QS{ zF|P;bYmgdqkAu%yJvi@!)R=i3d};t1>@f8>_*et1AV9#~dIN3_Li$dT`$L=zQ&?c-rIOTVn_QZC^bY|9NzN_fb6Waqt~T z;G0*kNE4*A^-(CF5NO^Ol-fY$26&FYa|?JqAE=0x0Ax6c@C7hK`!*@UIXsQdUXEtF+As?c+AuAqle)?kIwf#hQ~b=k9!*a z@GyK2TKfYE9#EkNj>XQ?K8BY)6c2kE-tsU6Zw3K{B*-vOSJdtx^o&x!zdkeS;1u`ZBG|FrE3GBUV9)`Dk zy5~UJK;1bi1wNgxeGG4dL*}-R;cL&m;F$Z*&H(Zy$W@?jX#mKJV5fEFs6>GL2e!A< zMYDX%KhhLwpMM*%e5UlE!}pnz_1NR0=$pTU0=v1Z##^ zSPyY7$SGjsdqJa)y=%aQh)3r;(BeIiEgqe>UTgrhI(zp(h5|bO`Se0|Som~)dNCCw z)%o71^V2WxCa!{9-aR@JO90q5n^E2;dGmk!Q=Z96|j8gRnN`?a3RRn zn~R>E2jN1Hlyc3p^AKDJyrBiOx#loj2xPej|B^$zK8i0q7;kwrUuW>(Uviz-NAZ;p z<8_bbYas4FULVExK8)u)nlFO5A9;Ng-}x{e^k}{c;-2O8QGDsq8}pXIqc_$P5|s?l7)1fd%b+~y(fRL%jv#sxxB{u5 zzzGwau|NqE9Da~MuZIM-2O}h8Js=5kiwdX`0VOppUP$`to}&UP*gc@B&;zu5laYbp z1s7x-*lKvd< zd<7_NK??OAa9IFqh=8&+$g7~V2J$Mnjd-^M(PW zq8`$^2g`z%g@ViljW>bJP2;a;Q2{UDKpN%gT?1Zd399ouzr6?r9Z&??K?Z8Bbl&&q zeD}f$Bm`pKdtnY?`gDE+6`Pfy<&&N7L4|4OtryvF-U|V+viBaH_dp9Lg1{1BqrUSp zFzf|6HEjZD@V4{bi>Kg3ebl4*FDrl33()mDFv}6{f||pHFlRm79C(KqYTi`1d0a5_ zpuM=>DKLM6Jhc~eEJ){Lu&#G6;&Gbi3O7##YF_6vP}KqM7=i-j){7#rQTIXhf;ik9 znEzPe`r+=G1L=NY_)iOF&bt@qd0^p$?!T>|qkH~?!pjKio?fi}y9?T72KQe*PV-XX z=A}T*!|>lEuu)+DnZwP2`A-$D->B#fEMP#J3qeWL2Q7N?@S&G<3`sdTbF$1UiT6q5|sYGI(}A^#N7w&tAy0fwE3MtGWWX$^~VTd|oXG z$45oLb04e;?$i0*L%RmNND8E=-bY2iryI0)4>Wjg?7<8g2>=ht8+$N=2fRT8UB({F zAu1A(p)O-k-wZOV{-2$}Q}KpJ=XZ~T?~Ofrb^d$w+T{B%9{1?{3+l*uDBkp7eCeTh z-=p)ahvHq2gD;Ie6mNJip72n-<)L`bqtiykqZ71Fxf5&=*oG1n1*ngFSs55SJ8yV) z9!=xVXZ4o{`-}BB8#6;1e?Bji&kN%FXq#RD3q#5VAJC>UkkO!d9&A233U(ZG4#-EZ zKz&Ca#!p~Zf|ef`d-TeD^XN5+19=nTGtd+g<4@3hedl@5G||DA#y*M%JQz>-C?54u zJOr8_0TqkjWex%$A4z~pRs|2xj?iZ>T0uuDbspX|q0oZ?G*|;J7D18r@5L`x1_l?- z*Ug_9`L`Vg%~^cE>GA(Wng@R#XmQv97jT;slnm4OZ-a#|r12MA0twFnr?@o!+qcsA zU*AmQzuf}vmZkCEo&sGS_xgf|au0Y*yN7a%3aDK6-~=_jU^?p|3PJT1ND^M8L#(TZ zmK6u4JeoN&H>jCkWvg(BtK&TC1hwV0bS{bS-*fx>0JY!0`>r#2GY736wVP~B_Znm#6|4Z%BmkKJs@g$n zAfALw#ex-p>(}E*;{jkRTtFS0de902_@Dq-yan2bt%o$gKqenR301Upc_0O#7An+g zP){1P0Rkip+I;~EcTh_hJaXFI106|)RI8wh95j^a(J6x%F!N~sskj5I3whRx!~sB^ zMZZ8RBO$v~K)rZyK!Ar@p`HYd2Z9AbF$9Xj#v`C{U!>t-kPkYT85op6BbA^v=FAKX z2f%YnprHlO+!ZLn!dCNwR_lHM$%1Cqm>C$fpt?Y-e5JwbSX#jM3UPtNd#8Z6iSGv) zw-03gi|#+az(*c{4q^u_4gpyXI$P5Kq;*F!(qz^L(9jWR{+x+{0cIg+Z7a+|&1V5p6v%22U&a~1+_4PnSntUF!l7*mUb0Ft{)~LfQ1TB+; zSqNHc2eS~gtPW-&Nd110ar;2#zgYPj6eZC4Bgpv|kaqQFkIsM4ED!Di*1M=U`1F>5 zrpCU%2xbS>ZzU=fAQylVGB{;)#y}Ck+q}H2PY?!5{wi z#^yy^@^aR~>1!nVr*a{GF5fEDf z!Zrc1!RkGFL27~(JbG;|dGy*;d3Fa&c=XC#^61rx^6UnQgV-`r5c@+^3cwu!pUwji zfhpio0+7Q%{TZLm6A1NgJiez%cy?a$>^$z%`2oVY=Gl1w)DZ*AT=ncc z=+XJZ<9nI_sG9{!X&@^qKwVp~Scu9CkiY|v&Kn-z)4=uX1yI#`!?T+iVw;P~2av!I z&u(W9hz+1wMu@b8N9R$G&WoPi&H@lCTvS$o6mNhk766$IUIHNi(Et|k04WIohcDF1 z4v@$Ms4-wi>;Q=zfEoi9fze+K=#f6$uEEy z3Klrw(J7(=F%rxNFHm;?o2cf)?4zRLBb=jR0b)G>v0i{!7eK5Vo{R@Q1+V(@FFDH# zUG4avoxxY}rVn$9$_EeO7?mF&)(Q}71BlfDVofl-P8<2MoV~L}xhgPdWx_B`)w`u2ISG5e`u)0I@tktN;*80>n}< z{10NEaNwVG+=p32#fKTPJkLiMvZ~65*+r!S!~sP*h!f!>T%wX-cmTvU0L|Glm#8@S zGQRK>JO-NR=Ji#);mi2XQ}CBB|B_F0ynv*C2~dIn@qa)R2zYj0 z1m_-5UH~W62_P*qJi6TkJib2wv3G!!uYf4$@aVkk*?9<(zc|1}i;GHwPv;9*PTJrB znsayK0PDTz*?9z^uq@u?MAU7nKtr*7nE*;#Gdvj&c?e$i;a_r@*KM8 zm+i|un zgHOHc0FBvc@Nc{5(e1|Jp?Lwic8uZ2f272%c;nlxju4d&P}~cE#{R+Ol>}&htUFG? zL-R6to!Kq0M-*?v)W)cMfUErhnjie((H$p&sTx$ZH$aS!QF#E@@&csgg-3Upf`{fc z(5PkSCx`|2zTE;X41;Lt4gnR_jp$RZRfpu zWe#@4vvt(7Lu3Uy{5c>ji4K2GFzXQ;Xf+&Ii$7OKJU9Qg`yPy!Jvwi7#Pf92^MciY zY~lm6UP*L>^MhuA4!%?Xt+xZOs`nS@2p8;#7drTw!=sm{*rW55N9VZ?f8maN5s%K( z;CbwWuLV2~zLM}b_)Y<|I<6yLv?E;1p`%>9!(W1b+gXtJJ5N9~dUT%d@R#h!mjW-z z^OyEG_(Gz?UB=_!D}|15S&xJ7G#on0<-iul%X>5*F^E3w(f9_`^ntG8+5nn7T>v5` zfQSYVkpLo4?wSV;je-OZfQSnq;sJ>G0A4E(I%5XJQveYL9=+}gJ3*Ux3@<^>g9Bw4 z2T(M6fQSeXH^8IYz=QvsM`y{E1dsoRJem*w@Mu23;nDnygTLntXl$>$9ppxk+8rL< z?T`^s7f_OGhcwSXZH(@Akh4H)7I<{GgIY%*_6(2ic2GG0Vo&hsb}#Vg_OAfh49>X? z9>)*-0PPTi50_2g7ic*S>WK0S^c(?M#2387oLx z3s~7Hurd~pUN3G8Wh@|N&0uAhz{;3CdcC+Xlre*pHG!4g0xM(k==I{nP{ssO)(BSi z2&|0Jqt^@6mq7M{4;LfI#|<9FCT9=4a%b@9G`Zr@{DZ@z^ALZ}*?<54dv&uMbujQ? z@GxXi;nx72$*19?qQI{aq5@tlFo9pwM`Z!OW{AoLehn7z7MljcORxn^9^Eci4nV@& zi`}EQh!1=`mFGv$f`#w*JbHbMz~Oz2wD3L(_7lPIJ_1%oFuV_gl@Sc@LtteD!}}mu z8Nu*A01t2Dk}C};fqvrO|Nr2i)bLRe0EM#xzeWrwuwzs{fWr9!D8#|}`he&E1D?%4 zxcPfTK*wvM=N5i>27UpSBk;T;Fa?r#!Y}ZLU*s2r@W5FIwAT%khYy4MU!d(}pzR*e zQU|3Rfy6L)^9`g30hJ>TAOf zb;Dz4BV58q<$=d8PLL|Fwh)yUAYKEg)whcaD#Wp?y8&b-Xy?YRZqR5CR6@dIS0|EI z1&>|KNL&q%T}((^1CL!09>gdM53u}>K3==$daKK&b0_psN zW(C0uJa#lSKrV;A&<$mL0PU6q4FdcCmw2E{$+#LA82B}KH*+#E@M}Wm!}v9Lw?MfM zKm%(Uyj!7M(24+l4c=`~E@)(pUxRl$lqs14*(Gr9>zV#K_+-~`W$KS_p_;t%%_ek#90-6o==sfIk`LRdy zO9xMW=bIkiZ+cvQ;nDmP#5?H0dBdxd<+{iJW6l30Y7T;1H?D@4JUjop8s6rYXYlT2 znFI<0@KF_@Ce?8XP+FP+5(96Snc&gQbKIlb*F3sIt~7XjzvPkp)k8VtOM|DO$o>BZ zJ^mm5f1vp{Yt2r_=EJO>{||XKAJ=ef{w>Mh6Y~H6f8XQ-UfnK7Hh37aJN`f5*!)9+ zzenfa|Nrn!IgoQ>;gvBce!=C1V<==xDhGIW5whF?wB`jg=L;=Ez>OAgxqv85uryjA zW5b|EF=PnCqxqKue@`YGD4nwgFf)O2P9!rE187JHl%OZ@3y6b?#0C5U;Q}DW27ZBX z1^)00Aoc-pIqA{uZm<(PxDD$2x*L3JZ)9L#U@Vn1bWyp`?QUS`qH?9%-NevEG(xOFCUtrnq#wsBCcQ zPEk4F(jB96p*u%qi%WNn$`O}tAC)WJE-EWJT~uat$EfV+c2POe>7p{HyGG?kw~NY} zP8XF4-99RNx=U2fIPS7w^;1S)%d=v>&5$3S{Pd7bwS_IdkTW$M;7b z&5wR~9DKy;(JL|uG*$%4@St@^pb37T&I_Q8w3^pEy2Cm=y4@zYbc?he;PhZ{F%Fqh z;L3Q+mGN4)$W)MsaY##ntKnxC#!rq14-2?5-f=a2;CS$WhzsK(N5jjYAsWYnhb7?R zk}jPtDlIOZDJmTj9zx_eZffX+7f&iDZozX=DA3v`#L%whaz`1#;r5yl&a$3f2O4pB)t zcw7P^D%lyM($ZO?($QIiC8cLh6mgk4xZiaCp^3TFLayqf}K&)QsBsV*^%*ccZo^_+yOlW-8m{gE{1nq z7;kjfsKgvRD!};8@YBIVB8(TH7W=5U96Txk5tZx=fmn-Ts|DOv1J7>v8=l?a54uet z;SaX;o+IP8?h+LbxUEwPxV>Y_4%@rR?~0cf5zybj8;pu$H6 zlun^CkX#FL8cI?HpRLybTCLyBq5>+9K!q6#sQ3aOlm)K+Kuye74WMDe<{y0BH7Y#( zJ!!xH|99yuQCR>g3pRktf&-wk;6k^H%9Kt}u?Q*yJ3(b&C!`FV(FrOCA!Xp4PEa`r zDFY{Tg33W3l|7v$DrZ2+_m1HK&_X9r+3o>4M*uWXW{;=?CwTOFFhlz}9*Q49j?z5U z?bEWr*k`(eu}{kZL!Nez{|7+*mzpb}0RI3QjR5sm9Xy&39smu@gQguo^L?PE6{unQ z0aPFV@M!*N&)>i9C%Co))niEGoCxdD&a;Lro(@r|099B8(3%cWzv1k4!xkQcXmG*(V(IbM1!5(4O$!74Z7yG(?|3-D{ks3`Djrhs;4x+m-eo!$*v#n9=V@U8tLxQ6BP zFa+(h?siWAF~AvfgW*X;XoA`g9^E1*Jory}bWS+~az4D4eFAQg)qn=OYE({uDuoB2 zAtF$OO#lssDS$Soy#U29xZTtM+9<988Yu-2t9<}TfQN%;fCkG9e7bW~Zh*vofD8Z+ zjDb%?UI3|fLE~E%pgyYu1GugYQOWSYUeU5l0vV71IK@%JM?q@6j9adN)cP>~@L{~+X?PH1Uxequg9bjJ;kpo&2@nmYprj012>_}dL8k_R zs!PzC1<)Ej&>7JncY&tMK{RM}g->_o44>}61u#c>8Bh5GvdDw+y$9oUPs2Z+2akX^ zXg7eCi5edDICxaut6StR#8Fegj`Cpq<-z#M)9{Mt!6ODBWuTJK1FY5*WIxP4(85TN zy`YYfN4Mh&pYF;HUfnievpkIVfCIym5j2kNWBA$Q;9>BkQ8PRk?}HYpA3TN}7+^R0 zfJQh!fR-p8JZu0`)>)%61ELlj4lw&bv;QD_AuCXQR6rK*@aZl*;MHyO72=US5CgkI zR62YauX-~6^)-CqdGG+(1q*x_k9!*a@;rD*-K(1i>{>75o-d$K@&RoWyy$6o0#sOZ zcpf}p0AA5kqp|>^!4y=YfUE_zzaVR3A=d_jmPpP3HH*7zK+dT@;nQ7y!L#!(x{E-? zR0L>Y5aUlz!xMhc!16QR1Ge6i@w{iZ?+xGX(g!e&9>#khIfn6*2P1ebXt&K-s2{<4 zK(X5G`@*+7_k&lr$Xk$g0(>X^4)c5f)JnhMN78ISJrNST@wCDyD zS3ZmfAc;=hlkvT;;SWf3K*dZ!`{_X{LEZr$oDXV#gA4~51BwpNVq}nUphcD-8nn0v zk|SMI7J%ju43Bw$5+UPvPjFT>fQy-ex*Z_pAcuo?rhzi&0+87tvp_iyv_%+XCTM9U zhz51ZVHs!90Y1IgG!9UpyI@r@ve{IYY%XCx#4LD5;OJbTmxOyJ4Xdn!+{*% z05Th77HG8$cm+&1Xi($-0iW&=6%Ws5SiLX6-}C4fXt!gH$^lRx_W>x%CV<)vKA@uj zKr6jYfEIayOJr~ZoC9=fhX!a##06082riLlfUFb%&0HAxbV5sH@IdbmkZ}t@vJ#+q z9t%(-0JN?j)&h`+*H_r;e~)gTBL_T;eXcur81o$QFyuK7YXV#ZnG2r!*x}LqqQRs2 zAlSo@O;FJ7J)NMDYH&5${Ij0F|Md@W6981TBR2tH^(9Jw7rdUk6TFPP2DCI7(v$-g z1>jmc`~WDXkSlJ`Fba6k6g*%C8$^SwkOHX%4U2%(zp#dD;G=aw!2((U16m{oHWsu|^0O==LDEriBa)3}8(lnUx?8R2Qg23ep8SeH$b<3oIva@Ez2)MIb)NHjv~h5C^Ie z)XD{E1Rc~3lA8^YJNQlj;>^V${v(NluQ))5du>qxZK;Mi^$lnYa@!Q}vECrPb3kfg z{#yd#fNbpEqOu0WhFS<}mx3$=oeK!k1iIG;?!ToVg&<8JnYADeRM!`%RiIPCL2~oJ zatQw|1My)R*MT@tjo_iBZBxK!ii0%HhseSGw;aSr@*n6vD475LfL57xm#8E-b&K>l zb(i$9fT{&>p#WMl2g_mIdmtBZbb?Bv<1Q)@-~FNcUtgHtD^P4We2v7c_ToQMm$l9vQAn50n4|bPDb|>@J(LbTU1Kmffq4wNe|o!f`%TbW7ItbyaS?pi%JT@d1OQ`m69H) z%LEHOP&W#6fgz+&4na6ihV(*Nf;z<>xSIzJJy6%L8?xW5dy9$-!g(U3J5PW*&I3); z!$J?#N9>*gzU8cYi;4-tc|4>$kAphS1NUK}p$F;Ev@F_O1<7mMBW~hHalkuSI+(C)8M}>uv zfx)TMr>DTF)1{}xv-u}mNfhYNYZZ$${<;gsE-D7yJ}NfGJ}M?@{PiKALDLWw@Um(L z&}r12J}N$*%|Ds=TdhBX&PmP>QE^D)e}56O@FV;NXt31)tkL16edN$0PFj|4iWK<2$1!RO+E zrbP`ebpAT{N`Qa+d&8@a{M)}9es%5q;dtpL6m)0u7#=W zOXt6X&jbvQxq#3+$Aj+#TnxW;$EehF-aPnF!0?=l;WZb-bB+gJ3Ah+ubL8KCxU)qC zG~;J@%<Zi{S|u!wbd`<6S`f2Zlc&2T4JWpXd%z0nHIsbY3|4 zK)~2hr1RpzmjaECK(-p5;@|G0Qet?~@Z-UE0*2?heN<{XPaS+DVEF0aO98`+ph}5> zfuZvn$gk%Pz7jC})ZL>3I;9NcNsu&X2?&}rD5^ToH9iAda1Gfw!-JimLvFgE?g9m9 zh)RXAqXftmWgu%$fm~pCih$*v=Roec22%AAnpg}kVsQo7kzh+bV2KMF7&V<2R6*`D zc9c2zNC0GgiQy@*a{lchDpiK3z!r2vj$AZ62eS#}b7Xt?xA&-kR>Ocp3gmD8?Vk+K zbzTIS^br(Xrwk8uhN$>}3WbDj9~F~>4+V@lKuO8S5HxKLK6n)*VF8lxU;)XPfn`Ks zT5P~FU_Dk~8StDNNRIOmRj2l=+1vJEx z&>f=UbMTRXaUeJ*ybLdb&ynr+Q31&qbY6o*rg0%Cu)2Lzd^*n`d@o>ly*ot3r12pr z91VYVUWcStP%QrJu2Jzg_*}s7qTx@&kD$Q_(9i|Un9l1Usqft-Dk2A832^@E{C@Dg z0K^8vf88}I5@2aa9RGvZ^qqhENyDG~+e=jB3_pVAGC|Sv(F4@qH9UCmg@EA+P!wtz zo-n-7$p*R~pgTlGqVojAZ6IwThUW~gfg}* zGH&NFXn#`IEcXR><&?pG5pwh4IEA&FN3_G z05TaAGb+%s1QePeRUnHX5d|_Dq*Mo_^rGRxPCo%~Oo4m_Dsmu!)_Dx16kugih>8lN0JsQ=K#)-vJ3oO8{%Cj+ zY$hm7KtTbD)@K5S=M0Z^7D<52geMilLtw)}-U4Yn1@acyl20JLpd_SXcn%ce9}O=a zd<9xBp$9cKcQ#yK2Q&Zq0|qQOgKQE6aby`AY#Y>T6+u{$^mU4 zYCZs+k9Gk~9z%*w(C{}0XdXqtv-!vY&*ne&+j;W)UH53cRHq3#Y8O0R3qE~r0mueW$_9lTc+(w7(MXpU&@~6M0_f zgATg}dk?g_^Cbspjd|k{P=tVnpmeUJol%!MU@5o87U zY!C^Mg`jAM+yW zMuCpG0wqxB(fBYquo>Mw;C=rfvpqnYl{_6ogpd~KCojP!3OlM0iSB%(Hr34(Oc-?X?YdA>C5s3|D?m7mR~`; z7cE~p@J~AC&~m?2+d<(Ie=BHXx5x2A2mb&6&oAI2;J`27Bj~^%e!`Jo&_~q4qxq0P z>GRi8pal>N{M%#%jbsEIJ7Po`z?(gOIn=xcc?5X^3giyZ1Rf$ufwLIwa6f3afE+Tm z!ya^g4Sdb0BmXuZRtElUod>u)7&?4d0zCeoXgyH*!UuG066i8gM8X6WHv*s{MZyC# z%LFP$KnfsxszFZhX#VNA1I$3*ps$27xrK4r-t;8UvFmFfw>g52U58$QOq!p->qGgs zbsXUKU;ufG7sWrFH7fM*%9%unSCD5fKtY1lD-Ix0h^s*TCs29?uzZY}Il0iE;!G6&plINk!DE5xn`xf}qysCx=@njTROsHlJnWe%_buru%A<-ir> za^MR}IRGj_L1Sw~lm{ZP@<0-`JdhEA6$ft&-#YFEIldEbiE!|5n*=T`LU;l^{-10;S@{Z74nWc| z$Q?wb5Kn&JvmUJ{cY#_I9{m0nK@A-O#Y90I=z0$_y}%FI-^#yjBB*@e-zFl^L2vhO zh$X`P4xrQvPMzI7;MD1H@F6p(tpeEvNU)4}$%m2x{-3Du@kssvj>Y}B%7^2y^5GMr ze7O7VFe87x5u2s(?u zx5B}rcN#;H2ZM*@1#sT|$v^3^hvknVU4>hvn$X%iZ30UD%`fO90LiW|UV<(Lz_Q;F zTAz2w2*9%MTTq09o!{L9-RloNc*IAAP_6{^j|MV7K8S+E1(}WqRdoylnI9F1aX&ae zqWEw$KY|K)4N#e6@#0PdBn?1HtSOKZ3z56JAsgyItC=7<6_ne+9Zhf(5}eZt96Wjh z9bnn)BRHFV;BPWwU|>+V#or1!O$gFh2JN3jYA++_H{qZE{}Y$rUcLa`Ytxycf@ryd z*2WQj zJyhT*Ds%vKZ+t92f|@j*mS4bebP-%Eet>pu_*-=t7#P6a8)dLB!7(-gf4*#S5Lg z34rA~=cpi`Fa{9=jRAmG3qg1-;JH?iiJ)m%h#2M&fZ<8l{(JsyCfxknY&Z`7;$Zy5 z_^U&N+vESi=ARDyJ&!Y7IfD;#Mm_|0??}tKu3W=#P+CwPTm5k z104$n5rZvfg7DU0ao`@vQI<#p0)_{m`{DSviLmo;D`90g_>+V2BICyn9(M2+PKTPO zpvAGEB^RLj1=iaKT{{l49dx!C*uLIYaND-CMFqSfqO(N>ysiXvtQ@qr4_b)|I@JrL z4RqocSX*}s^jZmM-azZ^gUtZtebAg|XAAUfH$-nAY#wMT1>CRh0dGA6)#9Lp32utE zfR{Uf8#~bP9g;fyooiIEb@Wl41#SZPsDL~A;BWygvH&{>Tu5Pd^iezbuzo+*jy``Y z=n5flZcs(!2JrrGr1EPp_4n!2KVB0A>Ej_UTm_{lP)`_90)x{4F~b)V2D-n0ClKPF z(f&RIg9nMjJ_`aMVFxaOj<HQ9&{OI6Cg!{qy5ygk2`4N<$p#A$l9*{7Elvqj*Z0I%=Ss zTVd+DTOilD;Fx~~o6+3^HUretM4x{Ko7df=0y>)-WBwVkagd@ZXdFFKRA(XgNWlRC zTEhtPXeTv#q*%viP{yxEV1HD`1=0r@F8xs-XNZ4B`=g}yM+KZ9VK>?z1+71UkIzEZ zpPxc-CG z{%C;>BrZ^TYeOhMZm=f8{owqF;=|GWh?F05tRP_sDX~WTqx_Q&g09O1%{O~k{@|Z< z$kXxAGZOkuEpg#&zI57QD56ho)nP2|a3hK%+mc)Y=5P>_M&4&~~i-%x0D1mND z0$maWnmGk6SO?9FLl&?@r;kBPiojEwQ&47R!FrmZw^Y53gd5*EMFn)p5@Vp=8gO*5wTnw7n1}#zmpCKava%Ojn3S^DCi%P@`E%RTX6J$Ya z^Fgck;nzQa_J=Vrpse4o0NqvAIR&~JV2cWPuDjPAynYG|+(1usA<2v_1Ea~kB zE$jjHp+Re~K}tZIP9aJlR}X{4K&wF@Vm*)`?CgQ`-;w+N7%MNZ&J^QX5)N8j0h&Pu z4I6-H(6|MN2IUnH4N3%{wHjc$a|`AoG0;Wh;Na^~0eJxwrU9U-2=I(C*#F&Azz0Bq z1i@F~Son0Bs30u~-2y%^0?!5BM5JkU8M?1kvlk!7l2aq5^Ue za^^=_54Hxph6R%OLHk0$^Ti&}PU?g!^b6dw+{{`o-W$1_@xGyo~F zu=UR&Iduy(r-CQ8N%pPzQ#|vI95Q7KIl?s@Un0C)>!C% zQta!$Yo2*D9tHP@JJ&!u^2Z@ZEJDm)gRyBEbQ&*`i!i#jP#1RgK&Qf?tw%K1P2k^F z!pnfXAU%Ya0kR^!<_YKo1s0S`9n&U&&QAbc9|gK?8hp*|f6zb&WUcoW@R4`mzF-Ta zt=i4#)9uLNu`8L8fdRbhv~vpFbD$mE58in&fLhj|!x|y`G9aFAg5GZp+MUS;I(h^!9+mZWkj1=z`~K z9-RkYOmAgm=yFj}NaN3k+}sW^y`u%(y@p)Y%?P?fy&hr(XcPq0%Lg_1AzpfK-4i^! z-6KF3L-&bFfex4GfrjZ66_5f)@RXUS<}n}3Pd@y9pFDeA*d;(M708ZM=E5CO zR^M5o5&&8+0@4IJ&?5qLUPpk3u^32;0ROg69-Y@c4!-AYeEtKxlXX9X80aK_o39Lf z9t@D1b7dQ!f#r<%G04HhbP-}|9t<9uKl!(PgP0_WFbSmE*ybw(NJZy0kAv@25xPLO zbY1}8m}hKr6l9qX<9Ux>mi?f9ANWcG$hFFlZg3~~A_!2hcY;q6nW6&nC`hgXv~xbd zquZ0i!x(&lR}bWB>f?~BCO|oaf7?fo&hy}VEOGktoX5d;=>7zWq5Ja(|F-WS!w$a3 z?uHNhZJI(X78=%NO2y6u7N z^Y3g?0qye#`4r?_P?Un54@tu?Nl^U4{M-%Vbo+oZs;2@x8H3vppyNS69tOw7piIVK zXLiEcY;(W|fP?%D5eNGWat<9R&4Y7oXN(GRGS;AeG6s!efl5Qr&^;*h_-T=h!Ir?= z6>}i_%V1H8k&F#M$r!W`3*;_P0|(-+L79xf&V-)44NAr!=YpaXA`UK!TcCT(K=BLp zGw8Y+SZVBN;bH6ox=yhNd`u_E&!A=|#Lpi*I*;QiQjTFMQb1y;MT#e=%J~8@30F}J z(uGzOgKyhLFO5MrT7c&rI(s1V4&6{^cY>}S>V^t-B95;r0EGrPEqD8X(lS4&5~}d* z^yl#GbQj>)fErX*u&UEz(dmme8wM0T*AZ91AKTNh@;@a=m9>$3c>;Dcq#5-?4jYI z>0to2+oRjVz{Ai3d|w$zk%b2%+&&Aq6&xO#$j&fCI77gL5n;CgSOeGw2@g$VXBZ-! zq2a*@wcB&o`?IS%(_NJrL9XyIyy&6nVd2^BFW}j2?%5sA0cwMQ8}A9=lz|j(2B7w# zfrqg;NQnUdwqKwNiw?fvh16r+4d8mrnB_0HP6fAMWTEX2<92ZM2Nu&sh=JN5ng{u} z9mCN|fmW8F7747f+yS-(wUOe%_}!zIkJ3<~Qf&)qrGV;fTv-EDN26yAP$L2@Yd}5v6I6DCU5lr^5&_B- zpdJXQ=biv+tbl{Tz@s}rz{5C1C4zt3A&<_B9tU6Y!dfaj!66K7|3P9{781k8J0P(L ziVt15keUYrI0iw6z?(Z8!77bSu*Bd7u=%hUGyyj=LD7%^3Vm=h1gWj#q50E;@t#kw z%vVtCdTM?KwNXHdKvz#e+A5G!eL=CF0J9~&pk>qDFi97c2(Z6FC;fph zel+mtu2AqWu2BIeWpHhe)L3xLFa?C;(Njt@{&f!dv&KRgb;fW`L) za4dp_VDY^H+xw{Aq{U_$r;qj zhItQ~oIye`@9hA259~Kk#>17IK|0X<1`jNq4~>)@t#L7 z57gfuLH@?xW(fg#5!C$bi~()i2A#BL95zH6EYK3_2Pm^b+9$B4$rQ-Cif-s6CHU}+ zZkQxEIftkufNtD_mCTSv3phE0TLYlu?4W_kzl}LEIhl#J-hume7pU@ zVFM*F~N80<_u!zAD|3|hSh zYCU61!{9~-71J=dDS*^op!OIEI1Pg>!5AY6Q2`&iX8_8n7Knm&s5CjiX_!!3!vIt! zK~_b94=o1y8FWPhc;Tam1!$DdfPdRjk4{i|imPD@YQCd2{y;*A#vkJ~aN!Q>&VVX? z)Nz)Jkp2S3(Ee3Or}>n}!B?`4k01lXyCBVPkeDt)4BTn{;n6Gd4O9$+ZRnf=9U^Ig zjO=uReAnFq5d>c`0WO`oT~sW5j9pY5V1pvQo#06ge~vW%{EKP)zb~ZmUpeuKU*J@l zBfp?Ohv#wk2vD~R6l$Pp9ncgLXd2On@uLr@$=;)40N$|K0y%&Pw89J&lAwc@K{RNj z97KcWTY5@B^DR4|11?KFcf!UX()iyWfZcBivIk^7$X}pK9zh`oTJr{K3xLFs=VU-) zzTM)WIT?`i>sz2RD^MCbBLiAW=-JH=8rJaaju!yWa-mJh?15?oolMoe2Rx4hx=}O& zG}aN|VJr{UBf!7yw+DEH9>-t@s9TRd*Z~s5GT3n(GI)}mrF@jWlZWOna1O%S#(;VeqzTQ7AR#0#-iJ&&L9V$3MLnb;(W3%ci~^an1Qp5^ zpfm%Kgw4l*<|-hbg)}iLzwo5Q@LR?UY*{2VaRob7J=-aPBk~ zfqDw01Lmm-;4U>dy;yjFRDgQcpn?W;Tq%D&bb=OTnB#{B<0+3`o=G6jVsB(1`wub~ z6QUB}VeBLUj!ba%4LU0r-Z{De8HdI2G_<5Sgr%ebiJ_M?Kl!&^ftZAmVy}Wa%O0H| zU8>MfG2R97I!Fu@pAgF!?|bx$>_@aRra&iSTA+g)ut^$l)b&6mLBqVTNw#iq3I_Ft zy9*UOj7wAsz@7%z-$>022mWpUJUTymbbdx2(CP#`$(RQ^F8ST#;Cpyh?FUC$@grRq6W}BalEIaPL8%En z34_Ftk}!O39PCW!hz6+Gh48^%f;BZ@NjCx>|;z~mU=Kr@C6J+NP~OC-q3PQ!aZyPChdsE}fvrt)6;u*?XkNtKGyxCCgFFZs zs|MXLICR=2&`AA7O!FiF)CGbpB=G^wy?{IpNy?zLz1@)tph6vzl))7~QriUFg8&t+ z@XDLaLLJgB0VNy?3UyGs1nTi0py~&s>jh&GuXAAkVXk;4gti6&b|16=3e}9%)N}@MhH7-1_rch72F6RW(tN4 ztWtnVvv5?*00Fu3I?}523-oq+V+5_V6ZHFPz2HFfO-xs1rL>W2RH>2YH)y4Fl1N+bO#4`W&(6~ zGq^Z{G&cgkL7^o9x)BMApzkkiM|Np^zbf$yuY=v%i0Zoa30t9quB4`o?)T;wmBcR<^ zpi@x6W7ME+L9ks$;35~cqXzkwP*=lm9<3*R`29cnwtlNK1f9zQHVNcdaE0WeA_3lE z1Tq2ATJY#DQ4#Rz{PbeN$DjXwJIf^_yq8FF4)z9pgmR&Ai}_-xjustv~h=FCurD>-{nMykBUL(jphgT z9?d_@%jI`jfSjj!$fFmutg3U13g{*+P&WvafM3h*sz8&5)Sy$qvkyL<&wV;SzL;?G z|9_8zkC_cm8Y1SeI&XPge$^4eV&L)rfJgH|4v*#^9Q;jBL05_O)~FbOZWsjL<$D}5 zfdM*YVi$-2oB0o9tmVo7|2?~9R6M&wR5(0Afn|8o@IQ3Fq(|oskIOGQTx<+Ll`@!R z;nDd4BIe-n|2V|X{~SeEJ-S)IH->Y74*RG8B^OXgfLc8Yp!SajNEqBEl0doY6@2?H zcrr-?lrA7^%u7_j%b&qpr9dJtuDt&VI#mZ0DWFqzKrsj2Kj;_+iYrj}7<_T@6zDK1 zEO<*)pcfZ2hG%$myC;B>X3K4G()3|d0AJkdp?L`8R^;#oI~Nq|;1x6+pe7t_eT|Qb zf`{cP4}SlPhPORhFM06$-|}d^U8e>bPzJBR2H$M!07`S`mx1n4=3xZg4eSP97Y!<5z$bwq-8ozV z3NuJJ`+)okI-Q|AMn%A*`L{!jyGQfm10bhxfOdRkfJVLxd^*2_T(bp~+_2nX907_i z@V&|4sN(Pd8`gTeuF|vD4eS{Y(D^$7AV-3fYJhkKU|zS23Pw;h|Fnl5P2zVD6krED z`2BAX8DJ0J{`~LR8JFPEcmx!`(T;J4(;TcA4NM>!Q~`i!Pz3;@LDjEIcPWEQcPxubw=aiFcP)=gcc_3%x2s5ZtORK5szrCM zj7M{gihu)u&lx7rS%8r9qCj!ZVR#aL|8uuU2mh(gDLo*+LGGgx;O}|<|Ns9T;G0V) zboaEFFfuT7Pib*sWMD9!(gHeJse4OH3?l=>!DIY}*E&BPJjCDm{orx&g9q6SFB<+d z-qHecpW(UAEiDjJ4|p{HaN+OS2)cmj_yLCh|NkSMS0>QH0=n&wU!aEtbc8a0_z8Z& z9v09B8;|A#0{pGFL2dzUIW@f0nWJLT`Oc-YL`BA>Ge$+hrPD`6#ig@GMZ={tL`BC1 zw0+XG^GIimib3anXnEt<`NO62xohVY*Un$Ao#$OUZ@PAVcIo_l@G#F_N!K%#ofj`Z zb%d}EI$nO;{6k?UXsFPI-}$8@=Ub;<9%V0Tn+EJ8lH1yyykfDD7%Z{Ye&X= zE}aKm3?CZ)Wc=vDTrwrWh4CeG&lHf49SQ5B)#k z(fmumrSlknPcq0~;4nt2FdP_MJO3g%^XtK*Je>!dAIk6Qn%iD=`O!X5KzL}L^Z0&q zH(2C#^FM{opAaAJ138@E`5xzGr``}%2FA-Sou6D3Pq}iQb5;E3$a(GHVRpm2u8i*- z8Q-~dUQ+z!(s}LsHN|tB*IXEnxiFWsBrx7%hC~^}1D_xs_;m0Xr=#H~um?af>EPIT zg1;x^|NsBpE-ErEh94X|k9E7KD7YBjaO^zX?V_UMVtB%_^I*4&iiV5f568~q-7YFR zE`}EzI}f=Sr>IDD$EX+>{_f6EF)=&~PL7cB5Ok$GxHZ)Y%JYaOq4C>5P!*%)oj*y$jlT zX`uV1z{Nah5lv@_iiJP;`v9uszIj0R4l9G|2SkNn04bEg$JbQM#33wcQ!3^FQ?V$;2pn|FkNXugjw5s$04OxV!fXjApJt5#> z`N@Od?-NNLFnIy4-2{Al_pmek1GQ6LFneeo2328_tl%mPly?|B8~;Om0*Vyh-en+9 z_;lx}SQx&2Da*jXFu|kwumecb6BY&r&&J~*qdXh`gCer58gz~nxSED8AOU&av)4tI z0puz48WeOZp9H9KQUECfRaG1yo&bpF(DJr)8vYmo2kMKs=Rg0y%>4iVzi;b*NW${$ zZ3DR(lzd9GL8eB4Oicip>eBi1;7jJ_hxQ)Kpe33A4}$7jaE1tYtqD?E0crz->S`>i zJ7ZKbKzXMCq!8KNF`!!A2UMXWSEZLcT0vFm1<<~9LTPK}Gf=a)PQat_2q*)AnorO} z2|>+IP}K?wKTuuf*3v-V@e?Q;f z|Nmd={Qdub0;qKcG8(i2q%%ZC1C&D)c7Wp3L)o39L=Tiezc~xA^S6L1TaR83M$rA) z{LLppDZO`(#7#y9hFze|@GsYbM2b#r%L#R_D1^%mdkZ;&`wEoJWN!fyxzF z=LNhb(nJMh90$lGix)hP!TlIemWV#gFVEo7_@)CK`v*XmmV)m)W{=<(=wSzSvB8Zi zANB}P%c}ILM{hf5MdVHgJGOwTi8K*!6v_kHjE2EJ=p{h5db0}9a|7f0YnJ!YqF?-7#~2y z0}ycmL>vGS8$iSY5HSHnG`NDBtS$@;E}bVqm8c8p=wAA7CGW{RZ|W*uP+(e}Dys07xx3d<;M= zaF~HZ4;+qk?`42`8=$s0hz9NPF}#G-beDHwVCV#GnPlSM*1``;ADtIL@xcrV) zP z4KBSrLY)^5ykPFU=5XL0lS9KZCI^FKE(Yfu8lLex7?toeI&_rqG`jTin005x+1R7fZ4}z<)9?<>nh9?nmFoA#D6mWPF z2%;@Kji7O{4hT&sptgXG1cw#)>fGtj5OD$3UoAXM3=9mAAOp*yg;$FY$Sa^A1BJ-8 z79Wt!9WDGjK*bW+9}4_ES3yCx6Er%95?-K&Uh_`}kIsXT`+7b9AMkAcp~c^`_0NA; zcbkf(3b=fO~NA^pPoH#yL|g(K7$B|uJ++`Z z8&dM8fyc}E1zOm_c^J8h=>ZFY>w^0pjYmKg(qVpiaCpJSLz~}Jpp1kz?+4{722iP~ z2_AE*0gc#|s7QG1$Y*3=Uq=I#(#D^3seokq2~&73lu&ZW9&ILJ`edppftYwXy?zJHLBs-uLNz?$Y`5g*guc zgC|tGPv;MhnI7MNdhoA5=)rgcbU$jZHq`(8@(du4f`_BF$uK&0%n^Zv!vW9#Fi(G| zxwDb6O6V_e|T74 z;P1->1*7E&{$9}0Yq0bWHGu)D#{-mrz-D<`w}W)o+yxyL2JXBZZvmg=4vJq#h|$ov z{_oTI?L`q6s2dE{3Q0_0Ce#h^@jZ{`gFiehPt+>IoDQ=Xst{rS>nooB+d+1Dc7q+_ z*$Fn#qt^pu0Dm9odbzX-9=#s_Jv;kB0q@Aa4SaOGV@D4=I0O%_2WjVk`V3|P!~ylk zK;8mXexOb(sD%zvi^W^BIY9@*y*~h+`2r1)f*GLRBA5XxhQJJv3&0G}ASsvu3Oz6b zG)xL+fW{#`yW2r3Km+xCpyJhWA1GJ(@cVx-d~0}nf=BNj9gr=ay(apgIh{GzfByIQ zf7qk>C}_x=qvpOxFJ$-z)TafH&>V+s;0MilfW$!Y5AqVI5Cn-C9`J1553-Sif9gTc z=KY}YQU?CMf9wnl9Va{(5BPLLGP6(j67c1Wpy55nP9GJ4gAdr6A2j&%u5i%zU~n}& zkmkaluWRee$N*xPh6FJ(fF?X5Kxd2xfCeKxKv!@(yfgvLb-{-aC-`)`s3ds)Kj70{ zqY~k3-43$er@KTYz^6M!#RD`n;=tcq$j-n38XIQt>|PIYD#$nv&{6oM3LdR*`TNS5 zK_v-~ibwNb0siJJ1_lPhOD{KpYU>GL`EaPb;iU;4o#zaZhI1!;69doT924+p{?A_X z5p>4=|AQWuuWGJ=b;^QuvZ#18A1H9?JoN1n#EK?H1_r}#FHeK&qRv+y&5u4f@^AZ) z#-DdAjX&YQC;oy157J!t3l4w}j_W)R3K3o-cSz8PY6e0WvI0h}OfhBW?s-TM&Q z^f-jJT@Rsorw4#a8&CoSDLa_PU;Ke3&5=L}>-N<& zNB-M))A-Xt6Px+BVJdFl1&KdR<4?bn#-INTVgyJLfBs$UYMw*XIP%|q3etKsjX(VX zM0@(>&;0r9X^#A$^#A_QXa0KjG*|vB=Rm|Y5OEJgJWF%rzw!=5d;<~xK*TwZ=Hmh$ z&Bs3Qw`zjwXv?eoEug(-otFi3|UO0v^rB;o<+a#H91%frm(853b+%x5*e7TsAn}A!Fe2 z|5(F80T0V}{5{V=b0T1QXmJJ4k>GO63VgKYN5e~L6AZs0A`^1IlZ_$&w)vnwc!!Lk z$Nysv}f{KLh`H-A$q5?J>v}X}Kovq-}dYiv51eC|$g2oRz z-+LT<&f>%P-Lu>0Ed#1`E({DFy)1^H_QG%eZ7kv)E+z_KEAQ1j_vkGFjrrbs5p@Yv zf*$o~{>xFb5$+wRwV+lTq*2@HqLSg!3Mu8nJs|1GG|!ijfxpk<_y7Ms-6AT!omX59 z-=g|=H#;~iQd9~c?N3MkZ7eFiJPiEXUN(G`UeUn6?I6F)(M}f?8INA)U!VdSl+8VQ zy%|A+j^JhkXr$BQpy%!%|G|LYNAZTo_ZuF)F3i6?4nAP=I;wP8Sssk6!1$9=+Zy7>50Y8s^Hs zt%jAsxtGNr>=MUs$DvL^GR}p6+d&t8mt!8i&i_1my;(5~`-d>h2W%K8)UbmMF8td* zxbVAt^yqc|@6qechN1UAR4-C+!aQ-3-{oAd2`6Z?n?u7l>2C)c9Qe1L<99jl(Ob;! z(R$m1-}AGN;yutdQ_b&?1bN++e_M<#gLAKmG)$Z0x5EuSotIqrw_S7Lce(D|Ya)b@ zIs`KE8^6nU2csO73KxUFAX>u3;H-neQ5S=|E(Tvg0wOLT-c`@eOAa6zu$YWPM~;l7 zXY&yOkLEq#?WY`|BacCehrg%$FDP-Qs1*2gJ^=UELwFQA1VFMJpUi{ z{C~v9I!7ggzsLLU|Nk%3e*FIr838}|kJ<2mPv=k2A=99C$4k(NB_fGW0QI%NB{?Yf z{@|!pfwm?X>Yf^2g51X|ZXg3Hx;?F@gK~7u+t;UIO|8xopks(EPt-bs7TtiF$`d?# z1K1%Ea{+YdYV)%nppB5QF#Ydw@E0@xHW8~1L6F7&55gLuCp;RDfLh<6RyuTWAClit z+UKBAa?qGRYz7O|YK0aokRvj{tuWByA20)S#4nfus+hnG(3!(v2I$aXFatD#4rYJ` z*ue~vTYO+$pg}7z12k#{+UW&y8|Z>3h+ARnI$FTXW~{;OcK)X0f(#6vo&P|UobF*~ zXqj}&gOLGrloP1U`Z~(FlZhGt=9xMZo45@7}hSZ*4z$aSzt@o!_f*})`+{iSE&+E|eY)46 zv~NWq?OTuD22lGJG!5AVg4$9Sz>Qjd z%G$FR_*+2bN9RS9Hr0gA(=G;w4PrzYK#f^YYwA$Vo0sL_^n47`m_3cFG5Zo6?60jL zp)LBz1;UU$31z5m05SOUb!R|m(*_7_n*pJD10eLE>Oa83n=uU%-ek95KVWaacHS~L zWe{S@0BgJ+gN&EM#~aY|BvSkJA(`!0Xo(2Q;oz(etzleLK%G@kx*dH!t^7xZK2k}8i5#1+l%}z*F1V%|9bTLBAT@@bC8;~I_%E9 zF1ifRmgrG@&05!g9=*PZW-ZJxq-HG-yK^rKN~`vP3%|=lk6zdR9=*PZRxL~`QmYot zKX@9orR*N9Z$0=uzxpVC^XPo<0c(JP8nrU^=xtg84O*iZ6&a%#6$uxE*DeO94K5oT zb}@MD0wQm_fclmW2A_>$R0=v`bR*SMkjQb?05_K zrWg{N4^JV@hh7&3M$o_*sL?@k0|GQ@LQMOi5?A{H+;k|F1s7Q<@QVG1KykL=rI(xG z?Farocd#U==`eup1tSwk(ITp82VuwxKpCpvL8T68{0l;x9*5Aj>mfAnblcJP0=eyl z-A0hm7TpAGugT7YGE^Ht4E}uG3EPq@HK^`F4Gh%&`6jbYJ1@byuFYDYA-zS+>2;0e8JvcfK~Aa`CSeXZZEt*Z7-C7 z+6$necor7I?S+@9?FEoF5f&2K3o!lA_5w&hnzbN5fZYLWKwxbzz|4WR7e2W1Z?j<` zb`%V)xd1Z@+FSsc#RD=6(OiHG?s@e3{`crDWrNH^e)Lg%=kfiXN3W0Re~*I?S$r5j zg0AJ|!5HuYjZXF2n7Qz8yYJBOUE1N>G0>pebyt3u%O1T*O@?>KO@{BT{M%$~urwLI zx$wJuckVSYLyUnPgN=b9nhd`oO@`B;=E7kYgWE0!pIridJozd^&v&4&a$z@yio0kwY|{Jrh( z{{Q!E29G*0@b}#Wtww?EC*t2GV`U^`X&__a@&CA|HCRo}tJga`8jpZRr|^$of$o~} zgm1|*0L_+bbhEp3?+1;_bRIqUmbv+9y;Cm__&@^2gPr`vtd9R(R9IX(e;j-v>&WP$ z!s68HW6NN80J;>Y={O?;!){RXO7pdEZ;pzF59qcr&@?dUwlM|<2GH0yNDRCi6uPq& zq};RDMMnd?)5}BiC8*608K&xi3?FresAzQF1C6wS2BAQ!Xu+dd;34Hs&<>(b(5!za zXp@uWM-P7gbB1p{T2Jl*O$&o|7GYV`3*Jx!y{-YY=>El#T|fUjc5eY+oDJT}_34Ep z8v{eHbG?h@5B}yWAU|~HsA#-21w|En24@1A9$t{1W{{5>5C3OiU~sYg-FcY58MH(W zWPqGh0J6XHrDtylkH$U_8?-H>6Lcg{XNgJzXrZb> z=K&ARgC5K-AY)uqAS<^)1)>Bfp~2S2gO@y?^WgV82U;J0lGykX*$H0v2};4pX&iok z94LW+llFg*jUFHy9XyV+sDRQ$+Hn^Z4hDuU@Z@k;zYZe23!J9(=*n;iAF_T1jI7@-pZWYzB{B7ZoN@3Iz=>gC@Q~aSCqjA9qoa05hPMpn)Vo z;R+V(1|KdH0=hU7}CfqiLUSU==y$h*Ei6>?4jl#W&BPT z9XqFkvNXs=AX5*NfYuMSsDRQMh`$dc08WHHo&P~w7_a^Q|KIUAco_s2DCKuP0|j6K zC=e<@0=qy2RP8E|T1bF3A80suK)U${Gk<$969dD4m7^0@yE8cQZ*y01&U4Mr>>az^WgNT16*{jsK4)NH_{aIZ^H}3E28JJuoc|6U<8@># z=jc4w`0M~b14HNa=I8b>d4_)=d3Hy}avqR8!v}T-kP#qtASKPu>^c8AGL{Q~B^iD& zf+RtTK#~ySIR71d$L7dbF4FiAWO3sou%)L|!KyACe8J<$=q~XRboGE^x4Qz^!Ka!Z z$wQpS@Q3r-!DArp9G#~cA3b1ZVCX#7{7jzn8rVgr8XqzI0SPre14(gSJNS+j>>7{+ zgFJ&H|MqePkSG_(0U#3?7#=V~jFx8rNeDPHmP>$L_D2;Y$9dx53sFZ#cbV5|j@|Am zod*xTlm>h2z}s<3K;;l9lY#G{Xg$E+XUPCs=K-ofx*fn2X^x7sX>>ozGo5 zKe{O1H2i6J(D38y62p_tzgYRFA8h``3|=q9@BGoBOETvRwf;}IYo5$6Ztuz>5=)yQnz8%&-8N!QW!k!@yv8 z^58+qgGWUj8Q(iHp6||4iD~}D3cAG(G)oAo2t7&yKz`Q(`8~y@^P7v|F&D*aE}j2f z6wi0Qbm@HRqIlQvuZ!U~!*`u$UxN1Ig5(VEyC@!a={)VC_!y)|@tWa17sG#s|6Wc8 z)y|#gT|f%1yL3KtQT*o8`P)VDu;FhP!*hoBUY8nvYyQRRz(4(1^DpN8phZ*s&i@=* z{)4=P76|(gfdFcQkQWHL-3$zd-wqy=Ja|Bq@hIb0m+l;u1W=TFg1ilj@&hi07hDu? zbiQ{{d=7T+XOMdj7~TL!dFOi3nJU(nawmIBJi%bpCKrykPjj#qfpU2}lxu3C;X|1#>0$%0L;y`XZd7a9&P6>oyds~0Yv*IX3O z8J+_r2Rau@i(B9xJud3X_}dYbcuQ1jKpyo0c~lJ)rwN_!I`6s|o^???>e6`woMSI4 z{xm%3VtCdNQqh7ACAi^YctP<7sNj0((s|TH@vPxl7sI=TN5K^>NWleg!Z_g4c~Ab3V*YK;0;a9_>(9-w@sCc{3 zdDlhpETn!iJZAXU@GDA93vFC|z}~o`O3kyciGcy^UB`n*MO{IytM@M5OH@F|VSxOL zQrlj2F+A#`co$R+fwJ&NNF*IKJPWODf4CTaa8bMfD#lK_fP8io6w7}NkAiDkP^-f5 z1h_ap3NqxUi{eF4B%d`rOXq}rsuAkvgU3Z38UHvkzUkfr?(L%bI0obg!>cZeUtKyM zfO0aZ+6B4zs^Qs}>%sZ-0l1R7;nH~!)XMnkqIebL~tdJx=d2K(rS;R~>jLG|iG z7sZb-AAxFDQ2PCKzaRvi{b~v7cPdNmIk<+ z^wY)gqKo1~Q0fMyk+Uv}e?eZpKzA>Hse^ji@!$bbSH`1`j7MF%TU4e%V;RNIpmYl= zv>>hHv(RYzVF>f{OK_9pp-bmi7sb1vdguqp&#-ngD5yXcHMk)7;L`clMe!-f&o}7q zX9k3y5zUS%;FWb~@eFEtJb<-4K7!p0j;9B3KOb~4dZy<-yhV54w96U7S+o!AWs;+MKnZix+tCmIr%NTmV%V&2V6Q&f>Oa%7sa=r z+=|{50R1-BUZVo)27$Z_ZfAmXaimMpJP8_z@If$La3pq;j~QL2c_dj*Ndmtq{=QBbtXn{{0Rb zczfWYcmY(sLYmg!;U0eAVt4}NrJJC^kozu*-$5RJ4)ri7m_XetP_Tgvc?j|Fb-H`F zung{DXcOdb_Zsj*b&!9-X&T&jitM~^_}xYEybEa9;s&VI2y(F@!n-eA48bjK(4ezR z=Xr>C-^0E80Nk}Y(fQp4ltx}c0_#5Az1vg@_wFH47sjiMe_gt#sO*7O#E1r0oJ;3< z&_MEYkas`0biM@n*0J-3At*tEQUhqP3p6YO%G@7aI-fgs-T)>$JaKf=1vGT~4CHap zC?DwbNRSj{?DiR0$vN?yb=!h(6@DAFW{0N?Oy9ge= zf93)i%?0%~Au|%-uz3g?8hruIHQ!tm!9)BH=swE1tN<3{pfQr4ph0@bavM;DBa(S6 zs1FF9a{?#hcP^cu6<-^E2F=0Tc)1ZAmFHXxzqu&>15GErhKvgs-T?KVKR_p)zPT8_ z0}tX~0A-fbE{eZF`d^?;I?-V$Y;!);%Z>*@?azmxF@qKr(Apl5pTV^kIFchk(Q5b) zG~;wy@in+$x&ZRhKf_~?7TF0{`|>hK8svGydxqx>kAYicpiUX2MfT4{@fv9A@wVY% z!*_=F=sogxBo8{H2pRc%;mG)*y9P23Qw}P^ZJU2F^S90d$KkQ>*TCL&Q9Nz<85D_z zARmK95J0i3c+REsFi7gKi{UlHdoOQ+^&I$q0o<4YPiGthjgJ`KF#G@-IQ$2mS%zr( zZFtzl@SfqlmrD_vZh%U}bB5pHi#;k}oO7#J8JIzW{t z#EKhGD^7HR;ssQ#K&`k(|IkXwfrggj!9${sjIZ2!mxz@MU$E$218*vnfC9`K9AJ=Q z|H1bQiYGud#xbb>!JQkB{|wK8=7b)DX5gU-2DC`frSkzOjBkLaJii$p>jY&zL-2U~ zHy6Wu;N=UTxo%LHoin`m60{u^ss~{WsCx`an8#dDt@%d(P}9qXhZ?Bheec#g#qNAs z$iD71@ZpXkM5s*yXPOJ3FgW1S`AqR2BnUo$8jBzgf)+tMbLqUS2+n4pR0B$9E}dW< zA3y;OPMHS`Pk?kh0F~i}-#`I<8JwL#D;>b;46Fl`b-`AEiagLHIcSjpXcAcwVFhSu zLOB6CPrqvEJ8iy>sMpcwU-xuYu2E6oW#{2As~Ofza$= zGf+Z10IrX~{sWck*IYVpyC^<}C7Nq6E#Tq9XP}%08cjR^3bG5JjCRfi6au#)nfVwz zncaX!3&a+rr1=cCI0a%0D3nPl{HYOW$1~u82Abx2=hnN$Y`f-~1Kn%Dhbn<8Jd8m5 z0P+v0F$QXs9P9i6Ni+vQOIt?qc}V@axOPpc(+I;Q`DJM8X73SQtKa zQTz(EgVf1IYNWEnG}r*wK~WdRlf6B>Td%g*gF1_#m9L;gR*J}(Afe6^pfq*^)*2 z-ZiY^obFpet4AV00S8WMkhTV-5_kt`qMZfLGlPZV!?`|=VB73lGE&}jWjyHAyN2)PRk2B+DKO9w z3nleYy7W$7nF;W~0*w$J1~tjnY`s4NRC<9H z?v~_(av~(8AX74+1{rLv(=m|Gp@_MI~Xjh%r; zSU^ipz*+a4OXq!%au>sQhOnXwTus7l=sW>Si|4>`fw18m{gak;JUp~OV~WQ>ZL!-$ zfAv903$*_Nlo_!%#!i6B9#BK6^97`x1oj}PZ+Qsh4HXU?;g4B z_oXg?k{Ed1Y#Att*?|jt(EchHNLLxDF?Is95cmUV%;`R4ehoZS32u$OH~jt*(!B(C z;Xy&52oAFg;EsZe;s?-D>i6KK(*M9RhUX2xLx(WHT26pUIZ!SJ4~T+Va2G&{*zi1f z#sajE)9{$#d&BSa4z=?!&?$?9pcdJ|-X8w9>mTmuu7NCH1UD)m{c-TnJES!R4i{*1 z3^Ys&Dsn!%7~XbK{0(i78NN3B3~p6`>j-cOk6h(}*Grr>eC?w68KeQ!tU@*LW@USFkjLebouUl`6_Ov>+tnL=@ z)q|pfqUc=vt zr$JpOPPT@b)I)o{10lsTn2^EZ}7tYf6%eA;~=T~;3f>+ z8)T_bu>5&cl<{cq8a>wuHM_c9AdC3X+7_Ue7eO|DlyEqy>8cGU5Sll7Z(&z+-U- zAayLlihuNPW?Tt_2N!6Z>^7)T_C06f=5EB=F^pCQsFek7Q$ULI1K{ChQ2CGAE`#iu zg0wQg4Xq!bRnO3t8DgC5p9`o}3T>JlGyDgx09+uWB;a8rkS(BbGHALy2OB55?*eMh zff~N_PGj>!;eiGkC%fm=JICzNCq@pJZpZyg1Mv?=(+uoEP+5Kt(&dJ< z<3ZOLfi!@^6tvq8l*$kdGsq|zNd0kWy9|`b!0JJ567V>jOD7^#UIVq3VdjH|$mrg& z%nyNw7iiVmcema(c4B|}T0!9jn=VC4WuR7u3#?;(AGD6=ICyaRfZ-2V!wj^b1=QFC zjo%zM{0=_;AF2gBOor4h18;mYJPvM_y+bt1K*MBE9iXlhtW^d{mylK&!jge#lvxEM zH_AS`^e*AQp^%x}?E~2;gj88V$}!lS2eg}b0n(5M`3>5yeh%&@f;vB-$`U-`q4)wc z+68KQfkrOClWH$qI?oxt1C4+@2j?$vI{`Y<1GWORB@Pr?;3-Q`8x}M$2ig?+&ZQG< z1!yZI-IEwk5Il(;5Oric;nur{Ez>W&u)77eIudlVRX_<+!)!LVz4Y_@MbIk!XOLAC zkcJtk0|VM7coV#Y8@#~cpNrv1!;jF0+0XA6!E1isf%4ipkRDKb1GKsFB6x}POHfsy z2pXFX&5VrLYJPi8|?6H@R5jrn|Lj$yhuk$VF%B}#=_$_$R@lDwJ`EM?Y_YB_| z{xtmfaurM?SSe`H>Oauv?m6(7_Ep2LE{bnmIv;}8CjSKYvz{5ga{+}vDLa#?5tNPo z(4d63+gdp5Y$ty~T6SLx3P=ZVKtg7?4}t>nA=ufVxwFo(z+F(#gwZjVPVnxAqlW(s-@ODKngAYT1SEg|z>*w$CnT>{xE4jvMLEb9Obi9ovEAHX4W)bJ>{wfX|Idg%dp zN%>b7#j~L0DThJxpl=QDzPt$<(*}q73y=cEryxDxMGc@ed!Wripk?SsL3+S*r+*Fa zf`>#P_WVHD^8hsR0$Brd)Wz^GvOP}?@1lg-UdYb+7Y;3NvF*J^WMcAHb?otmPEvu7 zLAA>4mMNlKz5VYP8 z)G`LO+Q6v?wjSmvXgAIGjd1zOyE)vb4m#yc<3CYSCx@HJE59vEbp7t(S8_rOkc-UBuCL1_q5 z3w#B&`A>l6-mXEy475!a(sBW70I!Gv4?vxD0nL4HRYv3_l=NDu5Oy zK<)VI0ch3JmEnGnsvG3);mW*c1cKe_a68HQlt zVcSPRegN%0Q#{ZKs!Bl<=yw(G8Xg68zhTpQ;Dq@B)Yv-)nsb2;SY7~?lZM|wjXm&o zh@+sU+dFV7gLc49xO85FH1-aFXSTqp3)Ek^=F$nZpV%51 zb*Os{tg%<(3#wr?A*)Z%gBF#8MljxkTJ#sd3pOAL0X(X`4P2GJ0FO7`2Q|u$gOC5X z1`3uJiYE+zyq0n4ya7%mpzt{c>aIeLQ2>W0SPZ3jBCxz=JK;rVQG^zq$-2Ws0Mr8o zuhg)-YA~le2Qtb5-iZxfe4E;NLlLz83AX#?K4^hGsE_auls=BVg!ujgcuMX)Xtx9? zus|NW2HL`W!|=yzS@3$>3ofA4Wq1q}Djy)5@L`+KkI~!r@@{b7gBtrU+aKyDj)4^UE}a(?Zy25cm!&scI^Tjy3Gn*acc3~P=KTlY3AwMJz2~5!7u2%^tx{J6 z?bnnAO*w*M|D7Rd8UU2Nz}r1PxPVKndxmuPzJe><`=AvkKizuw@F{P&c(i*Dd}9=N z@wGN6`DcTsm=!?_GoicwK>LxQ?e2G=A(~?^A?vSyfcMTk1-0J6JF!8HAW-eE2-?6Y z2M!KM1L_)RT2~9=;E)2^!sd;A@qFKxKdq zC=l|%Nf@*U#09j;>w`-tXxBBg!v$J*X?W}<=;%LC6$)z0{RDL!4!S5pIw;@3!Y>R@ zyp{+18m!$Av}Fo(h{FlcDI<`Xook?h_+upOp`u1nAmj`ShQp$azk9dHNmM$X>fQt2 z`U&270X_jK6P%J?xPWFk!Htfe;LTy+rZ8kD9BB6iX#d;~&~76`(Ed44-}tYK;!}|5 z2g4Ju<-lR_0MbV=JP0}|>Vu2o3BwbhmY(8WP~YPyodZD73EEVHEGhlv*4rZb-r_cV z{tA&7vcRbrbk>iH;Q{dc6UgtN{WT8_LFeEY9)#{cIpCsr0@Ql@3Od^0EhsQR-OU3o ziVqB5yp{!p1tf$(TgX7WybmaT0EGZJJPkh@9;9;!@H@ggOQ0tHZ@1nlk{j++_I2-3 zfvrOD2jvBDfsh4G!w*390ceRn$e)T&AxE!(0^uS&5H5fgSRVzoE{}qiOF_0dUjU`{ z7ocPS4x^8tqr(n@JDC?;6c2y`0kpFYEK27<;BtTm0_a4rzfQe#H2EZ~61w-Oz{VKC zwIaAtkP3}c!-s}9K?fHc1vk<`O#{Oh;A3<^tAjdkfVcc!bOD`k1|AAJp!flFf(7Vs z3K>w%@&OcX5ZRL;iK~WZL5Tyjk)EXO(9|dgxa{HWNKljDpIh%1gKoZgIo&Pr6AqB- zMbIv}^Pq#jKwIvPL$+~u-cLqA_Q=bVG(Q;aoE9Az!6bL z#v@L>YZUFex>7=Rn@R2%Tc{>3sHD0j%dDXgLmON0Z_)klc5}?>?Q+zyWsB z@T1|+*X6{Yjz^84_-g|S3ZKqr2Mb;Ot+Bq+dDLpEqmS@D>Q z;WN-AF=U;{anOdsi-zF3@FTQ(1RV|N(fJ*;Sm_vKRs2U#;6RoOzLx8Jsd&>9v>gw0 z(jK&%a9{Dg;dfA={d6%rX!sK)Q9xVDxXuZrMo4_N289GT7(k7sgKoWhIMuxk_jb3y zx1b`5g)~qixCWYF0u2*^&yKqYS~djUN&MgNJ2YE><N08W{&~*mw_KzVTD>rr}3W zV;K}ipa8mNcn;K9{s}tY`s*u@mMb6% zhE$hMP>dR01f6^F64b=K2VQ{i9druhd&BcDw}N|1kRw9=8Nxc8_Z8oRH`aeN{0QnT zK>`RO`wcAd)9@oGUt9<6Zl!kse6WNE0I0igz^%81Js~C`w7UgIqv1{P zAsC>cRq!E???H*!#qhY{d1wm(Qs=z`^`XGA{2x5ObWrgnBn?2r2O|9rR7-$lz)8u) z5VSv+gwryqkqh2hz=HrfoH|APvufzG?iTpA8*mE&To`16j@kmBf(Saq<|k;W>O1gK z6VNP&A?Sz!(BaYG!tEt!(LQK812i`J-bE2oM}RVd9N5z!&4yt4dtmjTlNdp#Z+~g4Txh$WK`vx~dzon-9@a%my`Z6>oxSL&zz6kmFLXgO<*KYmD>I zUeihNp^M;#KX|?CaTicdIO(GJ)9@pxl>|9&@EE9L02<;0H#;sGest-4ulU|&ATq;a zGiV?vYgEKEwNl-=XCJcttvBjiMoF6BDS)dk$KCrU=>sC+E@$ zng|805(NbuXdvz$Xw}s}$T`cP#=&=zR+%Ac2Ao?Y2sWB88^OZ>)NMNI*1JaEB<9SP zZWk5smJ*a?@YqH1G-&;$;cL(yW=N0lzKh~>(77Y;4ex_<0=T;W=+b!`wDRz@iy|nP zKxN`f7sZE$H^B`g(69-l6a}A145};*e}cjaJSUD?FVLaiaKR8B1n~C3xfhOt-7WCl zmEe>Bt{k&K$@n2?njbv+0rDs4m}pP~;XXJKLleS5@Tsk@T?`)^o(6>)XuZyN(2;;I z4R3-f2FL{KeHX*$hUY=S11e(-e?pQJSP&&M&><8~8NfpU+CGFVRs9B9s&^x znc&RpV)zhz7T8UfPH=)a4myJ7zKh|1!}HLj03H$PJPaz|z^7?LR!9E?9liq&1xP5p z2ek$ujcCwe%|AiQZxo+{1nC_JNA=->0PQVI;h+4nsHVFGelTJfXe31sG^$tvI+#K6 zqbK-4X;4!M)EWXe7eTE-P=guNRyqW(A3?QP!CRndpT~OrRX4r|vA)xTk1%*dG zIP2eZG5qM!`P%R%xV->c)b0X0X6n7+cTjT&++6VJd=2Rkc0w9XurLE3MFna>%Ry_L zPSBcVP(Sh=DA$48O`tS3APuKgx~NIRsdo;))}H+2?iToRTtr7Q72Ns-E$jh>!%uMU z`W>i*I}Qy7P&Wz`1{Xo~C9HuAYF>f_K}`l3kdMI{VJ(K6kS+u$ZMk6N4LbCsSL(n6 z05re^+L2-&dvv9CcMJHwZ_uJga5oBEOs0X;GwAe0@M-EGZz>)Gm4TpD>7X7Ev?KXZ z@g->F1l%G32heqJGXm6l1`jZSG(y@7|3F2~O;D5RI;f2e>WiV24s-~C<=XHN0FARA zcI#at|IJXMq`O50G+u}i0@pyx*Fj4ZpDDfr`yK2z@Q}(w!;jDqcnBIm`37w`AM3mc zsvMuYfL8p2deYGF0XLejf!hh+4Z$Zpflgth|7glmE%;~(thJyiW*2j=y9K_j9-Ici zgRE(w72?-iKr7lnb3~va$LlVg4;5d6#*{#dksx!AkecurbT|bP&EWo#;df97z`_SK zobt{El!uY0F91*gpMVh1P?5~gJkk+;C{kK(BWqH4ZnlhO3=UoNrMKH&bxpIB0y6X7eND* z^v(fGHQ>I7wwU)=8t=NczS{+|mJgTcv~(g5#6MJ(2lXOA4XE=johLmz zZz$dbt=RhsUM%I(c@t#9N0-ijpbg!iBf~l$f;#0tK^-#CFdg`?iT|KB0_X@m!}H*# z$xqMD8-}1@0^N~;Wu?^41MsB?I7i(R2`oiuo1_M6BHV!8#lm>BcaCObuu)aF3uH1L zbVO2Vy-O!}{VQnAA;<@yk#f+{{U==vKN^At96Sx94g%2WSs(*I1tRF~3ed?}pfETIGT$gf-KsEBqC6L=sXFUW&_oTpvlQ&ps9)bpoRhTVfl+ z=mR&Pe!iR!_Wwmt7B~ss7N-dIKlo-7(A`7eTm-IcL1*KgH~bDdClT6&1ecODjeli$ z2!PwiZoOL+*YEVs?)HHciJ)WA_*+41Rb4v4r(c0KD1*WPa+C+?j4<#9+7IAH;xTX% z29-aAkrWh(ZA8a!G=PK(7*X5dvgOM%8>r{-AJnaW4^0H%EeJPUI=_QV zxNdkHv~K})Ry)Xm1E4zgKJ3s6(6ReRAuT3QkMuol{jUgb8G`zaAKiM_@K09MNCO=R z2s;oF76#xrJmAuK_dDqNhohi135FLyi!vam`+-hp0gbjB-ZuoDoN?R*G@}e!x?=bP z8U`=EUjRk+b5Ia`2PKjNpp#DxAArK(0;miH-Cp(75OlMZB4`Bz_!LR71vCwVP6hY` zG-#L4d8ghr7H2qbB!a>K);xA@{>4&S3Eq1G+L(VI>_`&eROVD}dkexvXTsmKZ3WSG-2SLXx-T zrvRN$`~m9rfoe(6My+$8{UxA-4?yb>z-xv<2k$}mtV6sHTB8Fx&iMf7{wf#62jEH* z)TacU5DD7t1UgI-e83P*ecvkw^*wms{q5d45(#T+JU}<#fNwQ&0!4cXB;r8FuY)4) zqv1i&2Gtj!!s`U+78p>+2i6M!ZAAsI$OP?TdI>%R2)cw7v|k78=?5T9P>f%I9s=qJ@^~pE#$LE| zg7?cjG(6aO19Xc3Xw8t~fzF$t>KihX2-?qb40N#m2e7|Eu??*>9)Rjk@C`bk!~(wR z3A7guG-?RyKR*La#)GyAf)+D_PGO^|&*#g)eGWSI1hmIiAU3w;J;>*vO%b4uFxcni zpvCGScRmEgI5^r47=jkIgQD#MXf*UDD6N88gW$A!1GK^lw9Xrp&%w0?cwy#2&>k(+ zYyvvNA2M17I%o#8FtZc10LcZEOK9r%#nN!UgU;o+=hoX}u(7oDCCKlf^H)HA2PgLm zaLj?Wlf3+X5qw`jCwLX+3y|MWKw2lDGz)S+c)Q{O(5hO{wQUg3gHEslUD5ywxr3;A z#RYO^|20sr&;@dc+6mC|Wl*A_sppqT!95RMtG-8pNm=a<$n&rht{uQh9vpd~Q+vK& z10PKWTBHstqdtI_-GK_W&YPg7A0$bG4tWJ%=>^%7_XBcx7r561DjvbP1+>Nxv=iqi zXuRZ{A*cfYIe_E`X#L>}L)vEcHIi_jgEltYb?aTC(IK7s8su}(rg(U?S3-9L9RPKB z6hVtbL8aUU(2aYrHJ6|^EXe(kh4m+(WfioQ4?67f2DG;XI?cNioMFJ_+y(IHz(JQz z=(-E=zD>}*BcSa~G>!Ll5>VeCJSytKc(-?rMx$M)GN^b5^(;$ZwL18alMA4d3RZ7} zHX7V8JOM5OKoiNG*FZgeXqp9Gga$gH2DMfP7ZsqZ!XVk@0XVyWYDMs3Ta0*bhopi&-ELtKE=>EI>}Xu}YsP6uDRbP`lfg6s5WhR5hrr|%Sl z`5knY4yaE5oS(}N@;mGvFmO2st=50IbV534kfI7)JHxAW(AmDAVSLEue?`dog-F%< z320<~)u!PPpr zhz2EB&~2>Xqz&ppvljBd8e&T8Ic*JqK#hfR8!`>85E$ zKO+qHJLqoNi*CI=94rbgOF;Kkf-i9dr*%Y~{t#BDe*kshA%zrpbpIeI!GfA&usR)F zNP&wuaLoXUUT`xITBm~+VjF_DxqRxEWo zXu~FC3ADr>audWoNW}=Q(?RD=(mciA5`g+1T&G{{U8CWY zaZC}E-obZy!s>Krw+lS@3c6wl)S3aElLxNTL2FxGI=?}j4jGP81Pw?TegG$UNQdtL zv^4{63xTr>INVNv>U7YEHngV;IzAJ8V=w5QT3Qx!5BXsp2i57iW47ivAja-12#eoi@0?%B6)9ep$FCEl?hr~K~m+A*dl@4yt zAgc5m;O0NLPX7j~7a>D|iZ4LM)3zP^gb(KV!=T+lEfR@yc+x#OT~q>)_DMj7EI|i8 zKw|I)wC4(Lk6r-XZV4KUQFZ~HP5{2h7Id5}$RE)99kdPC@B{d`Q;+T#l>ksL5WMU1 zBCON|Wgk!v9kh80RL$Q64SpKJ>v?cz2DBHKmg(RoFEl7X6}=Pn%y_J zv>-4GblxQBKps$G7z&=!0`VZu2bJkBpyk?6P*^|$4CEQ`fF^i6?kA)%0QL>&B>Ed3 zpbHDY1DYS8mw|vA1V22wq1u0bzX&!T);PEU={#KkEdY24s$N0OqI({lzroD|P=Ny~ zGBUBx@ld5@w2m7TI3C?|zzG6=1N}j_-X$Cv`XM(!fdp#XfC340gLi2Sq!V-zJYfgE z&${y?_;?A>ln;2)4s_TDXhs*5oj?b!fx0=r4SyRR2B#A62r0Cw015`sZ8)HTlMjX` zAlVMG-WJ?ifF!cVpfmmqe;ai=9iAA`>E`|P6l+3>UrsG4~Q znr+1uFjScZ?BRsZ0)bjl$K85+EEgLGu14Bp5ZwHW1raXY;5jW&Gx8>QItLOwpeA$Y zNAN*8pyjrpiwfU?rglLmV=Ddz`34;Eh93=YLeIlF3Cb)rDgod@L{QLx58{C&RL~47 zXd?$`g7hQk@U?p`ov%S@1ayzVY4BR~mms@t(llraIiNuUUT5vnyGJvJ`+XkTiaL+( z9F+h>=yZZZ2OQ-eK`90@;RlLF(2Ov6B;lNk;yaJd_b#1ZL1#HA-ZeZ6x1q~D4G<hP9Xu||c;2J)Zton6fDhKY4jvU{&QVDLZE`#T z_U%W|=)}QelD#c@Gqir!f%XTuFmC}bZUa?lisxKAZ@7ZSGr5wsWY;6X{Z-Zh*Ze9ldv zt#K~QkZtpw*AjABzcVV6b-fIe3_XIu-?W5sOuzhv9LvTCEwezPdXmjyxSnH{~bIg>C)T6wlA*R`rsi^<|*LY%fYi>uAToJLCb4Cx+sFq>B{0&S254T6CV$On&!yfg%jgoAcLfFc!=iax?)WQ*c_ z7byow8pu(p0I!ul20je^1K2sB5!Yo|2g5+=b`AJ28IXexxOSd)1g$Z@uLxRx4Vq7U z4m#}bhasfn0$OhdvJt!z?*eGF5#+Nq8cC}z`@v!#RB?fV33O|$;!V)PLU5woW6xG@ zZw8987?m9GEbIx_&PT3_pFndDpo88(!3b*DD;_We9q{=AoJ&9py+G%OAcAp@MA7|! z(x67B3$u$#4JgAs=zOPm4IYXujJ8a(ogh&LI`|yqmItn#za2q~>_NK;T@1m4qTnb4 z9Z-rIW#>T+X-F9LP7zSKe!(1;_Cd2ypg;o0+Bdj;J)9mwTo+*Z8#HMFa?=l3tX)$C zoeKdfT|k{t(3bb_7eJZfB&ZBM4w{<<4O2nmWR1b)SNyjjDIi6qzy;*?1K?OY22PMp zy<5~~ANc4Ai8atvILJX5v8D)`$5w6s0XXanE3sCdG$^P4LueScJhL>qY00TyeHoxfZaUpaPu zcLn7$P`lIx>^GO*DH1m-uc$&It_8fp6O^PsbiP)+3~HBvbHE z2glAIj-a+1XmZXFQZ$413V@Cl2jztekf;T78SBBw@aTM|X?L z0|o|$*Ss(mxM|?R7{TGfSi$4M=po?3m?7fAm>}W8SRlg~p}?4-;?a2I1v>*nv}258 ztYe&GeC%P5&PV$VK6o(flV)IG@aXnY@p#eN&%l5p?9=)3ML|CUL#Si8W0+&8V@R+^ z;~Nhq1_s~Ga~_?iJv+a8cK-3`b^LF5(xdeT|CED<-#l7x^ZSFgEAxjR;Ma6fNdVQX z37}43hR0qn1_lNukae9oDgqwISyT)fJQzUB?l{yyqQ_lSBod$^3W6Y!&Jq<1kIotu z1OAps4v^!Hc_?1<==|>S{k})9j<5&gUytwiJoueod3Kiycrd>6><;Ddu)N0K54xzt zx4V|XvpZD4hw&H0T`uQZPGWJ^&KS6}po{!4oz(zymMEID4zV*Zcqm@*=sf80{iX-w zWe>*F9^Y?x@H^k~Xno7y32MZGhw(iuuk!bU4m1O~%J32>m|RX#-#NzY3=BSsKOoNW zVf+nojwiqKeUH|+6+#}Zw@Y|EI`12P^XPo_;;G8d|DK((5+0o|d^CS}Fy8R&bQLf> z;L-ZlgWvP0N2iPmXxxLtv(rU|!?ROH#qpSniU5O8=L3(%BcN1(l$v}yk9&5zDtLDL zYIt-)dKw;`kkj5hS`UPBI6OM1fO{e!b)fRsvl}WLz~Rx!0gfL?0_WFk zQTYH0?&B>g44?z;Ky2uqY>#f3B`zuk9-Tfa79Oo{OA1tSB4CCFpPTU2&1GB8|#iXUKPV31*8V1T+YF-cxst-X90hPbtQ0)X|^G+X?3{c3&gF-$7 zl=Tfj;qCxd0S@;yVCRCu-(n{yJ{@;(FfcHHqXHHQp-6Gyz^~z=VgR$SqXm3Y%WDCc zz%hsbCz%S^ck^#~P4#Msp z@PSJp%Rz>M@>B&Vp(cP>1|U`jh-CrN08!!J{)oMF7O|0I?)II$2ae8HS_FMMcA-n@0sC z#Q};m0guitDxf3+;z)ov79jt1_Nai;4=CGefcV`$pybh`0!l<3Eh-)$u}*IVkn16u zdsHC$yd^w3odrPRVEx@aDq#Jc-W(pC%pN;}85kItL20+MMWq8|$nh4H8PIeKihv17 z>A3+ZomW89KPb78mH`>kP^03&P^tn-H6SiSi6kh;L*wK)0r&*4mWLQ4v*FYbv_>5%pR==V0i>oe;a^OgoQ_Ei3*2Dr;Q4K%XN^S zLE(MyAq%K{gM|MU@M#eqoh2L`9-Sf_9{-&=JiFaAJiGl2K)EFX6bzj`DhZ4X44&O? z79g<VrXP2CTaEK#3bDEd{OK45F4V!v5R_U#MFONW_5qc~EGjS6e*XXO(fP=y^W%$_ zHU*0de&cU3VFH!s|2(?cJ-YoRJS;!*w+MlS zE_qmfDChNLcH{7{JjUO|!^FU_fyuME&Vqrzg^>wfAcG>ox7*Fa^Z4=q|Ns9typ*QL zFArKY0I|>W|8ZZ-=5hy-xuaoj~E!T_2$Js{PEi;4rN4)N@EQ}FEe(|{KWzO5%qJUqHt zR6s?!Jt*2CH8ObNvx|xXxTFD><}oTBpoA!~3sf^h>QGRBgTXN<7*>dT?5IR?PzA_A z86aChi~@)|TEIKwAdZ6^r44eiZ?~TXNRb3Yk&B7|NSkl#fBue>3=9mumgo6(2;INtOrsdqGVtAI%@02cNU}GS?aSbnXGy7@$-Ja+qg#nT1E^DUXAXSUj1-3_LW? zfl4%RChvq~a-U8cNP`DdP8xtxyM>442M>O~51{tiHxGXQYaXqa>eM{CZB#&+hXYjF zN`S%$T!>phxCbAxyf`EM^S|eRKa1D=9-0R|JN*PakGn~Lg3j=ON8=GtDvAa*!ViP; zmH@~AiCv(O+6js~-_9Q|d|DV75Gf*U0!sV)1tX~aea5%*xJTz{$Ife>onJjV|N3;# zQ856uA)4(#tqDd3h8+yAoWKnRP(cV|gX{)51eBRTAqW!()$w5QogjDefYVS9IBr1k zPyh;k5TgPTA&{7w0L_S?%nyn+Xo(R3QkVcX?0Aa`sC0u_0;&c;;-FFv)Bpe#LjoYx zkYsh7MFpbLMFrF_U;rh-a8T%QfD{^l6hf-J<~JNZy&))MMdE?7sy0`W1s}x<)WehDmK9l3y`ZoSnZ1FpN! z{Q&d1XLGFu1ApHqP_pf0hfq{jAfx*@A+e=VC&-4E=kLJSyzSgA{{Jkf^ zg`O*@(39}!4w2vhWk(K=P97DXZXOAr&LsqrWdOLOYXO&!@}PEiH@j!IKRB}rfEqp$ zpfau(lz|06DXbZk!X%)MMNMSj^o3Er1$*?a0XqTQSOvvv04Nlik0`t}`Tzev*d%Bx z;yAR83M#X#QziIY{)5`&nxGWrqJrAW?5$BLK#7Tt58#*pH3&h;vjCKwS`P5HHi7bH z_Y@TcCh&|~>m?6W%vV8yzc)`b(aoX?7U^wR@E_Fv za8aoMWloTJ7qT3{PB`0I>`}gae2O09gzw9Y8cF=YnWZ zZU@nj5((0U0r5d49LPeDdWaiaz`YcZB_MH-evnH+;Q*TB2Z@2qf;kS1f?MZP+hyyOpKn8(08X#pLTR|Lfa}8{5r;CaNs6++1 z6YO~n7ZtEaK_LuEyAB}VfP-Cw1zar)KvH^lh>8LzYisap_<*{RkOmVdgMh*q6wRRU z1zA=ADita~j!$@@B>wZiM{kTuf=B257p3cd{s+;v*+2gyYVN~n6FeH$%+4ep{Q zfXvGPsQ?9Mz>a`=P$vnJ7GP{pQUJ9XK`M~S+v6=N9E=R0WC>3EAO=XsF&7mFMv$qX zJ|%dp&;TS1D!JJ`nkzgQN?Acl7(ht@oD~8<#aI9+<|9Bo+X7H(fONNgx_wkKd^%ZF zJUb7(I4Sk#zenQ{P&6K%0Bhfal95O2fBqJbOFTQjd365vur3$i?*qBnv-7-X=OvF` zZwZg?UlyEGX?$P{+-)^SnprWzWukpjLDO zD0yT+gT}z4o71=3ox@{CFCzm3sL=!R3&;Xc2?I*|4?w9AG#0?XzyKK*h7|ZsZy{+3 zl%_!qWl;J-twTF~KouUSz|aK6!EqNA@VE}RUEf=y;^5N@DFnb(x<}`|7cTh>3|*k| zL<7`B)O1lP=zw%cKxP|wcDr%x1+_RmG>>{%zV_gEdhOZk!zQo~6!IRL$3Phclu$rr z33vnuw8tOh8&GQT=v)IHv;^gP0Z=GNfHJ&-M`w~!OJDFtp+8>0ATO&!BJz<#&*;_JW9AAYvydi~4ka_vw5G z>XEF<2Mte_s2G6qlm%G)AxL~uJ_AGZV|$QU;4I) z5EM3$lB!1qR8sjsrU6`3BtYsxjsh2w8XnC*>pl4W&w>KzqzAu0sJ&80D1ajPK!e$F z9G=~5p1m$C4xXKC9*svpi4kd-nqMAd6Y_jU^P39rOvXP@B2|DyRJS`v=fUQO_O6Cc zntz%*@=rhF`2R>ZKjXoJ51BiCR76}lpB{Y5=F?j*;L%&dF5n0bwVfc7Jv0x3GHwPa zlncPo)%nUp^AM<^CFs%mzl6u5^->AD;kOrAypZU0Jm$hC(9nGJk7qB7zNh9}P#{Er z!X*JjaDe*d-61L>ofi(ikZ|l^(Fb+SJ1-u5DbV4;2x4~>FoCH6W}nU)6%SAu5CC$B zOXovyG=gL5pJ(Td7cX)_G3cTq0ZJSSj^Elq`G~P3#PCwu1dy#3AU8WWcF&mx%7h>e z*!IqQ2j59JbQpMao2Yc&Klon2p`(rw#ObJG0#k9!9{&${G#~uq(R_fV`4@Z5rq^-k z;~60HH9$rhP;5R&%_fiLBNZrdiX5MfZ$ME#M9QBdSp>@;P-LQ)KcKpi-sR6vE=Yof zlt1;*@(0vX_U%O~f7r<{e?Y$43nF%b2(&XzUp@b#c$* z;5!RwiR96F-{atW16Y{^;c7TQ%O(g{!J(s$8B|n3xDpN>bu0)js61l@aXaeRz*HPN zq&)lK(R_fT`4=01Pu~Ck|G|4S3@<_J4^UEplxG9(J`RZc(8@&Q-mMGT{5@!#z_ar| zsM`Q3>7h+Z#_$MG7Yy7h>V`CwKt;9!$g>h2-R=RPNrApN7Em?fqoS}M(lR>kVfoX8 z-|r`=+1v+i&vv`0NO<=83m9I4w+}tL%L6>lfx)qx-?2NK#kJd=!?nAd2ULb} z7=A+pVzsuA=DB;|i#tQ}L;21Nmmlm0jeB}%p7;2E z^YW|a{|b)$&KEfkfmSkuu2=!DXu8RH(1r0O*o<%P4Baj*4!tcL&$<@{fQ|YAG3xl` z=ldW=odX&5qWK@lsDqq8JpLc{X#OqG`O>xXDSuDc|NsBf_~l&~7+gE=!rc2E;$D}| z4~9P!FBtw{d;vE3lRHDVPme?I6vmmAO;KPWgu9U~dj+u!>~7G4GR_MwhA&(gAAq%h zoD4Fhg;C|AZwy!n>f~dWpY4S>`7FfAe<4o(0CBQH=U>;(H~c-ppaC^(;p@`*;rj*7 z3x+Qke}IiexOd^}n|WX%gnMy?^9}H&M;AaO)Y}LLf3_>g1sel(Fo7^O=zI?j;~-EN zPjKnH4+&paczU=1TF3<2zw!ZU6~e`L_DJ`GtwOjMdkDj}4Il+Cvr7*oRY9FeAY2_> zI^Q~W{^9S5`v3pGE8`7UW_K1x#(%EN4p6&Mz@zzqgGckh1EAaqo*3=yfzGnHfXZjk7((+;d;b1afBygXJnjzee}Q^7 z8lXI-05U?tgYl<_<_}Q61Tw$_9c}LP0d;yoOAkN=2uP&@NDa7W2+Q`JpsWsB?149% zgSvsPh9?a#c{KlY;P1&}MxIOor+-jeUjuul2g{G3 zgKR$J-~rC~3;+E8kDS*pdT3q% z)u4(SJVzkz0IYd|9wE}%t(E-K(L6%LT& z1VF}m_;h}Hq4e*^f8WmX0FTBapmq^bw-QnNqs_m9h73WCCrHTzUGu;go&ah*fktZK zGZCFWput&?SG(OKJX#NcMg}VQ`<}BxT2LB@v89(D{C+P%>jnEXz@xe#J-z-Si1uc8 zc?4Sf=~c}u50J5pFFZQkBOvXkWRS_7kjW{JUUv~tAq^gjf-ax~hf*hGG|dA#Hw6;| zH~Wr5CNe-`&=M9rq>9v<0tFm+%2ooT$nXGYM(Pd=Y60uO(9PeS&(dAa;nE$>o&a1HarEm~(nS6NOhD{z95UuP;AFuI=A8|5pI7P2hKa z$$8g>@vY;*LtHMM55HgJJP0~=m+_!Sx6Rc9|J@n7YxWrQ&f$kPt*$ySd4OAK_feZx zubclVxOCow8hMlRw+rL%g9o^v9&rIRw0`jS*n%1XNDDd`Tst2i`R6pmKb<)$Je@BU z!Mk@{6wh&O_dyNRMo1CA!OH_DV7!Sier~qy^9_R1TLGfVP z1lP`|Nd7yI)u{Aj9VHL0fD1ytN-RG|umQALgysaBmra7KeAf;O{X7w>H7;W1R5?zSjO6Xzl+s zMEL#!x0XRM25rkB`)W6&oqHP8&VAebTY=yCJ#u_09(3va1~Ts%$UI02K*ZO}vfL_A z6vEOYmiR*V7$UwLTtV&7quAmLOa20-NAO7}GCCI<FYH1?1W5IP!CuB$(Qoez!CUA9T^!xvRkK^tUpv2?R4J}%`T|g@*LCYX< z4zYuK&4@;?2B-=I4Y-1eWJtRiG8qRF2lc}77Plbhz*@66SQr>4fT|x*t%;+YoiJLy zI(B{nrRTv|zT(cWv@T!K^DDF@qEqQ=4lZ3m$rfLINP787utuau39E%tBVuj8fYKvs z`HE5>qL;7lEW48GlXi0FS>WK>807AhSCmQEr*W3hV!^~=LIT?fG-|9=3;n_@f^4v0veDl0S}#B zg$>AlM(sMhgAB-irXmqn=i$m`mcsm~!%vee#M}Fs< zoS#95gBgNv9XEUk9`iPVI2dHi7I+IE=HTzBf&2~<$R9cXK^%-a9t#_W{QwT%TaKN# zL8oG00G}%f9*#u>@Ek^16CUQ^8_zu*=JxGzr6@!uEV@!tdz$A6*iH?$$(0=z@Opxv<^osb=z{C$dS&{1G) z^XN*TmTk9-ih^gazlPzZ37*~M8CctI8Ibl{2BiJA7(D)4qf+77>#hN60TVm;3+j}C z282OvPf+U_UOXFsTW%X=JD$g}yIjDv+g-%5 zJ72=JJ6*=HJ6yrFyI#eoJ48jm@HR+2%dAe9IR=o)UjhD}*PsU70r>g>*Un##o!4DD zA31iu0UcEVn!Y~m*!j~1bREul7sLCE=RLZ4j)Dh-YrvyRM_~iPe=k2pZXUgF{tX)t z{>k~C@w?-}!(8Cg7dbD24%z|@Eb1HujZ$^ztTE_a!wYTO9fgg*y}tYyxiRn-JRbZG zIvxxjV!nFt5SPdQ10Kyk1Y9~lx^`ZGj0YRuMocJ7aP9mH^UohgP~-HzOJ|G<59p+p z&X=I$xNd@vbovJx5&Q=88S0oY+=K5fqm1B!M!Z1-a9>>*k3u~65Og*W=vpL2@QCF# zuz9c%#yzkRVYmZ zX$kN(J|!v`I%Ai{57!G8Pi0=feCz6;}VSo&jzI*r;5PjQ{vObHMH+t|xNUp}+BQB4YA9brZaN=K?XeacI`aj+IiEp^Rr{;KbOw)E}&arNh`k{`JMlAzIR~+r)@;x&G^xyTLw}J#LO}1 zUBgX8+3m>h{1!AX2r5w^xkLbTFKOpB{vHod6?EIB^Q3F%PuI?~j-405_0J#2&hwxf zs37I_XU9(P#j8l=^)Ybz24xh`j2nCokBE%&7nHie$DW;Z={yH3RL~0n=nNjtLZI76 zg{S$q0;0@DE3bdR%WK!p5770DuAS$=aRMo?Pjy1e>qCy6FA(K5sAEr!^7f{nLFoXJ8Xds(>o3gu^^|MpO~=m9oi!>vj-BTm zJFkKh=Ns^qPmlupphq`K^-5}ieI9hmFOQ4iaTmk;E{y-dsrtV=1EEqI-AkYg+89yG z?GLV<*ZF%aK(!FGEXGl8gT_P9i|w1_6x;r!72DmQz2(r6X~(^wsXzYyo4+9IT3`h? z5#!UKy<4!BIJWU=aQO}0lm}{cgN8Xt7@yVwjZcHk=!VTDf)=`TgKoM9uaoI?Q2~!n z+ua8DaWb$CO@sF6GB7xXfp)-xdJEt!TT`G*`XI+5fGP*@4kiwdZubiCAoOj}w(4FV zHj7Nd+$pj|zNx54|6{cm}+-iEBz z0atk7-AUlha}tmc=>%=&>b&)$?A8y^7N`pFK~-)QpgvEju4gakSO@45W~B8iV3+xH zet+@7=ih(N<8Gj%F&IGRfwzZpcrf1d(7XY1O$Df<1P(^X5_8bTx9%7f0gvY24mIu` z&5sX&hWt4|JA*PjI%7b)w7+|F-g+^^=O1{X6S{feebeBheZVse9H4`m1wcNm^y~$l zc>-F81lpMf4!KSj6%Ej`WCJj-8?>egyt5J!RLwu_;qw!q06XBp?|%bioEm7#0e^tG z-u&_3voo&3qwxqRZlfLJ4nx-eLgE{;Q3ky6DFfua1n4Am0c@`+hz3tiYeIIX!nRz4 z(!ntom4XJ3?sx+a#={=XKg>%F9ly1Kf{~HGWhDax!!Z}o;cmU)1)I=Af{wSSfY^8&bcd*TfMVO|@BjaBhqQvy=`j`+Mvu-1pjZYsvY^Y!LEGD2 z-h?<*p%G*kc>Dph%M{cT1|4n$Rsy<&cPBV@kX!_s!T}|D(DoNl8p7wI1)u?uUKf=@ zkPE=u1&>2^VS~L1PTR*_R6IaD&qg-`575^4?h?@MQK*;V|NQ?C3mdrCT2%l4{|`Qn z4dit2VtG&$gPac9b^&raB$PmAgLt0JZU#R z~J<{unIFF{rnfV=^olsgVtxC`Dz4EF|z2eJyBX%JS;{tZ1C0dx{Z z=N9lzbC6p>`-(wYd^$^1z~_cUfOs%pmMDQTYyikctCW_{PAv!{G5@NPYkXAc69)9h`(flaJ4! zMPLSan;mG6UuO?wZvrigz~ZZ*BCrkY3ea(V5SA?{-<2A8_LgOU_M(DDaX^6!%DNyK zunR$%eTM%~f;vwjCylHczjsRg3R6;OdV4;*|*W#R-#{DTf31IIsTpLS=73Zy)Q zWL8j72+Hjs8gzyZhz6ArAR1JtfoRYnRUjI47!`;Hoz-=$MFn(@8G}bRIO!aNmCuCtT z$P!S43hZBa(F5XnHo7HrfQmJg5>yuCv14uEKyrk6utgrD1O+e90-dA?3QbU0!p#PG z$Ftcj0j&f*0$Q{HDnUW53&R75^}3z+JTAWjZ$EJU;Lx!}1iXa}yiN9pNAoX%qI;mj z8Nh;_kR`VuFM%3RpwoXqnE-q$p$CWuvKE}<5E12zR+@sd1GFItDnBtwQ&7w>mVoEc z!AArZfZ7}tpiT53Mg*7vFGnGR&xmrAU!K9E+vcMO|9Ov2n@`Xp^sPtZ5m0^sw<+M~ zCxB8bbZ8u0V0UhTwj@J9n?p=gJi6OK334~s!J3CXEN}7mfg;kkw>-hK*M&U+lw`pv zt#c0K6c^C>gq^U(5U{h)Kr@k@F`&iOp#3JDF)9+Eo#MAW`28<~c3OjXiX-;Uqc7Qb zp?3kaUIX0L;!%M$1fhprfzBd?#ysT6q0SP}K|L-i6(Bc5OVa;7o!?$?h%qpD9tZme zQka7L*!T<7gsJiM=)B<3{Gh?3H=@DA@`4Ay>kZJ}LU1Ds)P~IP0qwuL_2P&qXc7R; zC7_V+bWw=_op=OF3LKu0Q1k5dVNU?N09@PnKu&h_0JT39Ky7pl&_;03uoBWyM;^FZ z+PH%U)VAe0|Kq zqS?Iw6vqZ&i)kLm8fQUq9AAJI!JuT0x?TyAlc#{s(}FiII$?c7NMF&VTivBQp2ej* zpTniQo~Juspc}OPz(wUlw>x;D)Qj$T8BijX0ObJzkLF(v{5|DDp!39HRDOW6#Dg8H zZ#K&tyK8_B8{Q##_Cd6Vx*Q@O4$zYxBXm}iShDQL10B>IaZ)5y8JH3%K@fZ(WzZ+tKiwd zGQHDBWdg(o$!;GNn@%5<1CER*T^S#`be=Z+eekeEZ;v&|tWF=5DG>8O>U27NRF*KF za$)@B*m=p-@R#GkLlVxtJysxpcKWFFI2xXFJa`PGQl-;J<%}caX-CG_E}b_)0d&Lg zpULE+~D3P4Fv_1syaGQ*Mavn%6g7sJ~J4-0gcs7zqI*I5E`A0*^TR6wca z1mh`&1OH__HGJbGneBf$$$noGI0awQBu7-cWAyJ|d z(OIIh!jbW#BjZaK&>8t4GkO@08Gh~j4hiIt&JvXc$oeJV`a#Z&=`2xMgQQ=A@pxyA zN)OBzpsIEb+<_9^B`PQm1exIC$oRSQduNHt6_{5+$|f-0gCr117v>m{3tvN$nj_HOb1#F?Sa~i6hojywF2f`?D2B|=1l=eLWKI^lOrT2b(g4sVg`|d!M<4l3u=&~ zC!pk}IXGhH2uusa)e|5Y5F9%zU|LXP=L{ltFkAsnT329Bmw-4OEVu#YU5L|=i%I4X zl^xJ9LW`X(@UTXUoi(tq2APH&I~U+OKzRr$c4okIK>P{MKPR9zqs7i1m~*km4%~}K zv9kjnE?`HYq+D?9z%v3!9yNAOz=9er?`**xJMip=8aoHzt^m0lHI0BH;sUnVfhR_Y z)6imP4m6C=VrLILtkGfzURHrjLynypa2;r|vj9iz9D&-57CZ0)8RSQltPb|#2ACI- zVrLILT)>XPjGYUxpa#jK#?A~Ju`>sz1(K$a^Ue~O7Sz}|0e1z+?q9GSpf@bkUVPaY=H$eTHb*dh7eaH#|}KZfno>L7@2}-CafV8MLXb8 z1Zs{jo(DH{!0GM+%;OM8qQw)e9so&BVLayuYQe!83s>MlkJR`BH5TB-7DyLzWNm=! zKx*!Rbj*Q8FT~sM$bwaX5{&0NYe4N!P)h~WRyg3uNT98-0On&*5(5Pnv~h>OsQ|B8 zFq;bS+#vvJ5l%sEFPwozwFInr0j`a%z@ixxXNc%pfru`YR0EC>cq0dt5^pe`12u5K z5j<-ozClCW5UN3Ub&J5c`xR1P{oV3lKXc!I8uq zqOt0vwy44~~YPj9pY-xEQ`Lj!}8wV)z&| zWFP>V+m`TXKIY)jeEa}t&AdCI`PijX zzB8P~rPH0mrPH6M(_g@)GhC$8U7|By#-s5FXe112V;^Ef3g!G;5AaOI6zHWnTfjFU zfV=>nTJD?zzBk9GTiyqB2yS=0fJb+}gim+5f={=BN7=5s(a=uB4-4Vp&*(V)lz(V&S)&?uP$cuS%SXw2K>f=B0;D_{xG zw8$@kn%6#^pFpE26+WGFz)KqadsU1<3+lm&I$cygcrqUGHGJfG@Q{MX4vv$1K7)pn ze0xopK)O0S4X=3~Jf;CUq#k4~DDVz|?6mOfW#RB-yx?Pa(Bt4i1&xUoa~ z$CQ7dK{cOV877}j$P|Ka=S@$;pPmN~YIt;S0UvV$A0;bC~#&p*43BzTJPJ|_$#gC%CqN<3_yrR9V8tCij2Ao&k9l++_q=!v zq!g3{K)P3WG9K|{eB)#I4CE(I#?L;6cOjt*SuFrk^T3nwfG^_-U&BM-xa@XOnc>5D z0VFfS)9@f9>Y}m%*-v0YQTzmoB*^LMo{UF8<|@Dg$p9Ki7mxZdr>JoF!opbrlvp}^AU1Y@ zY&>{O!-v^Lbc!YpGiIOF4RN%T$W03={$pD&#Avy8{+y$^i4lT?HPrL z3rlt2(jDZZ9F-Mttp*;DDq;dG)w!rVfIAE9BP_9b0q!FMpU(T>u=?u(NzaJj06PjL zIG_dX4R~-W_;kmpOz>np4Xw>U?nY!W1#mqBuJS?NeE^Rgu*qmS^93SKq1rAU1nENL zXDm5W0`3w6kRv){R3?C20`bWQM8txe+2IRn7uQJf+#P+K17Sq6>x1}#~R-DfW+kw+;PdG0(Xc3S_%V& zP70_60&P=(Zz);;@{1uXDi6Q|K*5*svQKA>N{6rEJxKa;QMmvQJD6infLb`<%BDu; z13WrlvDo<=)B*uT$qM9%tWiP9n>8vM;5tz==MK0oaOUg;X*B!|4g(jJ2XMz==tbK5mCH>mB1=XXiRdz;{&aTeF2XU za29|xt3f#!Q7EIvAR+^UV-OyB0=OeDMdb!^?766*xF1ryet>%%9EF`RDhoiF80>uH zstH=gdKw-CHLsy@r~r=)u-`jSt4c&M2`i~C!*f6ls9cA(pTUU^+!p|)?+x(i2l*eA zZzh0rfn4hX%Hz-$x&d;feeocujFIqVyaV?QIF35vf!K_0Pbu z*y*AIuBpIbfmH1&cy|6qZNegQ7o@}j7X-h-H7%$aSfg?Ro(w>qf^?8To>hRS0&w{X z4Fu4|)=0e|aG&8kxQP!cB|!-@1(eYdU7s3I%z}FrpkPW-xd9IbY>_H}$eiE~(?QS9 z!;sRYMg>t!qUFj1@Mr-?HCnDj6v|j~8Bq#YwC*#cltr}Vuw+j}zYOATv^)xG86Y}$ zU?u3e)R*x-JeFV;Cpb`YKvgxYlL>O|3~+J+HyuFP{Q`3L6y!NjdjsU;98gw*YJ@bs zA?*g_{w_EQQJeyaWJCi1tO6sFQ$ST9G>wDn0JLV10#Yn@-hhS%Y%Bs)Q|v&Lz92t! zpf-mP4I5ZkfyPE4?GI4z5LWm?b%6$AYCyT}FG_9&btjM-w;XUcf&GM1uYh1d89Z4btO4G8UKRfLIGYCfx6)r z4|*6L_B?n9oajM?705zFKLJ)7A>!5rRJ?;KI*`H_9v2UL8vgTPMv66X;oONl(cZKec`_I86BC-5#S#AP6d zgLB6*Ps0N~#x*JhAaDD0-T?XB@TjNZaUbIxl?<@Qz&&Qrz$R#1^|0r~W1u11i${Ho zLsTk!4L^ApL&l9g3}1Q}hp1@y7@qPlE>SV?FuVr}WCxG#92F0b<`)ef%|{zR>*FEk zkFSAlhXe181grR4@7wtpJUigi`P--StuN?m=#!w~Yz@!|G&oBn@b@#k`2YX4xJTzP z(2%xNU^?pj#rr_a1h*s0h5~0h`340^Ud0<)R`0yZn{#-{rnFK8V&IIfyZ4`6c&8;VAu~Lz{k$KFk%5+$NT+7 z7U$3Z`?(kx7+wUh{QS?)jhKr9-B*t?A0@#Ax+LecN9SKqTCf181*pG3J5WFqH011T z0_g*7Z358?7#SEq^adz>07_qg(hs2Y2PnYCs?u}f4eJi9qOyB#<@ zc4dJSfXC~n!1oG*WW=1dEkZo-~azXmqe!V=R=OQgcuFI z^%#6WQi4b49Ps-1*4zAj-k|UXt@;LKR?sXPC?$h0hp+JHZH3Kd6&M}>T@eXNA)x#B zAom&_e8A?Bd;v6{0@lZP0hBQ+JTxzYjQRi$j~@6uMgl1HWq|e^F@U5&lX0L;Rgf78 z*e=;_1O9WJTc&^_8ob&ac1@oEf6wv%|Nrj*<-xQG-96wNPdiT?JjCC5?%*-rgD<%Z zFB*RAp3(ve-R>%0F4_6@;8DJV@0bn$8NOql(((ngRq7Pur_L!Y5IYVu z|8S^T4{~>bPj{gND067|bbAVbma!{%bTj&NJ3{uSfXWDo?i>}J?hq9f(BwU6RlN-O zaO4T#gOIK|cAj+Uym|1TluPHmgU3W&I&U33#BTV>@D$@Km(H(_pxc&yyMnF>c;TXW z!=>{c=-ixdhR2vi_ByP0XJGuqJY^5aO)j0+4jz+p>AZOGps-8lg@XsU3{Mz-03GvT z_|rx4BItku#eat992qY%USRy-@&9=9e+QS&gRY%FTtTOCzH{lk#ov?l|NsBa92FfG z(CM?F!0B=OKL$m7`eo@+s zCD3dL-aZVT5(e*ZgIy)m+X_k>po{~_k!!&F&7kL@bly1lfE}6>!CFB%u?Mof7m^uK zcYs5z2jxCc#2a1$84H;~>`{SOY(Rs?_;2~X)&T}3Ik1=~3e97ivc+tb~qeu4?@ZtoI?kz{a z0p9uD!8x9`b5gMRbaSNaB2nEnsk%3RQhXg2BYxs0$2!N)y6+F5P ze7X}jd^%G=S2>la2!L}lzdVC)=Pl39d!Xjg!2?Dc3wAT^4V6!Gl@mufqm+2GFKi<~e`B?(Y2HaqxhO zN9QMxgNNii4jz;AFudkrc+98sg^%F_55*Tgov(ZpA9)xa^6fnB$#~m?@tz0cHE{k8 z@a=r**?HEp^9{(R&dZSdu)rRMc&#%8baV!27k(#rtw|2ZLp~}Bph8OnlEp#QHY|gK z^7j#N{yqwd?lk@@;QS5dcr+hiYKG)*NW}g>Y&{3OEt0=y3M7AnaxhB%_Go^i;n{i8 zv-5&S=SPpuU!V-F02&66@a%R}@Mt~YxC?X-yAQwX1yI%z5Cl~X$6Zu76hN&75U~#= z9I&lDRya!#mX9ThjMC=0zy_oX*2l&GDGYk-g2H@+gkGrU7IDiy_ zha?n%+VC3mrp(JsRJDBHFj}oNwom&J&*d|3d%+ z$O{D^FJ$<(9w=ouy!}#|k%7UdyGI4I2iv#xq)+E#{uXwSSm!ez#eaq;JsST_0R?Jy zdJ7dinso}yzB&7*L+aHqq`8? z{&w)_E(G5%Y~j&e3BKOjz@xhme6Wg!N4KO$w=NpY&)w$=~r6baaF@IF&xGkekVM7SvoxqK4A6e z-2sZt7tY`m+5*mAbzsM|fD2O=up?bmBp`w=DheQx{UF{x5bK2(*kRvFZ9(o40NDv* z5O$c*w;%s~EFYH|y*$Fez~HO+&+vdJB&m7w`yKP>WobZm-V(;2Al3XW)4}e6?55|3 zvOyJ1GuX{8DiSb;0!Vg0h_?^Kda>y1kN+O6w@D7btgk=*zgF>4{B3x^qwzO1_zt7H zkA)GI9e;g?WJk#PKpvLgOSn9`**&b;_@^8=yn*pBYJbCHhpMtt%ab{uPJ1wZ;NK?h zVR*=6=Vnj?8r1XSUw@H*n>(Y2;RO%=^#}R4g)@QVA)?F(Q5J+KD?*eFA<7OFJv`wv zzuYg!aGze=%kM#l7kPGGa}4$D{OTCu*!d^aqgVIHdj^JJAI-lW&2Knfte^PfzsJG9 z%q8-Mx1r?=xYU2=()rx+zsP-$=EIC0mUl~Ec{Cs4h>mrPag240bBsTnhVUcEzQYU* z3?Le0CP*cS56U*9nEHSb)Imft7Tj-UU|@jJ;7SXL52}1X%3<=L#wUmmN`W96#s_6F z5FaKEW*@kYWME(r1_?4SFo22<5EEt|j4uun1oez?(4aaHBn49s zDrZ4_n7tw(4wC_3iNo9tx?K(=2BTs2!Q2lMhuII)2eTih z4o1VoL1uz5OdLjo#6TDpUNCWVdtu=LQVYT`^&mC~qw9moqniVBFH9U34lwg!@}R~M z$XpnPnFl%u2_y!y55@0O;REwG%zT)77~cS-7zxA7hsnd#!^{O89|BSib2m&L zCJxgFQx7vAbW8zAA1oaNf;bEe3_(yDd~Fp20|WRNe+C8y@EN2G3=A;;!|a3k2gZlx z7nr>;K1`k$YCcR}2+D`K8y4O$cf!PBd{{id`~wSDO{h7r@Pdhh?v;j0fhm|fVCKNw z2U8Do4@@1553>(OgAGH<&oJ{~G)x{AJ}??)E;=8UpK;MJeK2{LepaYOu<(TOVd_B# zw1AYr+zsQyWX!1Sn%=qk?E8OrcFiaYF%tOj@X}$>-GiVz z`ap*m-OK}0Sk_G3I3x@MGXZ+IR=*;nZ!@$VI%)-jX z&cVsW&BM#bFMtM0Q;Q2ybMuRH^HcH?i}F(vi&FDa(<^g|Q%fq7Qc_C<1cih}M8(7< zB&DQfWaZ?=EU&3N3k+J_AIxJqpCj?cPwCX7LGH$@`y*{vpH12v{<5y>jjVIRAujdx zXa3G#$DOBVI!iUJ-vPX6DCfYJZ0*%=`&`|nmuRk zy!j4}PR=f_ZtfnQUfw>we*SxN#pl{JU$LHA7CvS2ftQwwKhu1sC)chl>k#@TdaPU6 z-hPet;Y^SIvP~AIsh9u%)bE+Sgm>#r*NxJdJDU#fo)@kq&Y-IO>&(7O6Lb_Ub9NWY z)Jt=FEpy@iyh7jaR-NU#lw$=wA&10HPus31B)lc)-LmDXGIB)|a|I8bR`j(|Rkak7 z?Njzk)lHROa^n1thQdpS_-9Y*f27Wvza#moxW$3{2Ww{Bc~R}V{Da^dkCR0n#(K-e ze5WmO&);#>aG^w2-%RWI9vMQ#ho%MWGWt_?ZcE?0$0EzmbnP?}bM<(twr+xwb4Fm* z`B!_hHy3LkczJ7Pvv%Ss#%=e)RJ`VOT>ZJZviO_Q5?hgFk+bDfeYQlEeExsDzC>iam{1n)?~f5bX(n7Yctz@OX7M~rVBOw`ki@eQc?GkwQmD8^Em#k ze6)4B*}J4`m!*15Qu-2ZSGTR-6a2pJ(4@P2>vhY!duA}Nd#u4J9r0_k%9CH$N~eUj zHgtO!Uf*N?<=%%r@2a^^%Pyt1ojc|&^^iN#pYu^x-2}bU7ZTVe8WVj#AGYidP7VqS`Zv5{_4Wl5?+ z_APL~pP%6$4jPnKLHQJve?c90P*(|52gxunFsLvvFz7NcFn|tN1i6Ecfq_Aqfq?;3 z*MRDGP`;LAU|`T@U|_IgU|;~%73vHO47Lmm44`(94g&*&7y|vX-WZ&I@nv>f#*BlV%blgq4YN>ty~UK7Y3!<=tS>@+Owq&V!vuVgkA`x zuR`hn4G?kpCJ1fc454eF^bsii14`?(K;+w?^mQoxu@xfT*$$zXc0g#RP6!}z5ICrO4?ED$=D6+#QJLFmI!x{Mvd z*W`fEcj!dhb3*KEmxIuv@~HGg9OCHeaPeoO>0gS*hw1Zzin}R5>~6Mt?-(qsx=Z=TC&#^BHRI zJt$4c9AeeM%u$5e1LMPJn7uGQI*o3RF`7B9Q2v=>h(CnNhBj@0=6>rE?EXO)hxxy! z1)^SxO0+SWIT6jonNO@bm^&Sz_GA)iK1?6FdUXH$L(LWHgt*&hGI?}l2YLEn_PwQ0 zKg=9*>8()vGiF2l@n|`OR$U39&o6<{Fg}cyfy%@9Eps92rY?feM^`}TInH;5}L2{ zptLQN&V|zYp^$VP1hp5PKN*@IS3zk)_7ReghuQ<94?xW=4THGjO9+I{hN^3T(h7bM zaYE+9=v>q=g@;;YDivkZS%&S3eP&KUP80^>!#tZn(hAf#nle{1I#J0;qeo zLFp4v`U#X~%!H&jWhfmCrS+jSjE_zWK;_S8LG*t?qwk{euc7guK>4|=A^KN9X^S-w zelC(s59I%{cg{pyKzSwElXCxiEVurI$k8MX5P3 z{d1t<1LKdzk7Ce<8V=8uYFkGEUUa5jL_l!g<`oDER(NR7Xz zP<<>LA?}5xgQ-xy$7YDQ>lO(83rdG>h48tyLFoNZx@J3sZ@mLTe}K|UcS86nyCAg6 zZV3GcN?+Ln;XmCAp*QY>(6##^boK!V9dr;vyBvbhT8AODz!3=j3Q8Y33gP!1gV0gO zA#}Ko8+bfz29$2mh49hoYXsy)p!$>}A^Oik>8dCQpEDXl`+bMdv!L`^D81(gM11>C z2rX0X4tAF&l(vG>%1|1{N2kRI$fK)A=fm`aEr$}IwFuS>3=B~W3=E)kmY^m1TNxM_ zKsy~jgVsngGBAK{`txICV8{h6`T*%G^Z=3Y^^*!{e6S<~0|RV51#Er9NAS9p|FGp^ z44}0lAhob{7L91~CLl=$1_s!A48}hY1rAXAKxtqEIo%zuZ)rD;oQx0U_Lel(|q<)iD| zg2Eeo ztr{(ym+znb;@IdLly%4aM9#t0zf>MpbMWll=vC1%wfk}Mi`(bj>Uq&Aav-~Ld zF>*;HA z{@C1u{AU*OsO0Os)Lqq5;&o@`hL~F&Kg)sw?Pla2GhA^(oq5CY`pEsCxgQ*JpSb*L zVDc%pbWKf>R<7;p7K+k(e{ywvg?TN4LyEalcXMTx>76{(*s4=BY2l0gi@ejMRupu5 zA6gukb6oPpq>CzSGq1Ip@_i{-kR>2?aET;Gj=7vqxrh4JJsV6m^T=3wt-9goe`-$j z=X|}4cTN2z`N>NwL@G|Sa4;S3`SpL_gx5I%OTI7ux$jd&;W4Fk8rMN#a5nY5GAJDM zt$p8s!eYMFjrm9H5nA{`Ay6ZKw)2y$HxT<|3CVd+(2=lc2X?{ z6c2B;jzodt;{N8Tb3yTOFL`}8C{9*vDz^c}%d>TF-9d3T031;ufK zzPK|eo{Lt0SO|*iH#>t8;eh zr`Qi2P&~e)?V{Z42WPL<-g;GWG4EZyf9=;@`Qk;Z(m${*n{i^%(b{CLb-X|KvCOa+ zly;X9HsvmqZmDHa{#t%pW3tL|hw9a*jP~q1Day5Po{bN$z?>uLvd-I_>`w2ya@0qw zF7?kG&HBhUzph!W&OaS59^vlQBk7WJ!=U1TM1q8bn%jC-MUYr(Q=+my&-Y%G%v~tI-9XmLgSUDJ37#VrzI>r*g~|e)0|e7(-(T zs=p#?BO=cCpJF@7eDY*XP;aQ_5>3r05v2ew4KA*LdjE$T|83lOGFB>c!L9`hM6TVc z&)%4weN%jOOsigNt4(@wPk)x!e z<8tn~I^AO3-QR*41D7vbzI@ZKDd%fn*4BEO|GqOdZ|c;rwe$OKxZk)@@YuUn4B!c!X?1O!NfG#)53Dqq*bf#JzBB8 z@MdA*vEK81C)iJ%xM);+LNY~C(t1)sk*B4nXZ-qEZ8x27-ZcCvd-&7)PoGxY_V9kZ z`tjqP+q51<7e+_#;hkjCA=S}gr+H$@te{!5xPA8Ns?AVS+n@5Q*XV?iQDm*x%MHIa zZ1{9OOZsK=%a`SH#ufZF{QSn-mp!{$eD&%V*+LqNlULxF>1>g*R`hqVtMzJIjZ_|5b;Z+urzn0DLy_U!}l@`(%gEnGN}y;-K0 zuebL^)yc26Uu3yd|p_)tM(dg?T2qRPcJ)KR`yJC zLrRlTQ+Uv$kesy;{J# zD*$d%L8)#A6r>Cdk}e_osLVXnae1A`-nOSIq5e*gYf-QlP9f9&m#uacP* z>KPh(J5r!>(WXUMvxj7)yE|Jk!T8M6XD3qHQ*cF8~FYvkoa zk9;>znwpekwRQ2kE9F zXL;KiuAa7f^@qlbcIV{Jotvo?+9Bv7DA>&0$ zeul7*uyA0+oLZd?Iy$VocU-%iefe_F<(TZ}yPrR|ymLA{Z)slMs;Qszj+h@gBF)Ax z!OX+Vd}obtSD0&9SX_svlnbwm%YuLN?$^GJ} z77dpLA^{>IyY4$hKV1Cq;W8b+4Pp^uV&6+Howa&lWyN;sLVo7X%uGiiT@OwbPR{EO z)-Er&TTqZ+7;^NvC!)ODzy6F3$6ZNK&$^r(CU94wE7o@R{zS->R$m`{kuS`|3%R1|2(w% zuYp$oQPAo?09yT@gjW9|(CYstwEDM!R{#Cb>VE>X`e%n$|97F)|7B?PuM4gIE1=c? zbZGU@1g-vyq1FF#X!ZXMTK#W=R{x%BA=Q5vwE8cAR{v+A)&Fj2^V^pw+)UwEABIt^PMatN-`V>VF%w`j3HD|3c8}e=@ZCzXz@U zk3p;di_q%d8e09wL#uy7X!XAWTK(^YR{wjT)xRCI`sapL|NEiUe!{Lt$E6tw!^4z2!c zq1FF6X!TzYt^W0))qgUy`qzS1|7W1pe-pI&uYy+p9?

QPAbe;-=?`$DV#1JLS! zBDDHH0j>U{!IeJ)0|T`B{|T-B^WH$J|A)}({~5IU*ML_4hoRMf3AFm(2d(~Pq1FE@ zX!Rcst^O^b)&E*(^?w9f{ojIC|Hq-#|7~dX{}NjLXF;ofW@z>A1+D)3pw)i@wEF)8 zt^VDh)xSKn`Y(f4|G%KszZtapUk9!Jy`j~AE42Ervx8Ls&!N?SD75;wf>!^H(CR-3 zTKy+MtN+E&>R$j_{jY{r{}-Uu|50f5{{~w9i$SaZDbVVFKD7FO3a$QUK&yXoX!ZXD zTKzACR{ws`>fZ@k{hL6me-3E%{|;LHCqk?LjnL}fA6osZK&$`9(CS|mTKy|QtN&DJ z^R$p{{dYsF|3GN<&kC*nd!W_7CA9iq1+D(2q1FE#X!Rclt^OB4tN#vY z^`8!{{<)yle>=4L{|K%Ai=fqiFtqw-gjWCB(CU8)wEF)Ht^P%!)xQt4`dOTWo{p&!h|F_WU zzZ6>iw?V7_Y-sg=2-5q%VF0cE-5|aH9TOqF|KDdJz5mm~klw#wE~NL*$pq>B^Uj0x z{%7YvdjJ0eA-#W|ozUw4JEZqN?GvQ;Z*ULN`_Hw9^!|S=f%N{}4?ueVrm2wLzqvM~ z_us_`>HS}dhV=e(Bp|*2mT!>We?u0e_y5%j()-_h7t;Gz+zjdc&zTA7{X54%djFc! zpw<6FNbmpZI!AEtf3Fs#_y6J@r1w8557PUecOBCE7gmP!{+0hidjASjAiaN=m5|>5 zq79JV|M`AM@4qHU3EcaS5`pyo1L`5Y|C6zh-oMB-NbmoqIHdP)lMdj+ zKzje|Um?B!yWNo9|K%D;?_ZY-()+JC2kHG!zY6L7Gxr1$UI2kHGwDMEVx zS2`iR|A;6^?_Vz&()+jPgY^E_xI=pX8@51t|L>(Cz5i`#klugHF-Y%Uhy~L7pX>?g z{oi{8>HQz;h4lU}8bNyh){`K;|M>Ng-oN2bNbi5eZAkBb=Qc?1e-AID_iv{O>HTy2 zKzjfCQy{(n$XZD6|I>L$@4s9Q()%~w4(a`Wk%jdB)e|AT|JUu1-hXEXr1x($0n+;q zc?{|O_kMx&{!?rrz5luUAiaNE2T1Rq{{p1HXK1LVEw_RzQ0H_12Ky zzrG8k_n&+M()-u?59$4%c?RkIH>p5+|5Xi;-oJ+cr1w8{HnjRb3hDj(u7>pf55z-y z{}b6Ez5f$ckluf^F|7WF^!|S~Lwf&tVbJRT4W#$~OcK)j*VqW@{U0`i^!`iAA-(^7 z&XC@}>=j7w|J4FW??1c?()+jg4e9-_O@Q?Nj~s^d{%_SmdjH2)L3;nUBO$&2mnR{; z|EyDx-am6Dr1$R?2kHIy&4u*-6Bg!xd;fndAiaOL=aAmN{47ZCzswTS`~UR{()%~# zf%N{@aYB0k-j$Hvf9pj^@4rq4TK(HWdjFwEAiaO9t&rY-qc5cQA7lvW{U^PL^!^u5 zhxGmhydb^*)tex_{|lm!-v7}jcfq~?H${-%zt{{&?|;f3Nbi6C2T1S#X#u47KZ6z0 z`xoC2>HR+mhxGmz-h}l2{SHBT|4!9Q!M%SICrIy~Llx5de`f>f{U^3TdjA_ILwf)I zPa(a36%I)6|M4P7?_X6P()(As1?l~#NNbf&A1k(HG%7*m*+vh`i{~wn@djCaB)xo|0U@=JVpHclFxc9Gp1Je6nk_74f ze|`b!{fmBt^!|N%Aie*ku8`jUR(?qDe~SjB_rL2tr1!r}2h#ihUIOX;vt5Gp{vCxN zz5nYEAie+mLP+mlZZD+wf9*J=_y4FB()-V7f%N`$bRoU}x1o^Ue`x@u_usYy()-VT z3+eqI5(E$a-!P~E5B{sUtp^YO@0j=#Jox|nY(9AK|FrNz@Zi5-ZW4I#pOc9dJowK$ zFAqHUKRf3gc<}#!APac#pJ(S@@Zdk+ceeMS!T)KW8o-192KUZ^2mf>J--8GLe=K1K z5B|F!_zNEVH%%>D0~-7{*FFm#{O@Ay0T2FPiWUVA{^v;8fCv9uzIA~I{~NL%f(QS< zT4jO<|2N-t2M_)$Ze9Z({GT)PEqL(XIc6Go@LzLU)nd@#f9yj=@ZkT|bz;!!-w{0c z|Ki;?@ZkTXyw~8t|9RKLz=Qw7$~VD-|H^;G!Gr$_Q|iHk|1K-1f(QQ>ZBS(c4gR0+ zKLsBAuLOTNH z_|N{889exZxBCEi@c(knG4SBOE|(y9@W0~RGw|U5^sB+(!G9*d-QdCh;-(1j;Qw;& zx!}S7Z^4Y2mj~pvjY$Q+d3=&5B~FCxC$QpKV?z` z9{k_#sB;oD_+MKZ2Oj)Cw?Yy;_+M}R6g>E^@3IO!_@8{@C3x^(>%S0q@c+!SMc~2z zCY31g;D1#^EO_wWLqG#O_&;^_3-I9o{iD_3!GGV?6TpN22jbyN@ZkT?<}2XA|Gcnv@ZkT$H=DtO|IZ{hfCv9IHm(E@{vS3g2M_+2lt+UH z|Mxj-f(QR)uiOU@{=Ztl3m*Ir@A3f;{#*Q(01y7JP51yF{6BKI1U&eEtL`v(@c;NK z8Svo$?MMOe;Qz~$so=r?tW$5mga6E#8Q{TxueizJ!T-Lw&%uNL2@4yc)qf6n@ZasZ z9(eFyepU*2@W0IR0eJBL*Q-6?!GALzIq=~BI?fs3!GG^c2k_v3>%~a$;D4Qr8F=vj zxm_}N@IUm(cktl9)z-z}!T&~IBkQ=aq!^3(yb%l!T(e#OYq=-rot^N;!2mhBOeFYEx ze}1tOJoqpAkrO=l@6+Q99{gYGssJ}e@7wR<)Fd;>krm~2mkX6L%@Uoa(lOf2mh}fuLBSMKWe=V9{kT}2?r1U z>*yW=5B|Rm0RYYY zgVq2*tN-_)xqr|a0MOh&Xbk{p?jN)U05taxS_1%@`vl&>8^H+&^dy z0JQpF44V4~tpNbd{e#v3fad-|YXCrV|DZJhpt*n08UWDTKWGgAXzm}h2EfbI%L}vy z05taxS_1%@`v0RYYYgVq3m=Kk5gGJgim{on0AAO@QI2dx1B&HaPc0D$KHL2Cd& zbN`?<0HC>l&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj*X^lQp_(A+<04FG8FAG8JlH1`i$ z0|1))2dx1B&HaPc0D$KHL2Cd&bN`?<0HC>l&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&; ztpNbd{e#v3fad-|YXCrV|7+Zp89{UZpfv!Xxqr|a0MOh&Xbk{p?jN)U05taxS_1%@ z`v0RYYYgVq3m=Keuz06=s9 zpfv!{>VFAn?jN)U05taxS_1%@`v$ZzD?oGqpfv!Xxqr|a0MOh& zXbk{p?jN)U05taxS_1%@`vl&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&; ztpNbd{e#v3fad-|YXCrV|DZJhpt*n08UWDTKWGgAXzm}h1^_ho4_X5Nn)?T>0RYYY zgVq3m=Keuz0ATe$Xzm}h1^_ho4_X5Nn)?T>0cbL6Y67hR0L}e_)&PL!{y}R1Ky&|~ zH2|Qwf6y8L(A+<04FG8FAG8JlH1`i$0|1))2dx1B&HaPc0KA|5{yk_70BG(Xv<3h) z_YYbF0Gj&;tpNbd{e#v3fad-|YXCrV|IC>gJ3({*pfv!Xxqr|a0MOh&Xbk{p?jN)U z05taxS_1%@`vl&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&; ztpNbd{e#v3fad-|YXCrV|DZJh(CR-5H1`i$0|1))2dx1B&HaPc0D$KHL2Cd&bN`?< z0HC>l&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&;tpNbd{e#v3fad<+*`$2{&HaPc0D$KH zL2Cd&bN`?<0HC>l&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&;tpNbd{e#v3fad-|YXCrV z|DZJhpt*n08USeZe-t$L4_X5Nn)?T>0RYYYgVq4_v-S6b)&PL!{y}R1Ky&|~H2|Qw zf6y8L(A@vQiZg#fbN`?<0HC>l&>8^H+&^dy0BG(Xv<3h)_YYbF0Gj&;tpNbd{e#v3 zfad-|YXI_==H-Fb0D$KHL2Cd&bN`?<0Aa3SVW2et(CS|bH1`i$0|1))2dx1B&HaPc z0D$KHxw3ONg694~YXCrV|DZJhpt*n08UWDTKWGgAXzm}h1^_ho4_X5Nn)?T>0RYYY zgVq3m=Keuz06=s9pfv!Xxqr|a0MOh&Xbk{p?jN)U05taxS_1%@`vrIGAG8JlH1`i$0|1))2dx1B&HaPc0D$KHGg`v6Ky&|~H2_Oi zEm;Cu0|1))2dx1B&HaPc0D$KHL2Cd&bN`?<00|Njpz2?uM_CzE{VUraI|i!$kF~#e z0jmCAsI|9)s{i&|J9dDo{~auhjG*eDQPJNYRQ>xytADda%a(zv|7H1?E`h55OP{}f z1y%oFe^yq4mjEuz&j(fi`E?T~f~xOW|1LISAzPdK$_52*Uz6E=IcIcN<4 zQ(qsb`tRGecrmE@Uu?j`1FHUcK2}$Qs{iUMrlz3k-?T(l7F7MqE`RUpz8ltZA1j9`j22fc@n$?aEYcS zsQTB`;Nk*R|6KnzZVUje0ob)*0jT<40ImMB^;%m&)qm@`y?a5`|K7~lSWxvJ>mVQi zs{RGOfB6Ec{=aaaJ`Jk=Pyev916BWaBCM>S>YueSJsnj2r*D7q1XTS$nWL@_s{Yj_ z9UVc{zoS@pH>mpWUbcKWsQO?2vbGjf{nzGAoeHY{r@G&`0jmCQoc{eARQ>;+|Lz^A z`hWMfrUq2~*R-akfvW$s;JbH0)&JcXadA-fFV5)h4yyj$o#xF0RsZw&Pn`l)|EIR- z>Vm3&-DCUrgR1}iGVJW2>Yu%D?OIUvzqT|g3RL|^nKd_qs{iIQ#>SxP-*{qjGN}4b z=3rt1RsT$rR;>b6|Eq2m7J{n(LiQ6UK-K?=6iG=?^)G4Z=?Pu}=zQ}gsQSP8{?jK= z_5W%0YqdV@L^E(e|Y+vH=yeOjrZ-_pz8njzJ&`x)&D}i-d<4k z-}}YZ7F7M)rcIv?s{Y~Y|D?~K2UY*)*Jx{ls(ZM(~K-K@QJ^K2f>R(^| zzyVP8e<1$eJy7+3uRulyRQ=0b{`(hH{r}bU^#xV`zD1KJfvW#WCre8~)qkl38yl$l zXA|n`0#*NApEhj*RsWmzKYIqM{-0U!@qwy;z8ZOXQ1vfAH7N;H{U?=QxdN*GugqGp z0#yC4NSZbcRQ*po{PQQM`u}Ns^eCwMKRQKK6;%DJRz^my2CV_mYH0yg|1DRGia^zW z(GyEcQ1x%A>*E7n0+<>X2de(#{#I0gs{e`y78aoD--4^B2UPv{BwxG;s{SvoTe=if z{V!er=n<&;e>5{O5mfyre%rhmRQ+#mQB(v~|B7C7=5T=40944yfvSHwL1$-B_3vzb z{5YukKYsnsA5iuGM}UO|RQDJGeOn=%$2#hpz1%@gqIgo{qvsx^$S$} z|BAkUA5{I{e_B@us{ZRHsHlLdf0Z}Z*5D<8(^jtrRsXBy&z%ER|L0r;1wqxnAhi1L zSM~D)RsVj^wr>Yj|J%D?zXnzRuRqw>fU18RyT(RP_1~B^WeTYJpYr?rcTn~J{oc-< zpz438kFYSP`WN1yqXVk`b+RvC237x;cRzm)s{WrttN%RnBS%2h{}CQ$W>EFd46Xjd zcwJn;O8_6%*MqA6`gto?f~xgEQj{@uFP ztN~U3YvejRLDhd}fQSgF`WIRJ@FA%Be;6Sq2CDwWURYUys(-7UnVF#KKU0O16IA_k z-YqBqF9CeCZCgHQ4M6&Z3!v)%!sNGaLDm0T@iS*Y)&Ch$Cnr$#?-Vs-2B`X<0j>U* zEYQ#ZRsR~fF)?kRH2}wd`~X$|Ka|?qK-GU6wE9ngR{uTF>fat({kKD_e>G_Je+ydu zvp}nVMM&@8>;|;@Uj(iG^P$!MXK3~R6I%T*gjWA`(CR-FTK&(3R{y7<)qfbY`e%Yx z|J$I|zX7!R{|K%AuRyE+5@_|m99sQXL#uy%X!XAXTKyYBtN;7Z>faGs{f9uS|AWx# z{|>bJ-wdt(-JsR~b4c&s%M@Du`$Mb$T4?pp46Xi`K&yWZX!ZXOTK(^W^!~FqLaTp0 zX!U;%TK#82tA7V*_5U4O{d3zvs{bF*>R$v}{Wn6Z|LxG~e-5c16Q{Rcy<{}^cX&j_vlouJh}KeYPa0--K5G?9l2z1zP=ELaTpgX!ZXdTK%tv zR{w?2>R$?4{Rcs-{~6Hg{{*!9{{^l7o1xXe4Yc|%hF1Sp(CYsXwE7o@R{s~E)xRyY z`o9gW{=Y)2|0-zpp9rn~8=%$yUTF270j>U7 z|3zr^?*Xm;Wueu-0<`+qhF1U6q1C@PwEEu%t^WC-)&Cc0^`8ds|3j*OX=wGo23q|e zh4lWLjG)zjJ+%7IfmZ+Tpw)jHwEEu)t^Q-7)jub+`hN|r{tvu=59OUS@{TD#1|I5(oUlUsW7eTB4lhEp40$TkG zL972y(CU9bwEDMzR{u57>VGP<`Y(r8|FfXge-gC%KMbw@jiJ^56lnEd39bIMpw<6X zX!ZXDTK(%ntN&DJ_5T-I{Xc+K|6I`OKN(v6uY*?q>!H>EOlbB04O;!TK&yW*X!TzK zt^Ng})xR~g`o9jX{so}beo{|9LGZwIaZv!K=gZ)o*@4_f{EK&$@^(CR!@>(CR+`TKzAER{s&u>i-3_`riqy z{#BsW|6OSH{|H+Br$ej%$yX~R{vk;3e}^8V_iyM8>HXjT2kHGghC_P) zA)=7p|G{!d@BfZDr1!u1DWv!BHXqXafBpeH`0r)v1?m0!--7i1Ya<}Nf98{r-v1I! zNbg^R3)1`lw-M6&-?acd_@BKo8`AsNYlZaw&+Ucu{xf4Cy?+M*Nbmpq7fA1)`!uxr zw}bTlMOY!d|HgDk?|=IfNbi4+I;8h6=?Llli*-YK|I3y`djBtLA-(^+sgT~k`wd9% z|MYK2?|=R~Nbmn`4W#$qng;3p2j7MC{$s=;y?;h`Nblci9;Elre+tt3-=YiY{U6&8 z>HW*FLwf&xYazY=(kMvp->ezZ`#)n0>HSYkhV=e9m{x&%|C3fhdjB^IA-#Y06Oi72 ziX^1>Z|Mo?{X5@;^#0#}g7p4ZKZf-F3!@>uf2j^g?>}f3r1w8V4buBRVFc;@|JnfQ z{Wrga^!{!5A-(_NtB~HmRRg5=e`p`1_b+@F()+()0_pwRdO&*rxBo+W|6i*hz5l8S zklue{Jf!#EpaALp@6CYp{xhT?z5k|lklz2REs);7ZwRFKUp83@-23lPg7p4-Qy{(n z#~&fR|BJHT-6LVEv~c0qdo zd-Nf_fAs^9-hcc(NbkQu2GaY#{1?*u*Yt(-{);9-djBU&A-#VIHc0PZs0-5j|Fj9x z```Zz()+jIgY^Du|I=1OdjIn0AiaMV zLGa*zKU+Vf_pj;)>HR<34(a`OzlQYwKiEKe|8|X#-hb8HTM4hF1U2!Gr&KOY?6zYr7%6f8~Ra-hW^)r1u|w2h#i3;fD17{pLb?|7&v~z5gSIklz2<5=ig=|2IhQ zpVbZ0`|nx<>HW)fLVEuJB9Pwy;)jsle}ovM_y58Q()-_;3F-Z-a6)?jcMBlB|3}*( zz5nzJklz2~w~*ey_!&s=U(^ZG`;VFd9{gXjY6+zGzd!@h`_GMm^!|_kfb{;A+F!JyyYgMPmc`aM0cdwyW^vKoe_-~)+y!$t%p90KFm*70!~6xa7p4#9KA8D1e}L=;VVHYi{(;#G za~I6rFmqt`z|_Iq12PMQVfMoG!Q2NkALb93J7DgG`3Gh%%v~^d!|a2pgXx3W1Jehy zA7(zfdtvTCHwR`Px;}LCVCrDvF!NyUgV_f&2j)%~ALd?|I7~fEKTI9WT$p;8JWL$s z4w!nFe_-ap)WPh5$)md)W)3X;VD`bxg^9!LhsndtLpLABhq(i0AB+#v2QwFDKTI8r z50i)42jj!^!`uf-b07>eA3eRGr$3naFn7Z2g{5y;dWNM_nEfz)uyBCMqq_qZ?lAYl z%!9cb-CmgaFn7ZI0do(`KQMhTb7Au6?ts|?b1%$1n7d*Ah1m-;ALdR_Sb{LjJuv^k z^uf%9$)mdiW)IB0AhSRi=5BO*Vdlf!2@6k{dtm;7*$-0(qha>J%z@bpqha>K%!Sb~ z^I-a6_P}VEJ7NBX*@tcq%siNSn7J_ZF!N#RU^GlUj1RL1=5ClhF#Ry|VCrG&VDd0~ zVdlVSbpOE2g@p@D9wrW>VfMh(!R&+aVfMl7hnWMT(d~!vVg7*mADs^~A7&rS9#9$r zVOV;DrCV6~howiDewckQf56Ov*#}EsF!#gU1M@%3A24^o%z@bhQwMVo%siOAFnuuh z!OREw0fb@hfVmguADF!`cfs5ZGY4i5OdZTUF!Nyc!t}x12Qwe$50D!`80KD>e_-~) z+y!$t%p90KFm*8ZfXo76n7uH4F!#aChxr5M4w!pk{(;#Ga~I6rFmph5fG|uQ%snvk zVD`fF!Q2NkALb93J7DgG`3Gh%%v~^d!{lM+z~o`}!Q2Bg59S`2`(XNE=AoMdvlm?- zx_K~lFmaf9F!N#d!OVfV6UK+R7bXr<57Q4*2QwF@9wrYHhq(i$9_AmIc`$V_dtmbD z?uMBI3qP2BFmqwzF#BQhF!RvOhw)+VfY}G*!}P(-h1m~N2jj!!VfMlF!_0@t!`uba z2Qvref0%xldKe!j4|5O99GHHXdYHK|K1@94TXIlSg+4%pRC~ zVdlZy4f8L|UYPkXcY?wagkkQ1`3I&CW-d$~-5oG{VD1H(1;Q|QquUEJALdS2c*5KR z^AAiP%v_i}x;tR@z}yQn59V%|e_{5*%m=v!I4@^JIJeYcz zI+#4nUYI#B8r?rIb7A2ElZT1JXqY`Pbujy2e3*SO`(ft5XmtBwe3(CA{zvD-%!kn15jQ!`u&Z7mN?n2eS{|T$p;8IWTv?+zqn_*5 z9GH5TdFbwdxf|vWn7J_b!R&>(6BbS|f5PNp;xPR%^)Ua!+y!$l%s!aAVD`b>3v(CD z9#EKoFwFfh|HAAA$$>CTKg?Y)^I_(|%!Qc)a|g`5F!#aS3v(CDKA8Vt{(_m0t{!F& z$W0&&GZ)<)n7d%+!Q2h=2QGKQ{0*}grXJ=GbbT=MVfLZB4`wgSzc7Eo?1A|c=6;xe zVCKU3Fmqtx3UeRKUFhb*+zkpN5Qe!M=1!P>Fn7V+0dqf09HtLuFU;LAcfsrh*#W{Z zb7Ag-nG5p|%pWj!!`uV27v^plAEqB>E=)bl9GE*{=E3yC+zoRl%-t}5z}yXUC(L~y zKY(yYmc0t-PJ7T@_MkiML3i1M?z9KpWe>X39(0#I=uZ3dX(9VSciMyQvIpI154y`9 zbf-N?FUSm#UXU3ey&y9{dO>D@^n%O)=>?eq(hD*Jq!(m{^zX{fn^(mqt=W2i#xich zi`(x@UASHJSASZaTGre34|mM0*ZJr=p=Q_joQa#=XD(C``_tF@=o2GHreApB4Ta2P zj+1*nr$6J&vR;0wrFC8UZtWja{uO=Bv-xNy8*la1f9b`hXKU+&_yXl~?6i9_SZ8PN zb^N{hX0v>yVx6$$*$2^o-rW^EpJyoc`^c|b%12pzUzUHkJy~z&E^)JuyG72%AN(ni z8ucjVy<($`jZ-&cpFe90)4Io5{R`N*-_EGNa#{YhiB90F6CSHSX=N<>Yjy6-)&jmT z4xTch{YAp=bGFB}i!Pj|DNsG@_~(fg`E%!O+GtcNY5U)_t1dU>Si|AHyy5r1s;snI z;e7IX<+X1$N;{b!@V~iNHD$w|J1;Z>{EWH0mQPP8mSaeAk=kL=lrmq4pUCA8tW$+F-Ef!!abFI+{Tu`y%Krrj{djU2f z3Cnwq=4;4l8QgVyvr~j$RN{eh*(I*d7M_Cn)|srQoY*W5PTtj%s>r-z)r&bFV%6J1 zLQDKA7R+_lT4JSc6L4U?Xprn&IgNyyEt(An_(cpJIn8oN=;V?pRPPY5|H zy*wQ7E`@Ww;IH=@AQ?!(~>MsG(YIm_BNDBiQ{?s zy=LPorZ+2`A2EA7t-1W?D(~ayvqe_*Kfg_$&6qoRqWq=*6*JF1(rhR=xv;qOaI@B= zY@?Ko1rZZj-r04yJ$u7k$ohEAtC--$96K@{kJcQy*E=!fxew15-aGfdEaLjL&v&^* z{&s<^)fc0bx1Blm|B-&UVq%f7+@!gZ`8^&|r`Q>8effFP`?zD!i*L`qs%>+Re095W zLhGcSc_)vyO89%X<*$@0>$_fiaBEPHlUd)vWCL^cjPsd!N4LzjJ;}c9)z&h;GQOr- zr#tl@j?IZldEjKMQnA2dKTECNTpN?@_+xzB39q{jeOj|8q$vIdU(Qqi+e;diA`9og zpDg`V*kzLygT*?2dSVQ1WH8TA!7Y{&6(BZ{-e+)mrp+LGQ}c(|peZBA|kt6;FkqQ9;0{@*Ek zAE%>s;rAKFOA|UzPx-W~^yV+EuPIZWiP#C>UoX62O2kQJjl~z2vq=hmGYI@QHU9vc zj+@_Rt(%t$YdVbYRll{flt|6XEveKrE{wI1ToRp9y3%9kGU=N1HGiumYi1ZS*|K^c zQO>#NdyVPBKTny6LQyq~WMB8YNf(Nr9CmYEmGC2UipjbDNjImgKDA3)%p)V8uiQXo zVzNxiF{WorPvmLetu+=^)o7P4@Md<(zNM4PdAjkSx$TC0nd50q&KwUzHwC^v-e9P` zr~AM({T-9;@A_=C?7)ePm@rmbnYJ@5q5avL;-4a@uX6giW4~BCRgGs0*hOnfDx3*f zP~7dl^2dfcN0XnQR5XuB=LXlBPPXj+zfJa#)C!CJVhOb$e;;xG`Z&Gp?kaw{X|KB{ zC;i`3b+Ync|CF`8%Xyy)YHpt)-#<}GNPS)3lSGagt%hsAC;7g974zP8@#{C|TBhxZ z+jQ=$V$%2RJdcdOJ(=9Jn(e;M;w3uomg*=(&DhxAb;iAg`~2d_8Pi>Y%I1qRs4Uzl zc6Ei?@z~vVyRLIv-p<+)ddmB0a)W!$U#lwFyYteXa~zu&sJzPa;v&&-z9}F3TMAuk z#g%**9gX6*zB{CsXSFaUjz976*V5`qnhj=8t{q-IUwEy)!+D>TA7gn>++VuS<7T&A z-FN%F;g=UIb^TT%uc~)(QPYCPxS)A|(>$v(>d#H!(K~8Aeb>G{FAl|*a6a9`$iQ%I z^Q~vQ%gvp(=6zUKCzE#Z#`#sgrt%dF|Ew3&_R3s2F$bJKR<>@xdZeA{(HfzOClh6L41tA?_{$3@gv&7b}d$MVj&+!5wU(NiK zi5EUxG<3-5)Y=iA&Al%%D(dF@S)V>-z7*Q4|6>0Cf5HWqXR}3dTw`IGZ7=#SN9^-K z2hZR4KA-i~3E_MkbGEfv@#q%EWl1h~wws=`-*&lg*$;6OhiJuU%}CB2MXf#7?{Cfd z8N2h(4-vK=#?NQ1q|UApk=8BV&G4!4N{iU77gPBJ7a!cwB(-0mh|8Hz@xCQ5XWjO> zaTjdn@BI?zvLw9j);IsTKbBr;ewZM8%e`-=c+27TO>GjJrG@U;{d<3!XT}+uf5(~s z&X$<4HUG(-aGzOje~rvj*M6*7!0^2;vO{)phRd9hcl#qAM~VsvPyHZWTUd%2h7l809+)*e(7n_BHe>#mutu8%!NB*oznfk9 z-XM3WEAoi?^y~3l>C-s67Mx!Bn$x-8>-0ji0)FqX^^JRHNmeYMwevvG%MVUOy4iv9L+U*(PRl+T-+3=Gp>@ca?X_s<+&zR9_voURCt}hKJ4jR(jSc zUP-O_edW1F?(+w?v*(H5bZu|C&tbAR`0lK%S4vz8N?|f0d5_-(Z10hdZKyYY5ix)1 z@u%x;4sG<$npywo!iQ4!-?eR*r8+zE?iD|~pqjH|{k+#!LQ{9R9=v+>qrvmcqIbGp z&buvs8UB2ee!61Leruy5X6w%-bJTyEC0`3#<@cLwjd6TH`@=JfW}aR8Vz+^=TtkUx z@Pyp~XhCUzU1(X0Q6{y3*fACb8w|wjC3^FJ@iO z`?2NqU6xm=%UHhYX$w=>N z`q6)f_eF4XT!8CYarWC+7-n6RU~K%n^zHctCZA5VcLdfw=QayGve`n!MDFLA&Iw

Olf*;rtncr5r0Sv+N0?aOcFZxySHvw!LtvL%;)`JDg4qcdpTj~|QMK3%^Z zoGkFi=lPveVt0=P{n{%T!*Dt4N=j^hTSk_I+cT~|9A1RvbFVQ(at`>qH{qsfQe;<-2Iwm#ip zc3FG2!o>L>=cU&AC*-M|)~R^ZHEZYbBO)iZX?;CYT_m_~{Y`au-_44QJiJruB|W#aj#O_ zQ!~%o?4P)PO||vM*n-JYL~dX(S9QP9)USB?9+AEa8|zFcRc+1QESuQr-xr8_J5vK!T4J0 zkj(5kzu#Y3{e8+8wc4VY%y!vR7bQPfY%phm*Q{=@xm)--8Ln>6vOmzJ7QW!qfjJkQ z_P^Dg`_8s#WkTf%Pkv)ZX{UCkqD{x6zc*>>;C zsi$sdy1pk*nvuNvpMHgFRqVf=HT|Y;$$lx{Z$vYk)ZH&yT;(LArmDE=$OZ9$zQD;j z9+NB&U%9^M!N1d6dhf>SC|oP8Nz93Ud}HdN+mhPMOqVk^Cm1&$If^{%lY%e77M&d7`uq$KtONJH(qeoxikfj)dHt6(?@5$_kgr z=6U>UrqIe)vD==j3)Fj8YX5#6ZS7KT_=IKI1iT`n&YtntML?r~J3_IC?R0Mv`I?c$bDei1eXluUCc}8wtt+xx{ozt$;LOzd(Ox?>}I?lG0RpYenrNM zf(7%GKh+v^eDrS?Op)4>dR2r;tRSewSoj@hoQC~*TfV8moF{gMFinoky=BnpF!Pgj zyKrW({glv^E$ydQp1K#eaKTG$Q*}iV&EHji|K-g;lxZmWs|S3sWa@5Bq+i;wwW06I;=*Z-yC*;Fy1X@X2TS+D3y-WaNzei^5GihWjS6#a##O6hN<@22njckB6}zZ&pI869By^d-w@j|&SkSd|%{yEe zgIetuM@MlVnj7VO*m&AAsW*RnIF|G*ny&C=nw-rNl@7P%@A8)ECz?m`o&TA-(I?yM z_v!^~GOL`kE0aFvAM&l|pZzwZ@64_oJJsEn-v8ge%zy5p4O921>h)NByw|<-T3g76 zZDmKjuHTDoaMj+k*Px+ulJCoc^^G>S84Ty$%KdNW-f`ys{KLJQ>vo9u2DMrUIc?kM zaEb5MrB;f9CHlYgH+dKl|ayc?&bvlFT|`tWs@#`UvY(|h9% zoiKdxVp_j@Y=(YE%eOt?_^1GAi<+N7eQiC;bi`2y%Om$^>4`=rs>Mwq+=FF1Z z|2`yQpY`1+qoA01%5E`6=Yv;GNWU=GB+&QLL6v3mmc2V4sNi3x*T%)KB%I>$fMtrM z<+<&D+6tEF9JzVsIdhltrKpVCAN5ynYDr;xQ@Q_rLG0XrArc;Q?(P(hUdt)^w)Dye z(ZCtU`Pk0B=KitWN@8Mq&($aIJ_iNVNL>8i07Ics+MEPU4%TbmxdabK&6 zmS>NAg{4}k#$Ocpi<!?2e@9lh%Wj`W_+ST5D~X1`iFi^VEe z>$6)d%9lyr<9#EODYlkf&#hsy;gw?+lFPVr+m{}7xY55<{?|@13IF9b;v2gpuFDwsl_gER zkymfakRSP9Epp?|Ye!euYNpQj`7z;|?}u}F9qWz%$E!EFGjcT9a~O*}+4@szmcu{Z zzuA_zbxankItOiH+?-VRyeld(G;RL8{KK3&mnZ2)xwf{JxO=X=cl^_?d5et?ZaJTv z6tXApjKhZJ4QiYJo(P#@-E;ka`@F2LVaK$;%;cSNNLM$HGn@1N_Zjiu4zGbA`pLfVzR62Lfu29MPug_jMK1-^n{}pP$d2 zpm$T=_?p!#kHnudmb_}t>dtezvEoil@%EBUoeKoLg5-)fe{1(lKY98oM~C2)%d6 z)>1u}Eq>dx$I(>+`THu~8YKS|&0?>5&im}$h1uN;yxw_h`*rR(ZnrEf>&rirU6H~< zOn;coHGa(8?{mUnJ&$Q&gJo5Q_=nD_dGO=R#&^0JWtBa9tK{!4H5ZR< z__dPL#yQyk=E9o$!93l+%1`HX?74H(Ucp^@Wz9r~1NZM-{OQDap*Eu0!e91JSqpQj z;pd~ze<)iPKYs3_q{ZyL{A@!Tbg^&;LEiimmWTsw!irQ#KYUZ3~B2sO5L7SvoYE?v*t$pvtGN^ zWcP>Z+6zyb#B;9Txu)v6txDx$c?sj^W4G`4UOIK}iin=qYdNlcH=k|YyPDCt@_Rv@ z)?Wu!^)B5n_YNxgEI!c3&e)!O@QYO7y{BBpv-SpA?XELTsa+Lbky&o!vyNG;*^fc! zam88%fkn?hDQwB&S?)OZnWNw%}u0C6d zXZzQ3-*8C~i?7dB;Ilh*TF`Py#G^e2WH-5qTNPbCd;M$3ic`nu$g0_P7_F(%nX*ec z<!jB}f+pvaO3$Cms%>N1f(>3nMH1!LZYa}?)$^ezceJdvEcCeH52 zdfxIPtL~ze@7wPyRQpZ7{kqn(42t zXD?{w)$$mJ*WZ|)^dj>4hTcxaPkowotCn8WWMBw&m1f)eu2|R!*DUcPH-9eJ#*$!TyKd3?zweJso3bUE{lxdjS7c;Gjvt+4656L| zA-1<7OC{h(hUmvlntPb0{@U~Ftu(9htxr#LDrFPg(W-$h?XB}{9+~WwY;4kW zIQ_;ZHa~hn$tk;sPNGZ#+txga)W2BylRx0h&nN1)%oA!`KJrFQpA`2``Pt}xMmcPr)b)AZoAnmFYj+ERa)u|-^DU}y5GK^94dOw=ga=P=Bj&VddJ?L>U}`J zF>~SH%agWor%jmUCG~sL&LwV{l03y3w>;}tbv|m0U$C*6e^y#b_ZOFGwf{G(Z!X=| z8{;H9eYt6Qgsn>AqU3|Sx2@@BF*@T?d#G#i&D8>5Rz?56TkqY(vLebeckPt< zJ-YtOmpy#^;-0Bc>-Q^@Z#blO)O-KEwSS2gi$aY`jnPH%qYLvmThpY>wxnfVtz}gd zI=r-2{rh>VC6i}dozkdu;H=Ei4=J}h6aOFCV{H2|>zR+lY1Rj?X77}hJsb0%e}>b) zp z`>aO2WAWEV+#3#+|7cKjoiH_q;dR01|97*imR!4e&0=1_Ii}_HDGdCtU$f;Wl$~cg zBg^%_ZBh59n@^GsNt}!|h`JFHuVmCN8}0sY>zNF(t^T?SyR@(0+*!G7sk81xUYVBQ z7fXcpd#tLnzAvl)$(>KGqL_0l*E60^@13^)pL;R!l7gk478|qnLb0hVsg_Ew6C`)+ z;Jf-yOhz@2QSFDp;RCY@%j~A6s)@cWm}<6cis3b;_LCc@G=C@wco?&3LQmwbf^SaK zxf?~jDsy_)|9Pnz$?I2=aU-WN-9Wnd`it@nToV)Zk3`+xotTv_+WO(QUEt)aFPrCi z7ft!no5C40<6--YzdYup$1ZO)iB;v@WBkPQ&I4&-6Q>=kF08NX-V&h2!eP34vCF$7 z(`R0oDX!pIJ*&yl<>+?yW^1)&Iazall$NgOdj8?kf(oCLOEuWHm22oZTIwu2 zx&CvU+QOr3s#!echxQ1adwAz+?lvp)=yb0OGee$4cpg6KrTMC;a+b`bpkF`3Y~8HB?e0#=TjVTi z&-h`+iFxhw>kL+$DQ6U2qV99X!&vr|j=rqt9kK%YcR=^X_>uA%WD6-wOc0kudtAObolZy*B|fihksh7 z^Nl;3LBHZ%Y5x1lFG(xKI%TdzEfoyD@~>sWCCyLI7&eGiANuH2azJ@TNtwKMLU75U z#c#^I_f8bsnfzr&Pu8=wA8k(V5t-iXnro-n+9BxftNx)@yf0AGK45F{>@C^ZKM!X# ziV3XSa4Ok)nk}Em?S-LX-hX;y?uq1?e(d~y@K&JT`V6~_oBZCrbNyGGy!dlLko|*+ zW(|Gq58d)^#03;yn8_zqXd^J$k7rXVN0eU1hbQuXeuvGzA1ClQw)a()M5Xe^zpD%9 zR6pPMaPCe$W!Lk@uMWIXTzH&SBIx>($fBBcVXwbVv$#{*ztOfoc~xJ-%hkQ6mh;yX zaUYoY>)!TBx}HgY9YeFDef566xOXhK?$y2{tHbS0&rJxsbuBZzxJAU$X_=QY*IeEo z8VvzIzlna@T(wB@@eW@plR&{aYYkZ=-d8VGvMD!io5n5`cHGr$-&~b>w}gLY_$;fK zt($u5y~$zg`jzTFU&OPYDF`K%ao3)m)#+S5tttKOgHzG(KL4pa!C+Q8-(g$sq^*{- zF0geRtuoxOt~p;(-lEOx)H6m^gZUSeO#Y|+w*GrprADFX^`keBE^qthb&uoK@qNBC z=N##twPE_xHJ-bsv!73M@7Y|cRdcj>vb1o7+~mY_I!zmSWOi}x3@x2|Nw9YE-SzcC zPbTFaTWftwbI+SYA%#~DE>ijTt;tvTXoSCdQgq;BD;c%M(~Np2*k7Kme=ID?`S!<2 zH--~GZ+IFd|L%DFcJ}#(c^`8GX9YJ(gsWW5{{ERcaK(4`bzh%t7d=0x?#jJm*KbSh z)?jjsdFnFL?{=K(758lhe^%|#?huUCQoO9WyPNat=4nhXMP6;~k7BwTt~jMSee0SD ziw``H_|53Gx7jECa;Npq&))Z!=+4vhSlweJcjQlyPQ+C1dN$J$G37w-hga#24O?S0QzM z!M7KC&+eMjuD>|t;GT?Y_LRq4 z?pSvk{@lA>^6KvRI}2QsPo++ot@cl&?M>hu`vk^Vx$T|-3)vi=_-;I1_Wfx=&i=RB zq3=IQ2sth`iz?t?=Q-_?FvGu8#P>O$#tJ^?n_*{D1LA|PPgFfP?LAk~M`fcE@=KG8 z^DP$~X5(Vu*8Ylg|FHJTqV;o@6dl<9 zce0w9{r58_OP_u$ykRKHa$Nba#5C4f>_QEXUaM~^@c;9rvpm9Y z;-|ZaA6Z^!n-VKooY3fhM@ef!hugayBKP9BZ$B`y;__rui8*w6P13}vPb#0EFwgD1 z>bEi{?8~dvs&yQ@Dpd7kmTfuq;%3N*wjGq6_wdII!OWX| zQ)bJxzdRSJaldC_C-44eP8p6fb@?}h>=py9!2)5}x-KRVhk=0swr&fy4h**53$_jn zwk`~&52hZb4kiyZjsa#a%siMmFnO3cFm*8VVCrG!!t}w`o5A$K)Wg)l}VW4$kpfzEj^u=H+4LXXIjHV`t^yW9DJwWo2jNw; z5XZp4;Bf!@e+Om;h70$<|Ca!H_`&!8I?N0V4-9_%&tPU?a4`Due*-fEgMsmn{~wqc z7(N*P_^-giz_7vO$A1$R28IcyKmL2LFfa(1{rDfl!oYCB?8pBS76yh7WhX7!Fwd_^-jr!0^EF$A24E28IHcAO9m*85kD0{P{{uD#hJa1K{{LZPU|6vE*MAjI!r1!j ze*`-NgTuC8|Cg{cFg)1)>;DIK1_p(lzy2q1Ffc6G^XvZt4hDt|dw%`j!ok2Gu>aTp zHyjKM3I~7vSKwq|D7f(Je+4H4gTs?w|BrAoFa*5#^`C=_fk8m@_x}hk28IO5-~X3@ z`0~I1b8s^-98mxLKZ2WqVS~=^|68~j7%u4j{;$Ks!0^G~_x~k43=9rtzyE*XVPM$c z^!tAfF9SnB(C_~od<+a5LVy1c;bUOSLZhcE-ffsjA{IYby39FqS0*AZc0 zIFS42e~kzOLqOr5|3^d^7z9fG{1*{rU+k<9;tUKI#Q*+RkYHeNkoo&RL4twdg52N#3nUmA9w`6)|3HF)VT1bL z|2mQk3{;!c_U~qW%_x}b-28ICUfB)Y|GB8|F{`X%;ih*H++Q0u5QVa|Z+W-Eq z0r7YI`~L?-AN==!jx+;JO`f-D2W1-t+MW#kwb5*+^jPmp6^aB%tm ze~laigM!EZ|3Bmy7z#Z8|L2isU{LV<|6fO*fx*G||NjVi28Ip3|Nk$LhvXm;2*toy z6~w?;A;2ij!_F~*k%2*gfq_AWfq`Meo$vqkL26vs1wdj33=9ls?tK3bD+g2<7#Lg_ z7#M!s{{DXgNFASm8=r(1KX*At1B1PkwU)7p5=a=NCWnE6p+NV?|2R;g;>0K5#3$jz zr{Kh=;mBv;&i8<^nXQMlm!*%npNZLokfnf^+14D=2 zkN>wo20Oycapco*;cH-QX6<9?XKrI++5<9I0c?kWBOiw&UjxWm9R>!5FQBBP|KtBw zkbZZ*1&mB}d@C4Z_%<*)@$F!A;yb|T#S?diM#L_NPx;rCI*H%Hb4G%fZXiP_koeQfe93FAai1v7#IZXfBc6e06v3Q zJ`M(ucnK2&gNFT&|K1RD0+`(RI7~qPXJTMTu>bLY2dEMON4kU~pMpEz2j*r-st94? zQ*Z<&8UZIzgo4UokQkJPR@M z{a}pdYhZHX>tJ%?o4^DT^#sQYBLf2{>_K(lg0;W?+k^CA3$FvHVXw@H%@+`}R3aew|1dBxEMa9}__6ude{h@2kxu}WS9Y*6Fnrnk>wgd^T|>+S=amgi(7d9I znpZY3F))DQ@dGOZgUq&H|GCigePD#@`@slu8nn!1UZ3;*%)>Ph7DZ5|NBGT1g?uf^_>$aI4s=x(8?ZT7HsA*FeETAFsxu_VA#U<`~PZC z#fuyVFtaYOpt$W2Bi{`cN4^IvE_^RoT=+h)c=BCfVM@nlfg|4q76!2YK^30J@Bb@7 zG&Vavu%X!TofW%rAJ`ZeA{ZDLVmKHW5@de=e}V3QaJsnwuJ0k~hA9dZB8ckVk&nZb z?*b!pCT7B6U|=X=U|`t6!NBlE;rD-0L^_7$sSS*#v+!^w}a7* z?*O9@s+=Q8y$@6lVy^)w1H&Ap-~Z+D+UtR84o-XXp=M*V*B2_s0FIj#oD2*uD!>1` z;)?$U)bcM7Yg%&TYhZ%-;|It*&ENm?K^up##q|Yll(;UyYMv|K1#V_{M!p-|PJ9oz zJwd!rSPNc9z6;z8GeGS>E(Qi0)8GFmp_e7Fbi9BW#ok$rd@Gn8`8F_n@-1Lyx`Qpj zx$-SwW?lnQ=LA*9>;U4ybTLbVcyPG`9M}v2l}9|>pf>dH|C2%W0#cc}09rOOy+tY- zT|w=}3ceMLZhRXUeUKy=7-|?87(o4@5cl8zjX)c+u!Zjdl)S`r5}Tu3`3|r#FX7}n z!REwwfz6HY2Adn-12#{PC@-Gv<3(b%CXru%;=nR5DH} z?1ddz({FCR8D<`Q3(S1@EWiRwS@>p{Iq@wpbK_fK=Ek?d%oF4yQ6X%i+gbT$n8oug zfT(!@G78RXXGE6sLg6WJLQQkxTVdt|v%`@Io9Jwi&6zMe-k_K>6Gu**V8*P*4mHe? zZ-tp7%nBQr6)2u#Vuq?k5oIMoR3EEaUaX?WB>85T!8`=YYZZJ93?(do{tF@U8l?Po z;Y)xQ-_KBsQAfT6UsMrD`{W281A_+|J- zdI|vyptfv_00V=E>Yx8Tp!kD?Gq^1~0o?CvV`Aopw`IW{`3cOBI&qHx1H%IKKmRoZ zakSSa@Sv1SoB6Og(UETg4+Db&0|Nt(AOph&hd=*sfzqTSp8zN+GBIz3b%hc@Z6pIh z1_mC#KmW@>jd6%u!GjbUu=;BQYMZr)3%i{g*dgO44T1~|Hj#h+gZ#t*sdFIaf!jzA zn2^$L8Z$;Jb>su}Z$a)lA;`ec67%Q(0Yn%=%z?S90kvM8f;B-p@-;xi7Bt@WCGO9E z3ta6DwEosctfi78-vvB((M38yzd=HqISs6ho-~khJ4>N?p(80*S zFhPic;Y`+_|GTPj#i*&cBonu(EwJc zD2fS6SWP&@iB0V{m?(<5S9!4|PzKOAnG9&K=INjRA)qwn1nMS9xbt0LYG&?ZVp_~6 z0Z#oKkSJ!zU|?YI5n*63c>d>q39h{H03~lQ&Eb2&?#K6m-HGo9yCYu%hZD5#=*jnh zommz~#(BUFwrht71B1(_KmX6;YF~ZeKu#x2bNGI6`0+JxI`MUII`U26bmE)A>BP5y z)06K52Xh4vwlHwy`@jM2zpIEcFs%6h=YI;Q9|O;$j(n*7_uE+e@1XHY(3tZL=D+{D zq2UPW2ZHrKV1iY4%o$9e3JW?C2k!ra@-|5S5>W;Q4Yt4kc|dsw)&2%%xc(v*bp4>b z4619Nh%zwz;QIUjC}{iv9Ba^VS6JDwffYHdm{(%0Wgum)ffxfr4d37Y>7ap2Y-TlZ zp_uhU6noG%a6!f+8pIeF-pu>^|DY)Y1GM}Dm;DFWpyLtiO;Os`7NGH8F$RW?D}Vp5 z29?vO;ej-sGL;cEJRoDoAH*0KVqX6JFO41-E_@5%{YK`0XnGy_7C^_e48$22=5YS| ze-ES|oBto6ma~Vjma`DQ*N8JP81Vf2-;79CV81_r_BWUdSy22AD(5$dGcfcB{QF}~@-?tBt>Wuojo_QW z>clsL)roHbs~cYfD{~klUk7U{-vm}iWKj`jz7EzXsHh{~0#5ENT|VTI;tNcmF@rat zIh_^%{s)8d5w^HnfI5c4$jG;XC5dkXixb}t7AL*~EN*-YSePxD_*Srl^KD@9go^rs zL>FT1hd|mDDUu8f8f*Xk*Mp`RcfJEm%}mTHOrRo_g8|$=>X2k$Fj@ca|9McFcIVr` z#C#k)MhnWnOC%W>UTpaH-y9?dN$=ovasZl6n2zzCU<~EE!05zxgVBla0eC2*7%AyE z@*Mza1)23hl7ZpQ#()1;Lfrx>i@=irkU544sOh&CYkWiE#s)OEwdLRcvmnDU!_$Rt z1Ijom^A;Ro1aeo06a&MNt^fY7C(>P$@wn@X6a$0Cj(`6Xv73eAE)N`LfyNaTq!}32 zDE$B51o9)S4m`jJt^+IiPB2EG1v}FmM8yaSbdcXtq!}1~DE|L{4_En%K6Zzr`~{h{ zL7IV~M-`7*A5iL8=0iBl0(EKrNHZ`fX#W2Xo6iBw_X)@_FvMv7|GyGcHbDIA!dC$D zE(3!G0|SGB3gMbJ6H7#RkJ2fF|Nr-ICK;}hs-^5m1~ zV|L|J=w)%`)97J!;WKDs^Wd{+W_Rav$O9KtXp?^6dB`O)3=AB4|KW3vAmc{yXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jh5&U#V1gj17tFwr0Hs0QV2};ybQDMsG=~DE z83Z8uK*O^jp&51VAc{c}OfoPq244|0V)qWe|0KIkb!{#G&Bujg65<^v?z!`!k}&~m|FmG zA7}^x#6JKc7#P6o7eP$WGHVbG8U_W?9jp-hVd4=`KFr;qwO1f@oFIY$GUfwf{`(K{ zj|5cxe<&Xoz8|3ce^CE{^w1LvK;r@3PBUoyxr%o07Q#Zbz?(8$=t)Xdz%GBGJRB{i)ADh{I%@{UfJdokp08rVYCC5Y8e>VU6*}|Ol`QU>|1iitfY)p^m4)y4lSoejG5_^CO)X~ z{&S?Yw0DPJq1XjiJ?FA4efgTy1C9EpU%$L{O72!P$HwimH!2peR6Ywkd-}TcqPwA| zmUG=cl(;n}V&*lWZ1JtL3>mkI@yA_FoT07ERrKoL=j&Sw_}%6{_LtJ1yRvKR;`~iq zySTnilbdOHyQ;00 z|L-sUYNhHfes=%f|NITtP3M_<3ABmH%ZSz|E3eGqakQT`)7^dTn(SBJd9^8SRSp@y zO#LUA6&)?yzwOw*LuvA#xVCJcC9{3muk*+HKFr!Ot6m~!iBsUuBWbz^EDfrx4=>5T zdD%*K-8%nuldp(a`G&Q1eD<9dc zZ~k_U>x|#Wx0D>-W-WU0*9@~SL1oqkIdWCr#+mDx(x1;~PBfP8diY=dc172Jndgq3 zpFcm@^lz&mlXOA%%{O&yQ{=&So)e6_8KYC5t<1tfu)6J{mUw#E? zJnUGtMD}^xnTZl}-#5h0p08+dMM&XCx$ONtMm9^%R&DfT+0Y<-X_ukc$MolY;30GL zJVZ}^QE6UDW-fRH6l|@2ZeEFgxxRl&W}bd>eo?AEQ~{Wym!FcE#}HCkkQ(oqmzK{^ zoLQC1keHL1p2v`ulbBx2keR|zmROXTm{)>O74HU?g6jhF!FGX&52cWL3|0^RhVo(O zhlA9BFs#0D&d)7KEJ{quNo5Gm%q_@CjfaS&B3bB{n46lyke8U7%8-;;oXSv;oz9Sx zpA0gFAvnLZC>f+FB{kkBKRK}^Ge3_ZEi)%Iz96wAgCQp~FO?xVKc_S|kD;I_KRGp} zvx_0!tH1Qj79H;RSUAh(gE*mlS2@r88s}$0rvHX#`d}C$nwORzACRA!SCU%9keZX43zJ2T58u+9l1#WNmed|11%AIgWt{|qP}R?jYi@?qvJhw@?i*P`(^L-{cEAUA+8dU}DS zCzv{zd9ZW`^AF4&u>9$nSC*KQnZf`nAQ+tU^GZ@HN^(Gn-q|HJIfo&*BqbgcWDIVJ z#U&7yUw&RHgI{8HY6?SmW}cY|LvUqr7*f1D78NB{f@3uvT%IK7m*zneCrbKs%`44K zElMm&O^JtS$;?YhtzgK_%!@Be%qdM}$W5$(vNDU~iwhEqic^u(2S|T>7+57JK%f|r zK3ppE5_2%#)6$AlONtpv zi!<}miy2D5#bj}OL1Ho}L^6xxixSJ@OTpPHxwN<>KQ|sypr#gu;0jU{A5fH^%n%Rp5W4;G!TE{t-XIeo^62SlLNz4)!s34#8h;Ly z4@(aaQy4JHA6R;F%dALEVSt1gG(?f&Iuz_rXcYktjCe@+fWighwY>cJyv!Vi+{DTx zLpO)Ox@POXGUfSs0}ng>lJ#gOpNPOXfGge8cTkyxCOTEyT1rXT^A zl30?+P@I|yDR~g#=ag9zADmjkP@0#LT9i`>D%*1M%TtRON(%~7VaF*r6`;x- zNJLeykc`SlRgK^YpxLt_9indmlrBhv@IOH53sCh5sSt65NvNy|P+?`DqotJS5i6sV89Sl!2l}ZKxTo|Gk^$?rXo-yEjb_5sI6cqM6|XbK4wVD&(C2<%&P=f zJ((#CMTzAgU2zQ2ak1dGDuae5mh=ttUqMl3UJ1l=ItmP$3<|n-3Jl87YBD+nQu)O) zM8`7ZCKg09C>Q4^LdjSN2d)HCuqrSpL+UUE24#2^rof;K4iE(faE+$GpbRO_6&Pw6 zQu9i46&Mt%8Im$f;)_#Dq8aq`7_32V$jnWNW>7AImX8_?nhFfL;KD7MAr=zK2vW67 zU$so3B(=DtSfRKyIXShsIIT2C57sCaD%FDQRiOW~K&4mPUz5rimto1{TT2iHRoWmL>*CFn7RcLZdz@iN?k$scA-u zCPpb~hQ^lWrpBg57A9uN#s$=$=#%iG7-&p#kAC^#fEEIcAI z3b##&F(?Lx6jMucvov$d6bs`N<3xj$WJ?PJvt;9BGqW_~)U*`P@=7Gz7#QHgUkF1e zVxbt$z`)>IQIMKklA2Zum%C?u7ZD5U3?faEgsic3-xQy9QW zEH?#I*MQ72HcT-~PD?dNF*Hj|wKO(NGB-{(wM;QjHAptFuuO&xyMmO0aZ*aEsZny0 zv0+N8v2m)2nURTUs)1=*Qc6;aSz3}2XgdN}9gIjcF|jZ(G*3)SGcruEFf}qwOExq} zOtmmiOf)k$vc!m=6iY*6gG38MGZRx2%d}JrLkkOY6AJ^gRKsL*149#x^pRq2nQEA9 zY+#X?Xqp5XVN6Z5NKG*_PDwK{G)hUdgt-Go8<-fUS(sWFr5TwRrX(4g8YZWj8JVXV zni{8?rx~PTxIfj{ILRa>CD}6B*dooy(9$y5IMqDK(99$)IoZI}*bEk)FpViDhA9@w zDV7##1_nt+1}3SN76t~EmKLeWX%;3%=BY4uz-WWyWJ7b)B+F!jG{YpbLb8{mzGeej<7;R}_U}$P!Xeo?>K?YG|Hj4vSWpa)vZZ zvm`T1^Az*sBy&q+ixg8M(?p{*W5dM6G($7P6pZ*yHcm@UF-|czGqf~HH8C(SPf1HM zu{29gPBb%5H8jQye?xPV#3W0L6eDx<6w5TzL{l?E!(^jm%QO>1%M{BrxI>@}Q}fi6 zG?PRlqoh>hWJ^=i#AFl8ltiOcBSQo8Bs23wSa^b#GlR6GBpO>L8mFe3rkW+0fXXE! zQ`4lh)HF*|GXp~lOM}F;6bl1$19&_qT3T8fry84?m>ZZ`7@8#}fr?5~b3=0rQ-fq9 zvt-NU6oV8CM7m3}G&MF)HZr!bG)^%xFf;*`Oo=IJ7HMgqn72qxGBC0Is)Z#u z=* zCT8XaX+(w>A>T7FB$`+z8JU=vB^nqdo0*sR^qJc@Gktrhn zL6MV|o&lvYLGc8N8&F(y1qyLcoPk0eBnJw4kQ^xVL2{rN0Lg)30VD^SYXHfC zrW`Cns7anwnaIGEAzaIVgNB z%~Dd+%u*~Z6D?B>QVmj#5|a!~Qq7VqQqqjfOw*DLl8oWuV1!6pAUCBNCmAH0m>5}F zq$L|B8=6=qrX{7BfKzB%lBE$SFQl3nrka?USSDE-nMNnn8Mu! zG7E&063s0P&63hA(hLlf(^3;n3{4D83{p}}Qxa2+jEszv3=E9T3=@ql%?!=W6D^aI zObiXu(##Cgj6ek^BHw|`0%0Q)ixjg&Gs6@k12bcbB#TtjWCJ5JOJjp%<5V*PP}yUg zoN8ifX=aj^W@Kn)o@SPsoSKpXD%_F`%#xw84l)UXlhaI-49ybF%`FnsEQ~Ecu1QWc zwM;cnGBB|;GB!6zGBUADGBixJNHZ``G&M|2OH4K~H83_$OiN9*Off`+qp2ClL}QC2 z12cm}b5p~_WJ@z+3zOs&OJgJR)Fi_s!&GClL?gqrlq7RQLqn6KR0DGpP_r&M**q!D z%s9;~)i5Q|$lN3~B{eB6)!Z!23{+2>8YZR~r5T!7SXv}mnqrja$w>wV=BCDJCZ>tT zrl}T5Nv4Sg#wli&mWjz`rUnM)M&?Gz#zu)r2B|5jDTZdohKUwQW(KB-CdO%Lrb($O z76uk(2IfXdiH51>$;n2>rWQ$wsmY0k#wN)YMy7~#3i2BW8yj01rlq8$q$OLVB%2#s z8k-xKCz_ci877&S8(11!nkT1OBpId{ni(ag8JH#}rKMV=nV5niJk8iFDcLN^z{J!v z(ZbZoASu}-)hx|4E!EOA$uKR|IN8F))Cj|W2A0O4xHV2QH#9UcPqi>kF|;&FOE$MK zN=^aUX=-d}XqaSZZk%MCWMGry8XsS(=$8 z8>d>PC0ZJqn}E^_JpPO=z)gbWGz;TYLt|6()YP;ji=>n^LsJtY3sZv>GqV&6Q1xnN zWRPlNU}}(LYHnznl5Am|W|C-WWSC-XmYiytoN8j8Vvu5JoNSt6VVY)?WRR9-VQgrT zVq{@%o|>9$lxAj}1ZuUVn3$UwnkQNqCYl;s7#o=x64Q)L6Adkm z%?!;GlM<7YO$^PAO)L{rjSNf-jSUTrQq9s5O;Rl^6D`eC6O9ZKEmKodQ_W10Oifda zEfb9lEsZQKjX>!tE!i;9!q_Y+(Ky-2IMFyQH8m+I#l+Mk#l*zO*v!N@In@GGR9Ge^ zTbiULnu7B-yqp8YJqQ~am?T=HC7Y$BBw84y86+Acr>2-Er6yUV8dxNn7@C=yCmWij zrkR*oBpDf5Bw84mTPCF%8yhB?8yF`W8=G31rKK2}CL0Xa~8yK6Kq$Zmg8yXo~Bqti1m|&DI7O9q|mPzKI;>6g{ zI3>{{In5-^+{nVvBrVwx)OJiWH#fITHcL&iOfyeQG&DD|v`kD*Oi41c02QznrUr&7 zMi!Q-CYA;U;F{amFv-#~B{kV3$<)NyI5F8g#n{L)H8sgBCB?|h)WkH^(k#`~G|9r; zBq`O>z!IK*Ktn_f3=C#TCaDI-pa3;9Pf1ELH%>B3H8eFbHAyo_O)^Xb1-K>1+aTXt zq#CE0CYdIhB_+e_gH$sUBMT#wWaBi89<(^L!7G)tqjR8xy2OB2g9 zQ`6M6M3WR_a2%VMS)?SIn8JIdmZ=tIX=!Gbrlz2J$u!Nxz%*JN;9!A0yU%I`QFUZ%rMQ&(j>_!EzLMJ#VpMr*}~W$#VFa#EG5w( z*)$botci(fnt8H83aF85X$UG!;q7QpL(b5^BFWIyBrzq?$S~P5EydK-+{DDv#Khb( zDbY09Jk>lg$=ob8&B)9oH8I5?Ejc;W7~T&zH8D;#voNzrH8e9bOEye2Gch(ZHb_Y` zH#asjPfRrhwE-+l4a^M^O+nRTa#EU^nQ3xTGCUm^$D`D!iRNi($!2L5Noj_uDduKo zU|r^>W{C!7hAC!dMro!N25D&~DXAvLNhX$Qi55mF76yqXNfria7AD3f@Nfm?JrFid zw6riyNi;V}OEoew1@%}=lMT&{Qp}Q4j4ch4QY=hC;cb>`oN5W`J0zKyC8ebrnV1?H zniw0J8pFd0WEKdUnwci1BpN2CrWhF-nOh{MC8njNq@)@cq@*Sq7#f&cnwc0H873wh znWmbgTAEuVCMBC%niv`-rJ9?Vni^oZ&jQpxG630akY-|Onw)BBZj_pwYGRROkYbc- zm}YL0nrvZ^Vrra}Y?^FhZenU~Xkuh&YLS)*YAIX7+r=Qafv|;vfrUv@no(L(qJfc# zxv9C4Sz2n6QF3CEQHq6;p=m0pX#=WPQc^6E(vpmlEeuT!jZDoAjEz#0Q!L==3S<@t zr<#~sn5Cqerde2|nWq?=nYrKDJzn^>Bq7#o{|+YBIcVA#^oEX~Zo%rGt0!rao_#4tJ0%*4zx z$;8;w+%P3ACCSJl$uQB_C?(n0EIG;8$kZg&0u&iW=81_ZhAD;?$mtN&A~8rdGfp%& zO|mdCO*Kg~Pcbkw1m$g0qg0b*BNGeLWK+XLQ-j3B#6(Mzv}7|wOH0#KbHk*h)Kp6g z<3yvxWMgwfV+&(LBQul4lq3`Lv?Q~n6vI>lQ;QVSGy?;0oe6V0hz5;bnOIsFSy-4F znx!RM8kw1xTBey=q#7lgC8k)Uq**4Jn1lLQX~_l_$wsD@W+{p0$)KLRWm2k1l98oF ziiJgTYNDl)d1A78nyIlRDC49V8Ce*co24Myy&$_l*fKHE(g;-08k(ghC7GIo2A2#{ zOjC`MQ&NmTO~sTHV~fO;L}NpPBr^k}BnwMJvs5!ngG6H^Q}ZNqLlcu!)0C7H;}nCG zq@-k1Q_Ex%3lj^26l0SVQ}aYijPz}8o@{AgY-F5bZft1;>a?Up^*hf{xq~OG)*%%2XzV!Oe_tPOe{>zEK}1`lg%wnQjAPMHIu0&s845>Vq}z* zW^SI6n3if}nrxbyl5Av=VxF34Vv=TQoSF(6*h);aut+mAOtv(%G&D*yNls3I_rpM8 z3Bsm^2IfYlmIjF_CdsCTNk-;rX%h2h(8JL@;ni-{~CK_6%rlx_~-YEv4ric+nc!CBk%~On%Of3z~l1xFP zL&gS429_2^MwaF#=9Y%Z#)igeNtUU}$rdJ-sU`+yX-3ATmPRQCCTV6yp!Qy}xq)Sp zrA3m7ags5p&tq(CZe(a?Xl|JZ>h7B(7HOsi28NcFDWD#9igBv3fuXsng{g&^k%eJOa*7c~`I2OA zYG`3YHny|k!WgWX`Gy5X#@&+152}11B)~>BSQ-#a}yJjG;@O#3k#Dp(-Z?E z6N3~Zb3>z4LxWU9L$g#%LrbH?G~;AT!$kAcWK(l96Z2GKOHe1++}Ok*$s{?=#K0m2 zG`eJJX_N*sE;TjT)Hn@e{K_)TGSS$`+|tA((b&||!Xm}YJT)yX*(5E|+{7ZuIN8A5 z9OMvVv&3X`gCrBsKyIp`QKE5*p+Sn7g@s9qfkC2qYMQB~v6-cTv4N?HnNg}`Du|hA zW}a+nXl87d25PFLrC6jT8liL`yTX z)FhJ>Q1BX9n3$v`8YHDA8JL?Jq$V0BC#R%<#+HnYO%u&6jV%)`jSUl%&C-%g(h|)Q zQd1A703aHm&X<}rMoN8)p zYz&IuG)qhKq!eRgvlIi%#3TbFjPlRa%-k~77*u^*q^71O8mC$qfa)j%6B7$?PdPa) z#W)c(dy#CMm;}nNi53RtNy$kmCZM4_L!*>L3-d(NM9Y+9bCa}`R5O!ggA@}Jb3+R= zW25B6R7*3nBm;8`P(RWv%`!FF(9{%EjDp5;jZMsx5#v;#vIB$-OcIUF4O1;lQj^n? zOp`2<%*~UNOf1X{4bqYmEetJ;Qc_Gz&688j(u|GF5)INoW2K;em|?0VC~bg(&C)O} zDb*m^(!$i(0MrpqGDrdSZ7q@wEX<5e%#ut&L&}!P2F3=U5fxB3EzQu-*fPZ|)!Y;# z{UoNPCM6lArkR=;rJ9+VTPB+tBqydAn57t{nwndrS*BT}fYPmDig`-1g^@{$k(sfX z0jMjMW@wQJO7+I6#ztm_hDJt~CKjn_$!VaLN2<9=s)bRik)efUYKlQxl8K2yilK#h znz4nEk-0%~l8LD)Xt+Mb(83g{`~mk!%+oBBjgmkeL<>+hOffSw1NFcS%*_l;Ele@{ zn`tIS21cpI$)*;jMroFY7DkB%CdLM7px%H zLRM*RL9s%9St?}taZX}Yr9w)6Iw-mrEWl$G#ulJlkYs6QWSD4{oSJB6YMBTcoiW5H zABZEXgt@#VE-jDbd0r#n9Nu*f_~JEj7v9#5grI$;bpWd~Rw4 z8rn;;Fif&AN&*c#o12-KrKXsgn<2*ez>a5NU@%HEGdDCgF;1~eGD-!7WlFMTN^%-# z3?|hyE!EI8**w_{RDOUe!K9=#b0eb^6GOv9gH&U)G_z!k{A6O5WC%_%h9*YI#uiDS z-nW5;VNxon6KigsmTF>dWNZl<&oW2@71^M^lbKm^s+onQWr~RbV*DvPHQvb7j3Le3 z(8Ac<6qJxHQVk6(jLnl$QY=!8LCt*7_?)Go1!ySVC=FDJCz)6znHyUgBqqVfx08(x zObiXp%`8j}%u&5%t1p}sYa<5<|)P&DQU(gpvH``fkC2WlBIc~rDsF1l4fXVW}0STY;0_7o|I}}X^{$=9ANyf&8MkYpv$%%$$CduY$peA2ZvZawxqGhs$af-Qla%!S+qG76O zib1lOrKO<(C|Mhs8k-xXBpaH5hGI>O%#19J%`Ht$43Z7aQ;oobmY^nTVxp;`VWMS< zfk9G|C3Joe8eZTM6cSD_($F#uH2Q3AYHDPZXkrHHnwg{;TP7QVdbj3AX33yR#MsEt z*dWEkz&y>uGBGVR)xgrs#M06{%{9DHT*bgSwrmNy%vz7OBRm2FA%IphCnv zHPOP-%p}#+GRe$11vI*9kz{CWk(_K|ln82#z{e?I?y*QrPBbzzFfz9^N=!{QOEWYC z&C?o~nHn3WC7Gv~rx~QArGa|v#)c-Qsb-eu#-QPA1H%+hn;jJMhK5O?83q$Wa>Ff_9S&GcI&nj3T( zEfSNH3=NY_6O)pY6V20%5Bx3{P6if3|vlNqLb3+Tm)YPPuB(r4D2(r0(ib1NeiKQuM zI665g#Vpy}(mX90)c#JfNHVoBN&(HzSQ;6ao28h5x+1W6g3(DSpcI^DkOZ2tFfmRv zOiD~nGEGUdumDXzo2D3=CMH{$m?x&B7@Hb`=Ff~wQ!FhF6I0Di(hQQ!jgkx#L0!Kz zi^Rm_ltk0C-~q<|^~Q;Q^n#AM^tL?dH!LnAZ8G}9E5 zWCL>pBSS-T3zH;MBTx~XWSN?pY>=2@X=VZHN+y{ngWB9F#wLczX=$LL6hnx65XH2C zMUpY7(`=EJVw{>}YG`R-25LDQgG!ksi&RTcH_Xg5#XLDR$;2|nDAm{`%_7mn!YDZj zw8+6IDcQupFgZ0b#nK?v!Zgv+Jjue$#5~#3#3Cup*fiC|#KPRfAj#a)%+xZ?I4L#N z#K_PD6fP-drp76TX-1IvN=<__o){Py4ATq~Elg634a`8J1qMbY#-RSbff1zfo|2es zmSSL@Y?5q|lw@L$al$5k2Lj!X&(2Sggsd;izin&>$Wr`_iLMGMF#LUIni!>~S{Nl8rzII<%$Fn^ znI|QJs!{{fG;^a=GYb>*G~-l5OABMr=#FV}vY8pE?`LjeXa<^;GBiy}0xcRcGDuA^ zF-T4ZjaC_?SeSwq5EvO78G_bTfikAKDQLPh#S}E>Vqj>PXl`a{VPR}yl5AvV461fg zKm#c$#ug}R(Le!2Z2LYnKONGPDbL6($|(S?T?A=ou(U8tHBB>4PBb=1wlFa?u`stV z1`VC3C7Bq5Ch`)K4Gj$pP0cKmERzk5O)X3klT9p)K~wuFW~OGC>!ni7O_EJPjW`P< zLkr`iG|)t^fq}VYvSpgNg@Gw((l61_z&Op&Jk{9H*f=>gEzK}7F*(gB&BVaiz!0PV zo&=gaG&M^}N;9+oj~S+zn}OyMEKQ9}Qc?^}%t2$|mZ_lrm9eFzd8(nAF=!Cf3^d`A zVq%05UP;Mj1}26nDMpEjCI*J7Nok2@sg@QNX6D8whM-A-q?9BRb0g5GC}>i^AkEao zGBMfMG6|gKlM*r7)0PGXCPtPfiJ(b%Qv-`+Qwy`SRB+j2m}FpNZenI`1|ARwjfR5L?^WJ?VH8YQQuB^#xgCz&UuB%2zV zq#9a)CLck=O=)SMX1YD%h!MJj6J0<<1KBePf` zvseMTY*I%dCp9mU#A7?`G-rWt}-o1j5SgG4jXTpl>lBN4%+1qJ!Vso;IS`9+!O znR$shFvlolBo;&6qhPCGY5;W+ctv4)eld7cj4^14J<-U}7&H=TVPKS;Y-D5!nw?HI zOH4F20uN*xn;9e-C0ZIACxWK`QY?*3jSMVOER$0WlQ6==IMqBQ71Vq)wlD#;nG%gt z3{s6u5)%`RERzjPQ!Ol0Qc}##K-HXqu|aCGkx{a_VWL?|l0}kHvSAv=e1b7}RTyZb zBsnS7JjKk=+%PfG)B?1$!Nf4lC^gZ@9Ml^$N(I&OiAm<5kz(Uyvt&a{ixhLi6pZ#M zvE@xlemZz(G&rz|ONvrclk(HSJ#3`F2i>cbYH4B$nlQ3VOtdhwOal$BSQ=TF8d)YK zC#IT!M$0TM%#9P1%ni(wOihgqP18)xKs_ysq*Ty&im{ndnmMRKvoJO_OHBo>6HGKs zGfGTMHUUkT7$qedCz^vM%#)H+EI^I0RLe9=1JIHjL(p_ShW}EGlFTiQ6AhA*%#xE# zEe%XSb&hG0SxPc!*vL33$s*0zI5jQVzzj6CY;0y>VQ!I_YLW~djWSIFwR#OK42(dX zxYQKTnh?+kjY(RXL6V`lWujT4VX8q=lDSEWrI96QHryc5ATcE|$;{Hw%m~yKL~6-F z!YM7)Albwy%?Q*UG%`%HG%-j^1XaZ;mT90BmT8u0hDj;rsg@}QrlzTu7KUb^d8x$Y zRKwI{P)7;WptdwMPfjtlOtLToO=6^2q?snBq^4RJBpD|s8dxNPM!Z2Qoj}VQ3{61! zCOOT*JlWhlCC$JbBmbkuCuRrFJSExG7_>Se*}%lq&?wQ++$1T*%+$a*$->giz&tTE zISJICGcZmuF-QatpC?vQ2A>J8Xz(;Pc&w5@^SQbg;bH?%_-197<15kVycCiF=!+q$ubd? z;VjKllg&X>;EASbrj`a4Ny(;3pmD8aGec8DgQT=%6LV8TV+)hiM01Svm1<#Nl$L6g zXl|UAlnNR_G%>J9GcYwwF)%Sm1WnrkN*P%W(HDgFN1NAH|K@*ROphkbP5ojRR%*Zg!D9to2(HyjJJuxlS zIK>iFDy62F8-bQ;CZ?pAC8il$B$*i*fckny#-L#w6LZkgykyXFB1;RC#54oCQ@5;SI#Xa=fo4U#R442=^F zj8an43{#C#EG;ZS&2cl(u@5P*@ncAMf`*Gg3u=;*Qp}Cbjm!+pj8f7JlFcm4Oj1%3 z%}i5L(^5?>Qqw@~LZd`eGb2#z5VXd|%)l_!Ff|plLd(p^A{AtTrCDOCiGfj~fk9$& zvSn&wlDT=3Ns39bQL2Th5or1uGy`f3T4R-%W}KF6ZfR(onr4bvCksn4CYFgtCdr8w zX`qFd#%5`j#umwjmL?V^DWH*hi!?)H(2S>vMM_E{XeKl{CC$Ll#LzOyFx4<6#nK4W z|42$TN=daaF)*_<1PxgkCnkZ$(hN+^K@ttB}g$aH8f33G&i#_N;FDJ1r3y@faWud zEiKbbl2VOQ)6&dSQVq<_EKE|&4J<7UjZBg)5|b?qlMR#2lR+acMkYy#W){h2Mn*=d z=B5T_MyUoSX{kvDsg@}zrWTfoiDs$BNznO5NPK}xGjj{j(%Uq16C(pdQ%eI-RcMw5 zUdV51lwxFVWNB!WW@2t)kZNdZ0b1*7kqDX-0xd;1OfvhOI!^+t3&^ z9%W);X>5|3WMGnHX<(cPTFGMwn(#31nSna+iH3=$hN*^0 zMy3WSX(@)ODF&&jX&Ce6W(HS<|f9;$w{CQwB)4Zlr+;6&^TaXqJ^nxvXQA- zvXNzyg+;POYKpP3VQQjbqFGX!ak7Plp%GGvZ3Jp8CWDsff- zS*l4=qJ;^#U!7)VX=q}SY>u(M#WK~{$UMn7#Vpm-$k+h1sxui>P^Flsq*|FeTX{4YZuV(8SWnD9IQ!F=2w4J`58R4a_V+j!#TWG)hTHHZn@Jut+ko zG&D9K-93_%P2QbDbeWJ^QCG|)tVnUP7d8K_ZhZU7C>qRfKS+!Vwt5X|=s43^1; zps9Dz0tw5sWK$E+Fp7bNC1`b~MVcvS64S`kBE=Zqk26RDP4F0{7@3+S8G}~*CMKpD zo0uo1nx&b5R)3l%nwXiVrNRAWk(y*=V3B5?YG9gTXaO#%5nH4QX)l$Mxk3L2%bFibKuGETHGO-oBOGBmX`O*4kadz!gnvXQx= zfn~CprBSkBk|}7xL~?49X_94%k%gIQlCimgMG9iim!VOjfvK^vg-N1ivO%(i1!(Om zXsXS~JS92J#4<4@(ab0{37j>+PD(OJH8MytOEoq$G&3_XFtRX9O)&<~*_s=Ia!rzv zVVbF-1$5mbES$~YRPc0=d75d8r9q;lVG^h{ooJYvlxUEg2I`-g zfai>pLGv}qDHaySiI#@OCT5mKmYC~>64R1W%uJbS9t` z;wCAk$)FO**wQH3(!kIn88lx4D%?!WOifKq64OA%gGnN24Pi3o{D+x|Ws0$ZF{lNW znh09JZf=&8W|?Sck(iupVVDFOuQW3>v`92Hv^2LgvjBB=Qw-BmEX`9aQcMjo^SiMH zXqLv*)WSG1G1&~%EJ*>aGcq+dPBl-ov@igz?>9;`NHaD`PEIy9OHH%{l^vi)qp=xi zeJVH-kO)(A6N5w(1B=9DL$f4vBZDLh6B8p7@K&_sB=9Svf}VVP#0 znrN1iYHprrkOZA4gr*zNge8*MAf}N~3TSZO%*@c#*ep3E+1xbQFfAp`G#O+9Xh_pC z&B)x?$P~1~!Z6hWG$3Pco&stP8>A*%SQr?Z8YUZqI<5u=7M7NnF7|o3u1HHMg`h0xfGcGcyNGw1Q^|(vs86(vnim&C|?`O-+o_EJ4}X+`u%& z%+ee@v4W9aK{IIvpcw>HlQauUP!rt}w3H&%+}I-3(#Y7rFx52C(A>bn6jWEFBpW7K zq!=24rpiDA{1!%OiJ<8cGn3?$q+}B_3(WjroM@2>8d5S!O))V|F)=bq1FeEFNwZ8z zF*Y28Nax<$ZEu zQc9Acg`ojxvxm7sqLG26aUy7ia;kx;rKwS}k%h4dXpOaTTAG=Gg^3}kEo)|$1R7~h z0d0aYFiEno0Bry=PBlw1KJ0B!i~LK|{QWCP@}1DQV_rmWie* zsYV872B}7-mMLi_$(Bh;CW$6SW){f?sg}l|?Skee<_3wDW|qm8DF)_7iH3<7<725Q zrl7UH2FVs?DQ4zrpvv3G*eKc9Ajv$*IMvkL+#uBeR9RRgCs`(%B!jvFNrr~T78Z$V zmX<~a;KiCo#-LVytgVv9vHuvq(-dw=gm=Otb_wB0y7I7Urgg z;9X$IW`o#<=7uJTCgw(|si~&sDaHl{CI+C@y=kCDeg?*v>wgT=%)#XmXgn3{9?*U% zP?y8PBn>qG0x}aBTcm)NcUTxCg4U&h_633}2xE&x<78tq3o}!AJqyzVT2yUrX=-X@ znU-RiW@G?bU|^AE0UDG|1MR|rse{pGDWH{%hN+;jY!j0-14Hv9vowQL&~NM4iJhj&@7{=g$cZ!M<~9`42@GkT{)P02*np@*PWrUAw1m@iZ4^p)JY;@ zo|RC18GxG928eYlgyJjF+%Vb97_t7JP<&Zf8l*G` z&A==r1-ecH8gGc^1p~41XOxnXYHpl{(SIg3K26h%Ow27X%P(T%*Ag@fn}*qcCpNwl zO-&PxEYmQ`4`Sm#4YZadH5HzYVd<0D^kAN3YMf?n0dLpB^b?ytQj$$T>qg+|1g4+Z z^pcX6VriI^hEcx~n|@M^l1-Bg%u&;kr4fUPi3w;x-!u)hCdu5~IN8X+EZNA&+{6^L z7r+vuJhe18OH4`w9oJx#Xq0LRD$R@&4HJ_=D-}~yEHV6N0P0{ELr!5ZGEYqdO&J>- zfY%Kfrh>{NSU^B&V#lMCVe?<$EMWvL%RojD@{dU(Xpg!vd_tR$e+(^?LCeJ8?Oa0s zF-c1^H@1MS|AILVkzt8-Uuv2qX#G4!eL$>xK|MxuGtBcGh;@I8WfEu?0CW){%paKP z!7wq&$S}pi*wi!`G}4u3k!ofL8hn;TiArKTmBo0zAj7#N$T zCYc&o7$qhm`dOg317S0>Wb-rw&_dzV)YOy|OVFf0XecWs*$}kY$_O+Mn`~lXZVH-W zG*1LAQ%^|*jWVTyI`5d{Q7NfOsg`MJmY`!sk}MJpjV;U!Oe`!clMO9WO%qK(v+_yi z2C1gT7Urp@=4Pfwmc}W`Nr}dw-l3^E=Kdhi8fQu{$dAa_G%W>mN`y(0g{e7c{N4yO z^=xTwkd_QuJZEGGTE}8;U<_JUWnl_hrjZI7_5qCunk6S$q+*OmCnp-2gZ6Nn7^Ni} zm?Rsfnx-bFnVOpA*DnOYc_rdlSM7+D&CR=Ol6TcjCTBpDePSVH?F z#ksJG!YJ9&60{lzG%*QU17Tolm~3W{mYSSwl$2rwTC{I&VrgQKYGMpJ2EyDd$;iye z%*+_xE=)ByG)=Pvt#vaqOfoVs2JOl;u{23cOtLge0j;J=PE9s7N&{_cH32PXNHH@8 zFA{}?QL<5zp{1F5s+qBAQVM7&3bfPCEX~3UysFv)RDBs67#W!wrkH_N;aHd(gEskE zK-Yn0Wk84hVa73-n5CMTm>GiNKPkx|(Gs*qz``6f1Y!c(;%Z@>oM>)ho@9}hoNSS5 zXkut&X#`$cV{BxWl4fFzF&~#=YLpCW>l!2)CM6prrkWZWn;Dy%ni+!{qvoJF3sZw+ zbHmiMRKsLTGmDfo&~no>GjkKuBm+}p3yk_KEg7`r#lpQs#%&jXzj6O5@;;Z%qY#m(83@s3A6$bv~MTL!~nD=4Yc74w6e||wENP? zEZHR4*gVm~!ZbP6z{tYF+$<&8#3QpuGuZ25H7=mIk0b z8)=E4>7KO2q*OD@WYaX0v^2xiWTPa|rpF{>(4s)lmc!IkLqqd4(6F*$nn|*0QnDdv zZB1gTg^6LZsX=OLvI)H2f`xdRp;0nu%*DbiB{40{&^+11!Z6vwFwxR7(bzJ{%)mG~ z(JTox#$s$_kZfvhY-(y`oMdSZ>g^esrJ0*q7$$*M%A}g65_T4b2P^L91av zQ(6WohM+z9i6+TO$w>w#pxxczzKdZZXxWjOA;x@nQes+?MXI@>L6R|OFCu7{VS)#F#WwI$~T+Spp6|}N9#n>bnR{Sv- zrKBaACZ!k~nI#*6mWqOgA`OgEEG<*bl0ka{6D=*0O+ag-QVl_S>dej4Kvjt$yxo)x z-VSGEZjxeZX=!O-keCWynqp~Y0qXG?nSn;}EkSGRjSVbPQ;f_k%uNkIQ{k}q1<%hy z5C20i%Rp)j6HSd$3=LCEO$`i;Et5cfY|u9HWK)ZjB+Jw!@b>sLLr^X;OH2Wc-5Z&j znHw5frWqJm7@J`3-!wKeF-hleA=03-jb;;}ipnG^0dN;ber_o^xrG^My*sFYFtSWZNlG5N4;LaawY!c@k*)-pn$|%se^S&?wp5Jk{LHG|?c@ z(%jtA1hjV~&B8Jz&Db(6DGhX*je$j~ftf*yIcNe7v;o_~AT7nhJSEZ0#2mEO+QK3! z1+?rr+1Lc0j^Oqso0ym-r z+{QdP#W>M4)i5>9(9*;*IoTo=v}@D^w0b`|#T+zpZ<>^7YG`BzS}|mV*}p;wZ)h0^ za|?(zOEFGNF|tfCGPg7|1kDH;CxVXBGD}G{N;EJwF-I3530#Mk1FlgtY325vFG|gg^oMLK{l$x5BXklS) zYMGK`0$K`dkeX%zp1e;pG&Q!gFg7p-?e0uYN;WVA%}|>pn;0b-8yQ#_CMSWKrsjqQ zDWDTxQb8*PQj9?R@W5LTlZ`CX(m-p+%`B1<(@ad#EKN*OF~&1d;uBg%g4_wi$z~R5 z#+H_bpnA(N%{V0`4KxjAU~X(`o(LLOhN*+m2Fajx{l=j3EY;8ybf`_DDd>QoRM1HW zmYDm~EK^MkQbBVPX-Q_rsg@R|DMpr-NhY9e5JpKBX&C9O#9|OF)#;jelbWkPBH~8 z$v3i0N;C(p)=o7v$LRkXT7ZU&LEF-j4M2mNiKZr?ZM^1b2Bt}ArYRWe(~Lk1Rm=@c zl2R>9EI}*bLBp&`pjFyQ29~K91+G*3v%@or>lYG`Va zoR(~unwnym2y$MsDQJhknF*-jYG7h$nq+B=I2SL?)X>B{CCxlBDH(KVfCZ>DG&C}^ zurxAHHcB!zH#1BEod5<;C#janCKf5?mIlVDiQp*~(1Bp428O1FscFechUTWp25HHl z6{to=7M6*a^W90trk2STpv8VB=4qy8piSpSCdQyqF(Y$h!?ZNBRHNh+&_eHIlQhuU zSxEl|8jhgxt3(T9b0bR=)5NqyQ`2P7V#^fJsa1xCM&?GKh)6WFOffM^O#~f9V1!5) zu=uku1+9%tvjDBYOii>*v`92c12tC7L5I7T8z+PIz<`b|NJ}#{H8n8B7~e9n04+2y zGcrrFG_^D~O*J%6O*Kjb?J2S}wlGfutpQ0k0Ub?YVU(7ZY5@;7nEjwRZQ~?R8z>Rv zRnS7jBy&px3(yocXsx)VX-b-zd2*U%vI*#XF^ut`WKgvaTA-SgmX@5Dm}X&;Xpw9N zI+OskHr^o7ASK1n(in6+Ns?irp`}rhrIDdYk{LXGm>U~f7@8y{nwlAyCWCfanH#5? zB!do6NCch92-@Odnq-`q1n!4h7#o|JgVuxGHEdmtjg$YHDH{Xc3NyrI~@L zsYMcKD#Ic%(b6I*CD}X$JRkr%3DzRb9CXHOBH|n~lSBhkL*rxvkPA%GOie9}63syi z7)&h<%@dO?6I0TRElf>}K-)$wQ$fcWnS+W0#JQGc=1IoMNfs%fY5{Z%qhVU2Nt&Ul zS*n3?lBtoUxkVC4vx&K}5$JdoOG7h@WOFl9Q+Rlqq?uV7TYz?(86+iJSXvsUnHhoB zGlGs6HBU)3PD@NNF)=kWO0obgaszD&GcijsO)^O}F-tQ~HpHl}P0W)mj4jeY6N(mw zDWK!-5)IPQK4WYBq?7Dgr(Mk$7t=1GQ$My5uFNvRf~-RXv)EtQEz$)@I( zNtTuv{XNj(Kq*GXmL{Ns4oyI-8bAlk8CjYpr&$^pfl6Z|Bg2#=Lt~>PW3%LB1JEgJ zrk2Jj#+F8wrWTg)avhc*l2T0!K^tLGQcRQ6lFUKvEF-ftlQfIe)FhB;i6$nN2F8}g z1|Vk|C#RU08m1(rr6e1qB_*XABkC2Hc`2zDX(^_uspg=89up%o(?rlJV^gyYZT-pg3j!&C;^?_tch^B zYOw;6yF;MvEy&NQG&DAV&M&}u4EcGf#Toe}3T3H9nQ4^@$%#2R3TcU%Ij|MN==K+v z=4#{?r|T$Wr&i*$6e+yW^=IZ~mgtujq$HN4>ZgGh|LZDb<|P-U=BDPABnC zX#wcw5oD);1C@~eWVlugufU=*0@MbAHoz(%Y_QQ_BGJ^uEY;X7Db2vt$UNCH#W=~( z%+S;%$->CQ%rrG61=KDuNj6AKHcU%4O#~ek13G@k#3Tt+5G5vK1Ruk_Y+#%W+G$||>I7RRn;V)YnqbZcTY`2%r-F{1O|`HzFi$ZDtvm*8k2XoN0Ihzt zNHVoFO*FGGx3o-4G&BXB_Gpm?I&LQsv=7)6qyB`aA63Zl;;O|8S_(Lh76!;Df#7jIFxWktCqzosFo=d<(KBA z6zhPP;QB)WbY(z@5Qa{72Rsh?BFaces0-C>4KxcWTrlyfg zBU}PufmVbiB_^ekOG8XSkdOjcuQ)j|C$T8EG^fN$p-weTp|n^(zkmS}I1nXJEy(R1 z(8Ut^`NjJA#ql|rd8HMQW=%$FVnKXj4)g*#4E3O^ck~NVi_##f!B&8>0fPZ}juO;f zh=<;F5}yaUN~^pmvm_Oqbr}%MVg^-34JStzg>X-o5D!hL;}{rV!T~|9&Yr=Z{(hPu z5kG&0FxMa_kTR$?#~}AmUst~n1;0>VC)Xg548#moMGari;9yTbcLkUlge1azm>g8U z0z@-J9;V;f$3NIr!70em*%j;x*NBiHM+F9(yv!Us2319dlA_X725>dZfB^Anxh0@$ zSF9AEMGNSdqN36~J%#Yhl#&c^0aQ?wnw(jjnV+XnlAo`TlnLK_kL|vnwA>Q?v|Q*- zC@|Bp*;ksEod-H02~@c1D3oX9=NA++z%+oz&O)^r7((+vMO;p5ib5LbQauIm6=one zgSiX_84Ly}SL#8-+tn}BS0T*NC)CvzVK;~cw-t0r3aF@s8wkBNg+Ygl!JwGo&{hTo zZ36=X1BK8KXNKxp1_fIM(CskQwG7c*47Lm!@H<&hqKg4~f13j2eil%p4Sb;($i?8> zwHOo}5Ru2gz))OL1iBW_N+A<+@tXqJ8K8R~L9WGe-wafPKKLT8%;b1*I6%@iT&N^J zk-;y~k3rWnFO5MPL_iE#`637rO82JfiKU8fo z#A=9Q?B>JeKn$pMD}~IQoYeHh90gGHD-5l)S^}wV74q^+6cWo4Gjl+fUV`eX z?9`&XRLE^ySi&D-fIdhwaw!xK7C@BKAiF>qq8!;iNbko=K^5GVg2?N`igiRffLC1E zsg+0(g5iHO1K=h>0svIJft&%yXvz`xA$2$v^78YNQz4cXr>15zz&nMY%iutpe-m@T z1!OS;1BQ9Ii4~c-rMU{o?uTemC`c`W8eNo{n4FQC!VsU5AD@(ypPUVEwcs=_f+zzS zFv6!OH7zGKxkMjILxLqIl_4pWAsKcl5j=FT#5Yu*J}4VQ6T1dOG=nnu0zCzE|HG95lYVsoNAEdMa@&!)wLG=j8uPF+}Mac@_O91hzhn0WG;f3f8LJ}ji2Msa@ zhH=`D%{)Y(7UVJpXpa_V6qtsZ2Mc9HIAMu9kOo}w2Qxq)#(=~ZWEcdb5sGoz2agxX zUr2Pd6Rj5lK6fXZj4A6&A5Whgo0JY&DTEQd^ z`@p>?EY`u&8^m0M`;a|_q8FF@;?pt{OZ3w+Q*%<{VPOQ}LL8fx8lP5_4==XBZUqrI z%>yra)Q<;K5F-hYr!|Lut4lFwF;zAf+ak zKs%-2*eNa0QwU4U$xKlwNX#rMR!A&LRnRchG1k;k&@j?5(FC`OHB59YG-2r%YK@hG zGvvx%&=Dx0h6SkpP0Y!xf(>_KrXSe-fhnnJiKRIu@t{t8eo zl3;sb1XMrR8%XX;16}b6QiDexq?`ddoWKQPFy!Q?TPdiPLB<9^`Z3}g7Ji`4A-E$~ zk_jE}1}SGKN-a(;Doc%r-mVy*2)+#&ECnVo%!4J6j6@^-;*3NiNZ^B5@t_uCG1>?T z)OrO_1GWf!wY7q0UP@{OtdS2&2>Fl;?TQlf(o+=-^z>}NHbV$_0tdA(5T+=A3M&N$ zP;fKoC?qDAlqTjVfRtFl42EcDfa?d>`>@k(KqL9NiP@=E3JmVf&Q=NuV1!RD)SL-u=2U{!V}|n#1_lOf?q3R4 zFTt>(77`9H*KUQ1A1H;0!?O7in0OgP96V^nz`$@BD&9~55nljuJOcy6BdE9m^j>k8 z`5&R;AE5Ta%x7W*-SsTN@BnJB0Mr~IsQ3q{y%JDyC8)SUCB)tUsJIbSyZ~x1%zP)X zxFo{^XuK;xZ=4N*if;(<1e=fmy#PH2DlQNM5#Ip4_`D4&?vMZxhpC?n6=w*9h{M!x zg^C}DhlrPfZDC+I2NvgNXyAgl9~M3jq2ddm`3~m(FN~1%*5C}ur)t6wgE*NW;v2#s z;=iB)BnK0>hlsy`CM;v9_yR|W_)Vy|2UHw(zjPc_JOU~XyJz|q#9D?7sQ3ct{n5No z@k*#T?0#u+sCXAtoB?{TG(S{)7E~N|KQ$=*fuvSJ#bNhQw}S*37#Maz#bNhS>q5m( zLB(PBQLl!I--3$6?x%*Se+3mUfZkgT?xZp>F#Ljw!|uUe1T}|?84}I{^{!wMCFsTG z63n1<%g?~T2Z=`p4zM(X5=>kSRa^%qE{7^^1`}696?cHzs~`_55f~U&L*vC4Djx6> z;+})hnc--tIR{vv=0Go4Plt(fLd0R|tq3a408NJt5a%=0Ld|z*hM50^4IgfdB`#ox zSU~;t6DqDS86sZB4VGqLXMx0*!6JzG0VasJ0#tm#Jc#%NsC$fAK=CNaa3CF$PhsVc zCsaLyF2uhfP;<(m;t#AK;^(0mU;Ktdjcw602MEUnsX5<{tzk-Yr)=vihqEL!xq3ihKd_> zLClAVzk!MupoxElif=#@{|6O+2^9y`mmnvxvx34|f`OqMV!k6tkb!|g04g4UCN2pT zUw|gA1Qq{)Caw(?H|&9!53|<<%x{E-LlIPb0-AU=R9vASRecLod;^+zFI3!c0z^H` z-f2*A2dFqKe&<8Q8_>j8K*bNBiEo68Gfae-4>M;MRNMhg{4i9!0Zsf2RQv#%_*JMl z!z5Jm??J^aq2i$S7AWYRL&fFM;^jS5JOHX5mfn6q#TTH7GqOR_=La-#E~vP}WQcoU z<_JT@C!mSTK*b-RiK{}z4W^))qX!jlKod8IiXViE!~E+26~6!#how(XsJO#ai1{$_ zAgK5TH1TMtxWY74^(j#C325TEP;rLosOrn0;st2p^-ysYXuLqHO@?-;_yaWc6QJUb zGa%-}{5umW9sm`G<(EZJ@ds$)tD)irGa=@{)Ng@`Gt5F2-wPF=fF^znDy}daRsDIW z_y#ob8&GkFIjHI%Ld6e4#bN$>1r@&l6$kYbKwiR9pw7n1O+T zl^v396QJTS^?XqA2~csEdU2?@23owxL&f(%)x+9p8c^{IP;prLH-w5S%!9ZSCT;~4 zFF+G_hKg^5io?wJfr=l1io?p2P^dV=e2Dol@i?fsB~%<%Kc+*)1EAtC_Y^?I7odq( zLd73K#bM?&LB$ysKX#8%6iZd>PsE3(<04lBk6^EH~5-Pp{P5cs6++i`q9GLpsQ1OFMacHxM;R#gy z0#qEP{w-8IVF{`^-=N|Tq2jRm@jq1j15_Ml4hIJ$-4-r|m;-HQG6+J&8=&Ga^-@rA z#$^!o(B>zDGE`guDh^Yx0~MbL6^Ay@8BC$#3!vgK^>$Ek#pMw5Iicb24i$HW#tW<+ z9T!6`unYhvmEJQ1J~=aaev?02OCg1u+LEz7i@PfF`~PD!u?sd^c451Df~| zsJO#wRP)b5#V4SNUxSK2Koh?Y759h63oN}ohl(4lftU{~4?jS~6QJTSfBl4tZ-9!! zHr_IELel4Bs5mShxuN18pyDudM4;jhYa#Z+#ATu46VSxfpyCgp;;{ayK2%&_9mE`1 zzrX@2ZU7aBr3Xi-_yII=FQ|CHdWbnN^}$f_2T*aC`7uy&h7Az)u<|w)D(-+Lo(C1L zgo?xJ_j0Is2sB<``LrG?-T+k(Grt2Wz7r}AD+eY*#rH$SVd-`jRQv)|92U-tq2dY~ zA?}BXuYrmepowpVif@F9!_40Y6+ZwKhn4@wq2dOcAm+owFF?f?po!mviZgD8sE3*V z2r4cB6^F&kYpD1FH1RJ`af2-ob71QKLd7>i#bM^NaY54U0jM}kJwH@D8X7OK^ehe) z57>%oz5-PIB2*mO&1KMpia&sg!@}7JDsHe1Vh&8)8Y*506^EJQ0u^t7io^1$FI0R3 zns^vg`~jMHJXBm@JH%d?IT=uK2Q=|QsCWUIcokH90h)L-RQw=R99IAKK*b+G#bN#N zsZeo&9T4}x#OFc99ni#=L&XcA@dC?_>tW((>UTiJ7odqBgo_#<58Y-R$6^FTB1uEVE6%T~gQM1cs5mSf44~o*pyIF%n3hoS2Wa9>P;rGr5cj~;dqc$& z(8NQa;tSBkW1->?(8SZA;tGdR&CiF5FM!622sGc7L&X!&)HguI7odrELd7pa#bMzv z2`c^oDh^ABv!UVwMkU+V0-E?&sQ3jm@qbWp#$ynBVdk^* zLeecqIYb=Rui=M^D?ru5%4Z3vcmbNYB2@eUnz$BJT;Mpwe3&`LQ1JvbaT}=k1~hS3 zsQ5>yILw`XP;rJ65c6T}#&D>(1DbdORJ;LAJQFIu6DkfH7cGK{Ux13k++Ph9S2zi= z7be~U6)!*&?}dtQgo?w=p9U2_02PO|8|OpC1)=c*t6!Ew#SKnD?1ib{02N<=CcYCY z&UhN49%k<$sJH-B9M%pz4HaL2CVmAfZg2)-4ov-BsQ5;xIL!QKQ1Js$aag>(hl(?t zg_r{q{{aG`?W{9XF`B!g+|jFmwE&;uFxsBcS387a;0k?n#7- zD?r6z;hzN+-+(4w3>9~{2r&nyz6L6O0V)nNzZEL}0V)nFC;On{3YQ?}z{ICR#RJg9 z7eK`u(8O0l#W$ddZ-R&wfF>>r6+eI` zt_BtVfF`aF6<4^5>K+TIxF=K`77mV3@dT(i%>7aRSgxHdFiVD(WMR6GGqeLYlsB2*ma{tl@40;o95{E1NU2WaB6pyCSGQQfl` zDxQEQz6L7304feEueL(PAE1fvgNjSufS3<+=W(dG0aP4j&IPD=0h;(tsQ3mn@kdbc z4`|}Aq2dNNA@;(`w=Yof1~l=%Q1OFMahN;V1R&|w0U9r`{w5z(`~p-x%zSaExWX+| zdljJK1!&@$Q1Jt3;zm$$f!h#sVC9lERNMe64qeW`-~tsdfQrM~lfF>#2~crsXnhd| z6+aCXht0FZL&YCJ#bMjAGN9rLcTn9^2o*Pkio?vQf{Hsp#igP4Hbcb|pyIFtqcE6FHD>hD&Bx5E(8_7fF>>t6<2tGYK{t2yZ}vH7b<=L zDh}%xm_fxGpz#7rw{}qR4^Z{6abtI=xWPk+z0l=a3;|GaXQ()=JdA{jCqTu6q2Zqd z6+ZwKhoy&XsQ3e@ILtjIP;rJw5PMF^g+oZ$(?oiK4` zAxOFnfQrM+;em?hLd9X@pQ2Fl2B^3a)LuEL_#&t{%wOtI@eNRM*!n;NsQ3k_IBZ|!hEAw>0#qE9-X=lC8=&Ga^|PVk3(&-uK*e`J z#bM#L7Ak%SDh`{E*aj6p0TqXZ=YFX8X{b1C9_j>C`~p-QX3j;Z_yedoY#+%jsJOy2 zNO;OY)5Bw^xE)j+)-Qeo6%T-l%R|+Fg^K4x#bN2~A5?r3G+tow#U>0%w>41pFn{qw z#T%gFuyB@uicf`#!@^AwDn1`74l_p!D!vF!+!!jp0V)nFCvBkO7og&>`py+9{tPM( zODBF%@lQ~3n7!dp@vms&2~hDLXyTbr@!wE!So$x5inBe3#0$*)YN$9TR2g4i%Sxio?QT1614qDh@06c0$G7 zq2jRkIs_FDgo?x5e;O*D02POow^yLz4N!4d{dgBDz6L4|OK;Dh;ya<@F!SF-#rHzR zVfp0;RQwQ{IHL$8eO`cyYeCaF7gU_#1teb7q2j_&aRaD0te%pAiU&Z&VeVIjiq}BJ zVd1F<6@P#hFJ@5j2~hRmONkj680?|q`=H{m^y2{)zW^17xjzsp&hQfAehsMmqoCp% zP;r=hlA+=bP;prOk^>b_fQoBF%_)V7Pk@T+L&fW$;`^cEu<&n(ieG?=!`g=vpyCX# zAnt^zp9vLbg^I({)gq`kKU5sn&RGo={{#(Bm^quF;tEjpc2IZjfr`gL#bM!j6e?Z- z6}N|~KL-`x02Nn*ieHC{UxSLn^4$Zd_)RqNmr(ILP;uD0kxx+Z4^VLxsQJI4;v%mh z;RDO3ETWKfD~2Y{3l*1uio?togNiFa#bNb=JXAaZDh~6n22^|jR2-Hb458u&pyIIf zW(5`h02PO&e`lyT19Tq;tlsp7iYvT<_zR{!1S%c?6^HewVxi)_P;r>Q(xBoCpyIH- zXZcX^J5X_$`U;W6;SaFP;pp0a3fUw z0#qDUKJ0>ue}Ia^;^i<@+~5<$JuvgnK*a-~;;?wR3KcJaio@Ea_n_jHP;pp3dJYw@ zhl<10e}IZlfQrM?;ZLae0jM~v9mpgONuSoxc!8B0Tu|``Q1!5UDhw58hwlG^)u%F0 zaRsP2tlgyw6*q#4!_3!%iaS8XVeT=9iYGwDVeNJYsCXSz99G|XLdBb*;;{NL2r9k+ zDh?apj)samK<6W1`7sG9?hFkFSa@bZ#eJaSuyUpdDxLrphqbq>pyCD4{d6$@HbKQJ zpyDw1cR|H#q2jRcoCFo`go?xBeHK)_A1V%W=OU>145&D){jdruz6dG~vv(6zd^uDc zX8tay_*yjaLs0R}P;ry;!?<1(V19aaaEZkl~ z#UDV`!^R0eLdAbW#bM_Bgo-m(LGm5UUPcK>I_E|c=Y)!jqKOMa#TB69u>P7PRNMh7 z4y)f4q2duxaacHLLd7%C#0{b16;N@Q`z@j3b!g&_Q1J;+ao9MOCscePR2&v=fl%?4 zP;pp!8wnNP02PPDVZ1av_(I2~csEI}bp`r=f|TfQrw7io@J<0V=)(Dh^8zH=yEMpyDw9K7fkvg^I)6{{kw0 z0xAwu{{bpq42>69e0_(CUxccM#ruD#_zkEy%wO!1kbH3uDh?Yz5r>L@ zfr`W8MII{7R0GL(u>Pq!RGbYe4zpJuDlPyOhoxt8sJJ3j9Of^3sJJ#%92P$AP;oP; zIIR5ihl)Ev#bN0@94hXPCLRwJ4}glp>aTRDcoI|`W^X=JJQpes^H(`kycQZSFnjBu z;>Bp{+o0kNP;pp2*asC~02POod()ueyP@K+^fnJFei$ka%a6;T;uoOeuyNpZQ1O>g zahUtJLB&5n#bNQX4=TH(a|1kHcLd8YV#C4(KQc!W2drYC?3TWcCP;oV=ILw`{P;mpO zILw{CQ1Mu(I4r(Gq2ifPaag{Ng^CwI#bNQ73Kg$H6VHW;w?M^V=9fanCqTtv`K1;r zJ{u|y3%6FNcn4a%^gzW|L)F95&lITmgL+6f!^S1%K*iY_AmT9dmq5kEpyIIde+^Vz z0xAw0$JhcDmxhYN;$;t1+yE*LYY!iRiYGwDVdcgdsCWZZ9G0)IK*gs)#bNf|fr`&W z6Mq5~pMxg;1}feM4L6uMpP}OO(bWHjiZ4PFXO@Pf|D|Z++)(iqXyU?9@zrSJ(oper zP;prLSB8pjhKj@7sSOq11{H_Z7sgQWU1;LgQ1N|GahUneQ1Qc1aag|ahKiqtio?_g zL&YyZ#bN5Bq2f27;;?j^3>AM26^G@QY^eAvs5s30VyO5;XuQD8uY!udhpLD9w+Sl# z87dAlzY8k<3r&0yRGhI9lFni2c@|Wh87dAle-Tui9V!lU=PIZ;4^$i$FPos^0#I?- zxZEzNxCvAorv4CA+#D(nbI&QLxFu8^X744axE)j+7CyJ2;%-oJSo!k^Djon8huQlI zDjp0KhnfEgDjoq9hvna2Q1O}2c!8A3;xPAELdEAp#bM?~iBR!9P;r?0OsM#NH1R^H_#vn`%>9*6@sm(-SpI5+ zim!ym3#|Rw0TsUjRS&aw0#y7uR2&v=Goa%4q2jP`SO69O02PO|e^x-n1)3oF2sUoB z0V?hS6^FTV2UI)&Dh?Y@H~nhRD1(e9A?f9sQ5*wI4u7@fQmnW zio?{ufQmCVL);Gww+~Qp0jM}k{STpfQrM+k%x*iv_RYm+Yh1+6;FVQ!`7kcL&YaT#bN2t94fv5Dh@N>9x8qT zP23$S&d>_67pC4HDsF%#9u5^xKogILicdfjPlt*hKoif0ia&&k!`xpE75@MghqdtnkcmSGsKUDlTG+towJ`F0~fTn&PRD1)P_%f*Y12pkgNk2(io?cT??J^sK*eF^KZA-ZbU@q*OV971 z;to)8nEG!}@d7mQe^BuSP;pqiu*pI4#RaH1%p5+bI0M>wFJe&f3D9vx*!-iu9OV3* z35AezY}P;vGGC~;Ln%bu5?VmyLB$ygAmYu?b9?%r;tk~xaRsP3tHJj2Gt5{6S+NGI z*Y-ihSD=Ysgqow^;tZaNI0iNUAynMK3nIQ6TA{v!ihuBjh=cYmgEan!ieE^Ch`U17 zbI3#d%islBp{D_LkO)-#gDXV6KeT{Tg^EvTgNPeJ8~UbD@e6Jcb3o^pf$VjKiYuf; z)PwfPfW(8L;uB&a;-b*-jE9PEh=+*FL&fu<;s(tS@yXC|sE3MwaEI8-4^=-2D!w2B zqW%Tc{qv#X6N(|?lb{)L9aQ|nEQt6Y=s{Y0VB(V@;=iC3^97iA3q*V$)IA@d;tHY= zaW<&Ef1u(9k`VD{&)h-`4S8VN+9OL&fS^^Rj&{OQD4vtN+k>otDxc&!Xe_#(D2y?72gm7 z5x)mD|1eaX;gb{C0MI&b5aT9PJb)1r{wJUl0PmsVAKpXMb3x7d3l*QB3o##b4hzT} zW<^kZ@iQ<$!wt5+R1zwF0PXxbMMX&X7idAuk%g86T2S!~Y7lYIxnLmkO`zsDtb>#f zuy}EVs-I8?N#{GD`PUyR-p~#akApU_VqxNMA^w6!7egvkoZ%Hj9CY3p$le;L_<;~e zIynk;XD?KIgFi%^2Wsyen79W-JOvsrtDxcvz7X+lXn5{|iW{tgxHA!I&Pk~Fg7pyb ziO_WT2`cWe5hA{;8stg_1|B6y_#gNL4IilaiZJnSsN!ZY@h_<2-Z1eWsNxAQ@m~<} z2B`U^F!BGW;$2X2hrg)e^I_sl&~y$pXNwXfJp^z<)SEyn<`Yoy2|^HYTWH7Q4pjVt z97KEzRQ(62_yi4z_zkFf7G+TQNHQ#dmM75SoIzL_VlP7_M76|aVhAApL(($#dR_=J~`^!x{!4iCb_KS9JxpyBWeDlYI9A|4D)4}2;N z3~UV0LWF^VAp&Zzr3%FT8}cFUZ-SFx2&QJvjhYn~yje&|USPD@e4-LP%e}E?L4i#ru3$YibJ`!sFhD=C!_CVc}3l(?Bfrx8B2jZKc z=14%zf#t`EQ1u2;5cO-J0~X7n;tw();%7jS#lXOD7%IM?6(W8M>aTlH@qiYHxFb~j z7u4PZ(DN-}@x`VN2?quqNV&uSb-xr?T!P^Mv^~rK4NpC=I6uPyZisqF>SAE9R)>cF zN=P}s1G*r_3o71l6C!>N+P;c{iVLiOh%bk_GYf3KB*O-1c?B&t7}}uXJJ7@zg2g2m z3JM_ZfraO3sQC|`Lh3bpsQDkD;s;(p#7&{%vKkQgD?EpY&w+|NLB&5jgos;1#S@|8 z29F`)0Z{Q~sCdH@hIEJP#E=02SZx0HWRsDt-ql&afI1!fQ<-5%UQu zJ^@;f2SJ1x7&RgBm;g<;u<;NfsJI3+y}`!iRH5PyP;pp#FxP~HLqRPh{m4Px1G;02 zk%6D#z$QrgXMjdbDAb$-yHLfGVB&{R#q(j}r%=UfVB(ih#XDi*w@}5W!Neb-iZ6zV zzd{w?02OzDw#Q)g$X=*_7gRygVF9!}zX(<@!B7BA|FHS2Cs6ehA|UG1p$m&a!G!I6 z>2F|j1R16TK+-2P`+_NK>RG`30AY;tu0^##@r!vLxExeH`g!AqU~$ZI%U!_cV4f2m zrNzJ?#K6li0eUVvw7Ou(0*iy4i$c_Z#d#SnK+ipX3QdRY+6)W|44CJQ_e0e`D1@YE zX!2p00TsUh6^Gfo1S+184^iI%3Sb5XhMigr41x?23dy7h@Sg{cUu2UZ?6ukq41!D&3>naJ7$VBRunTHV12i0< z&SW?Y7Kf=q(APlbAf3Yx&5jID!RmP#6rkxd6{0#-r8zjzvxEBCgO)>E5K+;tJbY2pcu7q_!@dz~(iPF#kg_|Tsx-tQ)=Vfq!h8xUY zXP7uNzM#jhGrZLRna|5m@C#Be=t1+5FIYX2g-~V^Se%#PLjfe-Vf!odq2dnEaE7gK ztb~ehfTr_&s5vcAaRaD&=&%jLM5y=&sQ5vs`q^M{CRF+G(*B{i=!H$E>hH?>&T(8L^t zZ)A+hwM5~fDK%=dpz#gS z`4|e&RT!b^Fh=8>pz%%7_-1H)b2PpM8sCy3zBnV%ST8#@IXN*qjRATQR)`^-Wdvs# z!&xRU7UZ@vs3u5gF@OVJFWA%F*AdDN1>Hsk5e^02eg$EILmVLk<|1UlChHm*Sy&iD zO@WFS8yc8FMIaV}6q%z785>wyGQe(I)C1*Zu=&LZG4NGNa2469m5|#Dp%)&)B@lNa z!h~Sgj_Jh*IJ&^iLx`4vZj?$aNyTdgBN@g>fiXZgD<&1I7#gHOMPRNlgt^NQ zE&_9xASq%v~_cjbQFF zg1O5GE(LR!5zJjiFn1Zj++_rFml4ceMlg37!Q5p8bC(g!T}Ci>8Nu9T1alY6PGgw6 zjA8CFhPlfat_J2VW0<>)VeT@9xyu;lE@POxjA8CFhPlfa<}PEHyNqG(GKRSeW|axd zT_!MhnZVp-0&|xMTrtdDCNOuIz}#g5bC(IsT_!MhnZVp-0&|xM%v~lhcbUN41+&2v z<}Op1yG&v3GKIOz6y`2dxGtExOkwUag}KWV<}Op1yG&v3GKIOz6y`2dn7d42?t&R? z26LAg%w1+McbUQ5Wd?JX8O&W~aP2U6nZev;26LAg%w1+McbUQ5Wd?JX8O&W~Fn7Vs zGl#j$9Of=_n7hnj?lOnD%N*t|bC|o#;pV{HWe#(fIm}(=Fn5{5++_}PmpRN`<}i1` zjIn^Z%L3*u3z)ksVD7Sjxyu6PE(@5uEMV@kfEx&Nmj%pS7BF{Nz}#g4bC(6oT^2BR z!E{@~++_)KmnF0PrNP{l26I;$%w1_PccsDHl?HQH z8q8g3Fn6WF+?57(57cg0Yr+WD3^Ou-I?u=et_12lBLk@Oj0~X8GctfW&&UAkJR<|B z^Nb9j&NDKAI?u=e>O3O@sPl{rpw2TgfI80z)(nF+Zj4~fFe6wq%*YVtE?6_n2-XZU zf;Gd8V9hWiSToEB)(kU(HN%Wx%`hWaGt3Cq3^Rf?!;E0fFe6wq4A#~%f(IPjr3fil zc)^-sMzCg>5v&5v&T)j9|?$BUm%c2-XZUf;Gd8Okn8?)(kU(HN%Wx%`hWaGt3Cq3^Rf?!;E0f zFe6wq%m~&DGlDh4;4uPgh8e+{VMefKm=UZQW&~@78Nr%ipbj6nGh+m6h8e+{VMefK zm=UZQW&~@78Nr%iMzCg>5v&5v&5v&5v&ctqss`^=rV#ex{P3rE+bf@%Lvx!GJ-X_j1pm`JFL-V z1Z!&_Wj9_goBUoF@2-emzg0;1bU~MfUSX;{o*48qDwY7|3Z7m~M zTgxa3R@uPXT1K$8mJzJ21utJ=Z7m~MTgwR6)-r;%wTxhGEhAW4%LvxiGJ>_Wj9_go zBUoF@2-emzg0;1bU~Mg_Wj8b5gGn|GtWsG1=EF)MG%LvxQGJ-X+ zj9^VHBUls52-d_hf;F*>U`;F|SQE<#*2FS`HL;9fO)Mi=6U!(S)|7$MFn7V4SVpiW zmJzIpWdv(t8Nr%ZMzAK95v+-21Z!eJ>r_~k3ae3J6)LPgg;l4p+7woq!s=33RSK&~ zVHGK?9)(q-uv!#WiNfkoXl)IvL17grtp0>mpRn2!R(ZnePFU3mt2tp6C#>FtRhzI{ z6IN-$>P%Rb39XZ16(+2{gjJWY+7eb-!s<#>XcG}uQ^G1rSUm}=CSkQCtdfM)k+3Qf zRzpIKgVm3)>Je5u!YW5t-3Y51VKpPHVuaO;uxb%jE5a&8Se*!~5@9tWtU`p=udwP6 zRvW@9Ls(r1s|sN?A*>>V)q}8V5LOGqDnVEs2&)2NH6W}4gw=o0S`=3M!74vk-3P1s zU^O4C;)B(Duxbxh>%l5LSe*x}@?bR{tiprUcd+UXT35mM&Rp2CKnf zqXw{w3|5apYdTmh2CKwibr`G)gVkWL3Jg|%!KyDVnl=u!;*-Z^5c9 zXvGGrv|x1>tjdDbSg;BUR$sxYD_Cs>tE^yk6|Aa))l{&G3RX|Sswr441+Bhdbrh_M zg4Iy43JO*~!Kx=%?F6fwV09C$YJ$~Fu!;#*FTtuMSgiyb0Dx9buulDl_v+;P!#|1^JnIB~aIa_=Tm3 zC8JZTPA2?|3b z6G{q-GV@B(z-r5(?DYKN61`w2|A=@)1_av(iEWI;Hi57~{x3=`E@ntC%1SxY#tq$n}3I4!>@7cK&s!(_-vEKAJM3vhIC@$_?t^1w5eP&ULEh$^U- z%zQma2&CpE=clBm#DhZ)AzGZASb!l4R+E*X=Vrl>m7y2pAL{4g?C%#G;^-F=ALSb4 z4-y3h2Z)B)nU$djwJjCpEc5FR?g2 z)69ec#w|+CNi4}MOO1ynF;LtmCKc!Bl$NB%7bTX%6+*%cymSG~EMh3iEJ)2w(F^hn zaP@ToCD(XA18jnZSOkNxsSLtUX=Z@MOpqWpm6&Fl8N?&ZgoJ~xk&&UPIm|_HG0*@4 z)IV@BV@tR#a4}N@3x=Z7ypqh^RK3Ka^y2t<1h=?2wFtVP!O#dUoRnXhmr@*`oRONG z9iLiMlwYKmk(if~lM3PJ8o*Viq^2d7=9I)If(^>d&x=n>%*-h*N`*u}%vzYToc#3k zRA|ybmn%ulMNU58grsY1Y+#CE8JfzpqSRE7LNh`NLF+f*YGCVqpdLUo6THX;=EB^> z?9}+goXqsR)D&GKb3;pn|MQFE!6^%FY(ZjPW-@{YDuuvhJDN~(VopwKQ9L-WfJ#J| zRp6p39wnEfN`dnMG%_KIp`{+GGEka_TUnG^oLW?t8lO^`mzbNG3@Ju+4NZ(KP2g%E zro^Wf!bLzvAjK;47u5u91PEp%DX$ z0BGbHEC3=*&Em5m(jZHYz!ARH8g_hg{6A~LjzNYJX{1cOkSL8 ztOqWO7(gtD6hm=IQF4A>nO=OFp&59U6OxFr5xR((393k9K|yL>N_R18vG z!i-PJOh;A&svHta;?YDii$V2xDkz`irKW=mI+&^PDXGbsxrsS?#Tl7tCGk0_X(c$M ziZatPz;danN%`q|0iGar5O#1#kgKbczk9qR7BOdpScqdNf&-2~1h=>(F+J4?!G{K8 zNosLPd~$wKYJ750WkE^4UWjXONPKdBXgpFC91?^@Wm0Nhaz<`qQFc6RSq)K&U^NY1#ds8@q=M?<_>9yFVy^>jv+DK1GY0%>*k3ypX6fSTap z62uVi?&I&|=o9bn<`(Q40%;e4OwGwmN{&x1E(I?HWdPMg4i4@}-#h2z4gR2^b^z<^&aC^^nFwJSGQ`K16qV*B7pG;U88O7iLyKpKO{oACrN5D9QZr4;AKLs}aQ@$ul`F$Os^xu6nZqM->xyr+MB zaY;&MUVLeBY6?SqJlIK~r~o%5<5P0ti&DY$Ybwa_lFa1zg3MHKm>Mz^rGlFm2m>Mh zPAV=2sRbtiP#B~cWx&G#9K_%N%grxKMc0{@Sy7r-oRU_O2?}kftK;KUG7^h3Qj0+G z0aK9zQjwNf0agoYI-?sE;_D1gw4iu{Bo%OUrhuc9L9e(nwXigC3~m4blK*737pK=z)V5~L;M6fr^PMu4^^ zK$p!kJYa&Xi+=zWfSub5vjn6T#s<-#^DseY+(4Bx{DJEK0~LUsp9E41!m#}aAT|ht z&Lv0IufPnkA9lV2Y~K(_EeNCQ2ko-@_WyrA)H((SsD9YKOqly&`v_p`=s{+IFlavo zXwNN7e*#p00(8F~2h_u$V+ue_n10y)#V`g2@YX(<{tOm~`!k>poeHu934_c);xfcB zFfjZ_a{oW5{(n&YuyfO3?uXd}qq7+p82%yYmtck1F9Fp6;eqx5gZ4i$z_y*iolwQV z06q!@atoMxC<1% zV5QLgCa{Z&LFp4L4ke($0_8C^&wF41329h9gy@FEHH;0Sx1sAdhU~L@U<}a@I`;{r4u&D3FdhQ~D1Jd=%rKAT zLG&{~4^DvX6NKqNcmFX41_sbpU1)Y=fbYYD>Iaz((+i?ud>DO+fdRDJ37iMP@=*IZ zh}3_N0g^Xh_6tDu3qbWhfM!@&`h?jF^T%^&_`&pl$cOm;9V8CJAKXAP3=9`w7fnDVVD>_}pzGn_X$K|-q7M{9^mC$VK;tq10GGea?*IS* literal 0 HcmV?d00001 diff --git a/tests/core/encoding/test_core_json.odin b/tests/core/encoding/json/test_core_json.odin similarity index 64% rename from tests/core/encoding/test_core_json.odin rename to tests/core/encoding/json/test_core_json.odin index 702086ea2..60e71bf72 100644 --- a/tests/core/encoding/test_core_json.odin +++ b/tests/core/encoding/json/test_core_json.odin @@ -9,32 +9,30 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - + t := testing.T{} + parse_json(&t) marshal_json(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 { os.exit(1) } diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin new file mode 100644 index 000000000..5b8ccdc2a --- /dev/null +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -0,0 +1,81 @@ +package test_core_varint + +import "core:encoding/varint" +import "core:testing" +import "core:fmt" +import "core:os" + +TEST_count := 0 +TEST_fail := 0 + +when ODIN_TEST { + expect :: testing.expect + log :: testing.log +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} + +main :: proc() { + t := testing.T{} + + test_dwarf(&t) + + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } +} + +@(test) +test_dwarf :: proc(t: ^testing.T) { + for vector in ULEB_Vectors { + val, size := varint.decode_uleb128(vector.encoded) + + msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) + expect(t, size == vector.size && val == vector.value, msg) + } + + for vector in ILEB_Vectors { + val, size := varint.decode_ileb128(vector.encoded) + + msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) + expect(t, size == vector.size && val == vector.value, msg) + } +} + +ULEB_Test_Vector :: struct { + encoded: []u8, + value: u128, + size: int, +} + +ULEB_Vectors :: []ULEB_Test_Vector{ + { []u8{0x00}, 0, 1 }, + { []u8{0x7f}, 127, 1 }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3 }, + { []u8{0x80}, 0, 0 }, + { []u8{}, 0, 0 }, +} + +ILEB_Test_Vector :: struct { + encoded: []u8, + value: i128, + size: int, +} + +ILEB_Vectors :: []ILEB_Test_Vector{ + { []u8{0x00}, 0, 1 }, + { []u8{0xC0, 0xBB, 0x78}, -123456, 3 }, + { []u8{}, 0, 0 }, +} \ No newline at end of file diff --git a/tests/core/hash/test_core_hash.odin b/tests/core/hash/test_core_hash.odin index f68767612..607642339 100644 --- a/tests/core/hash/test_core_hash.odin +++ b/tests/core/hash/test_core_hash.odin @@ -15,14 +15,12 @@ when ODIN_TEST { log :: testing.log } else { expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) TEST_count += 1 if !condition { TEST_fail += 1 - fmt.println(" FAIL:", message) + fmt.printf("[%v] %v\n", loc, message) return } - fmt.println(" PASS") } log :: proc(t: ^testing.T, v: any, loc := #caller_location) { fmt.printf("[%v] ", loc) diff --git a/tests/core/image/test_core_image.odin b/tests/core/image/test_core_image.odin index 2171a0d92..52005d915 100644 --- a/tests/core/image/test_core_image.odin +++ b/tests/core/image/test_core_image.odin @@ -32,23 +32,21 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } I_Error :: image.Error diff --git a/tests/core/math/noise/test_core_math_noise.odin b/tests/core/math/noise/test_core_math_noise.odin index be89d076a..a0360e695 100644 --- a/tests/core/math/noise/test_core_math_noise.odin +++ b/tests/core/math/noise/test_core_math_noise.odin @@ -13,23 +13,21 @@ V3 :: noise.Vec3 V4 :: noise.Vec4 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index ef31f91db..3837436bc 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -10,34 +10,31 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } - main :: proc() { - t := testing.T{} - test_parse_demo(&t) + t := testing.T{} + test_parse_demo(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @@ -50,4 +47,4 @@ test_parse_demo :: proc(t: ^testing.T) { for key, value in pkg.files { expect(t, value.syntax_error_count == 0, fmt.tprintf("%v should contain zero errors", key)) } -} +} \ No newline at end of file diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index c1f9603fd..70da1a73b 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -9,59 +9,57 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - test_index_any_small_string_not_found(&t) - test_index_any_larger_string_not_found(&t) - test_index_any_small_string_found(&t) - test_index_any_larger_string_found(&t) + t := testing.T{} + test_index_any_small_string_not_found(&t) + test_index_any_larger_string_not_found(&t) + test_index_any_small_string_found(&t) + test_index_any_larger_string_found(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @test test_index_any_small_string_not_found :: proc(t: ^testing.T) { - index := strings.index_any(".", "/:\"") - log(t, index) - expect(t, index == -1, "index_any should be negative") + index := strings.index_any(".", "/:\"") + log(t, index) + expect(t, index == -1, "index_any should be negative") } @test test_index_any_larger_string_not_found :: proc(t: ^testing.T) { - index := strings.index_any("aaaaaaaa.aaaaaaaa", "/:\"") - expect(t, index == -1, "index_any should be negative") + index := strings.index_any("aaaaaaaa.aaaaaaaa", "/:\"") + expect(t, index == -1, "index_any should be negative") } @test test_index_any_small_string_found :: proc(t: ^testing.T) { - index := strings.index_any(".", "/:.\"") - expect(t, index == 0, "index_any should be 0") + index := strings.index_any(".", "/:.\"") + expect(t, index == 0, "index_any should be 0") } @test test_index_any_larger_string_found :: proc(t: ^testing.T) { - index := strings.index_any("aaaaaaaa:aaaaaaaa", "/:\"") - expect(t, index == 8, "index_any should be 8") + index := strings.index_any("aaaaaaaa:aaaaaaaa", "/:\"") + expect(t, index == 8, "index_any should be 8") } From e76a5d8e12ae3d6e8e75e8df53a30bfbcc66b829 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 18:07:16 +0100 Subject: [PATCH 2/7] [varint] Add signed LEB128 encoding. --- core/encoding/varint/leb128.odin | 96 ++++++++++++++++--- .../encoding/varint/test_core_varint.odin | 47 +++++++-- 2 files changed, 119 insertions(+), 24 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 0c314b3f8..7640ba1fb 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -6,21 +6,31 @@ Jeroen van Rijn: Initial implementation. */ -// package varint implements variable length integer encoding and decoding -// using the LEB128 format as used by DWARF debug and other file formats +// package varint implements variable length integer encoding and decoding using +// the LEB128 format as used by DWARF debug info, Android .dex and other file formats. package varint -// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. -// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. // In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. -decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { +// Instead we'll set limits on the values we'll encode/decode +// 18 * 7 bits = 126, which means that a possible 19th byte may at most be `0b0000_0011`. +LEB128_MAX_BYTES :: 19 + +Error :: enum { + None = 0, + Buffer_Too_Small = 1, + Value_Too_Large = 2, +} + +// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. +decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { more := true for v, i in buf { size = i + 1 - if size > size_of(u128) { - return + if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + return 0, 0, .Value_Too_Large } val |= u128(v & 0x7f) << uint(i * 7) @@ -33,25 +43,26 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { // If the buffer runs out before the number ends, return an error. if more { - return 0, 0 + return 0, 0, .Buffer_Too_Small } return } // Decode a slice of bytes encoding a signed LEB128 integer into value and number of bytes used. -// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. -// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. -decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. +decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { shift: uint if len(buf) == 0 { - return + return 0, 0, .Buffer_Too_Small } for v in buf { size += 1 - if size > size_of(i128) { - return + + // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. + if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + return 0, 0, .Value_Too_Large } val |= i128(v & 0x7f) << shift @@ -64,4 +75,61 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { val |= max(i128) << shift } return +} + +// Encode `val` into `buf` as an unsigned LEB128 encoded series of bytes. +// `buf` must be appropriately sized. +encode_uleb128 :: proc(buf: []u8, val: u128) -> (size: int, err: Error) { + val := val + + for { + size += 1 + + if size > len(buf) { + return 0, .Buffer_Too_Small + } + + low := val & 0x7f + val >>= 7 + + if val > 0 { + low |= 0x80 // more bytes to follow + } + buf[size - 1] = u8(low) + + if val == 0 { break } + } + return +} + +@(private) +SIGN_MASK :: (i128(1) << 121) // sign extend mask + +// Encode `val` into `buf` as a signed LEB128 encoded series of bytes. +// `buf` must be appropriately sized. +encode_ileb128 :: proc(buf: []u8, val: i128) -> (size: int, err: Error) { + val := val + more := true + + for more { + size += 1 + + if size > len(buf) { + return 0, .Buffer_Too_Small + } + + low := val & 0x7f + val >>= 7 + + low = (low ~ SIGN_MASK) - SIGN_MASK + + if (val == 0 && low & 0x40 != 0x40) || (val == -1 && low & 0x40 == 0x40) { + more = false + } else { + low |= 0x80 + } + + buf[size - 1] = u8(low) + } + return } \ No newline at end of file diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 5b8ccdc2a..63a9d1d72 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -4,6 +4,7 @@ import "core:encoding/varint" import "core:testing" import "core:fmt" import "core:os" +import "core:slice" TEST_count := 0 TEST_fail := 0 @@ -39,18 +40,40 @@ main :: proc() { @(test) test_dwarf :: proc(t: ^testing.T) { + buf: [varint.LEB128_MAX_BYTES]u8 + for vector in ULEB_Vectors { - val, size := varint.decode_uleb128(vector.encoded) + val, size, err := varint.decode_uleb128(vector.encoded) msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) expect(t, size == vector.size && val == vector.value, msg) + + msg = fmt.tprintf("Expected decoder to return error %v, got %v", vector.error, err) + expect(t, err == vector.error, msg) + + if err == .None { // Try to roundtrip + size, err = varint.encode_uleb128(buf[:], vector.value) + + msg = fmt.tprintf("Expected %v to encode to %02x, got %02x", vector.value, vector.encoded, buf[:size]) + expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) + } } for vector in ILEB_Vectors { - val, size := varint.decode_ileb128(vector.encoded) + val, size, err := varint.decode_ileb128(vector.encoded) msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) expect(t, size == vector.size && val == vector.value, msg) + + msg = fmt.tprintf("Expected decoder to return error %v, got %v", vector.error, err) + expect(t, err == vector.error, msg) + + if err == .None { // Try to roundtrip + size, err = varint.encode_ileb128(buf[:], vector.value) + + msg = fmt.tprintf("Expected %v to encode to %02x, got %02x", vector.value, vector.encoded, buf[:size]) + expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) + } } } @@ -58,24 +81,28 @@ ULEB_Test_Vector :: struct { encoded: []u8, value: u128, size: int, + error: varint.Error, } ULEB_Vectors :: []ULEB_Test_Vector{ - { []u8{0x00}, 0, 1 }, - { []u8{0x7f}, 127, 1 }, - { []u8{0xE5, 0x8E, 0x26}, 624485, 3 }, - { []u8{0x80}, 0, 0 }, - { []u8{}, 0, 0 }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, } ILEB_Test_Vector :: struct { encoded: []u8, value: i128, size: int, + error: varint.Error, } ILEB_Vectors :: []ILEB_Test_Vector{ - { []u8{0x00}, 0, 1 }, - { []u8{0xC0, 0xBB, 0x78}, -123456, 3 }, - { []u8{}, 0, 0 }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x3f}, 63, 1, .None }, + { []u8{0x40}, -64, 1, .None }, + { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, + { []u8{}, 0, 0, .Buffer_Too_Small }, } \ No newline at end of file From 76b10b5f5dd17b2c4e80f391883ec42500a85875 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:28:55 +0100 Subject: [PATCH 3/7] [varint] Add additional LEB128 tests. --- core/encoding/varint/leb128.odin | 8 ++- .../encoding/varint/test_core_varint.odin | 62 ++++++++++++++++--- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 7640ba1fb..898c6af67 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -10,6 +10,8 @@ // the LEB128 format as used by DWARF debug info, Android .dex and other file formats. package varint +import "core:fmt" + // In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. // Instead we'll set limits on the values we'll encode/decode // 18 * 7 bits = 126, which means that a possible 19th byte may at most be `0b0000_0011`. @@ -29,6 +31,7 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { for v, i in buf { size = i + 1 + // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. if size == LEB128_MAX_BYTES && v > 0b0000_0011 { return 0, 0, .Value_Too_Large } @@ -60,8 +63,8 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { for v in buf { size += 1 - // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. - if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + // 18 * 7 bits = 126, which including sign means we can have a 19th byte. + if size == LEB128_MAX_BYTES && v > 0x7f { return 0, 0, .Value_Too_Large } @@ -86,6 +89,7 @@ encode_uleb128 :: proc(buf: []u8, val: u128) -> (size: int, err: Error) { size += 1 if size > len(buf) { + fmt.println(val, buf[:size - 1]) return 0, .Buffer_Too_Small } diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 63a9d1d72..813c52018 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -5,10 +5,13 @@ import "core:testing" import "core:fmt" import "core:os" import "core:slice" +import "core:math/rand" TEST_count := 0 TEST_fail := 0 +RANDOM_TESTS :: 100 + when ODIN_TEST { expect :: testing.expect log :: testing.log @@ -30,7 +33,7 @@ when ODIN_TEST { main :: proc() { t := testing.T{} - test_dwarf(&t) + test_leb128(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 { @@ -39,7 +42,7 @@ main :: proc() { } @(test) -test_dwarf :: proc(t: ^testing.T) { +test_leb128 :: proc(t: ^testing.T) { buf: [varint.LEB128_MAX_BYTES]u8 for vector in ULEB_Vectors { @@ -75,6 +78,46 @@ test_dwarf :: proc(t: ^testing.T) { expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) } } + + for num_bytes in 1..uint(16) { + for _ in 0..RANDOM_TESTS { + unsigned, signed := get_random(num_bytes) + + { + encode_size, encode_err := varint.encode_uleb128(buf[:], unsigned) + msg := fmt.tprintf("%v failed to encode as an unsigned LEB128 value, got %v", unsigned, encode_err) + expect(t, encode_err == .None, msg) + + decoded, decode_size, decode_err := varint.decode_uleb128(buf[:]) + msg = fmt.tprintf("Expected %02x to decode as %v, got %v", buf[:encode_size], unsigned, decoded) + expect(t, decode_err == .None && decode_size == encode_size && decoded == unsigned, msg) + } + + { + encode_size, encode_err := varint.encode_ileb128(buf[:], signed) + msg := fmt.tprintf("%v failed to encode as a signed LEB128 value, got %v", signed, encode_err) + expect(t, encode_err == .None, msg) + + decoded, decode_size, decode_err := varint.decode_ileb128(buf[:]) + msg = fmt.tprintf("Expected %02x to decode as %v, got %v, err: %v", buf[:encode_size], signed, decoded, decode_err) + expect(t, decode_err == .None && decode_size == encode_size && decoded == signed, msg) + } + } + } +} + +get_random :: proc(byte_count: uint) -> (u: u128, i: i128) { + assert(byte_count >= 0 && byte_count <= size_of(u128)) + + for _ in 1..byte_count { + u <<= 8 + u |= u128(rand.uint32() & 0xff) + } + + bias := i128(1 << (byte_count * 7)) - 1 + i = i128(u) - bias + + return } ULEB_Test_Vector :: struct { @@ -85,11 +128,13 @@ ULEB_Test_Vector :: struct { } ULEB_Vectors :: []ULEB_Test_Vector{ - { []u8{0x00}, 0, 1, .None }, - { []u8{0x7f}, 127, 1, .None }, - { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, - { []u8{0x80}, 0, 0, .Buffer_Too_Small }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, + + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, } ILEB_Test_Vector :: struct { @@ -105,4 +150,7 @@ ILEB_Vectors :: []ILEB_Test_Vector{ { []u8{0x40}, -64, 1, .None }, { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, { []u8{}, 0, 0, .Buffer_Too_Small }, + + { []u8{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e}, min(i128), 19, .None }, + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, max(i128), 19, .None }, } \ No newline at end of file From 52e60526effe7c8265f4a60e87abd9fc69ce9332 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:32:30 +0100 Subject: [PATCH 4/7] tabs. --- tests/core/encoding/varint/test_core_varint.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 813c52018..093b043d7 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -129,12 +129,12 @@ ULEB_Test_Vector :: struct { ULEB_Vectors :: []ULEB_Test_Vector{ { []u8{0x00}, 0, 1, .None }, - { []u8{0x7f}, 127, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, - { []u8{0x80}, 0, 0, .Buffer_Too_Small }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, - { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, } ILEB_Test_Vector :: struct { @@ -149,7 +149,7 @@ ILEB_Vectors :: []ILEB_Test_Vector{ { []u8{0x3f}, 63, 1, .None }, { []u8{0x40}, -64, 1, .None }, { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, { []u8{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e}, min(i128), 19, .None }, { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, max(i128), 19, .None }, From 26ffec845ba0212e838657320ac70ab464b2bd3e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:38:36 +0100 Subject: [PATCH 5/7] [crypto] Remove unused `mem` import for siphash. --- core/crypto/siphash/siphash.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/crypto/siphash/siphash.odin b/core/crypto/siphash/siphash.odin index 63576551c..a6c75f315 100644 --- a/core/crypto/siphash/siphash.odin +++ b/core/crypto/siphash/siphash.odin @@ -14,7 +14,6 @@ package siphash import "core:crypto" import "core:crypto/util" -import "core:mem" /* High level API From 2a41814985f99d76ca07b48896eb79a1e2b4dea9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:56:42 +0100 Subject: [PATCH 6/7] [varint] Tighten max input bounds. --- core/encoding/varint/leb128.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 898c6af67..476b9c2c9 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -32,7 +32,7 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { size = i + 1 // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. - if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && v > 0b0000_0011 { return 0, 0, .Value_Too_Large } @@ -64,7 +64,7 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { size += 1 // 18 * 7 bits = 126, which including sign means we can have a 19th byte. - if size == LEB128_MAX_BYTES && v > 0x7f { + if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && v > 0x7f { return 0, 0, .Value_Too_Large } From 64705ddd1df8c6c63a971b01d6a832d1eb75ae56 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 20:08:56 +0100 Subject: [PATCH 7/7] [varint] Add doc.odin --- core/encoding/varint/doc.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 core/encoding/varint/doc.odin diff --git a/core/encoding/varint/doc.odin b/core/encoding/varint/doc.odin new file mode 100644 index 000000000..dd068b261 --- /dev/null +++ b/core/encoding/varint/doc.odin @@ -0,0 +1,27 @@ +/* + Implementation of the LEB128 variable integer encoding as used by DWARF encoding and DEX files, among others. + + Author of this Odin package: Jeroen van Rijn + + Example: + ```odin + import "core:encoding/varint" + import "core:fmt" + + main :: proc() { + buf: [varint.LEB128_MAX_BYTES]u8 + + value := u128(42) + + encode_size, encode_err := varint.encode_uleb128(buf[:], value) + assert(encode_size == 1 && encode_err == .None) + + fmt.println(buf[:encode_size]) + + decoded_val, decode_size, decode_err := varint.decode_uleb128(buf[:encode_size]) + assert(decoded_val == value && decode_size == encode_size && decode_err == .None) + } + ``` + +*/ +package varint \ No newline at end of file