From 6d7217f37a241c688e4734d7b8f6904299cadd2b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 15:40:00 +0100 Subject: [PATCH 01/14] [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..bW8EMSp7Qw|AOrFSH{)UB5#v zb!G}3dikXn9x?jR%P$^v`K4FRnmuav*dsSg>Gu#?moJ`h@|mGGw)}DY z>bu^Ua7y>#7ks7Sh>EYCaN!-&TRKRdc=Qp!-<;_FKb7t5N0N5m4)drT&`0cmK4Ay+ zVLPB-484GVAO9QxVSDgVbP*+An{vt2>gr3cm@48GSABhIXv!4Hm@>2af*I9QuDIaRD?`&} zOr0vhS6IPQrd)ExRaZKODWMa}6UR-Ma@ZjyqXT$kA3W@kF{sKo_UE7e(>(Bz#2_eJl?qG!*8VO5r2 z^HKife+shbzR#(wFpDmK^gqQ}bQAAf!PqRii)5xGo<+Aa*;eqf=t1NUg(|Y>yZVj( zH~p^#{%e8%THwDH_^$>2Yk~h-;J+65KVyOQk$pFNwQuKn_2JBvypT6HRo$<*)2n?f zZ@KA1@0eF0_l|sx@5qQaNcrh1%XIbf8Tq{O+OlRkO@5W~+Nx$!CjW%;+M;HfO@5j3 z+7f4)On!;-+Nx$6P5wdUwKdMvnEWr5*OoO?MPB-rypu>ibH0~+#jAa-yW)&QN2>9r z6GC1`TY*VBsx}`V>K(c}_5R){{^ipSiHxX2LMYVOvSPg#^2Y1CdXE;7)a8M#BJ_4m zYg|4pU{-&Z8vZ%&nk3onwY__+*VfbD%W3zX*;+lgPr@!v!pG~Y{hIMpUtw=OYmYO% z6{=tX<@bSOFJE&oJ&;$L@bpu?G^Upc+>;T&(=#z@^A(l)u?OMc|lAM4f6V$k;R z>QBl`f0KemIn`Ht^%JAsQ4^xGF7fJb90o^$SARO`Nd;-0`(QcQ8~3;BaIbTRPojQz3G4R8Ju|B%QQMZ6s9l!l^>&nx>zJ`N zzM(z0dhgQufpFemTE9Dti{NX7FBiUC%KKICUmAI2;50aX4%mGfJaj-P*Q( zF!qBH<<5dqdh5W_FYg+en*e8y=gajs7@z9IcE@Jj*4|zW|JgQOW*9$a)6kivXO(`X z^vu#TPLC9hpK|#wp-9pA^nih(j_|vDYuY9L;Ld-$CK@IlHyh zBt7WkYcEN?xA-=FT&izArRB*nFGHkOmnoyxq^`bNx8=$*3-~s*8YYgTJ9m(UO=UG( zjXkyiWe?i9A)|I~;oH^t95rqxOAVD3^qOvswB35c7OW$&w#b0=@fN$o_F-N_X+9!e zpdfNqDpC~Q`z?gEEP+WaP?RGA;|IqVMd=8y1y;;5s;vMj*g^drFm9=L0aIuK^>&~R z(3s|^$Aj}9ghJbokZ9`Q7a-$Gt-5&0=Lp90esQ&G zIkH|hek}z0`hw^k;X6paZ|!lL3gClU4-DlP73Kk*v&{uMGu{Gpj(Ias?n(%m&2k(W zJajP>ge)boiaiRliVcO4&z>muTg$b=FSGiql)868?doR~xEtxb0yiM%|wPB$wFMMPTd* zzrnXLO-J}upyD2yOeW^)`W+2rrfFsk{QycwxW~j|R+Yv1l=9i5JemIIsMV3&o@ z0&DUObu}>cIRiU^l@SB~B;LUWJ^?J)!@v$;(@+B+6T_YcwgGECZ{Sj3{0j#D9$2}* zfi1wMn1R0o7JSLT2Z3D&8u)8b4>s_AV9LT@07Hiu>d%4kLlYW|_1IZn@w!PvB0X;) zM(l7j;6uPB8@hf9oJ}35w*kLk;q|~m6AXr)G1Yj3B*OC+iESbcGNapY-L80p%4zL2 z5;L}=Y_*f^0G>`_tDOq6)vi@FQ{Ebv3(2F zalpM1*B%Z{unW{!_}uC~KHxhLIKnnN!8TiVtQM%}u~GYR)RYS0po!h#*KP`G?~wyT zF{%RJ9u4P419Jj~cVQ^BvUjnvdsuYZ!&gf#w(Dm*xC@Cs$kC`Y4UTJoo&(B5{%BI; zAt?i4djO!R4*UVI(XKMz45-z>$L%U}K|nnjIM%K*M+MYEVCYQaphE*{KT%IJ)T@Ad z&>ACCaghlGnKcRo@9}M&A-@~wwGJldyko?3#ybi~Q1UMn7h6lM0%}o$`ZTb~8tqA- z^Ny83=QHg<=SjmCbm&$cQ`AijxuWn`tHyW|eW z_+CJ*1J1Tib9F#HA6R1@?4*D?78u7FFFIu9(+SLTqD}eLtv{Oto7U(dxY_ijC zbU>AlR+wow{JL|EL&-l-qtWrO5A?Ykt{qONOnGY}Fs&QM-`jc`85aZH5XgU>^J(l&_#8a+CqQ($o5ULUE{7QHebGhb7`RJpttSR5b%?;emc)(r zPk~Op`r}%?9_VzLE@(A86X-S%#{nzpjYeBOhtNkztTMlI2xUf~j45wDDbV6&%F*r> zTTePUWu%u=MtV7Aq?c1hdWGznM0)8t4_cO9HBK4%9Hb{mtTHPc!u6z#%DHBC2wO^2 z7-2ndkn_N;6zW6NUvD6i@&XTh-4$oa2ddw3>w*4wK)nNMr}e;_fX>&x25ht*I60tB z1U6d_JS?D&08W+%4jwL_L*{o}A=iI=wuWo>qf@55wH(b&JIV2_l+!&o4`-2UvaUA+ z=v?nApc~lB1+D8{3Uqd#26Urw5zx7w`iL&SAh8C%*C9sxi|C?qnwG7+)=7a%nzPi? ze08I(`Re4WKdx2HSEq~SiPKQ?Rp(tKoB(`~-Vj$?fKdKGVs+76GbU)bc7Jp+<*g?N zO1w!q%B5|+Kan_HG*_K2>W|aqWAV@FqWI@*cn&aSJg+c((PXnP4lCB7l>E-dwRVtG zDuz-jM~7Ve%48Et0p6nKy?Fr5S>WUCh^VAtuamJZ@HqZ@%=8;4146(*o-0z$WVt@qjuC*lGP? z?|`}saJq?$`5GG}rS6NmJgsH$~3Wn%i`5k*z0xtF&&Q_@bvMk#-g^ zKG@jy3_%+gPX)ShI2q_h=OmzYgTeXrV5%z?TV*s4h1k_f8CR~h-LXXRyx>|-wQdQh zR{?9RR@$T5U2XovGtAy!u>|%%lGveH2{N5)xb`3#G3Bl21U>$ca(cYM*3;-YA5(mC zz4#r_^-c50_4syR&F;nyHvrv^PwPVqI?KltOHk%T606J$Agj!5DWh_ZEk8KjsJ?EL zTy609^`vN|Sc8iVHerP;wJy9s>Y&4wDgciBJB!b%3c(`4Cw5B3DAwk#XvVk7XUSKsC1cC>4#7d(nMla z`Z35^Un;3QGI->IgE9BuQ9n|``QO(4iE?g#$W>4{^+B5Ag+2_!BL>=)-jURTVUsUA z9W}=~?HEiAsHXv+vtw{W0d)W{ZpT39OeePs*u)s%G9xSCK)EwXY*!U8 z)YZhJqorCXbU}G?q{h-~J&2sKLUO!f4ZXZh^p5bMBn8)bg3`lnWQ%~Ip~e9Y0J<^Q zAL#Tb0JV6^SPtOJeb9AIbf9&YxA zgW0u%Bhn+=yRj6ud8>E(CU2&zT!gwcbY0GrUs*YB{jkdd|3j zs&QOnX7BLZPm$HL_s_PA--g9@@!G@bqGGn!dRbs~t;KjwN_2Z}pKLuxdbmiaIPL6v zx!_Lip9@D0GAfPykrl0YYgN)b)`xAh{72(wm07Z>62)+DI2GTn>FmR5u9Hqad#$Wx=K!e?XC4F#%y}d{?IuzwZ~BV zdb04T%-#Q(1$0N!=Ygut#5rgZK3J4r{kmja$G1L=@|Tfu4Oy?X3W5t+KZk&+?-iZs zLDFa)?`)ux{S{!By+3w3(2a5h(2e~hp!0|mf$|gd_-(m~Ky^?Mog}g5`6fso4#-kT zigWua)`Ijw>!YcdRc`d?2+x2)SHQX4@~W+z?yLL;$hCSLm0fw4U!!nn z!nS(in?~JJNUXY(Kt}!_bkU#B!CrDynYdcDteT?a_?ZxJh-%S0!e^7Xz;is%x!K`B zf4u}cm&_L|Fjn7;Hg4DZCU7fG&B7i&3l4;yOJY^}D#)~JuFRsuAbNDFt8gC%xt~}A0`wsH7@?8?!$^ysh{oXTmLW8~J@OsPDMB>6y z1F-olqyKdQ^%CIZ(;14Q@ii&U>2L5Yof8eScJY#9YRS@C4~cH&b3n`_q{gUUQjvmR zlZc)Bh#-BuhM7EUHO7^x%xhDjYTc1Y_sn2%_yT zlGsiafNZC(<~hnSrhMsqD9)wIDW{i{Y`uOYFWNDb9`2Ti{4_q&s4stWcHRJV+N}q= zG3f?sqzDsZimlKwBvzTjK~|Y6DWh`Q)-zPta<(Z%`39e>BYc^I6i+d*BYbL5dNj}- z{fdCi*1~%R)c(MY*22=u@%|0C!dm!=fcglqVzTMv-2qiGXpxz;!(|(^+l9pTCJfRi z(Qu7NZ(OP#(9;8I9GGH2bv|tdqv!8PYifVZv|!h=D~6^p zLSn1tJIk|vA$W`{-vw$K!@!yg>}PwU=kGeL5j9Gp;+s<@7~ia*5cV@ktmM-{`tS^V zgr(V)Plaka(h)ul*loof8&D4h_Lwl1Kh#S8E)*pHki<&J1L#I(3b5uN)9-SiyDmQtSi#uhCBFnB=+`7xmj^(m z*@i0VqH>zv%|3k`CDDf(?@*u*qxOn{9pOI*q?HE3_AtOLtUm)5Uu<+~45&8(d#%%7 z7EsRu=ACbN%K~Z%Fm$$|?i)~d6ZH%eR{mUShHe%V+P*8&_uR#MyZ1eJ@d8lKU9^XD zhx332e7C^op5*vz!1oyN4sKqwhyS*Z<+~6*cP4A4&~@v6;0K29VaIn|z;`c&?#Yk^ zz|r;+YEi)OU8ru@YJo>thG?MCT&S`%dd>h&unZeN$AgDaV~J|0ZWnt2u-r1d2!qr0 zBB)N+3ZQgF*yCcb&v2gxl^%+EEO3RrCU}3qPzu#WqeFnJEW@{hCW@iDCWZrD6W0X{ zBLWG7fLpAD3xXy-2i57YWpJMkUcm4XRHwsRK&Qi@Fu3*TZKzJdbHE&XMBOuBSQ{{` z0PbcPKFaSK{3im2M}R{u!)q`&OD=}$y7_aU>*gQDU@f^QknkO#EXjeQY43ru?R{!# zm>IK13SDPz1kR?VNa4r>j*|C|eB|?b{OdX@sn(6u3hixbT^7_j3wRT?cqPd3HE@EF zpYVJ($j;!ad39*aJhI->A5-L_$s-V$(k-HMy_clM#`(*DdIlTnC8F+bTD=(PqR9n7 z=d9-gUF10jsCdMl=uRNDe@bF?`3cDB@)dMZIZgjfY)gL@sPvc!tmh;yvi%t7Mwv*HnM#;pz8eG-#%Ga6;RIu7TU;mVn96-7`Krv7ElKR z3l!M~55EOSOW!21it3#1EIXOrnDV9fqK_M8*^=%(XzOV_JMAcIJcn7mHJ(j}7#nIl zon4 zj(Re17i(JS<*0=~&zg2VTUru5=@f<({ugja8!g?vImv4O%4UgzpM;*}-y@5oBaNv5N5z6}s0|uHsjs&dv zm0Em}Z++lf3v>%a#jh>oa>;N0F1APbHZofEJUyTOUc)u!`UeH=;rsZOh+!Yv-Heg{ zfRWF)KIO^rF9G3sjl_AuGr*cnM#*Dn++2Gt8b6|06-V-|78A9P59FP=FOp^N`RW+6 zfq9JZPVSx~O|ISM?zK6sU6lR8=Co#!yU*sHw7Cat?kRF8w3$xa?CkUX#P%dF4cHAwQ5D^2**jzzR@T#9_W;iK27Du zqmKkSeMSciB|xY9Awcy=`dkS{=u8r6+Y!DRWc6uw`g{!v`aEelpCQqQO22ZD>G3lI zIgtgVTMdNm8i0}55x!WosYc6F1L`rrL3TbL6i|l&tL%IZ2h#j{<}>b}e=WB{JHj{fExts<*DEpa4P?>ydP7CMG(Z!YXMWEv|H^>Ih#Oa9<3!%DL#&VYo-7E%!Sl@`sM_x`2Bs+$u-* z*(K`V&}Hm5$$ib{9<#YoX4(yHCx_|AKV_*$T56|qMI)cH$ty|*kKcnpgNlkb)^+v- znGV%1pT>jKu6&*=j}(q9GSWug^{%?Vh;L)xrPrV`AFjcV`3Xd14tdXBD`GJIvQf-y z`L=^`jZVyK$hL={<6GRv_t*}!hI;&_HZ%Zy1eisQm4>OROERqiLuSZ^^#keJ8tc%w31eO~xEWYaQWIzD=d2 zx6lxuT(99KF4vDAO@Tb+wL$WYQ4g#a_iy<&+{rNy0rAkO5;l0$0oFqgBC*O8IS=(} zpVAtp@<`#B6Abs5$;d{h^GK}spW|!6`U$)hJrH`e6{@))vvh>3eWAoLV4c_sNA
Y1k zt4Ott!qW~n;bfc(Cq$vk;6B2JlQE*^z;qigQ}KRx-_7s~o$+l(sbPj<$rEH@T1jG>If9s_ zW>_DF|B9M4@LLkw_uojAZQye1s+_tHh$PXw3Xw+qSr7(k!Y)JOFc1d zUFO=t1iNv0i|3m7cJgPyuX_o|H+Mw(!88r|?8f+Z9Z)YXB@5GZ5_$fpv#EqGy8dsi za&91WCj2Ugf3m3J{{m?qQ(f&nA-zmu>%IhXja@-ql~Z>uiJ6!l8&o?QMMKjssQ2&k?Hbb#bsbqM zyk)3JKI?Bmg^ghRhHuw`mZr^Qsj!K}c>J^%g9>`)0sHdpT98V5_Js=5Mb#kx1>mdn zyDnAuJ>RZ{X;f$-ONB>B%qYhgZofhKm-KeHOobplkY67~mUhCcv+td(hlJ z^{rI9>`H!MLHDPraHemiWdKzmAnm_N{6&15F4Qi&ftRTdAnPqz55=gN9C{`Mb~RrS zy(4@S$-&kdg}|yCJyC}O-C3v~@M24SkExwH#cX0;0J_^-D}g_PL7S>^FjM^)5LCi)`6q5r z$1C_YZOvJE3&p(TEIPKjhD1T~Qj?m?2j?3|!zVc!a4gWhyE_u-j^VoljpaD+5Fo2` zE-lO-cAx@ez9drfN)p?||2W_QmU<|#=4504eSq59!#fao9t_xj)U{wp(>Q7AgQ7nvGKyA0VP(8jNn!qh zqYUwD^lJ;>RN5Y%qXhD`j$CcYSK4H{O)j*_xi$EW@q9R?9FYV3;2;Tnl{CG8_*> z(+H#F^-x_mrvsm}45MHu_@ZIB45~&M9nJ#2WEqCQ;I5yZ4b|PGJ06&}3|o5o=A8%C z8EOo0gJpOHhJww;s7FF|QzZr*c)g)2J~)O00){;ThGrO?p&k&l1G_g2PTyUC4_RRg zB#b9x=*2*&?$Y{(f8>S!U>UB5!F8wys*~_KaD`>K5C&(nH=#P4{Tb+NmXHp)rio{v zx?x!kbXM1<)G<5`)w#xlz-Md|pAQ%wg6f+1DR7Nt*vkIhDfu&~&UYGtdb6Fry{-+u zy{`PNK*G&H=f6+F&^6L1IR~oK;Y#2;wu#>cO;ka3_n*%L_PfC}@q>V23RI_LIdFhw zm=iFZ4AosVIZDtnOozc)ay(S$;0FTtvka%eP+4e{JQ%7Qti6B-S%xEEaIWzMsLl>~ zz~d~#a5327-Zfy@xFs)if@R1J7;=Els9Rxh!qx%Zt$;K^$1%JE)v5D5@Ir(U&)WLA zKD5K>u4b&J*x4opyuvp7K)|ppVE8p~CJfvkkR-;jA!zcK6uQ~-J>c&R-|3F;ih%E1 z6gr=~8Mxf=9qjlf1$@_0=oGsIn1PQj^!K}PP{3IkNSx#(qMFtS4o#DI5@%^1+mfKrgO`)^R z`M^5Ecb4P(Gki|Jvng~wdOWbv@D)40hXTG*3f)%h5a16DpSjyc*B8L&VpS1^&Xjus z?}HD9nOp5^EbZaH_F_#aD|N}hj_A)FWR!nsARZl%ZZVJ=R{@-Bp9_pmHTFmZ)FXiT zm4>>1K#c-t+v{8(z0)V*Ent_u&h^)T`WSGwz0OraHTU|`i^Ka=T`PETTpj2Ms2>7T z7Z~aX0rfp#!9|8TXkYZT)$RbgexDz}lYsGQhIcHmajJnM1BQOUN=ud8PAlvMV7INd z5?E#7!@#CXjD(*7n}O$)o?Cie>G`Eo^mBW4MuEPchx6vV-K>Go?*l#*n`hvou^N+} z5gV%?&5L`<1+hj$nIBt7T3$ab&uh6Aq(gz1EQ?L|I?7_Rt;dzcsy=#6<6ai49I0}^ zFUwJH#AMcCQSwWY_@+QrFCvuyFO-iUFtQQ5#tWiOXbP;)9D`$K$YvGLtf;lRgkXK&RRkG4M zsw@_d+}S3MLR2sI_?^LGZ_Z<~S)W;#JFPmT)hk1H2~BG>zrS}nzmSQtSoQ{4vKmX) zUy0>vsq9;>K;|j7bC5PZaF!e9TP|uWH+Mtzv_$f$(&S%d9b={5Hd$z>*H9hGQ~O-d zGFDmjg8}?FBW65k0)|fAbck2qpVXKmm;N5jziRc_7~=+v!LL1@lvg(IXnqHALS9MA z8~3%m$buBV>rubDz53(xmN()?8cdi+x5B2`0Bxqj8MEY=L4(NK=nvK-^u`I%*3eqj=&%25yA zPBlilMycwo;m0ufear3gQ`5DC5sSo~@-EuiVz$p&Jt^9@C*zIot{u}kqjyPaU7`9| zvdZ={a>_G(ozxFye!P#J(s|8x`uK7G*~$LN)r`~814V>Sj718wtdQDvEIy{E833AE zk)@{@0cTsrqH`O&W_gF~Tl=;r_h^z1i?E_|z~)F1!>O-MeRb)pJ5rPz6Nu`oKwrg7 z(^zv$811b043|y2@Tj>fy-32uml~R%XY?=dl5NQ+Ha;&;-6W5SoZKl}*Qk^}%v0rg zGHs)bypXBtZKG}+>-h82_m6D*Xe`(JNhzUhm^PB^SNeJL+IlFVfHk`C_j=cVwrT z34@sDXAH~plJjFJO0>ji@XG544J%LHZ6=l1QD+2Kysscp7i*$?oOr>Czs-)W`Li$o zE{+uDj?_5I;uQprNZl;c7CA-0I{ieeqQ_)6csBM@(?*Zv#!rNevr5nO!$zh^wObB= z+mC9M8k8zEEim2c!(wNZq*ZBdv{IjqGw8=^3yc}k5|_-4nG9o0hM1>t=V7H73Rm-E zy+rEmD(f{|&N@h_EBvI+eJXn`U&_+9SV|UHV-k^lCCB<|$NOxkz!fQ~i*-{Q^#?hl z&X09LkaIIiu`FxX#cC*!>L+{kHY4>*y?VQ&Fg>74v>%1hSX&(^R0r}tr2|yFnD$0W zAp@FypkX!?S=N9q0k0!>q-<$gne&(&xo?#|FKddJdBgg}F98!hwVwIwS2c5$d0wcp zVVYe9<;jlppU_+CS0K;;Z%?;!<@q40qE_Y1kItrlz;4y6mm~(!$i&%Mxzck~PPnfsFVI-4zRW%Q(%w~ey*epFTW^PR))(fks-D{RR{p@wl9h8;MHaLT zY@4$(bOSA{SZ?c7?=@$cBs83yQ_>3w$&rcgN6I!QH`i_*al;|r;!yOSKc^9^iVr?R}8!R0w4JKZtxamH9lL<9?qRQxNBB zt|4U>)SQs)8A%62ZC&}y()9XBl=AhFvkk^F>Bu24&d8g?G7bC9bKaDJ+TM%~yuop& zv%HV>By%4>+Z_B{cjLdiJulhg4eXB8)nX#;{ZBVPk==7_c}aVDNk@56NBLguUgQt$ zUTycWq)-2z&W60m#OJ))^~Vy)rcuUFf1gqM8At9>qX z!zk7*ulD^Ty@C7=_v2zS`6I~BI>3wEy*0CN0v0TX-qZ^jh1d8^+n*|4E4?nTNr zX4?H4Z7aRxYOi)RzvI0*5qaQ)L~?y%^*Vku9L`CRiL3edA}eE!_-ogOCPgN^$iHV7 zKO#a=o7RJnw^wJPqk{qM^*WZDWc4~VlzcuBnfPoXQub1xgf*NlCcMbMXTAMC@b=qM z((4Ue9glpcqkQ0B%aboAduqFKy|#2eZ(xsCo67NOpQU5()1S6u_-Y?d*^#9Ur{*lm zp&Rd)MJ7I>nWSYhR63`N@0!xKmxq+jY2(j39XoL#i#@*wpDq}QvxUkAuE3%Gq1E~W z<5XtL&3@X9SM`;Q6vNT6*bT=D%*$}dU~a55EM;vaYnRl}kXN+K+iPuE!*LADW`<>r zSGy)OgJI#9`MVjGHU6+D&#lwQWAu?AL4G9#-B!yiK3ROO5t?L&%D|-pQpX(Im@RtX8s7r$J%Rw@h)jpl0+258K?agV+`3KX`PS_dydbJyK*x3%;s6*z)HJ*OrT%Q`R_W96q zZ;5Ru67u%z^cu>d%(qR4Uo+&v(S=VCW>%*O>fPSPH@%z>me;gBS+WYtBqH~uywzQ} zA?sO+Ftw~a^6QR(u{>wlHp4-@XT7(p#Y1LO<0T(8N2*|p?{-~P+6UF3ozg~^Ho3If zr72SRR#oV&;|!P$0bpxJKRn)Ud=0UoMw=NgS!b`cz$2+zi~a3x%HbyQ^U=PsSzjrA zb?U22U)|d|W{4h_Dp6mRVG*>#4U@lF}pri_|!CLi;v06eA@sY7V=t+C15FmpSVOCoOZ< zl}Meb=P5Nus~wzmYvh{9pOjAXX?oamzEX6J~YLJ4X|>X*usTsVW0*C)C> zxiS35v0OaQ_-NbB?Q`@$;+HfET$cHubA0mr-BT%A%|)P2js+6`T51l*@cbu{u55 zHi75e=a_BkGb@)_VVLX8r5#@-MT?)fDmL}2D3|$;tFn;PucFX!kE>!+zlw6}rp{d( zxm{h5Uej|OsQi_yVN+_Tq*b}4LhBA!&!wT?ObUFbt7KEZ8RhKJy-$CRg{?++qJ*)y%8x<7>CveDj&xuXpZ_ zn!H|3GDiuhy3CH^AkN4D6It^zw;>q|M6r&dQ-RVsTY5R^U2|x1OK$}>QJhm+} zsAgr?JkGtzwzkZGnwO8QSy@ANzu2*ZYH06^*{$?P_ELSVo7k4wy=G;%UvE%QZ(A{6 zbYk|;79+1TuIbgIzPf;i9& z&N44&mDiB_Ep28vW!_qsqbBFss-@<<6q$dv`dGtPdHs;sv_@adGkuaaA*rpr;ds1a z$1SkiVvAq9X<%vO;oRNlm5m-zo@~GQL2h?kJMg&nvfL4)61^) z4J!n*$r;eV>7oHWJP|h1&oU> zEZ}lxc`)mYhU!jgCN4U~UZ)N^%c2g0^hBIUOk26uoVXQl7jx#`WAc()0OCU8Z~Tq>tOBXa{yVi%M>zlyw!)>{qt&-xh8; zGX<*4yyOF4SnsQfVQ0iLa6mtV+sdrt5@3 zohtYgTZN~C|LE88!B~~HDwp{(?cA!Mm4f6(in|sj6exl)am`K=KQ7=Q)Eii?AdQu- z_Il?pKcLb2-MqG!`@8C6kW0bPuZ_N^D3nUUhp|MTSEI}$sP`TzNOWd|SXCI5C!d*&Df%A%E6 z6mK$kGPu*Xt`B%+3hOGjR46^~{r^l0T`?ltLiT#7GsnMTpM4Q0`&3{PGty{{|Ipc?SR%7b zlvd?3U*=C(c`aWc&u15J+=O9~xi1c}a*AQ|r+XpzE#Kfiu+v?+%t`y$ItB14mPwCc z;P?DGKCod$xy)d;h~kUF$N#2I9$>v+#|Ktl;n^BT9vaQ=7e|UAdebJnG-RiliV!H2w8)W{zeGLOktxWhO|TsX~MR0 zHf(Qr#|o5y%qE$n-ea>g-^4YqKF_OFZJG-Qc1WCE*l zW?!3bP(!tk+D%fV?j}ae1W9HIq803PaQEt66Ah*8jW7`UE7b$9#_**2c(seQ#_b-N zd)P45^0-ko-<-yM{Y{NP{~lF>MFNSaQRMKZ0TC7ub^TZb-d}tQ>pmz}X{N-sVlBft zEZZ{5$}*(>s-c}Ci#*p3wplgK5$R*AhPH}VzpX*Q=7EU+XDi3YckEf~Mj5sUX8pe& z54B$`&fX~&*uC|2>-u&?#h*0Rc{?yx8MQP8Wbe!nJ1*>87=2vZtFPd?&Vra6A523F zVm%t5`U*T`L9E+i#&JO`ZE)20@GfN`uOZ#gmQy`W?olB(H!eX02Oncx1vmGBUE!3o zE8NfD3i{+V=wX~B2jFeJK%|d(0sHFo*QlzFNs;uv!MTIZeO$zOI}lOmM5qs$9tFx^ z1}rlDX9Pd0o4z>?p(ltwD3W(CG+)|Y!uU%Z}giAo?YJ`{9SFvq=D7J=4>Cfp-gZmm?p)3QRB2Cn8 z&8fB*J?H`+C(D0)*M@6+a@Y2E9z*aW5kpikLRnFX3Pv1a$CfpB6X7(pt^i=9; z$O|x4W&JrWKo+_K;C@63@ck z_KH-izdt5bOV+L{;rb9AuF=HNBQ$0r_4#?<{+r ztv+|{O%E9d%~Ds_gZ=5Y!+E#%H73N@H6fg}J54iotFgjjW9^i|ePO9ZS*+cx6gv&W zn5R2y7l3ISI@Y#CtSw5ba(1h9Aq}hd5|AFsk-*)oLg~>6!15LCSP$(wLE03I4N@h!h`K ze^Ac)!*x!I)X3b(UwOzvAQ-Nr~z5Wbl!Gmwhl+rLD?kZsx5o>7eoV>-3<*A{FN3srMcW z6sv~(#<|=ui_PvfYO!&-JcIiNRCZU@9t5k6*|f3H=u#J}0o$_*Lt%*ws3@()IuS%erZe*Zs-=Zksb4y)}atJ(cx zC01f6twVr+;#uil=Ur_?UX_znpdYo3t{(U^1L6}e_4ck?)G*(g0TBVYfv^OvU^c3qnywsif*mK-qa&0{5 zjtnpPl(`=2u4#6dYnpmxqv7fTze@Eh8C`$z)$Nvl2jMWSEb4YSx359PWlr6BV9gK{ zur1M_J<8eH^P3l~x{~`Jq>2c2X#K}9!=kQ+l*A?mQ$o^4PWNrjjZR9%*~89`>xlz`w`m;_b&tMdadr)aJ|;u zk0>rR2XJ=^e^();z@EbYzLwFziiKDXgBpt#fIl-F{9YBAq#Ct%mx?{j;tQ>~=>v6Ri~hzr(pJdz6CtU9|a%SEvs^7 z%bGa_COuj`XQ4cxwx@sfIeZU|%)Qs-+X_5ATh8^;E<6Lw#*K@z78A2E7y`k(<82P0<#(e07__kNWERz^bd9-C+;og%yNosZQ^M zkj(W|*MUl6cRXkHY_EA%;3?gt{+I4nC6;dUxBvlXXC4>m3x+qGwT*)$HX`6-4+?k< z=9ZNy+Mev}Sm@uoy7{*}#C>gEd)YpRj`Di{$a!kJ7bahR*1E@{EPFTYjJ+4BBIcFB z|E=aV!SVl=QRn{!+i(d>o5N7`@tS@Mv+UalZuR}y2iBjJv;OQ!1`aJ5=`EkVb>80g zBXcT;l$uA)EdUdWn~1|v(=xZZ!TTdzp?KR{0JBQ;SWcovzum!SkHq3}79G~A%1c#i z$!mNq=H5;y{o>jIOf-7~LyKe&M6aF;(=;Ft$y3V2kDGLU%rof%b2CJ*Ax|d%88M&3 z;wNMN0e`mV0?9Myf=g*w=K?jvrAw~X^}WCPQo2R^Y;!)ivCKakys43C&I*i+z@NDp z_|?J{d|+2LT5p zSM-6^K{=yC=0lq0M7V;+a$02i#k2T|OkD9PW2q;`wl|dLtWtme)0Xdl>lM<>@3b># z@Vl|PW}0vsJk=k3AB_aOd+=NjwwR)&^zF*4+b|0XeJ-GGo?wnkvKpTlU zk8S(#O6CVISY^5p<-5-s@JwH<53KtrXU`WuMJ!&BN2Q$V)6|Dfs_Bd?yaIf^FTw}* z1gxAr0iSP043vmjdm(IBgT9ja4c<-G6jYnJnnIra-2v_}gX?_RJ{YUgR^^rorTbag zMj{X4AW&*GQ`PU~BCvmrXNMPie*d(L_y3!VJx@OMnWx?DPU8hx^>%Py`1&2(>O9-8 z$~wW&=uT88{yk~#YmwW!7)f0KYJs2&=PO9LaDIi{xluz(%wMR~EE49{(5{HnNH;RN z{x)(R*uNvR!&^ho{E4UY>W_XYJ?}Xr_!r(^y>W_HKaqy)MR(g6($y%BW#2ZV*EZLb z)!ahxXRaj|(p+XVwf&&^$(zGBZr@^=St#h9-_v_zbUQ5rbm|YWk*P^KJ(3Qe4Mt>XEvE^sOb1zU>*$x0`ZUS1*@TDPCxe_g?HccA0pJ~XdNP?YG1 zD^i5`wS^6t+p(8v`FL4X9On6vZ)zLgaB8nN_lZc|rRUdKji^>kb*uP?F5 zS)``Qk}EenXQk6=4Abtd=E*SL*XJh&DD+md)vV?nlgI;|dSZKFW{}j;OLlWRBXx(N zjZ$=cFX-CV; zy^X8A?-K$4Bnvq*$wMF@+(%zMkx!2$c zno4vZJk~kq&QJ?k@pECDBC54(wVtbiPSzOBJz#fmM)2tomlil znSLrlyz}&gBLmis>Z{*KB)2edyf>@dnVQ%c@58m7KIODyo~9^jB2Xi?WV_!!5pW*Z&7CriHcs&w=;cyGrq z#p8~?CW~J^i#ocl8`;0zXRjUQIC@JKe>1qt>8~pp{BQcw1bD{L7lM8L8^O(vJ`c=< zGyFB+pE~;NEdDBR4Rm8toz@Jf0hBj9WRBP6JV~NQGAEY2rk_YD0A?l;NzDBkosRV! zrB27glyVyGV&&77eSV$Sq4IIC!pWg-LnCMH6MVp5{>x)w(^4cbK2kc|KizF>g37H(QT7^LU`w;GRE3 zktS7Xp$qy9kZOydIOa-VU)MRqD=(Jm0ZWzQXhXS_;P$&Rl+Tt)^kSL4mEkoka1Uu6 zH%!fV9mlCpN->L4)4uFy)Ima{B$1aglDN?2jRy2k8hFVQ^Sop~v6+S;t6|7oq&zOF zR*e`;Rm{lB>&KGvzrj^_ai#P6+2CU6ts*QHS}ZnMeZaJSp_1OZwfgY@Z}HtwjR4(U zqmqPnl1807tpW3jwV|iMcen<+!Ro6bQUkXE$x3+9qyf0Wd#e(?k0omVu}h>u*BZ)s z_p_}l%s}Q&r!5(Fn7T{8(&eKrU!i<`UG8K<=YVF+GT%6YabEdZqJBW4{$xy57prmQ z^GLJEDMwyGYO2YN4UmT$Ag?zd?t=;+R03p&DpGyqfudRV%&!_$CPZ~eSF@xI(JM6@#@lHcaAP5Ay;7= ziPvn6MsCsXBW1=T1OAc?!Dc5iB2N8i*%*Euxy}fPMCTg`k+W7r2G6%rYTKhy@mV%v zz0(>?-r2T(Jo501k%u2TSnb9S`)&MJC-9c9&2kAVUh`40Z9g8`8sFLxuj$=Aa!U*P z+L=D=iX^n>sit?Lh5NeA2_chKbR{xQ>}ed*j}T)G7d#q#8fdJlsFA=CSWTeB3^`_fDDTuQHG3 z$Ny{lL~h}5%oQ8wn#5Ikf?lzzEtb(5JdE;mq;`MVVjxII# zpWD$jI{q|m?aYp@(($i=e`j`d#g2aw{QPhF)dbkljxOZ*=fOiHGW<2*9qs5kv5)Mj z4V@Vu(us=4<^1Z&|H3*enIYUHdp%Y3WYtsj%p#ka3|TYTjIf-G+669^b1H9~j#QCM z`6{J_;V1tzz+@}Q%IQsvX4j`y6j{x(m%P&~dt9%&>1JI;6OrBOx?QI=YLhYUg&U_+ zRrd^zBR-5&z*O^&)|*0(3Tu1fv-m}x`?m@Dar8DPRGt(sPrjQzr@cQHnXP^y+QA`J zSD$s?;(6EX^+anr<=SD`Am;Ri<}cGuhX#+Ihv^yHUS|}miPZ8FIicE3W4#78xQLI` zeis5SL>J~PIReDX)4j_|Hl!QQVk%z`!Jof6=D9jEzrZ!0hDQgft4nl@@heTH(r0zE z`tkn$ZZ@v=84-V^B+tx4Qhi((+PeCC{oPWBK{bB7g*lnz*1Fi$Hg`5jz{t`d>nLMdg{)S$ zca$+&Xr>|750}LN|0ts)PBBey=O}a3+1W=K{j!=7Kt$S^qs+@L?(X0yb3Ste115Sq z61Ba%MCSi^^MBk*+3k9;vnyrvoB!NO+4T*}zq2c4v*X{{m9ob1@9auh;rMrUr7VD7 zbKzqvr5{iKudSDNw*QB%mtSC@|8v&M^D6#@^|FvkpS50&?)XnzFYjWbqKDl6Z?2a^ zM*L6K%dazH|6MQtrS)>R)3Vn~-M;x}*2@yNdhB4mJY?Js*Gugxvv--StR`RKQtk3o zu6?D_8kaV@w8^E-E={?#)1_T5?RKf2l8~IJON*gvS6fJ0s9g-W033Hc8U|mLqpMC; z(yfzVpIJ)6P) zNpMjXe-k+F_!olxlWZfnz|rSr@z;R6U4LhT`Mn4uzY5&x=+m?KE5S{UJ{fF01-n&% z{gbSh#UBS(!7saiY`xW;1s&|O*4wdgXI}>{c6t9gaDnn%2QD=9ZLb5Hkwu&aQCjg4 zsfkMjkeYR+fKS#jHKh%!JH3jtn>?JROWSfbk`azxek1DGpN-JGj<J}QlzF%VfZy3WilFyr7--u%QlmBjL)`R_=KXl(ezVJz&B=}fb+7>ziPGb{98c= zVWOGyufR^7fA4ea`9dm$tdUe#AOHL-i|7!LQi}E~NV&6UXvMNKG@XA%b2Z;W zs{iVwQqH-zlW@-czRlf6qI2#KNT;=>@^sdn?`U^s(Qb9LA7|0DaozDL_+a#1JPd8J z7WPB@%_`UPIOaAXpzl0A1(7j_>DmOvmNjkwW{R zt8r6i5Pi}_A}OG%s8OZ%LSc=@p3B!F>6WrRA{#H*=7=nc&d0IO|4-KYZ!psTUGM*; z_5KSdX0P{M3?+2QC+uZ6qrX*{<&x_38_kZtvTq(z5c1|Ys*ICWj zZl@7ps&Bnc2|IdA7QbA+`BuCBYHIj$n!x^gt@-WK8^KkMU(-}TAuZiHTyKa5nje42=f@$0L znrqNQqP6-Y@wz(NPjEln+jD)-kyU<)LD`j*8q?lJO2k!LDsMN|dTYq)@U zPGDaJcYPD*QGBY5Np#zC@v|f1BK(w@yRJR7&E;W! zYbmruUygUs=mA`6a1*gZ#~?&&!Slj4>}^#x`(v*V{J4w#S?Uu|f& z?k2Z0`4;5qW3E5Wqr2v3NcB(}4@q!wRNd*K++A+;H&G%e7A0q)$(PY6Pj1cjlA0hB4M&%$$wMhhlarWKOs1@-B~qf}Eh|W| zv%yVB^)E3l0vAL7*d<2Uc1>A!2>rkpz`*UyCB}>kC<>u^usiE%2?^hFkPQ;+A2Mlp zEvb2O;_(8Wp2&^Ne}0Q@-TR@K0j_d%RmzU8KEI@PJN`vrKZ>f^?C9$AORpx!KMyQ6wOa$oj;=m`74!=D zOUgg?tBp$^r^cj%Z2nxdMv_|AB6kPJgz{^_p`cv0Ai|>1`cEpnT z)5AYx7k>M1S-u9>#V~n@IrEqjZg457i#o1&osUb`EYgV5HMe zd`XVer+-rPvT1lr&+|GupRxNj?w{rG>L_^@`!4w2o`8*^K~V&&{}IXPk9 z%Ad7Wu!m<;N&V_$`NZbH_jQD7fwavqs|+aiLEHxwKB)9Tl@Drs(CC9EA2j(tQ5jCBsoobnv>!8$z+ADQ!Ux^HvxIy~6p*Ojg&of) zp7=8|0(bVS767tpq{wRit?w7pnherJyE%r}RKY}>HR_||mxT@aI54UZd)`R3OTpzwyP zDRM8|ROzHIo{vA*E9Lsu7-h7^jN>%~4R^|DzP(3!8&yK+U1&J`M|yvXrL$I-CNmVl z0%7utQ9>WKq4p-TQNI$_avnKWs)FgHrl898!fVi$5uHR3$81wTU@BGw?{-eBl?e~2bCz`-n zn^RSh@bmZ6W|Tj+rgdg3o6&s!c1qtAuAn7re;+867)p%~8hy~@gJvJ3d{7CHqS}ns zxZX>4=(f+^jQaeN+I;(G2T7k_dKEbSPYaShe--?V=tJ-Ng5<}7V*#s8=Bw}p5t8SH zTJlytx?bB)xt|FHE!XaM(;nK35E+-=M=>4Ml~ z#Sz3z-%dO!Prg~6%%qQIci{27RCXMRhlnHkg2zj~D7MFoJ|mP|#dAqG0o}dRys8cO zl;C0?R)nW7%Jc;nPTF>^-D!S;#>lC#l)i9dcMi_4G*fpFZq$dqaHEWT^of4|TDUok zcNae^+-!5|)qF>NJJJ0GG6*~N4Fbaugq`iYLtr?Hag%>ybNkPPo~*}iOtf=>XM2y` z7%l#_u=CiM?66b#Pllb6Mmtk?5O&_&$KT=xp{JpgHvakDhC;mcHg=;vaQ??g`jqW& zIm}SWeY18FHBy7d{Ec)e7OzcvR6Qwu;}PNV(U(1#@XdIn&4cG+A4S#$<>L*IJ?B8H?JGsoFoX# zi_(#|9zsY%Lf8bz{=dIdb)J5@r+cPncN0O=pWUhR)N`up)TydpojO&|^Q7V>SN&aq z|1fk8Hpw8t)7!J2f1UVBsbHP`YLSjFl_1P?|iI@r5nlEc85YDzum*-A}&)T1gb%;HehMeue8-$=?;;SY#O z2t}*FUhr<^qtSiHf#yxSC1|%QcS6f(?{ax+yY34-_r3Y(xl>2O6Jjs)9B4~nm5mZY zH!BZAyIH9x#LkMNum!Cbf24e#%KellIKJOFzWX~PxGxZI+f36>u8+}C)onIVEETjz zSafa8!F5je`j9TDvF1+()<5<-bcAjhv$7>z!xn@ zb5V2YCrOiFs|JWQV%`a1e`r=GN=}rWs5nt|qUOZB6LlvRooG1Ga$@D#y+9SMp<$nh zII+^~?)=KNa>?qmyYow~eB?h2or~p4@bv8N{Hj^w_e1^*&>EqVQ&msT?#^E$z8d-G zp!?14&R>D25cwye`_1moUxKF<^|KwCMmKpTpwqLv^B0J(!EdeHJ-aXc3|&e7y3~A* z|44{r{53ieM3})XCQEr1lQSZ2IMg*H`b^q63D_}dD@J(#U%zoYllIIr9+|X<2AQ<; zqaBm>1+Hc9684+455~dLf~Uu%{fbP-q^$+8a5}U1WC}Ualecxj(DPUx z#oig_>(oqZ^8~fi{9q|GK^viprx<%q$;OzB0D-E-l$uCK8_Kpo4gxw&XPT6A106*h4 z@erT8nQb!;evx$PLSa)_PYZ?Z2tXqc$^K1PjM~T-WI-%Kb@K9XDi1UsYisnWRvD zzN|JO+U`+bR$H+|tJq%4>awIjuaktZ7+u0$mn^HHrQ#mT>UZYSUejMf9?Jk!8)UO) z%UtMg&=oFaWnFQKPtZ59S;MOO$z;BbmsG{)!N=&J0?>VuIkl>;#p|5zr&iTr z)rDx>H}&Vev0}etMe8xKx6*$-CJWI%#Ax0PPHb5|8rnu=oybA7nQ^6%Sfa`oWSn8d z^z@WYP)p+}IZ<|^;zZSnniKO*)SXy#qTxi#2~CkfU?(&|st@D|^%Jd$TkUR~6P~u@ zMA?ao6ICZ_PRu(|cVf|rh7&C(B$dj|reu&@J0%Y;B+khFto%qkOpkii@#_j12yxx~ z_OrLKW>zGx9Mdd=5rB(+*a#UR);VZa)WVa7O# zqPVVEd)FzfnD1P_Beh-*O9`BC>UNHzl3sOeFP)!>D5<6MWpV1ZTJe69zU$?;ey_~e z6*VW?)bN~$2(Z$8?fjar3zw}vUps$;{OA8D@E?ZG#d5pnYv-?vC-N^q)37FI_k8XA zHF&Cj81kQk?l)gMe+8bQ$Uh0)Z@zZ^5FTm44pA6UZe7&TJ zE9G+Gp$PTs%xG9dWk$nfof!=qq&n29s%JI@_oS``hPoCOW;TVL(99;^2*sZs(316c zKugYV2raP)oQF-QSf2zT2bt{;#MP&Xk&GxZxdPinj4jmaH zbYzGey|q214>14Rw3$aq?Nnl@?@!wU6K-RboG3d{aiZ!(%?U9} z{W`~#qfVlg(_$RS`=Fm0NSD^DTelo=`xrT_hF4p1o-SUrF zZrKVnd`4sGl?+K4P+4X^?Hg`Th*{YACL9K{#q-8ZLd&<#sFc??+~8>xWkls zEHkZEfU#Y}bSTYKvnmhxicdo~UuXWi@7->Ce0th>Clyg2kzwADflj;0py}rYzB+cY z7CiQ*v(A@$Zo5A{?VOa^`%mmcvQ(6B-In6DT11OZjR!32Ek zeJpimrW!@pVl)*k3rfk7Jy!K;OP_Nh??k}~S%St>a-!@+#fhpDH7Dkss5`OfM8k;| zgcK{ATR+i9h|^GbIHgj#5=uYOl53x6M!jirh0Ro*jIqtsaZBKST;2(MwXHptqCeN( zx0VkNnzNspQ?jt1s?xNddbIiOU-S9EQ`;!ye&tF_@f1lUeim|L+5d@X4tv*gfE z13n9_0bj5kSZP!FXhA5>u?Rn#>r-`&?##tMq=Qk^Q5>7^!lV3yyou5ZoIdrLl2TvM zxhu2xKFtd30Gq_0QR$z@o1;8P^Wg+3)LBD^aYArwF~Vabs!r6Lur7~y>f!~746U3N z6&Lr9*XEm!A|foWjrCs9iJJkLY1|CgN3RG~VZ z`K(V4G6`HBpq)7>;6XSN{^jO7AG4N8K<*)m?LPs)P=`V7+kXOp>3bCXP2Z=c!T&N~ zlAd8uISBY)5xZOu@K@$9yQd5MzmLpMB=~2^&$@8ViJIHj^AM>CAU!WwiWa@w2vs=6 zxNN2<_)Ih5gdoh4=A9@wG2ukXiLw(FC#p`=oS1i_?!=-K4JTR&>+-LbPIY~^x#v*+h43zL%>|e`!0WCKJh2! zRA%>lvE!|4pD&(E8VQ`9FVwc}`68!kbj=rv(|lpijb<*s%a#Z231jIQ+;4k-p(qhwzu(gE)x2m=REcHLFNa1ZBfMZ{P3yfFRy!Keuy2Vgo2VCDCj)# zJ$9f@Jvlu;Tn;16Wo=qgyD^?72z_xN6UNVV%CbL;9w(kMbjH%%v~A{VTI`*9mro5k z()p;&-U2MCQz3fTNIl2b1vUn_&W3hfr+%(=f%<;Wb%Av&iq4U*evs;Z`i0S@E=#1k ztbUN{w)&-JgPzldl9?Ldg&c|5rjqrXL`+$TuOG=Yi1agQgmOmYohUdl;Y7)avJ(|2 zs!r6Ln0KP?#G(@oCt46zm#$TaMjwwbYNiP<$H;k#yb}c{CY&faQFfx@MAeC!6Z1~g zomhmBEDb{aM7N-=0S2F1GVgqe636MqzEBcZBXPefzW-{K^~lL@>Nmg04h*x#0Ove& zRDg4yrpR6EwPSTsINzxo%U3kjHwIUfR)U=B{4JYn!tzD$mah=Y`}Qxf7dW@ibBeqB zJm+yvCIt#o189&<#38K7#N#!Y)K;BL9**@xrza_g+ya*`efW4LiSY*?Y(MC=swatA zu|cu_X%`Wu@1w)1&%<23#!2FizLP}eOI?%1V}aTeJxK)oCF5jTFycSc`r*3;?AN%C z$h`BVjJ#f8pFYn&i2v!oynb-Jo-5v^YYlJY7kjva|L;(cvL2j1VhCcN)BKX{yY zUs9DK-VfD+$tJw_c;S7Scm_sl>zhZw!m>fwS0jt1ccY5*@?on675mp(W<12_*AT%P z1SftSQB)iG=VjG)&Jl_cW?g?%m?LVS)!I+8{qT_oc`)pTWHBRaS`NryFUF%}IvJp! zy#s3}90n|9VqIg}bI`Rc*hxZT$Qu^@M?c#3clT?~ICtvv;fXP3Y%{4fvPvjG4Y<wrz|ww;_PGv*Q}#H{zV4?Ctwh56k+Y zB27|34W(9UKJj?XCzU_zo=@&GAKTJLg@f%!*uE#uQ}vmB3g{u(;n0Pg;xDEx)GKOg z@xDi>FOU0gokys@+`Rm2EKY8GWZnrKj7_*OYtY$BbgIOm1+9_Q<z zVcz)+t-$sb&{U<|f9_L0`RJ4tZmn^fe3CQO?$&xJCZCcU5b{3R zWH970StoK3iJxkK=_t%8s*VBI$R9-AvT zft@~YHO79)sn1%zy`I_g>GbsUoLAfQbTe`Oy~|bRC#gzvR(gI?+_BD2m;ZFf{Pg63 z=cjw_Z%?xagq^(QRh=vFh`*)5}Notw0@$;Qgi`&KJph+{1edr=9~1d2&=WC!I>ldw_Cs-V(8=LC=tktH-Gy4neVjimEz3dhvWH~k^}mxSnsa|UmMtas$)cZO^1f|no^C>I?afR6ICZ_ zPRu(|cVf|rh7&CagUfBR7j2x>`dJpU>?tAC_`xrowD~r9gp}9rFPyUQ6uQLLnfsIP zna+Il(I4NnkuMIfn}8#8)&0Yt82)Bq`f9s8c=yP`CBBP#Xy$=m`#3L3eY72vXXhaE z+xMz##aA+Jxkep%eA8F8F|4oCF6bt2a+zBP>lCj_)28Z@3=p1Yy-|kx0)=gz`P!D- zKfiVQJ?qM<#BdODeD}>qC~740JD0%EGGpCy&dXf&y5|gEF|y_MuWWhr4ejLrHnVj5 zmq#uM$&ZFibys!WHr$dDL>B*tfGBhEZ$;!+MVmLg4BSP2i75S;$T%!4!OaC#h@qyx zLrZ)-f$3q&E~p4+fzH49=&q-$C@C57&Kzw^_4S#h+gz&gz3YC2?^d4js~ffrUmfI{ zeci?}J&hyp%$>hcEk?ONU|6u}PM5zpeAwk5-}Ko~g>C7yZ`-Jaj@9MJOQ}n5*8w33)(R{m8@h6GCKG5q#Ul-{0q7Mf8WYIzd_)iJnEFQUNF7v&xF4U8& zbu??8iLk)`@!1PD@{a9o8#i2|OTHp|{!F9!yuUr3Md2TOPToj=O;zwd>djImL1V`& zPAjI*Z9eK2_M&c_fYUor~Az3Z(h^E%Y?I^Kp_7N*gW z*Ss2RG@s2APO0}+-G@LFVwE(%Ah}ksqWpY=P8<071})_-i^f3>I(7J2Nz|$@`*2td z>WFEbX{31c`r__yJub87g|XbM;v@eCXqP7kJ;WEf zr7JxZtc9NFJai-SkEQqv(D};)e-Szt`6r-DF@AfBzXUxW<99+o7yiVBq!TqZn5AaD z)vv(l(*{MJUd;QgE{o<(V%P4Zrb2-td~%qV;h6ZBM&hQ49FL#{aY>wF?XYhPUZ)8s7QKXq6D=o(sArJNiJTKs zf!!)V&>#~8`W+ZjotWZtU>k4SW(<7)XBYzuT7i%+abZ$uo$g{DAaf+ECxV{hpISCWHBl$9J6A~S&UMINB^hnONqq= zrLuJu@=O|!Wbx7~7Q>$*$)s9n{aRd*ECJv^Z^i6aP0fa*apo*Wd4$sU*os!E_gQL{ z=USP!809WW#8bBz$?o+#WHI~+D>`@vKcw2T z@vz0HoS=EOC@e;$drKa&808UU#ua2SDm`c(gVACnVbCG(jIbDKEc6b`?vr?hwiQ}KePeMqd z&2`oTvzP3V)VF?cN9LEO_LOLw9hq{SKNq$#MD5w5UQX04iu&3Uh`Nod+qnAW%l0%# z$(xnB@;1MpI);h7vB5W9ho~D_hf$aJ=w+A zk1PE*zMq&SVlK}vzQJPddm=GkC+5oR;+rkzn8q6^R(&9P8CE`6zBRX_vbEbI4H|AP=`&5*9K~ij1(t- ziQ@DinBolGr5_{m5b4#-j_Q`#)BpF(C40ni($pT!BAf3UUMysO@1~h>8CN7Tt&2V; zi%PSKzHeBtCy+u1im$_=)HzC2oH-Eohr6F@F8tKGq2Ho^sFNbrTTfw)d^#6f_HNyn z+d9_F>^@mivuc+bwy}zr(xjj}AMZS-uHFAe4qIpLz#05uPA3%iZhah;{(5oK2h|TN z%7hK4X$v`C8Ly>^UTU!ZGkfOr%$1?~mxSsc9sWAizZs=S8(#efGJ9@~w&Ag;;O}46 zp#r}5NoG+EOB*2FK2|;H18@CRnY~g6)xGc5twXFmL3yj0x#tbFmTk7RcLU$y8hzJ}5H{aen>T=jW+*XgR=(AcM6{1E>!!)xroTDkEb;)R*FvexB!iymxE@nXR z#^Scc6?`O_sryJ7z67=Df#Sutz5R@B!$)^zp>{nMJLCPgKWOjm?A5_DS6ya#AN<@& z1NLmO?A(+3g`Im!%+MNq zjJ5Ejgb_KWCmVgiD!#jJ7j-EPI8mfNqEd^!XkY9_$=f<|FzPtdy?+)Q2qiI6&7Bs~ z{ge^chZM#q9p&Q*M!A1V=`U z8W(kvX$+L9wWSWV$2g@S2k;k|KY;XAN>!_E&YzpPb@v^OEkhqp57?o-&w61YbJb`0e;4!lx>5dY z8_hB$PdzD5wh()sRDjrhbMCDB-*)R+A55T5^XtWr;{n*E=cZruKS718g-cG9ov1ib zb)x2kn5EL~goUV5<s6Or3rxbG2`pzT%@D7+6tx zVAzmCGPUaka?~&Rswq{HQJZ|$)LN|pM}WZaGCXx2#VMPn-J?b8in#fE>dU5$=7ax~ zhQAGHgZ8CfgS{#u``2O6Yd$^A(j^~k^0U_nLXQ&|07Z* zP&w>~mqe+vR4m8&n2VvU-eL|8*4 z+wEF9o11NP;{EdJQN78iwTfWPi0r6El$;*jb@k);EjczF znooa?tR(!>8YC2=!BRks1Ns94AAV~7&1>VpR%X2paDNwn^{Hc*McwN*;M357`Xv?- zxLhvIT)>hP+sGgXyJ5~a+&22}AMC(|TEqooWoAQF0 zA4a?5v*+1tzK^n?Z8onN9j9Y&qUX3%5F)4w@XMc)4 z`Il|DMi=_Z`g?!xcudJtZs?dYDyq~&Y)XztQ<5-C9avqT%PQ7F1t`}cslA*QG-*Z* z%W2Jo?7B^k&z#T7;9N`5u#{oEAc3t=BKZgj>cj!yx>MQAe(0Ss! zR?^b&-`$v=7|tX^%YX(H#wk;Qp0A`2L;J>i6Z+Z+4uZk3dyq0Ek2F7i`Fc#q8^U); zzl{mG{=}M)g;-aaa*I)vebD{z&iRFRK9KY_ehuF_~Os^AK^LlV#`7? zp7uq}&OH8Cpck0+sL@ST9_D4?CwZlv8Gf}k%LXJvy!Vh! zed4o03khho4(;`_`nuweWkffccN|QQ=(E>2qOXX@oE=(x28o zp);9iuCOtcb3)U%#b|y>=HF!#wy_AQ5|%zwv@yp19)_UBX!!~)&M)N4!;iAI z`bXw_*?6mw*N|EVQ$zNDmZ0Nny>C| z7{rpa(o@sUzF1VSBw2Opnps9gr|rqIv_||SVJ~|!&!|^t8zbbO(PdiI?MdzE^t2~i z&0qLHdiI&10LuV-Ms|}jmDj-S$?k)k!+#f`sRmEVo>USw;_v)_vpX#-++M8 z$9>U)GyaLdeUGv$wRfxU(aWODoOX$wjZ%-?-V+0&I~2?DOaBT6^z%(}`dq%r>l>>K z|9@BCq;@+Su~B7e6+~;hKiRld3|6xC{l=z_4I*lPe_Rj|XU*e)iZvLjYe9^Zxta!y zUgqjC0*18y+B(u}pJ#e7`87`%q3&RWPdYmP>l@i(_l;~#Kox;PoS5pdKkZA!E3=8ekE{O*9n^BR zA%PF307eVD?Z7C&tz(OJwzzn(agwUDK=yKn3U-p`-?q&(xWArBc%46sUL+%3o5;+U z%2?N`6mFyB6^ojbi}rk?iHt8~o+BPtyTRHNfJzu>RKu_`Nh!fRM^LKCOm zsyI=FP~+7I^}{Y!vci5l{z=A*GMwXf-#x|mTIwp&C7&xf@Jf=&s@4Y7gw6|=FmK3o z>&ETZE@@KVy0I7zO|TBlzdd$@lA48r%Y^z#cO~fq-6f`8MG-Jn37x3{Atud7CQUsd zqzkwg3H8%)1-8X-1{N=_XQn0<#X>85jjgIHRh&@2Z8LA&h*MCnLnOsW@#b|K6}`X0 zpDhb2UussW&9|Mq`Ie)LzZ=q;?XKt`3q?-{36_3~q)vLC!+Z^YF?Vkv3%1wz%OPaMu@qt;h1CUn)IwCF`>LDl*@}3`-O_AAAxa>< zE}fw}@%hMDz#h9}RT7Iyt%jmXYA3r^*vXWd%N zyzGNKhj@TehM;fNVM87zj0b0t)IDW$CdZW_ecH=JeDl@sw~=#;y>(_qx%0@qC^>YD zT5^u8EH@9Cz9RpS$^GYl)s{OqVl`w77!7Bp{(vj%F9j)z{xCtPpGB&>8KM5CS}XN% z=Hj=&;G2!QmAHsvgHUlLr6V6Eu=6?%iqpVW8BJ(EA|-`8t-dLqrQd?6?zs7!M-2}z z{Rl;7p0br*dbQgZc>cbrWa}}tuaic#OZUu`Ji4?T}xR|>7j_878yql!%-Qv z6}uA=T(P>9Qmpml*t1bATl_(>1@z;JEke68dn#7==HnTCDiafKEtxFS=NrkSzdkQL zEv3&eEW@!d>C-E9L`ve?)S+R6ve4((h@L*@B)cO(XamDK2H3aNGIgqKKtO1!&5~65 z&b9UJm{?J5+sghKE?wEWl_*=Yf#wC&JWagy-x34Z)w~mWMKx=DRMD?en=orhy-dGv zB9r}3<4@22`n+tSUqqHlOarr9!@~y~qz*J&A-!%&EnJ>%(LCWI_35mPLh#b?54_TF znC3iSq+XMdGuIvba(4RV^zm@(U~|LtmR>D1LJJ+S7GkQm79zA3swsjNnkUrHA{$P$ zAX1IAgG+BD-AWqC9sA*#U7G3$cde;%DX1A;4QhUcRAK#3dnt?1dDf7{vi8y-+y8X_ z^lYz-zb|R8_T$E;5}Ku{@@b`gQW4jt46darU59v@&8}%Sg@ZI(apt;WXTyb<4bv~D z@j_FEnB4Ts*LB8>PQP4MbTl25Pk#F4JgyvL4mQW8x17>}c{*aO7OoNMXDwWJVi6+M z!ms1fTUfVJEqq9vRKHHB$%MdKIG-AfW2+6uU8It~T=NH{3AUCDmbLG%k;(qk`O~v~ z-+OARed{WZ3YbD@Kd+F^U8_A!72KDirq9WCD6u6TO&s(^{leG*v5lCANR;@tUvLE~ zI;FsU;!^&EC{Q-4DR7>=9nG|oS`p3OO5r>ofc}DwtD(Dw^vm@3>*Uv8f4}(Hl>V%i z$S)m8U#f@dW4h6Jh}TDuhxuX{w&`c7_6(8 zAfC0>gz`ggB|`lyvgCKmszrNV`UM!gJ#{P9o;$^foJvZ2P7+vqmdV%Ka}s*M_EdV4 zYc1(B7we(wE}LqasQnuycrTmkU5`GQ=c{QitEuFdKDbsrR3Fn1*IvKv+{b_MT7uzS zBh>VRG^DK;v~=K&@i+5V2My`r3yzEf-D&curC0LG#ryP~qx&=EsmW$#ow-Dbv^G|s^8qq2Mlf;-NRPG0? zh?&n8XTI9Ze{{Xt?~v7s^D-k4%D5KO>?0&k;`rRHGAEy%gdq;`B}lBI^O-P;i+p-z z&)fdTTE&+!ut3SpH~opK!4do@(x{7+61N)f&G|j}mx~s)ed0vB?T_u`pJ{K`M(KJn z3UZiGYEJ9=23}23TzD0+uDu$xv^P(PB8}ch7+evd8GQs*iPy*qYj}DYLzk2)Z}tK? zxf8EWUR{wcHRepx#5O=D^qzz--Sy7D_?BI-v4MeXcp!FNpbbN{pmwjUDA#92lJe8Z zr7`&*@I?5WoN`9U1EC}bG_*J0a_;8((M9E1k#w}Jyhb{d_SYXmD>UUIyuk^A4`#BU z0_cYojY~8%O&H?v%M|6M(G?@pbf1~3aK+L7NdkrC819T=DTdo)I1$5Q3=1(Fi(x*7 zqcP0Ia6=5UF+@LBo`Rt;bf3v2p+R&Opn{+4t-RX`Cz0Hon?j7LQ|4MvTT%f7lwGIV zAd0baVO5lZCqSxJKS^1a71nc^7X!JNCD;V}Cn4_BSh7 zqt)b~kgC|ZmJ}*r%gz|` z{kcC5YOh+>tm6nbAD#Mic=hWWkjpXzo)+WKt`qtm@gZnGb9fl~R$TFF?FRIz5+r=- zR7v#e*Vj(1N7oMsqV$oO-QRvxX3smDN9|$V0FUknlw;juYEGEzovc^dEhxmgD|I7^ zqTK?IS7!OEqLa8l#jFVHB($M`Qo99$13hxA7Z@z41=$UFlv-&4dh=b?;!Lx9e_&c* znA#suR=SoTv~#jQ5bS_}>{hmx+(zV_sFBoS<}Hr|{ae;Re4dri?#n-9gj%S}(;s=K zowq;(81DqcfieE1{Q4KY`^5P5bLQ9IHuKGHm;O9T?B&wGBss_0qOSZ4NCDv!>S1V~ zPz85kLS-JUlBGIY%|;k>;*O`9amtw>LvAqYR9||qdaG%n?y76)4%rM5;oOGcaL*~V zeES!PU?x;VPujm@B z_#`e~#fewi$>8cQEa`n5=3kBeeP%AI!X1-W4MaWEK6b4>AjDIMXJ2D1c=lsNRuRFo zzX1~2FXgYNkaQY~c=maH#=(|abJ|m<9Tofd@_$rj zu9T;elu|j5*!3<_&SJQDO!Jc8Z+pW>SCnxBGB%a29A(tfO4n9WTgFjj%%4yhTff(q zaY8a`%9M(OKCSs%QlvUPLg^PGsk0I4QR+cTJ^Z$}j-vuw_$WU0E~%hruM<5}n}xwe zK(@Z5)auH|ue9p4dYX8aDk?wt>p%Or*q`thC^M5$%d|l=lfPi&;QspOeap@t1b=;K zn6`hwyTTFaimqW=p#h~chMiOx{q<6=DQ<#WQfrA&KO${N@OL6nXy)Rd=T=ne){PS> zjq>EPb%mSQ+cZUL9q4t}TF{l(Q<1+)w()({m5VlRH%Zo#LFVG;kwcdP-$+z{2mQU_ zyXCiNlrYGAF&>A^cBz9q6S^avpthG2M7O-umKxQGTfSyyA8$t@G_{t+h*~Rz`dOq< z$cP$5qTILrV$xd`pVDpTvuyO%ecU%Cm&n$YtcCK5O1_X(JLI2N^3d38NWQFpzKKlw z`{yq`lIovfQi=;=`lC%wC{`;z_0O8*;aXbaa+gK3Su1U_c#}3|R2#B^KN^3*OK(*0 z(u+)c>2>X1`T!!Pa$CaEAa(N8&m!ya8nFn`Zjjd{4Wjst200`~BvwiqCXNRDj1 zK}MlhY!KfsQEF?CwWMCw9&aX-{n}aY>5E$b%~X3xYDpi~^BD5+T5sf1dzczjJFe;Y zik?0PCsIm}c?}TsSRm9d=n>!xdW1;yn7Mc-3~gOxms4# z<=ZI2=5zVG$-#tMOAgEQStgVI`uzKEr1cqVU`j!MzO62wi0L!lm$K03Sp?JPJi0@l zRk5Pa8lirs#tQ9XL{$ys(^{84b+1F8)3G&`8hy?Ym_8R%`jp3LV0|hF6K*XzEYqiY zdw+fY;=L(-N^g16HWz-ECpBwwaKW!GPSKODZqE_+~W*bg-gaKWbT zR5(C_<|>keYpDgzy@X);oX2)(ZYXLl+tyroyM^_{mNM|3__o(3%2RwwdHuI3vnd^H zSVe_*UTE{x5%M z=hO}@HmI7KyhW&=DX;FtB1EFauJNpU9hy8OW=g9Q3Lgn+ zQ<6)crWEw&H7ZI;T$?($FJ(=i^L-tPtc!<^xk#v=>90hFMwFGaD^mNbas8zD4khl4 zA}A$FoFoWJWGo~~gkDjJWy)v1R^p()H6&i9KOJf4ufO$QP3g~SiGHL5=}VQc5f-n# za)-F4Ki*0(eNG0-7XDKk@0UYWdN%&BxL;|1wXS}S;TjyKoiCc2&Hw0`m)7#dp_wZ$ z$thpkT>Un_0#+5;T>U`YT(t#pX6mKL8rlqHsUgdR`i1tx(lDYTlfxS_bMX!slE&1% zj>eo6Gx{hK(wNf()|hhWdSl9|yJBOu_sf;uL|aRG-(T%m15cCD{*98o*Z%6}udEOI zt5#XbFO|?Ps)y=Riq~Ghom{gCav?$3Uwr_D+x}|SJRAI3vr_h#1tcFx+E>=mNbtRBjo$gDCoZ5?V za-WB|&T2ZJNkm#nq`3B8>ssoN?6nT7F4}87HHb7yXho&O&Bl8h{2u)27I1M-uxL9f zw%2Of+qEgJaP168ed=O3XoJM%ZW_3xY7*OdueFFkxy*n!(RcIQ&(uGH3^>(r^)LljQIzM4jpzI@Li~3CQSqO)l4bVN{M(WR8lzv2Zk7qy=`+lS}m`Ar)=A_Rq|y+a;$& z@dlcH*nA-zpZzg*C(+=Q8yhAWM{)?QlZKfD>niVai%bE#HQ_|bi82HaivHN0>um#B zE3|DhUuvHG=3w6V3{+Pkw80@l>+p=0y5vzDVHgCL*#}uNKULRW^dhaVuo1&n42Mu3 zhP!T8W)AOeyom3zJzsA|u>|iBjvo+=EosTJqk3SHpt$Keod>K-lZ=`}gh;6)mp}K* zU_9eo187Gv^UK%kYZF^{WZv33X>)zY*36sNzk#Y@S)B2c3W<2!F9l-sjJJq5H*@!= z+b6nqRAK#;zCLl%jxCutH=yq28xe2*3Rk~$Cx2f1Ij-)}mHxc;(_9_dk-7a_6#Jo< za&ef8Pkud<{VX)^P`~}7+_+CS#PuLI_>!aD_%Js$&IgY zV~K(;__F?deMjc?-w^SD{vhV-DdzR}@c+IYnU7z&P8y^_4<6+9gSWE89@%|lBy;g5 zt*}vFB{tYJAzf?efc`{1p7Ey8nXQ}1E-!QvpN}Xb6&y-@r%k$S=#PK1YL+%``;U#4%|yYD}3!HCTH-6wQ2@BB&ovaUWvF^d%~90_)1 zJjDla%&BL@_~s>V4d-N*o=Ca`!6q1k0lA&f3}P{wVvMLdQFCJ6iMkVuPBffoIiaaG zXw8Y76D4>wLbel*N?7O#=tcyVm1cP7&yv~D{?%uA=a*cI3xU50-EW3>e$}iN`42(& zo8g^*9-eaK-v`Y_uu3$KzBv?&Ruv+pw7;nTXHiX7Q1z!EIC%(u_ur$;( zb#O=t#Sw;)b(!UQEG9+f9jB3VFePME#Pc_+ z*c0a?-OBdF6F;X8@a8j4QYd@k2LmyB##2Q+Vo#V|wjR4|N9Lz^cL4xepgC#P2?G5v zEfR>Xw(SdX1^Z%surDkku`fb@7}UNn?%nsFv0y|m`{Hx=V-?K~Y+s!D2H6)sb<5KG zN!Nx+hE*7mPH6tJn2Hmc0WGHH#Jm%ACl;M(IMH%q$fhC8d07IMPtJ)FJQ^;tFA6AD z^n~b$UMtxb&aYf^A6VVKaDK_Pcwlw=!ueIRO5|V3zHt6|`16r}CHunptME5seOIzC zoWBfz6@JsCJlIAILB!9k2(renzA{c2OTP}$?yh`aOXqos)3Y5z zju6AGU|!IQf^&+zB&@vqSQWV;8dI;mN#3@l7)?JP89N@U;zxez5vziiAXh*DrGnrQGiHW4?KU-%YGQ? zWj}=OFsS`t+`I38>Vgry?1y{SWV?4}b0IAkRwngY#G6FGT*8><8yB!{0zZ z23(7wV}?$pVZR7Ab=VPdRjLL{^APe!$bJ|ind}FdAF?0vx+goCP#*Cd@j|nScx@pY z$|WT>W)h1zvx&zS?13LS$x2F-B^r3yswaI$xoZaakVOK^tspQj-%}A-ABvDqqotx~ zemU7k)fGCd55;J%dRabLA6cp-N32}$D%5i0x~SZM+`4j;4^UyUopHr$I;;;_Lc()n zCKJ2v*w)x*wo=^Zl?!22pGFXbol}@4*b&0EvA#B+hRH)7RjUjqN+d7WbMgA&_h}S< zq0{=PsiA1JDxq5+a*FyU#y;rNt_fpd9y+y&p(JY2H@(h z&$1A6nus~266H+{_R|Qh_@U78DOO#S;&X)h+1){n6jL_lgnn2kL$`GpEL(1G8!W|z z*Pr|J;mi*``^Rm3kVYp`Oe{{3NGzE&pWPKq8c8R-f_p@UVr6#-`(Q7=Wr~*c|hYzYZwCr z`=Zx@pXL}G0x2dR(MT|nQ^v%Xp!G9Vrsy(sDe_OI_$$!9bC8~~tHf6$|6Gc{2JJf& zX^UW<_O zEY@9?)I{V@pYg~M?`J>K7FnM7O5`7d&c%ER&_h$9+#zsCp-v?YlV6(_V(90bqR)3ho?biw%l`A8ea<(XDC{xT`f`fZz8YToxF>loRc zpODRx`hflz&wXP1(_dUihDk|enS`d z%ypRQW6ubtmnKx-1J|IdngFYP8}`SxcbHxk6^Q924JZ@4ULa@vmVF!cBB2ZDV5)7v zq23`EMkqTxJ)>*{6~)DY8>4KtQF|>Cy4`gc+U>3; z^sRBEwV+cUWKa?n^Nj*CKQ$0$+Bes4%oS%2$?`>4jYBE#!4A-Bkox)y z+K}4tA&qpSv92Xa8tI)Wx(uDI2WXf~@mHYxL24oL&!zZl(ET8_9QhYg{B`JlkXnoU zhg19w=zfs882OK+_=nJHKS&)q80srXb^YX^`$1|x@(WU(zo7j4Kx!%S3sRlG1U)#U z7U+%1`^}FTKeOnAKA9uX&&FX5If$E=`23c^t1-3c*)R>ogeyU=B!zW?KtD@kAHfZA20D2~l+dcq& z!3)w~%mIymp)VSL@}+Gwt~nYYie?x|QIc4Z?ndKAA17%W-xkNEUX9Hu{`CXRr2C92Nf1>p~{c3pS*EHTx zFN0-Sn)OJ@(pbecK#~y zg&04b;;%qE_)J1Oe;GOpzjgnPRd&kc*Mi$tjP3I>$BakHXPE)GBC^<0l{M=zqX`J8 z_4QfTtcoV@W)3hkq0DYH$&yQZoxRlj@2@(BMRq4vD9Z#ZbP=)Q%}+QUthlxK2v!V+ z6~Fr8-dOQ?1_l2H#)`}0fD=}vHa8Zz6!cd&r?G;sXkU9`vBH;o!ixDQ%1T(_{KAUt zjR8Ye!V2dXRx}2|iZG3Swr#%bIClFbOQGF%MGeIgx3cx385<^RNE>JUU3iigR=0Bu z3y&9VKD0lLHhkz*kkbA>tK4*>Pa0@FdF#vnJ=c?;d;IZW(Yae6!J@&i=+1Kk76mt7 zj$Y5dff4AeIE?!s(DywXH{Z3sO~Pw+!?(Zrn4+yG6N6R=V!glQgvNXr4^C8_s5v2K z*(BQueX*mQCZbR)VUhDI*Tn&_$oVB#75-j!%VlOYoxAxynJ_uV9s7&L*>h6sCq9OO zEuW=jinDy7M5GVJiWL_K4ax9{Kok^O_d{LpLUkTG7o%_8ofdJG_p^ zg*G28Ox?9@<_p?ekqu*zbj@=Zar{H8Y|0X=5wE-bb{>Xr3YJ9*lGK*FIj@k0qMM4l zug{I|eh?_yo;Hg#Zf$T6x|dUD!vSzjqy8E@g?YblxI7%DIPf|pxwt-Oz{_> z%kY~L3XH3uIt?(Mo*E(q4z*t@T-K|hYvM_kb8Y)zG-~j z(B5_bLIP`@x>^cpb=;|7ai1(6TzcMg7{A3CT|JwtTh$tN^}}4DTZU0EPPATvzJ7Z{a0j*YQQb&d1zwC0?My z?A7525;NBq&eoPY-*>w1h;px+tUOsxNbWMImgUY1V%L`YspNjIa<9dHq-|$%|Jh!- z^LoX#<<6_tuWKpyQp|m4$Xx?#ne5rM=6*W4e?_^M)x!Y;9X>+#*Y(Q%^tI;BE7-4V zD)+o)7Y@Xc`_5ju^Yz!YY351f{&|z##tO0%lKUHb<^H4iI$O1vL|j)|)BY?=gBIxmkuRZn9E6g$xn8#U>ls&x&YY>1)vt z$w903@kJv_qQY+Zq2xVA<413jvArOs-8ag7Tc6pp|C`7CL}E$Z4k-nEV^I|os=}cF z`&vm(#Q2)xr=kg#;;%wiBEP&^NN;&opnW@YGR0qpF2ElK0^CL@+4(bH-F%lFD$@i0 z1)8~SG3hOjwxBE$oxJi?=M6$ z@tj9%gqGF(X2}Eq*2L{>M6Lok6i#TQXlq2V1=%>XT zbY96{+Sh{SpI*^&mI}#SHMQ}n5SSigL5$`mTbDBJ7H9c(hm5%ApBGlORxw~*1*t$4 zqVJ>}&>tAjpShQ|J%8pqscKF`Nn?U2=|oO}A+DDn-_RYkPSRYYR1?{C zz|K9^yu_<%lcujL+Z4XmW1GovlW@syfG)ILdfidUF%^!+F~X-!E)L#Wh^3$qXjKQ3 z+@ZrcwBAHJ&G0T7>v%fAhJ|aKoTDojQ=pnYRwp!VP`rw55?ZC|MuhWrp==J-6DOua zc8?vJ8p4dCx>FFWH5f0Ri&%6`}HLDo@-4AS(5NR= z6*>)(&M%0}!5_Le+(sx_YLl>yjrP6McwRy9=<7+Lqpc_7Ix_Ut9^h!%=P1;OV7Jh{ zG~yB@>jQv6GLj~Y%OKBKG`s_oPEccArR0Rb!D1>-RGp|fA!cEz?7EUfg;q}WD9S$Qes-PnE7#fwR|hTUmt1-H zO|}|^8c~IC(2{FxkuJ)i=J9LYQ0aPp;IO)I^oNNzjbAqR(# z8*j2jWW3p`iiyo9K{wf^iF=yVNIFe|ZnCLAQKFk{l^)3UE9VH=t_;AS*BGl#z}DM; zJm8z^pcQi^7OSE(aUakhF`iL~_!eplzJ=Pp`I3#QE%m>|9;q`BOH?;xI^2XcN7YP6 zu_<_YoX3QAgQpN;SPL5wF|Z*4Fxg8)6JLkuY$dRW+J8 zT+6buXH>0O{XKPVxION_rZAABn_|LttH(_2dOxD*$Ac0)mdG8eSy=+Yx)@pQ8iq-$ z4YO#TaiQKSrUuC+q~esznB9Y^j51fX=s=sVyXQ-qiJZ|Novag*PlJrSqN)i-sBg|xUJaz9}=c) zwO1}9Jg@G>&7-V7nZbIC5Ye$^+BmURTqV|U0!gzb43;ePM2xSg2C0Rv^H+(_e|U93 zbpA5@HS)J^QX@|zst^u{0HK>h_~FwA9jzPApPooOEP0oVqY>|f$7G$zsprg|GCun< z_5=n%NUKwxZkQyRie|{FP-#hr=vo0YXFiKPc=1!)SSjJuE9->aSlPMIO)nkRh?>3Z z!NLoBqh|5>{ZX?(vmVeNq2_1*`zomU=F2v!;%I=CWI&SsI0`(31_Lam6H+BO%2x(L z44)71TN6gWTnI5;27g0B_CZ!vAVF4LXk5O$rCJ>;vi=<{nkSvFjbs($e zL<2R-?}4cP4BDQEs5mPabk?!HXA$)kPY;Od$Pf;w{0jBr9}UqTS+6i~>Vd4k`Is&f z^G{AJqNZJk^@xxwA*%BWQ41eg9Z{WMh&lwnHE=eJo8V&Id>2@%W3%e>ZR0XNp}JMZ zRl~mztw~CgZ&)fH!wZ_T$^c->NgRHVqmeYpYH>Q9Cye*ytkN&_t^%6~5Mz#LOV&bk zWozwBB;-iUHc7T@ajgUsXhJ_odDZj_pOZF7eeRP2q-s08!7Zf_o;ai)fp+s##+~jj z5|)1>G>n{i&x+}Kc?`v0swQs)7JY4HA+Ow zOiyf9=sfW~Y}VG3dm-!;xmZSw$+SV?yEj@JrG1f=2wXMdRqHNa|@$_?YY zb@1=kPb}sZVx1?DxfVrP33Hv_F!!UYW3KZHb6b5dSKBn&k`VT4qq1$mR!=nE8baof zB|%st1hEM?uI{2dd3^SzX4e+%H3OD~z{3c^sNp8>^1u{*;J>tSbBJ5&V7+j&(-eK^ z5p>(k19rahc<_@N3O~PjR)74=(Z9^i32*bOFZgb7a~}GFM%l6A4T4V9#xmp`!6Fte(=QNV=2~E_&6U$SqUGVU-(%4r`7S% z`Gt=;_yaCcs1Y*m*vn>?b$kRW7eSF|k@m7j!&1L(kBXfw#&xOz&YpF0=BoQ2Qap`N zC$z#e+Z!R{*N6!x1Xva`Z+yOmfofmY6h7~Hv9xOH{d_5209^W<;fR-;fOsu0l; zAl!|oiEMv-rrEvze<<*_7s{r!%l;8IMeCl{W z`&*BF1hjbv;UK+J8L&XfGQ6^#JW_?+u_GK4*z9;W=s0&LN`>^sEy@PP8c1 zZZ(`(bfWIWyc3#NjJfJW#fh>LB_}4FP>djClrjhTY-RTL0P-X7k1_6)R`U9rV~&tt zF2=W@8@C1iCbYj|u>tLGra7GAUxc2I{D+|37_37N?+*Dar12qApUsl@4zg=|XpMY-B*g@OmVnhW(PX7vA@~nu9mrBb7 z$#W!GrvHL&&A!KuLi^&PD9=lEeD){oc8 zPYfmxXkw|8UJH#wgqAEzvIA!#CSZwme|SAJiS#*CG0tFt`+QQ1Cr)MKo8N4K^URuy ztR_D5Xr63DPI;n7b)POVLMlJ#pe2iXhzy!!AGx6X=ZB~2nW<;rZs+`E{_ib*XY*~l zkF3vJa^3FxAGJV+Lz%M|r*2c04KA{+*qflA!vEsJQxc)J#x3h04n+l7*s>0SFffA@ zVF_l*$+k`*$~H4~-EDd@VEtSEKc0L#jS+#ixV$i4>KH9eDP_`sq2p*wSJJk;+ES6^mwIH**-J4Z@1-wU(@Qa0Xi|HB*8bSjSsG7SZy+>FarTuw zGIIWgYjmMA=&$^kWT1yob30XGA&xL*#HorS3TJ;7uQLy8O!@<$pKAUiU4v7trqC3&TLK<+N)=2=DY}GgJ>3gaZ}4@Z03z)Lk4P+wGnX zR9G$px~H-A#ZDnrs}Bb%;`Lm-HX%4cAt6#WzZFZgitTChiyi$=5^9`?)yNzcl}nQ}n38O`DINJ9QuD!N+GlW*dPEb@H*S)G9H{Dxtfn=b+t9y$^bG#M^mj z!$W$MV5G=n8cL_K{^wVHQNY>Rn|Zu|&zkP}E9Mwsk1$g>Mqp$^C6+8kffsWkXOJZ?bN8Yqo%es9$M7g{85$86O~AT@>WC75&}7TYK#7O z&=Uj{mT@&L5t30!8g6sH*-)JLV_o=~#R zTZc#n4bZP^$#TdUN)+y}8U*4Km?jwK%zAbmu-msm<@DY4i}Fy22DH>H zX;kP)yfz_FyM#!=sufGLidAVjvCo9p0CQ=%G5MG<==%^t86-mIP^qKqD0ChHd!XxG z!^0ro4Ti4cGyfW(^%gR*e2{R_Di~+?-wsBD9IpX7~2R;?9oY5 zyFIF$5}*u6DAgHCM28a93;g{cbROb0=86j2(Iuo+^iD!c)`hQUf9pHoD>sKK(gy`N zz6!7%Uj^C^ExtbXmVt0pD@@1LN$BIiRbimxs&FyjYVDBW>Zi+{xT@bX=E0kjopwgGU}b zBwVx#f~$mXvL-7;;TZ7=u0p49)qqpDO0;nGeVD2d@XJk|mMYZL+$^CPf zW>)fyIDZR$wmufuve5lJBhJ4FPd)Ol{W)T5fuozJ9PKl&9*ABxu5=Ioq|WBWdm&68(u$UA8$KYebXuGNrS`ZxMW;C z1fG}7?k5}^Xnt!TsLyXr=;N5*WPkbmR)-Gr+vRne-@f&~+VdM;mv6_*LA)+^^NN<{ z8{*+^DZkt6qIbR9OXs)E81GX!-wo=jf#_pu)YLP8K)za=8|oTKS205Uh#Trh$!wR` zJdwSBPs%u(uj!*>`XMYl(%u6<0ql@vG!_9-&iLq{|_r@-t%$J*+ z=seqI?%I-iG1m}CUfdgfGIr51$&GN^L6WPoK;vg{z;5y%Yu7 z2kr4S=xU4~%qOEpDxp<1lH;;05J9&}0lHU!=tapBAbP9dG~n}LscSaivpAB&egQ94 zRGnz6Z;3Lf5QeS&EUrvvQ6&lV>p*Fl-U42k-Nw8UO6P5O25*ls_ebgaSB27KI#lDo z4FNnnX_T&k9FEeOBOa=iNM`r@KQItVmk`2HTGsLLpfsvZP#QX*bOAYl_2*mp}BGZC1RfM;|b(a1x09-G| z^h07t?~+D^j>Kydf{IEAUv$7`#S*PzRa#E$?KO$zhPq4`^gWGG2DQ*NXh-dR(0Qu6 z%-3_cIowi?%TfC-^0BO>OsgZxC3Mu5x#6fScaNiX1G*cvl}>Z>8N8=WeP;Zqqc&@j zd>3j5jJ!N95#s}|iwOuhF=YLZd9y)`koqv;sJaQX*y|CUkEG&T(5)ChLI%iX{K~Ai zk4L_px|C029Exo=M=nBbmC_rv4d1c1%M@U!-F2SM@jLi`0)C4(h2O#%b&wLF^-7I* zs#Z{=@C$&x>YCz8A#y3WPxQH21wx^K5r>C4Tln{q0BC2ee1G`Miq zTLLn&>ka^)hQnmf8fzR~$ZOXm+29P?z*VheZwG;RHZ<;CjMzQl1{xQn7MS4%0C1Cs zLh@n<3?z*zJQlA_2#{JrI6}i_#S*PzRoaBu+W>C4p*|Ca5!Xa04RC>20~I=eH=+9g zc;U;zsdU%*Ghe`IA8hXX$i(tN!bPhf=uMcQH*|vD&Gg;u|SS9UG~ z@E=J#l@epR2BcbRRh_6fp%_)Lm))#*+1aYBXk}CScyQ%Rr{a}aj`&c7V`K#)WlyV} z!Xlt;a(B2w3Y5~v6_Q45+1P9FhqTa^WVaTe1e38QRT4QLvAV<7u4$B{Jt74~!0ia! z!CfcM4wp!lrWSWjP0lZc*RS}T`$X#8P=}3pt)_jLeIh5#4}{kZ1a-V_LLUcS%Sds& zu0scFd+u)xr@yql1E-tua$ujxPdy`g{H6V_lPDXI+dlRbG5xWdg2!Jiq()G?npZ?k zXZ^!koIC0tNry4Qx)XQQof53h8wSQt)OYzsRCwYS(S?TY`>qHj7X-{8PSL{E{UWE) zfx2w%Atl}Wh+m|H9vq-|LiYjaKmEKkzTCn-iI%2Gtv}QhGJ>mwj?r__j?w#|-xXny zQMAm$Rywuv-+ibDK)G>DOKhY3|j(PFPffsUl&ThNUd z-`B!!kVz;@xdGDs{30qPZDAMS@5Jjx%K_JQPrN?N-9h~$<%rtu3^4&^CaJmwHI!wx zZsYjuwv9X{iPR`aIK0ypwIXVlsf)NL2`%pxQ2VlfaUV&YLVKZh4FGW~dmr>eXJx?9K{>(^z)P4bz=_{AMHZ%fSFx>k_qpJWhW|5lprLWHWVGj#h&{_5OgvXuhgX& z-)qCt`bUi#7%{JE%UP$s1)6vJNmNR26kkAb>SATf!8RZ(L?!n2TKpq6)~R2G2GP$% zGl(Wq-b(#C?C5#sY$0;uA}L4=xMiI!UZ8_`2CjiJMjC$ccVexLk#XF z@xdiOcUHp_<^Jb%ll;IZqnpIGCT|RGk~7la9qqrB+$0Hj!yCZ+tD2SP$R_P3c{UdI zGB=6vJLyRC-rs6Y$SGnSui}Ja)VWr2lZ**o;88XW2W)7MS7tThE$1q*7K(sai<_iG zDV=6_MdfNca)&)1zBd0zH*g~VXv9zxuO@X8IZvpcbP&l7{MG~{{FeP|32mhe_fX6Y zawL)+3F~C4gog+%VK?xTa66gmmqPWEZ*yNtgBvMSSNlKAzLbCXlYvlOf;y@mTv6ph||~fPR+e-!9EBx6q%)=oAWQz|uIDrTissq0d35 z{VYFlI2gq9#CKchN~czS$$=gSf8PV0&jc|GQ0TGwSscI@$s->HIs)zSE$DKLKkaY`hOWO-Ik||rfqpH&6X#ONPb3U zaMZu$v|~ekb*H3%A&&Z#T?Ze`9&^wTufCX=XDj(>dZPYI{xEcnWAoGezYi_Le)G$u zo?Wu*NBlJL#nby(Z{-<{J|U0akQ5QWj><4{4^e4hHl09X=voKidCR{pJ!Q%pQc1^VHQ|`@}=a7 zI?rNoOe46zM)Lt}q@RsX!+9dLG}jMuGLjv}{4y`j!1IBe3u%W=0rja{xcdjP$0}gx zCim?$kSaAFNJ$T~Z|8@9f1vqb;-U8K{MGN-d~oRtI_86S|Nrd04Sd~2mH(ggF%|Ge z7c?ruMWd$RLxQNOz;c5r{RVF&N|Cx2H!5OKc8QW|&;l2eEV+b07E$Zd8b#N#iyD=M zv|@Y1LrFm}z)!8RYDCa`jYxo{l*jzvpEEP}ev_tYK-}N%|L1+RnWr;n&YU^t%$fPl zcfLLu<^%X0pAW?T>3chim(71Z*tE|xn-3&TMfrjp$&{N9G(RB@l1I%41f}_4j(wk5 z=Yu0JbE5Ig_I&l|qIhxwo= zNJBx|217)1iEy=QYW z2N?FWXOpB4{(fA0CupA~(u`;MOJH;D&4_^F-i#9R*S>MF8~&%eH?toCG-DtBuX{7F z5)GQ?-pm(A#QEL#X1IC2Xov?jWT4a@OYq7!5RdQ8jCfl&ME*>#T=g`{-`O~e6+V8( z)6*OcKhwRL6b*^cF>s7|g0wdi@+XNWf8mVsGuxXv}Yq=)K$0y4B5BG-5%y3c_gwpNa>oo1Zh>XX5hhPw>Q?8jVwuNO8qKe=!|#@S&1 zvFzy>=O80RVR3S_{GwT23CeOb-ajI(Crl!G(~Pn|Ouk>1eERduc2CYklA5!>Z^+(I zbhDo3?uouQWjY1D?fxlgC!q=OkVXC5RyXS;bD=I z;w)E)WJ08sh=|iEmy`%5F7S45kF|Re^0j-C^Z9$+J!yqn*A@{8N(S|{gXLaO^zcvi zTBlz0P*ttf-4$Ntobh~=y5T&c@WkHtkx`Kj$k14OwcxQxDnw*kEhj@HZggke0x?Jp znjo99e+;&Kw{tA1(8C#S^9%nYY;=^V>(CaiikW0Ef`#5i{4Z;vd%D#6yszSFVH|>` z{tFyrkqBsL65WSD7nXYP&}o+Xt3DYlHSCF7YLf9y4^84S*Zb_6m$^1ydh25g5rcX9 z(h?Pugre{`xx!pKxe6x}Wu`HI1KwQgL`zco6W*`4gnRerJvJctKUQbY@BT=X_3n=o z?eOwu?y4uJW_$6+pkbBmbWGdn)~hzwhf1kf_TIl9W=Zp=8Maw>$?zEkcdrL#+u7<9 z8FB>FGGkD?s_S!3kIVd|Bp< z{ghK{Ij=eQ@t=M6v=8*sGh^`wv4TRD;C-1gh2 z*8Jmf+iwv}i{-rO_VT`m%NG2*a@JVR`>H?vg|i=i_|wX1wVa`QuGr_-pDOzo<+NGO zLz{ki*^NIq%%WQ?seb)FXePv&g1t!_n)r44@7dpc>Gps4fpUf|XTzVq_TmTE{&b6Sa+Y(` z2akO1&@B&+DQDDjdjIzF-+tzUCtBafENAq#wYOfhaNmuB*&`x)&|FgA6)zSnWf#al19;5mZHSyB z<9W&%vz*UYfBmSDx|6Gwv%_+J*wz2$?`-YAMmgh_v(JkUJ^TYddGQ~Vlee6|X*v7y zmmm1MR^?1u&ZiHnIqsgHEjdj&yDaB7|NQrBzx&6ppP`&GO_{?Fz2dWLzxogF`-*ZZ zEa&9EfAHeg`j_0RoJ!02=*lG%>BBGljB={TDf)|*2qiP-;saj37;BiD3A58ob11#ECb;xbk>0NU)x^I&DFf0iDW zx#m}{9L=%@stG<#hQeqQ4(*t4753(h7p@TIqQk9EM_0l{o6?@a%Gj;9(bvX@^I@i0X zoNrI2SL|AU-|>CjPe^0bI}=LUmpEDb2&!~WWv#vg+R0H5txe&wHpa;jR8AonMhP9% z{dWK`LqRO3-OTdL30R3j1fw^T%3e2X-@nk%*V=1!-5 zJ5b3~)R(f|L#?@O*xk^bIg0Vz?~0eo_@2k*JsPFl_C2{pphevn* zzG>OxKt)s6F+>d0V-+90H(mFuy6sW<_0dRfzo>3UG;)11Dt|Z{*;X0V{V6Jch}Z#9 z-LInZ8-aLURL6&bZcIi~Bk2{}*N>*_?rL7KZGA?sJKMa5s2G(j&yDJ=qc(K9a5|*% zyina#d0o!Uw++y@088>iSW-3%{gfZLAiDFn(XwCbTenj;I{Kf4{;2M$rn*PdD{|{M z2P)F2bKuzq;~myY;nZlfVwCTJ7+eEU3z7tt>$?(e zU^J4#*)%d<-?S{RVX<+;CenA~frjoZYr+{@9kFpkca;rY-CYAw`TejFem@zF+yuY3 z!CUw}8I|8e41Vv5%Kroe{MJyw@9U!#x2zx4irn$nqYiDte@R8U&ifmXrSzsL(NRY| zmsT%&#fhHnX*mzDJ8|&|kLZ|c5VLEGw5l^=Pb2WOuU%oqDy>4t~N>L8$-~S40)D*#aq7UX3EYTwa19?#Xp5jk-FcvUL?6mi;q_Ke615 z>v~z(4lFEY(#WUtB41i4BPu&0@@0$bqwJ#U{5!5dq)*Oi8f~`%79MIBK#i|)O(Osw zMhW#4EvHcTehD60I|&1=wFv2XekAIN18Oii07AaFul#iO)EOh7+G<%f)pC3U)S|ke z7Q+Zwujd>9^~=00YCQ}5*Zy=0@}IqNz~hdxuddGD{7rRz@xm!qSoGZa6N{gC$|WUF zsM>Zn;X{B$LV~p`=mce&)W_&o{!$CrQ@jNFY>GCLHQgN*u;J0*WP=r&qk#Jut^V@y`Y#3Hn zI=i!p@AO=8@Pe|;wbfUEG<4C#pC=_Qyvo#|Y3oSpc1M$|%Y*AN!jDLcL^(y%fTo^Vh5AM&Sv`N^s5jb4~+UC(Tm zGZ54f4n)(Y(+%WENG4UHiC4&J#L}8He7T;c*aAUt5SKF|FkwEeQ&XxpW+7MCD+Hgx zk#F_sxSqsNWK3wM?zo?%JBc4f{#IpdQOwBH^T7{(#Wm@kZgKYkj~nWyQr-92Hut7? z0BabbRuQpR<8RYEamhrO{wpXCZb2n+a~BY6!Lx6!*3SMXeJg75_nzmB(IikLzweV} zj2p?Te6mu*Io$I0cbvHTq<5Yyz9b#MC_^8{r?}%z7ITA}%&a z!R)vbtyYA`LNL#m0Q1MyIAwXlDh9>QeKia#iegA1zWkCIwqV+1|K}*aW>V|0hO7Hc zZ6(Ejx(YuaO!Pt+9m{4ayti~Jxj$T-O_%;e2wJ#p( z^_igHHN^Lz;Q#bRz-hA93!#pP*yj-U1!;MQ?ZDgU7;)&UMn$9J(~_Yyk{4SE zK*%@^h4n<9IJ8(T<;Oi^lXlN_=PxK6F%kZTh|-2jy@kwGCi1=`FjEa{WucCg zRu;RyR2nT22B7n5;g`|~uG1O6vcSL3`3{T{hRzHU2`h(<#2GN_qa^iB>CCLS@=$NqQV+Ajp$|IviS|Ym&3t z)H0P21T|EvxS^tTly!L^L^2`L9wMzFB8^u~wLe5$KdW2`3$-3weguzHdkCqhZ*_I#GY`C#Ot@|6;7v|_rmayz^~--Wlu4aO)`k2zKh}J{ z)>~Bp7(-!#D#?sko-Bg$&`;4PCd%Y#5|O#n(}j+ubyJ09N&xKakn=i=e3C|M)g`MM zG~Bvg=20mWKm}oQ&(3oX7OG&vRM^n?TzXiIb-K+Ej+vVHr!!w;-XRs4#*=k$sP*Z(P%xcaH7ACKIBusA5L zrTnBR&b?S19{xIiNf;OAGv9}4Hwh2o^Zgc~-YlHyzV+4h&DmY~FMYy2vU7};Od$+q z3K?Z5&^Dr|L(+1m3wD=qv2&ENp}@`)2JuN6#b0tGLfFbnSm_?T z$+fK#i99j_!D^le^<7y#PR)|*5uDnqF4m$|qH1igl`mspz@W4Auw;TCUM*{SC^b;6 zXjL!jPpcK2EHVV4g{eW7Qe1& z;PlY2iz^fhr#PgwZmSn-t#|9l->Qr)irKnW%(`U2QQB^p@%ss5>)L+<)-ckkl!ybf zEJtvAHIBi{jEDy{XdxcdK=8P|YVE5ZpCS6joIg+C5Mx`ELzx!kNhl5*VqOSM0^fLj zQI?#=vZlww5Ke}O{8KBc^ixoh5cROGOGd2$8k3x+e7?|_o{^s?4igPtSovr1T}0r7 z#nni_SrLn?&5&Q^<8}A(pep{p8~f3J6d^@Pbqj8uQT1PC=SH+f9$?5N{2P4e)^8{v zX|G+EZA0<&H0#NIqU?_K8%t*BOKvGnXS5Wzj`?TzHa9UbNvH48Dd2 z9F)nElecj1I+^T4C$BH|GzDX2VaDO3rXi)LuQas=vEj?9sNY&ZuawBTb*PoPg(#09 z;5PTIQ>;+KWBO-!AvdF9^e?QAdwtsQp^t7|TGU4ahv|kL?zO?aFyuK#Y|!hYmZxu_ zsjbS`qF7NMr!JyJTGpyn<5xpiH`RTYTZL`{)DWVMibx%0!-G1?jt6zDpggE!CGnt+ zX7imoKA%$|LeU95Rq8tNcH)zwQ_FPXGH0!bqS)sidu=Hafi2JkMXeN}rd!49iC6y8 ztwQzaB@m>^EUZGu1q;SJVR3YG%8bo=mWKNqj11?F+UO0^O|!QY8W0S#AtOC1B&6M9 z^vY?Q#8fj1TZx1vX&Z66XTz*~%?rvCj+})IGvSPdEiKK2c8vAUi0IpZAD|6{Adpx# zR;P*!QVef#K`PhLgSZu-_*khNe#TReLvh(tzakZgJ>sfR#KS5w%OfsBr$<~Wf5wlv z&b*k)^MAx;yRW8vepeUzJL7#>SXy{$J6ejUKIWh?EJ($D%ePY<@rR7H)X;dTrp7Bi z0#crtBQU>5T;k9FF#enGn9d$moxfl9p>J``J&WnFtXtpWY9H@}Z^Z{x#O=J7_-T8? zxsmIx7mt+d0dKf*+f9BfTTCX|2Df z)?utCXk2;RDqxR)!c~>KNb;>d+3u2QpKNu>W}lQ70Px#Wuc7_A374KN#~o6YX(J0!=NXOy)%l~p70O=^>=GRhuNt#y2rffA`u zWQ%CsB%&HNCHaeY&!Hxr97(~g{0jz)&$Z<0$`LUi7K-GBl59s*K*urD>)($0%{2H4m7bCV#45vXg&(_eiiZH4xFj=2D6Dd^cGD@Y?2=l&j{}6_j`>?sBQcY-aAQH!K| zecC)eh!ncmM|ljKz8H4+q304|D2M20#t-E%@nbZU%Gjb1*zP%mA z_HZqI-Ugq?Xy$B%0L>YAl=DK-OZ;`}_wZx?*I$QlT#XidZqA2#;FJB;r zBEy&6q(&-fB=sw|gp^lc>>HjcGP<$4MGiyCvAD51a{O(qUgMbCSl#M4o32i65u(ik zki;JR0pqTEY}^$O)S_Gt(^&k7jAuhH;Y`*}`m$YwNwE)>w)(s_LeLm1$9-Pj=V`G! z=JR$C##o5uNM{2JOOMUz-~4R|%;XLEB0tam+H`)VXffmY84-85 zVNr02JI3M!5-$oa@uJ`o-y+mS4*&4|rAOP(rBqm3Y3T=Q9~-NY53(PcFX(r#|mI7%RmyD~TBCCSH z+cd9v+UUfGlKsJ+xat2gH;+T5=5PK%B|fg(RcLgV14ezp>veA|Fg-*vAL6n47gqgo zxS(+Efv})82MSsb^wo~J8qieSNRV0n-|%GHCUXq9IwEtCe>vwF{5Xw^C1O5(k&)LB z+IWfS4DG0Ae$LYV*fdPZQ%_70gK~t$Jp#av-G19gi&S6i?qzN4|z3oVzeslw#_T zPvS|%2VJ~MahUoJ3`nF4Kyey#uB5 zzj+IpHPEfX8vIWR6U%vl#8*lwbn7Cm)Kx#J`g-cDCiT==O_D$8yF8@%8vIJ<&-eJ1 z;29}jjM^woGy4ZhYgugu5&e=OOu{ES#R_3^PBMgMoCsZ+Lz%X{ zDJ){A<)ZCd6tRVTd^w*#4<{>b1JoXX!Z}KqS`YHrK_t9hb`pC^QSe4y6)mj z8rs8FdYl>>5?KblSfUY>UTajt0k&V{M?V_#N^LWPNy0!uVQD(2oelA5l2DUK#!&b) z<-2@&i`+uWZAhqZY0B4-ulntR)7mjm=d$DyXsbdXLvoy%Tv|1{Hyv98@d}eZtn#6} z5#>`$Ap=5y*>n`svZ|977i*Fncq{! z;0Uz90CN!7iNdp}B`M@bzPq>t9RjoXJLtn&no&AMsIwZ%*IASSaRBl+5GJ8SvYpbH zkQWiUyl~zmK*T3<R4Ap~L@ps~AQHd!M zMaY5Mv4DEduzJt18MVFQe#>g#E(Aj+SpGwDEF%pew#^}g94luN#zIG?8f;TT+3WHP z&WvgCn5aR;)E6PQG{d-qeD$&2mj^AjH07PXd`O|wQr9l@sR|&&9wZ~wD8L|sh8FHk zE61!l+9`06tqwpPhjtEe4w&#{$i)zHv;qk=)|g&NZu;)BE| z(J~F*M&gGvcw3dRMKOCJT_g9^_PE-;8u2s)s9l+L3EM_q@c(D-2?VvP1U9C2sv_h! zoUF|NH<$8`CRei5a_WdHS-!Z-y=Rw$l-l2T)gb&HgwwQg&E z_zmPMSG;SLhR{jbpg^arTv(^*y}`HmHrk0Nte!jeDvTRQ2jK^;1V*TYI;S-JFRl$p zOK@!dBj3t_lhO$;_^47mjgRFsJ_ZkonlC|N2>EB!*FwcJS}N?o1_+4|%8&X>9)h)whz;;XFSV%Qa0oWt z#{tZAme;x-`iLL9MmCazcZ6j*@PRRHC;1wa`y*&^A#h<8L0H1|fADkNEI2(y+P`sqvnruibj zSk#wzZ(3BX5_#Z)wgVdt!=j|_j+J%Wr^YUH)l2W1Iy!nC855O(FwX88UBD|8yy$fg z?z`|r$~xZW*)5t?P5O|iX{=5aX+=3ehY-qDo{}fCKh^ZVxI~vq);q} zI&s`+qqy#_!VAHXI5;CzdO!U9#|^x{##hcL3>?$UF3z!9=~eBW`KAv%IhFYKq~uSK zp+u6QQMAXm4)WjS3EJ8TdyV8tCVP%XSTYD_O(d;TLvsM)He*5wfdqGE3!xLvX zg8hURL7o33r3+yf&Q- zxI|o3O4?K^9tK^}Vms)H7Q;bTQp8PHuHGfNRFy5lxLHj!b71@67AEQ8V?giho0Be~ zAEfg(TZ$;+0i|qmXi5wc2_}u;FsXyil088B?9L69NF-#%6_y~JxCI^Ku8EGn6UR*P zP`Kuz!nswcDvP{ILj8(5=Z1fV&I#J?p{U!wvMx6@rkb@Fot$?G>WS|U7R~$0w>g*4 zTmwR{11ULrS$aUIq6(#{qO|g@9MlnM(WPeOpT8jEyc_xGmQTk5u0b-?QPmNSjY?Cm zl`zz6BhEjA3-vOBi`A1P*Rp0PVe}Uf6Ni0+zh;f#dO!dKJMUC{?^qtn_EWxSr#@mg!Hh=_d zvP>w7l$IVSY$X(>?S%S?Io2yg%@(}qjBp6OHjq>vT!dl4_v8{6_dt;@O3hj5jY=O+ z)(jz=5J+{p@9Q?JaotHlcWMNCN882@vWQlI0o6y#UA&G<(%j(-+IJ4k*WCtD-#TbH zsiHVHaNP}UG*;K=H~j$(;ck?!8!OXCUS+#ciT)cY)*1VoU-= zTC=*PMG;KXt29khtH7i)0uxzcLwBtao{B8-a!Xw6W;3QeSL?BKwqR7EO<8w@h#t#S ztLIU<8we4lnS$(k0x?5jVN&+bZzAbgiM#~o(Rn9jx6W~#O9(u^sBhNJK(8v=%-7A4 zG#YGMgQ@OF%Gz7EeFrw9ZuGe@^^>05x(`mAVs}1tyhqb3%{+%tNS-sZTGY2HQXkFA zFv{W>aAlkH2SX}mcn(0RihAx?R}oD)ZWL!>M~UA}Mq>`LYlw&(Ftb6n0j9>9t`&NI z4bczIcCj!mrznxsD{Q~pnVE?A^8izRCTIh3ZNKUl^ttx8$68!^K7Ox@OPezHxVUDJ zJbG*RiKl#B37vk*mqvy7npj-g81ma<@uGH8w>OqQ5Q}dJaUS(6Upq3Qr3p=GifIbN zmwzX7P~8;cZqEoATw@3>g_sZx-^^de)8uA8&gG{(3n$SGdrIZKIL(odN9-SAwbX(P zj%>3jfxPOa_~u5rrMO|eZHX=(IA>j`U% zP_o}H&1J^1kaUjxrvAq2BUC7RF5p46n)PQ~QL>Gm;8x{RS^O2er73Uoy^}Veg z@L|S>?LL%Icc%f7FJIT}J5FZ15C}k=8utWQMbbH+7D92(5sJ$Bvd2C5Se+%}wG&@Qs{+-r1BbF7e!6X}PPw_(uN193n2zG|f<`Mqz&|5E5kJ!k#Ae!H zW<;Rs&oa{*Ix$P-VwUKTHE|(_Ff7f9Aq!n6w5V1mvJmka6gT_N zIYMX(vf8lx z8XqQoSmnb?A6B?f$9b&>2q9Pr66I|qQIjZ3YnN%Tkmbu!{NzhfU@psEh=4#c$i8ZGLC)RZZCj~eywo>Un4hz{V z{p8a&k`#^Ooh@ijp5_y6V3v)ZDBV(dEveHuaJuDnloIwQD%>USR!-wDL2$Zf={?=_pNF(KSitv;=s)=rv zW&9y~ySNceob|Upd1TnRXVp6d$AO!4}QOy=d_)lY3zv8FnGK7aRG= z^R%r)?_ppHGUB>7OY&kh>zCF>9&T8K@UweIdZ}T^%z!cHFfRUrlWCp?^S_n&?T_8e zmTOCG=0N>d55t+GjT#SzZa|)k-}jKY_Kry#(Z6~av#xfYy`9NrZ-d|761B%H(Myn1 z%a=M$l?`7(uIphjB-3d>g~5a$GS@we2)Q(C^rCVXmFY z-Bh)-hmkYdclR(_p-&!$h4f7#`&SR+uO7z#eGlWP<4ejs5L4y@CCO59DRbHEdy=gO z&8f^wV#++9J;|WVNt7cfGcDV4VexB(}gxA}L`z0+tzOTQ_G$)8=Jc(xSRE z*XdyvmP&^0$7g-X{cLOk#g|Z;J-I1v{&V~OD$~MT^=yHS{Rz)JEWNq( z%p+VW?3Um&Cs>2dmJ5-ss6iC=EZhp)-6un9;w}&LbL*fY}vyFr`zL%M!LTF&lJlg2zp{lv68;qb#jG6RkTjm1PQ`W3FDOSD?v+?!qs0Sph56fA!^`(o;_18( zMO%Z=QFf2pjF1bLA}RcXa;FK0G=Q|D^cDeb7DWE4-u4oOIK z2V_E8DG-OHjY%lb+uQ9h%|w*Y<$c{L6L3-*m-p&f-o&~;oqbRz_#f- zpOtoq6p=IrX<^7?UDZ>1>$0vZ&A<1^+4|}}h~)a}k7ym{&&+QA{$)RXWqzO6J}=6S zMvw4e#<6H5e@ry;*o&j`>!Q=Ivr5ZHX!yY>ap-mIRVv*6VB$UdefjD|We+CSj6Rrn z*M6V3_e!1^^x8lGbuUgi0CB-y zpwhvk3UP&fdxh{ba;=c1{h2fla`a*ic6(bwPl0bv zd0lPfNq-GXS%}oma!#Xx^jbLmHZ{614pevnB2OG(>)HU#hJ4MDmjB=PV#Kq^?dS&@ zB7P0=S0ii~Wub!!f5v=&hm^T*@h$yJ%A&&-|A@d_%%OcKK>SA)Vu>sy?eh7WJoz$N zt^PI&g+m`~GJR_!Zu5o@Q-YDgdYrXBEgWj2UTO3+Qpm6h-f+>b!2;9b%hnJwq6XJV z{jh`IPJHrwnJvzL2rm=2%JtOBo@ikDq!MaR;-PjV8is3@I?@Q4OKFMfWaM&DM-r?$ z>Yvo7sCycM@SIj+uW=KQtePsy%IT;08tIsiYY4sS3B*)S)-RN+{w&XF4PAVaRt2e^ z3*CL!VuE#q4yq$kJ#|E9s!SE7dM6xB#jc}&+($!+OZ2{Lbp8z+Iezi(hP4f+G`y$b z?@zhD>(N)P`=r~jgM2kHmUoUz1@YzT%CPoa!EM}%oAfgOAtH53-=7l$WYTMVzDzm; zWooX@ZWZb+hO;ltN#lbr;Zx|^lJJsg9qcEqVX?%pc*T!XQSQ8&_-=zve+`2Clq?Bp z5iGcwcHQ71E!a(wDM3kjG9@gUBeyDJi()n-Mty7b(cB&RU2hWJM!ih1noBb_u?+O= znEpP*{MixSgmJfj-5l{Hn7`q|XLVv2&BPFI7ol@u~mi#H@zYTrt% zoH%@sC25s}CWP3wuhq0a7QS`xekAMlhFyaHPoH<{674!rb zQI&hWi%`gA0=BjTJJB>-v4(G}zGu7Tgd(cv%!NuHc8w|MuOLv(n5LN+{75!B=d|^%3!j|I z-^uL2{rS=Pe;l<2Mx!jRZFlJE#`V=n+4GIQ;UPj9l$!m1ypdfL7SAm@2T>W7?~FG0 zQ^>$TA^x&LC>$h27A-Chv++~T0QM5MF#{$;T%Vp6rdE67g$%IxH;kpQq*Yq0(i8~> ziqnMs>#J+^h3O0#_A*dYHkW_n#f!==1WHHqYYkj+?l61vMg=UK#bR zu1?nNwC|7F=W9pqUzE7I@u-&GMIT9Az3A|+@dU|5ExnB&;Um=B(tL+@M+6$HScSr5j2HqW%-c zqUzaCV z;!7h9-8Uz?8ATS6Cyy20K!ow^nrd|rp9~Nh2_UX0=;ZGJvF%+`?`}>skMTwE=EU2^ zK)k-L++n^xV7?{M^FCe}aoEUp*luy{LGu-bRTN8p`cDwPrbP27_?i-L8!f!X-ZV*9 zk4M?4N(|pY1m2~qN5y%%%ZHq^71ta8PDB95AS}v0EFux>u1$ke@cy6kSpPIcN&kvn#xP>Jr_)X=7X zEaFPTPdXe0?zK4Xq3aGyV|AOM=sST!Kqu3&p!cj_gsP7t#F7%Oc2Sb93=yUc+!w(` z1g1jo7&fK*_OEX4xuXMqbyQb)*{LkCyz7q@>Hf6{7S^N6SiT8#d`41#TN+OMP+7y& z9Z}Z}Nw|Cd4Pqc%)w|`{A8Tx0^=a&$dmr|shLaoK*>Fm_s1iB=H!O4>RgfTJ5`2m zZFSYky8BMUKG_Q{zte?&+27#3slqkaP+`S=9s4#--KdJh&;4mr->Ryn?5g^v#CKLD ziKL8|Vo}UH9+<|zDhi|QElt^{#J^6F-aZ@uwsTYS`@bgsxh;$m7t%URd1h5J@A38; zHZ#+(9wFh*;V8SPy6!%`k|Snm(@jh)nP2tK{7^p$wN(lX3(+Emtx1y7I68i+Ojr?1 zR5|KnG9pqV-z1|VtWhsvlK&=wtl|`njo_G1kNa@ahvp7Yy%K)tXXBI3{yr_n{5-#= zm7O~Tn>JUgz27VI`=`20^mw(dP_WF`esDoqnt`e0(+|yk|5!ylaq)|=$6Rg2;2fvH zIgY_O&JB(@78@LWk9^wrNIfJzd}$sD=LK&|Usat^7?bm)fNI#kW1N1#X6wvx5;Mg; ziF=hoIS~xp#~HYtiC!5mi5>l0TU~?LMg6>b@8?(4FeT||7m`k4N%uP`&^1&j5~d_c zuD*)sMonVwO#pY4{IMc-&9t%US5w@_cw)n9f;Ia8p?y!ve`6)w?7AVSocl z;^A{MvrDxY6JuOSpa#r5m~oI5fp3||7AG$FB#g#TXvLi*nz;J9sp=aC`&V&Xe3j{c z(@jeOFKgJgs&Y}G3YU)#VA&GgpBDIX$tWFd5lmt^f=9v_+SIjc=?{dVDRIJ%=KfO; zVx-UB)zsf{(9-+^uV4k#AMr}+>V-?ANA8Laxs$EnX!*@i`7hEd?oM2+b(}G3QT0%H z;mMG47DeJbp!WDpYo)3Gh=cGVxo!GyZ24o2@xC!$F?{6eMmfF!-wF+hW+Z0!&zyP#Q4oj2KQC+EM7 zKhLA(7=I>TzLx?13bc7mXk~=INwU~un*f^^scI$pvJTjSXr&gGftf%PB{kY&HPZOoZibfrvE#x^%Xf3RZoUiu34gT3 ziOvDEYW}74QB$?LQktrvQL|*vl;4flV8$HHw?e&>WM{*}qGrf%t#72<){^LmOu?AX z&k=WvA-s?%dsKCz`@3ql>%0o>q8k@9w_wZHM8j#ILn{(2X-H>iB11-KLTVVAkfO|J z;yr4jZz*rj>J4P|%gqQ}KK6int((Py+(n$v1+qvN9*x-)&{}Se8Hc5Iy2q zR4rO7qtj(%>>-v-rRI)KN8d1YGX1<>1_06MHg8vxV&tU`M>d8%3HH;3-Zeb~|6x>% zdU(Gc8rS`UP}bl@w1G)ag-AV^sNApTOL{K!o>ApCB@SIxufHd!$U5Lt6rGmX|2qEj z_4jv;p4O0f-U;p4?@Dpz#e3q+x&?Zte+NP(5qY;0seb1=!@&GuSuNS|PLw!^M9J7| zz6|m;2K$<`H_6B&S~YGF-80p}V6SQw0jnfnNm0QJ{;0;qZb{2gPgCoth0gS%KPC^} z;AoEQxe($C7xAa-vGdM*hqwbS`_O{a5T3z*jTs79wTTH|FH@ZPy2#(Hfe z*eYu^at<*xo$Fwy$8I6$SYB$M`8UzbA+Xrg0j&-Qf-o647jC720~^H-ezWDdX>(|B|CHl(5<`=jig zk_);iD@mU!Xtr!+_dSX3>(vWbh}xR*+?qFech$uwWVLla* z*9|6FE-W0ubN2qXJleHu|HK84VMuUp#&B+AHs#Bhk&}B%{IeMrk+I&&CYqSQlXfd4 z(rGoOK~I?;lj zFVVZO6ykJejOcda-e_#EuZ3ZR<+bL_etRnT=q|}6A^I&Tz^E6NK^;_dDlbOt4#dJmsdcHK@ z>lwWxM&KCnFU`ehD=d<_Co>(ON{rTLl!}c0t|f|$7W90HzF1XhKgrA||DY!L2W*Zq zmsDw*(qj`%s3b0`t{|bs^yNG=Ely+^O=Nglej-y?_%N&Ryh$jhfyIH!^X|y&m&t%zS&yDTg`om=zXI znFr=%9CMAwd}JK6+-hjH^#>lU!otFNU>=NP-smy^#zfuI+~P2=A<*JnVc`m!Smu_E z);Q)ikNJW)=30lj-eXo+IAI=`b8*b09y3ReOH$YBFt>Tk3JVVlfQJDU`p(B>{)&fm ztJd^S*YPZ=+jKR!VL3!UEF0*%mJfw*3C~_6p)5{eg;5xD?#di>6`neU1up)z4>w&* z6Mj3vyWsuTRx4BcHJ2-;vxvWW{^mc) z0|@QBOKHc2g(PB@Mz>@5;JkBT)7Id;?Z`pqHb{6-qX!J-2`#3Xr~S6x zDgOETwC54Mls9L$xwUky9H<(NeWh@AJ+_wJaw3VVM^;>)=E}}t6*47T45*W27Zx7iiL$`Jnbuy1ZK7(wJgc2Cx*k^diSCs`qJ z%f*WG9FzfLio1VuMUk$=)jUfHdoJx0A5=pd!3@7;ZS<3nD_*!C`E)&8)w`Ch?X}wE z@~nEM{WHPqI8e=M-lKmuchaQ7!g@7Hnan68jS&Qr6fdk*xe6Ff8&KkMSHeceta1{z zFy@q#092BbH<~l(H)obxBFM?^+Z=nAlcnZPbT_*X(;A3pZ(az)J$ih`=iqac*cD84GIgKqqKn>ig9Hl@vs*$ z>p+HGhB>(sfJ$8XA$W@esRoM{dGqc&5qloUuoF=w>ni^?>_l*oNOQZ{XTxp@UgIPo zzjg}`z|DpWVgn`_zjly7lZL{AZZ_7$I~V5RIOd$kd};YtDQh2~vW!SlJyV}55G zbB)7X>oF@Vykj1iJL5EGJmx1VVl=lo%xy|a+d6<1)qWhhu zTAt9v)nl=N%2HG~N985CTc@6_dp3JE3Oni9nDN+!g$oh(ALt4G%DQ{foY{;Tv-#}L z@7%?l-H>?84P83YKK~wf{A1K-z3q5Wk??p=*S&3GWz=;xdm}43siV_6Q4vlU=}TWN%~#l;(HaY)T-sYY06 zG@~*vasRlvNYOEXt1U?YSKk*W{#cQsKl)y}!m5I%}^CS^8-NG78VX zL3?$vBeLQ9N;->|MDEi1+Q?Nl$>{lk=AP0qDDDp+ZD+{3-GSNVEc_)&w3Q;%uci0NY{Kymyp%uWF%I|^2MP6)4Xkw&4o9R;(LP`O zw6ncByPW1En#k2Le1DKxeJsQKjrRo^3-5Ht12M_-IqgV@&jYv2hhy$7=&yK>@iVG?Eq%F!4 zo*{*>qs8M@eWlmlv%5-6q@6}zrA8p_r^UvyO(T|_D@0$5ViWJpDQ!m5P>egFcmv*yHX)z>Lp ztsvlp;M-bpZeAgBuL%OzY_3P8W#k{w!Pel7g(!dLe`eryt;0& zifOv|f)$fCUDc~r<`BV>dc6iM)zNFvB1kfMVt$pyZh+ga!&3Vi-{C|4w~2N*zsem&Y!`i5Kd#KjXyouFHyF zrnC1Y`tyerTUUS7dYKO^eOT+m6roygA=K|Q;;K_tPUK~=%vV}mpfx^M+%*osd*cYU zKxO_L&lfr!Lw}8i8c##bMYegDsJYDDOJ4J(;@ABgr`+M}#B%3%B$o3zE67n}qESjQ zP8#e&3-%$GI>e>EOA1g?4&?VpC9dhN7V)Q%zM8Z!IWqmr%`1MH=)czr(9NdoeWk(Y zy!Nq)tM{$RJo<``=Vu=MWXFD)N6+b~aGYL$4_^j~mKPEi|GO$LJVT0orClf{S&xvF zCNx*yA!eV2M-$gq)9o{))_NaGPcTj~qWm^*izTqKGQ?PcKS=b) zX@n0qWqGe$P9ZpIqjJX}<@m=K7@xwSRM&Z6`iGRPe?#F0PH#)=YADdwkUqx63+Y4< zHi=pV2$E?UOHv`xf0^KAy^g(b-x@doCs-jf-TFs!{Kyeg|w)ch|+u=U5Vxq)zeytwhg(Ko`czE)9{<_D1xO;Yswo zhKR@@s+E1L)x8n2<%t*}7fvVSle-Zz0Cb^CRkQ*~bSsLrYCDHNYtAY4AuJPZ?Cq>n z60-b)qd0zU+%$qZFYqRz^*UWRwA99dzKu_+jZgl0ZH%#NQn;Q!dO2(oitHV8LL@!W za|sdS>petl%qQ#%GjYI)k7e9TYh{Vcx~uhE)15DNx{>I=f*hwiBjcGzD-#!NAR}@0 z_NnSylb5X0M1Lt6CxS8-`lI$zW*LT5(~8>?{cqH5C?Mjsx(A|>-z;LiBAuzg zib#8yA}jN6;Y7Y{Kvl189+*GkAMjQd9>x8fef$E0mSZu^^!ed?k)<_!8{@+_Rvf-< z#o@blx8eJ@FcpdubaRkUKVwE31IgTJ=Fe=ymA2uWUh$Ljn)PZrJwwt|GyA9026!8M zQC-xv>&=NvM+jb*_}q2Ln=_AI-8yd>*|$Xgi6*Cu)@l$^TJ zs+7P5c=X~DAVdCIOYT9~GF}J{2x8dvq^zqGm;inieyj$E_Yqd%!Zc zDE+L`5jdA9?YdwNQTl=**h80ce!$1Vfcq|4{`4+&9pbuVMRaMDD$*WRHJ%S@2uj)` zQ{lUu^j)rZ+$E1_$e=_BgXd%pH|5Ddx zR7Sei;?f)e_G~0Ml6lnZ*>zF>qN{mne$`mC;t#TC?hL8ynwr*9z({~0YCko?Q}}L$PntcCynYfKK$gow-&X@ zYG(iRH0KTBkseuXET{`FvdIeCp;yt~>uXdeFA)cEq@9qESPxwB#ZQ zs8LW=mzy{`%KkJO`O~7rHCMf{227{ne$;1w+V#7o(TWF{0ny88bv1&+`lBvXNk>Hc zu+-SpgTxRCCTRuH!Yi$;>(N)Ndw)z6_vX)E#<8|^UuunR*6IG4P1i+Pe1$dc78VUt zV_I2!0Pw<6o{ixZ*<_#S-VRjy$ZOqF{-T4P2Q3KT@M8ZBZ{kD5Tjx+Cm6;mt52_gL z)6^&cB?V+_qF)%bUX5;@PP(8s3G!*E(bt3ma(6&(umEGkQ*)56vb|b>093L7cY(He zY~eOb6uB-7ESmhT)XZ%#CFdjqi&q7^x$K-G9)Wvwq#3od$Oy(kNgWz0j0WC>&-(3WUsw<%j2A##7zB|$g zZ)|(y&3mrZRa<(q#);n&+iEum zx5%_LUFc@Mp1oiRbSGq)AtByQ{7vWYc}i263A8HgNf!f9(y+1<+2n;;7xxqeSx|Oi zU?9l7CtS0q?H5edgvsJ;Ot&TLG|snrW*g_*NE8lzfUB(Bh1Zo5G`edP(i1l-yRV?C zfYS=9G!I(Mr#%k}kLE$EtvN(#1l{u8JSb8mB!iGM|9LPc+fGNu{E$akx3aeU>GR;} z2S~)P^2M@#$&NdHDnhJ9e-@@JIL02pz%slvdn{;-Y2UqN29xS{HGc#>E zqt`|RQ(@ty6wWytUZlM&6Q!a-yNw)Y&~6|WGiZ9RWp0CZg^;-osBf?%pbe;3XmjWl zC1HIg8&L1k?!uJcMbz@9tHAQ+3gynna^&LjJF0|m93vbbm@kgOIF5}0$K!c$90HD6 ztay^KmKCod?B(%>4gCx&{vk;!GPeeV!HTyKmm!^I682=irvc4rw?|AW{2YFjC5rar znb_^DP|Sz>NfR({w`(lnxFFNqlk2QliJaEo&zj(o9nxA&b2ImA1ag2t=F?y*K2(t< zc5m<+EZANeybO@kg&$v#>fV{i-tsVs%u~5U*N9??t9ND|TbSs138TuR@saU;nd3)( zvt-#w*YA#5b{h_-o9ihq8`ht~Ak}7(l2!^OC2fRANjpI>T_nwe@5!CLzl3BEH2T3D z>heV4-;ODDd|stk;PVr}%#Y7{urdpu$H^9-^Mo*VlHeKf`G=1>KG!2x zfzP$X{{npO)-XCxt0T6%zWEvOc;du)X--*ORpsavwnH0m3-NzCa?J#JqS57W}^J=YEwvki6 zTI-c-iKQ~XW5IF6bzg{CJ^N^>`dM$1ntPd0 z<$Zl+R!$(mpf)bsRCf+?Srf1?P z^Z?WlJn%~pyqE{|69;ITl}!szaBV?}r((OmiJnDF4n;BT-zfxex|5Ktd5gCb9~L(m zzhUKJi*pL6?_(GUV$yE)W`T|Q!vQvFuzOlZ3u==ff@J(T>u7zTNYvY23i8>io+7NA zl<2N*BN6uOZPIm5RdrY2$oL|C11TdimOm=sF`HKS%7TS@pIrxXcF3Cb@hL6~;h;jG zrGR=e(dzTteEyK-U+J)U%@F(=${9CKK^Oj(HV4FYqO8bjdfJA#CosCvowgXu#Gxbe}wnw-7%$jK~r|yUU~2$qjk58dIkIZg|wEV6%T)O2XjjvkG1EN~-cBX(L? z9NPufFk4L$A7qfH&EheZscf&aRREfMwi47|X0{rS^DIxI@E?BpwF}v0+r@-qlKA0s zbX8^6RaKbAkC=D_prm1y30Wk03?}3ewN+9dL2nXdNqy$j9X&hzkteq*MtbF6hV*Wu z*7ka)tsI{L+4EdEj?ydwMw+((^e99Yoq? zQ*L8*M&d94GzKTF&nv9wiwj*-3)jDlzYEqM==ahatH<;_JabgVDIIOm)JU}A(e)2- z`1-MTTPGC{(B97qM8zD*o23Ry1kS>)JmF6 z?)^2hq3>K0vao4tN!0h26!TKl_es#4Rm(0Q@EU$d)#+cmL6`HoWziv{b=#w(FHVhk)0FGVS=`L`+GHRz;ex z<6=~Fu4b_EX^2s99bihM-Yziq;QUQ|z`fyTqk6PP_2@ruRL|lKk`q%=_Sfd!ODvDV zoXm3wW*5Wd@Md-~TrPs`M&k;1X53#c{4~U{bd$ONdfbffW1!z$ADq24%HG+OeYh$6 zgcgrl&d9}VQ7DF{QLk1u&a!_>XRpiu-9bFPMH1z1>N&4o9cb9uSiQJ>U4_CW=Pc_|sTT|ClOA{A7!~$L`q`W-QcwK)B--Y^xk_$-g&@9;!_4}u_>KWTI35^Oxwsde;p}d;G4tSvNJvZsE;>-BY)}!iAiVZR+BKHD!rz zy`9y-jJ(i|f#j`4+oo&uMGG$z`4%4JHuM67LtO=nV-EGo3(u%t(6I9-4Vin(8*=w9 zYRKH0Z0_&S*EXh@Qg5W~0}FZr(8QI`E$kjOt++qYe=t*BQ{R%NzPDi)?Xq#Ehhj$D zg5TPPqmZRsXMXa8z;Ux;1vE}8hg*EUZOvXOYp&rGZ?xZ3JVp{>(WsG z$-TRwx?a4h)nWd3V5AEXf1Jqu9D*CJdEc>9)eqMWtSW1`=FEwThHE}Cv9RHq&Zhn| zxKSRd=8r$NRUeZpQ%AByqup*7I%Q{@*1dD$1lOr%)MJURiCbJ-s_^tX zwQjMEL1_aaFus%%qmpYOwIX$|cyzq1)G(v^vp}eOyW?5_CrM_8!KvK7cg(|^(P6(bR{sI7`Qj8!mRVI z{wk)T6Q&#W3pq5QVsmdgP@TzW+1NV1jB{RP*}CNyu99hwwyj#ooN}hK>pzEYnxrc( zUQ_=GPer$HkGdYkwEvLhx|#MUartPX>)Rx~X`iI7nRFkH`7r0hAs-I< zaKMKdAGZ6j)rT!UO!=_Zhe;n+`ml^}=PC^QGJ0e-eS!GL_G04dQM2khSIMT2^henA z?K@Y=qK{JEA!;)kk$&b(u$WQS$S_)?gtF&mnYM}IkuzY=ZxwqChw#s_U7!9O(Rbp({ODch|??h5??<3qWniscNr4rR%j3tqUP-HaIbh( zgvSuPpO;S`^yE}i_J(PBZRF{zAlaWZX2-Rbj5uUper#{|5#ma7|7lZvM4@w^Vnb*B zo9*yg6EV~ey!6Sbh6@)hp`x)9iR{=|E^EA&P2;Y|mwx=kQ`Nt0$Ic(iAp*Tr^}fPN zAyIi|ef3ff5}ZIfl)k2Lij^YRjTd$@8~&^z^Lu8)-!mKjIGOHmXEMBp=YRJX+~#No zj3AS-ok}q$-q5t-kBR=@@|sw23M?&a{3Pipl_1E_$d$e+%#55Gat~^BKwYJc**{2v zIx!kHJ$`xOQl4Mfl^2)FD!1ql>yzoV!i2)yr3bReq{&C|z?`8QQ(>D1tW~pQO0(qQ z{0Xc$b>iR&68g`-GyyCidI7sAJ!dOakfc zKnhkLk49<4|3CKL2EOj1%KuMjfbjSYi(-5vK*V$rHbq!d9^{6$@QvO;kf$ud8ilPz zMJpsySsqeyv*Z$PsajWdWtXlGYhAl*ckPy@2qXnc3km_2QelM(g7-@V1850P&Hw#5 zGv9l^HxF&f!|HGUn^${h=KGzQ@64HV&YU@O=1ku;{G_M*kC?e0`JUDbp=6aIJ7Ju~iSzaR`wz7L*w`9YfRkoh@*sm`*rK%`O9tu*pm z*SyNynDMo1iOr`vX^ooFqfo-^mO1c^y|&Cj;NocXWz}Wv$6S5Rv~_dD5?8wH=qfFH z_P6nn|IM^9#-HMo zaR}r*nZ}~X!DG>(AdqO>oj~%5q0=1}eH>Y&MFL430?8Z2qK=AibWTgyJ1y+}SY@*1 z{=ozdzY%PSv7Zi?wgCBLV+>27f6(1S_MvmUeDc>MX7?cF>StWx*Fyx;)f&1G)hGgA z-2}?TLdqag6aXj!g)DSz~EsGjS)a^z-3@w8B$;_&UP)!%Ku91B&{xkf@4uiH$Iq0Pc`a)iAudUaLW;nmsH-R0LHeU>8 zLG(8?I6U|FeKl0YN@T|UxXOhfRI>;|7ota(kVg`?$=-(ZHL3xkMhE36n^@>k%8n~A z&#i`Aafi`{_RodAe}UhnN80x*%C?0&Zyw;DGUtW}EZ6RWj-j$k2wNxR@jH(rdz6fq|1KB&cQ`=^@c>7E0aMd)}rCkd6J9ysWub#-h!(I=Z#CFK4yX1ef zEINw}h_*!Mm=07yQ0$W)%+R<2EBXT*X$rt<+7%;PeuPmlsDh^ zZ`7!v89ew~|DaM2YIx9{C_5DJpxr;P87uo3mBHB>&m2ASTwdh2J`IOkc)NJ4hw*Ld zzN*vKM3r$*+FhkJ4wA1U6rp1*^KqB=UNuy;rr28ZlH|X#7q5n{D{kK;?rWU@KeTDu zl-<~r6@K)8&G6&L=?dxj2Ko#^KD})OSv2y8Ly+G9v%-$=W0pXdxWfo?vr0~aAfvxB z1X=Mh50WCxx%o3%MM*~E%J{8e$q_u6A3rfPIglrR89z}CLsdLU$4`ogLY+dCqj;0= ze)i2klovl*QD!%k&_OU!A6QKTU>c)GKEb=8Z;Nl49V&B3X!w*;mf!ZHe)p6#3|-Dvw4Bx-YCfZN;vaw zS{2~;g*U5?I7$Ylj|Zz($;vidxb-;-wBMioebdj7>N4|1M=PS3~q=sC4@J$kZyIz~t z{vN%Y#*3!l#C+xvE{e^E*`cAGEnisv3XP2Z0&-+;1;Gw=66A;w)vk>QTY8!Yp5igHU1 z*;rM}oEckK{oM(~XPc^}$d2bOZeoSjG`g;N=2JoL5v#bc;B;tESb-)bPqrUy<20$N zXBcOj;A%U_Ka9Q&w#NFEe~@Zro_<=3s25A1ps}!&UN_K(c>iGxT1u^Q8Z|~A<41WX zf=~%QYJL%z3?COOvG8`GNkVfl=jsk%wXw1DDb!L=p_aObO`6N7) z$(7FjcE*SJ8HL#+q=< zq4-ofBRgwkx~!h46dL+0RtYZM^eDBwsE?$L6)`)l`rjCrbXaZ{{PI0O~}6Oyq$t; zzOUYBkgraaA9E4|-xPGq2ozr-@+eLFSiK z!b7y87ZU7T-u^jST^SzDlI3!cR-K|BC)1BJX;!>iEk2P}fXCGmdNPMYp5CW)klARk zkDC`emX;2153)r&Szd_}@bGz2uX4j-YiN(=pyYLr>PJ;P<8RW?(Jte#n@L2UplCWf zntc?}PU{NzO_AM3sfS_R`h;9tjoziLxMeo_{^FiLq4e{?S^eB3e)%0kJI`$*5aw2q z2~099t|Wc~%dPPPs+^tV(p$wfiYk@N34pvGg?g8b##_xuN2ypk`mk7VmByudjdJ;w z-FC**Nl7()a4gL1lhDuzuLLeI$ytkZy)tjL)F_R8HTBQMgX@08pBQWLlCW)0!ZemZ_0U%O9L%_R$W* zQXoT5f{fNn6H`sAqnef-pqfe}6jP`KndM+c5fzeD^Gn`Do9uOL7c$g3C6Z}nUsZ1YoUhO=Sj_;>hHLlIinrm&=q&wMWyc$S{!s3LMKzW&LJ+wEfUxx;=958gtF|wS+c2TA^1=fX!^KnJAO)!yGn|-% zFs-OcDK}+U`7cA?bvoI9l14Iku3%G#WAy!KNWkczgg(II}4#D}|M{rtrE;7qi> z?eO7-Hw_=mM61bGNyyyvF+RUpO}tZ+%=lJScZ=!=zw`TyygFLC-k8T1xj)kMHZezlJ>(jfb&b>nSA84~s$)N` z+5!7I8@E@_*$GPgFf$j+5SV-?HB0%r=n@tu5-R7Xd(T7fLmtd)oXR1{xEr_NJ?Y$n zx~`WNq_f|(-UQwMgkUq{5nV{IOS<>S^End~_8$6Kf=CxSqLq;T=qt3s42F+(Du`gw zKLH-EvdHt{q;jCm76)R836+H-aWT84G&rfDfegGBhDl$#WoeTCk~#}2f>SIJs|X5Q zFC{M1FkTlE&9wYtwAe^+zCdT7Y{8Xv=LH3}ep-PFtJ)-o#?_T1)9ky?XQk#Pi03em zY&|_c`d?mz7`-h#`g#-YgWTQ-ZS4PD{=LG=79Eh96BZsMmbyXa5>O2<%&|s*9rL(1 zYijti=8abIK6&!)Zq^e17$K*2rt~Ot6e(>`)o6pNrdV3jS2}whtW~lov1ma#h(-NaNWv0E4Ey}7tGW+rvJvfITe zHk1_O)@MwG~P~y^`M4#hpjs_XC zN(Nc9r&U6d_847sDjHQcx>KUgw-kaSNeGtF+(?Ulv~zH!Ux7X8-uFLf0gxM-Cs-Sm zm%vXh*#$Q-Iiq_|@A#%ZqJBa+{?gI?16rnXZ)me?nv^p`~GkBZWJkNj8G zxggv>S}-2r<}Mb0bntT5Q%sI;FP++WM*bOCM5sj--h~SIhS}bS8++#L6x~n>s@ayh zuBhJiKyj>u32-cMPt=n!R2W~LTW6Q&A|JqW#A7R2z_av(uZZ_Y@6!hvVZ&flLG4=&|)Sbv3)4~?R4zQ(%feFih9!}pRoH5xK)}2x{r0p$f%Pk@6S2lk+qzYD5 zb-jGW~xK!WbV$&gsov^8U54fYA(x^I^bFX&950|Nv7Vx= zJQc{vgQ$4n%d!2G18)aLiyY!SS+-K4rb=Wyi7UinnP!xmLal}qTSd8vt%;(+l#^$& zWQ#82XK|k-9hhDI#|uG5ni3kiEpZ0i(>$Bg#SocOK-XwL$w{)MY7a%@6PZ!z@{Vyd zUcB5cWukHkLk+rr__9br%6w2|o&+@~!Wxe)k=xqa;~C9XX-;M;SW(&imK~=Ig^ul8 z8z-`)dOdC2)!G=-TbazN5_bmDa%oCICR%RxU$Iq^mpC`*{G6$(lE*k>HI>GNW1J^A z1oxzC00L2)he%e8;KrG1)g&91z~tweL|72Zr{tC>*7VuS3vM^n)CA zP35P98}2xqIQnM2U3h!xswZ*xll+g!K1+APb&{8@Knx#p$FmwgFu3Zc_T)v@;v-AU z@}_AzW<6$gqYFg4UjB0X?ptP6uqpO7ku=R|MbxlJ%eSQdWIup@gr(MTZsIf!)n|vjeX*HErLzx(*>x!X1*Fws?gaM3 zT)FngeC+M*Z;wu3+*oY5S8orxb?;mmbGE~n>MIHe#KEL(^?`Bu| z>MI-Nej%OhzfBS9EU8=1=a%Zfw4I>C!u3swvTHgQDC~Oa9qpI$3ub%>WDRpT{DyiA+y-m^6*#r~YQ}G= zqgo z@rO=&v4zz+R(7=Xif(SUEQf~!PfY`d1PGx|JBQL8K6HF2>>2=vmV1rXJ?INO{`}VZ zQ3(9D!aK#Md^+}1CBcp5b3xb|&e0sOQ?O)UXr~#_)o|0m$Z?K-=dG^MAj}+I zO;DD8Xa9xob1&LB%UbofCmMv7@`^bw`UgUtN+SGMZ37OuO0P&+G@V&ma zU-@$vL87iq`(r@v5xEWt{XrwQ;p5JZ3+9__P=8_?x->GU;WAxrkROngI^3eZwF(S1 zdR8Y?SfTIurMdFJYGCh8GoNptg}2_OTqC)#+ilK$sfFWqO}$@X*ZWKOjgSj4=3g!F z>hq}&IAetcLSB%#lQ8O~JfMz-X!X(CTt?}| z#AdD!x^w+71)jfSRR2kgZ%v}=bsff>2?tNYEoyd(9(ppr}6+F3m z*Q4f?1>IYu(t}LoKtZW;VSEVo2T$K!EuKZ&DX>cIvHf} zXY_>q227_;HP(;n0SyN0JR3kbfOq#^MP5yX)wI&4LY83hSi0FT<9xO;I5x8UtK zD4xC`?1e@@3TbHZsOk$3VsyC1nj^hKW|6hauDfWj8{6PDf6ZIX#q}J(vJb%OKgo=5 zs+lu5oY+YQ-7D9E=iAcG#yT26D(KK1A#Bm;tlrnC*A5!qg^5T1HgfA+>3j`@EDltf zKRuHYMPbT^Ez08v>FpgH6oBx0XE7off0}g`AMgvL-dRw9Uz^8!jm0IqDyCPh1m#z| z5MekFJJ2f`Pul7p1ktxemZ3swRC|Ts^DJ~nrGy|0ET3-)`P2`QuQ&zd6J%<47Nxl> z;mljTFR^VB+YEFlG%(@gMY1eI>PI-`%v=5|pl9m(F?_=>iqd)ue zHGCZlt?v!G$ODgWxh)k2bJpIXCJ@;eE_|hvsII>3`Z-T#ZRG#D@E`=%@E~n_@3yx6 z1~ag%RmT|d`Cv8wEH0te+y|B*xUoETJq$m{=^P9~9K@|;ObKHUACT0zykMne6e(Py zZ#hvo$Xq}|keJ_;-8vSv*Ql%s$41fV?1RnO$3W-oi@No4eslJfCf%|LJ=z7EF@6h+ z7OUEFShl?X+F1n#C3>g6OrypSJ|n`xEh+HDMHmtY)Kk2Wg59|QUZ%4iLQIEfa4OO> zw%{*xW03o`DrOGF-eKl@2DmxU7>Y+yd9ZZgJUr~Z1b*RF6RlzI+i=d6F6Yr$#ux8_ zxjh9(+K%xdNB`Vfa)Ov&kol=4N_m31&F0vX2Dawxe;L>SS9A99rtELzfRuelTY_^h z=~%FZ(-ywaSLRwsA;Yz>35`%oD(+AS@dMgL(Q8+HY%{}d!2yAvY6A9SLtG4?8 zEQ7(;-)}8pbF}4L>!zXy&6%W^9+)O#{Hzz|w=e>r0;|txgNjdxpEH;?CqU0CdIaZ) z?xvvdx8Hi`c$o%6yiGiBsfC`WsUn|G<&|%>-os=U1MMB3+q$fjv!7=7pcEJVEwRjP zW-oG9e75)$Kdb3R)|Si0mYTw>R>WLCp^X#kIr@Wm$zZ-+4J3XY@j zXt;TsB8&|NLgMfBrCNzUrBdW+BQ8gWEEX*Pt*Y)8t6$T1{?UhCP55@xdaT61hlpY} zbbNLipm(Ys5)1Hi5N2P%ggMMP!%Eg@C&Ghd-Kph@<4Exnlmk4)(MEs!8YaD_31g1)c8wu4C`L+(SxJXFL;0d@ArKx=>A8^Rf3tM}!GGovp0}k||jZq&#O@N{M0=+Yr8Y_j?2&r}Dwn|N6ml$g8<58@$!x?=0MAX7(?0tD6=-|!SBo)&a3WiXdKE=JWn@#o=V1t8GmBC6_*aCUN3jdK)H^+c`nViE5sOT?(E%wDF8 zQB|y`MqCa&l`6O#TPWl&ho_8CRAn`Y>A^NNxI&uE3K<3op-ovZOWVc|kkHodd9`6A z-@oj)dS(UPHXZ#%#$Qk>^mIGp-^xA_N{4NXzisc18~^sNPBQi)z_DCb_CMo6Arm0^ zC5w*cXG-m55_NMhYLyt;=g`@ho7((aIvJcJ>_mIxv+p=|7AFJEzEEIMsdk&YAGc)w z+r%-&W;y%8L(mduKMvjs7fnI@k5nMH;3GUJa}z@&Dt+4@0t#j8W*um~(fja#36zSl zGLeHYT`#>Wxavbdp(Hpdzvl;SzDnzG|dH7&z z=###dzr*d(i?w>hlvjAv{hkl-h(WZT^fE!VfU1c9+Rmn<^A+}ntcY1YxHxM-lr$Dk zf%~kbEbpUX?i0-XC-DCyKk=Ig099LM;JZ}@ZKOn^q09Sa%iH4hQcG%=(lmWwnL@1+ z&N)Oa@N-9tC8UKxVrb=@Qc_nUY!R5k@M6gPE^G8*K^HrlpJ z5{-2h2vyWQUcrOB8G{D6SJDFwoq>vUmC_4u7p5j~IV>uF<%nGaCMWE+4&ocLv%_8M zcj_9sDCqvi-g>;;z1Er_qX%6#Uq?3hTGa7@FxOEN=4gdiRmNKhZ4+)KaC7GIR>OeP z0eiJ<*Jav6spE~G1UfZsyLGs8GYJdzP=*5%%hb9oEHn(?EdNUX5MLmqqvM&|z^Hm< z5WhF1m(hl(e4szQ1PT(L_+hCwnA(qEdTDl?gm@uiaQ$4jF0UNF~TzS*;Fu{O_*s2bumW)h<6!Kej|+pr%ay(buft35J(#Mv#TQn^q+OeTzNzEIa%2uouzve3mmz z_siZUl>Jgmc#xl?@Kx=O0H`S-R4d}=!k7JamM#JBbX!_QpU#`}?OdY6XvJ)$#(yqO zi*f~4T~ct05S_T-%b@eEIsA85e|WGm{>mxltXz_qQbK+Bzw)}{39fCzp{1%NW^&^H znSE8*gY{xd#9$r6N=;Xu#P&~FZV#y3$AAjUQ|IIJufbfC*+`UVnQ8oq|m87G; zF;j-ZKRkR z+uxXMHgQ?}Y;v6kf_sR{jdb)oxZ2gb^uQ%yS&{YBHsir`n{*w0jzDb*fD9|CVJD0( z!u?4+@AMeXoM2

EcG;3oKp$=zJw9KhGX>3fc(D%XW}Ntn#WhHVSE^=(V`DUcjwq zD0#qOiPQFhU+zqftoEs~GFX2kIdYk-+rAEKL}>l?m5|2yJs&Uat+3|^P})L`g$!r* z+L$}x`mT{b39ec|eSPoO$8}D<|A@jMEL9VQc?v1*(%xuRO#Bz0=7ryD4!ZBN)PR#M zuvyr)coBVD+2c8V7mFKgTV32>+hXwoY(ph!NQw~h`*M&uT>^uUo$GEMACK(&-(cfs zb#2;7-zd~Is3di*CrluGPTUPD(qkMn2ANCsplgjLDyHH4IuM^ObY0wb|Ke@*p!+DR zVW1S@k3xDnfES(-EH(U%1$ge3;`5UszRT+of0;*o_Yi)s^yJk4Z+D|4xN#S4p-Sf( zeMm#gN+e{(w+Q;uzn z>}7F7$6<>X&@rzh-`s4EOKXoO3vmV};2J`$*kz*5hnus%9FO?x{u{*4WxPSjNzCGG zaT|+2sYdY{7dL)U?c%fw?qqT7lg@x&EV298^|(xryBc6m8?cQ5LH?8nAjreQHh5R1 zCA;tTSZvu@hKfhrXj#0J_@~Yu#nuDc;SZjE_7DRS4-L9IRFm*z<7Gs6>^?)ZrP_n2 z%|PU#$I9N)^kW{+qccs5Bl80E`;`<;*kiXi5WWJ03iR6X18cXiSgm+JyLn#Y z5oB&Rk-UJd$I#$(_LojO_bTtA7c7HY!Bh$@%uk}sKWXpEHb}=7vy{XW8-E3`) zJ35vaB_1ln*cFTH9VIV?y@$6S9QJ;k2`OH{vfV|?Y~|;3z!)7@kG`RhZ6S@n`r=r) zsAWxD3+B?fDo`4!>XutxiDF@ zEE@X-W})Ok@;OVyAelf%U{J1$O)3*!E1FaiW(i9jrzhYhiaKim7_iuwLM-YiF*>W- zFJ1v&LOW*&TS%AS>jei>&S~g^%+8i5w3&7k@pU%uq9ZJWXOY~0D8}H4tP=oAXss7L z(mD$nPsc}`(AuDP8e^YFWt6t(l)OZR*I}QOr~H-Mqh%tsK3Y(C z)cx@WSD`fqi?V-JTEyz8wxs9#zgv0zIl>!JtRyr#+O8^4>K5KbPbq^$-QU?n0tonU z2sfMNggFm|GI}N`42yt4D+_yF??;TN<99GB4-I=x?<+0+6aRdrOBdEM`5(M&uu^ zK#M%!v{{%7RQANslsvAiYMb-xGy}urU); zy!K_ip$1wP%d^D0gFqhj=}pvOjjgoLyiV=Q-KVKv3GK@o9wf9c_nxV*Fg6cftc)Ln z_iqTU{f0{EmNC+WA>Q^RdGFU%-jm+Gmn%^iTR4m(z32y)3pxR0Li5GeNls9$dA~|v z)+)S)eJoW-h6ZKqU0&PcpD*^$>nJGODmTOWsgwLhKa|&$nx@>auo}qQjLZ8@l@ETj zUW8mpo*9n}&6L^aJT(MoWfV!ND7TMWR?c=?8>w==RYendALKHSiF7!Np3-CJrWFbm zA}HQM{MOPf*#rscjV6Oo*~hbR$}i=G%jGD@>P1yudUYnEEE=LU%9zwDV$zzlv?){1 z${~p(yoR0WZ9=6ryJDEQo1KW~J9K)PdK8ZXa+W%;eQd$2xtl#*2d`j}e1oL3Lu{@_ zS5rp&ljG+*eZn?hTd2~iPJBW`>gi{A7xxtl$>K)U*;|k39V2hUk$qG<1`U$s5B&zf z)Ry`6Hn7bzU*nK2jcR7ke3=F%Obk$p_?SKO!~n%R;@ch|m#bueg3PY$9u-zLFPj`% zAcMl*xo2^AOf*n54oEVid8o0(-FE$O;Vb^aeSr*L6KG%3!eye;MaY>gZ zwtvMcYy#-p$v=|=LH>APtBeg72fEtQ1@Nw!&tOK2T7bDg$V=Fh#Z$yrb!wiFUa&-m zsCmL(3CS&gB2Vc&;j+2UTTbz!$EBz5_4CAomM8#G1^Se8>^uRH8%m7ZOE#XXRD^;Dmx{_pSYZd1S7JVCZW0BmD%B&biwy#( z8VL1#h1eNY_7mzaL`S1%nCj>MR63kGmnW`+CAqSex1Uw)uAiBU4-)+kG6&fg{mgu` z#<$R~HHY!Vf>8W2@1mzIgKJ;9{P|*?ZXKn0GfyE6-gG{rpEhfo%7GtH2xy}OooXYj zA@{^~mW`*$%JLh}PviG0e)I485ygsDmWJA_>4nw8(<%$Gx>U#_aWgdwq-u{KpVH(N zDrddr^eez|IpbXmL`W;ivP_E!>^kmmpA+_;g$(paJLgIKc=H99Z>@%zn_5k_tU$J8 zU8)MkT9FLBW75-aZfduW(afbP4NaSJrqC998$VqtLL%#RgwX-&Ru|r1+I3$_>M&vH zVa3s$5|$=Ww8L~R)`!sqIZ>nbGS=jWjUa~-+t~;b{EP>-f2i2N30QUk zfC5rHD;c$vmap-eoJ9 zs@gfM?|M0_*vmD_Xj4==`^0$8P=YqeUcY-Xrb;yohq3Af)?v@LJ1w!&_QRWkA8iSz zIR%Qyv5aw(rIv-T&Xh3$e_~DVVhM^7ZD`8=cT;v#eyEq{fNnnZlHKC-h(B)@TSeaL zu){#7R|Y!epB!{9n**KItXY1w9f$T4Blkd$eQ0&Rlk62ObP{Ml-oznHv= zZP_++oNh4m%yFPffGIShL|0Nq#%Nd>z!ZXUYMd~4DuBVXH6E+=R+}HIK}-1ch;$CO zA52xuur1>ILFPY68c$`3g5p&}INyhDK5X$}%7^tntRXavC)A%1OtsqL@z(e1Gj8!1 zbpO~=15;HGWR!if?n7(Ub6Av{2qtx z6TZl5V-WWM$Atqgzbh;sOqVC7t?;HBKbpO8mpO;64PSghmi+@!Rk-GvPmiqs$u6Ip z8D`gqFFqa)JROARKfhQ_JAduJ<02-UJ`k?iaMs>sFE3pFq|apE2*|rnIDIhu+{k%h z`HSKC{mU0o%CgTp{;S{Yy5Prg_Ko4dv%81qulvuPeTEO;@TL9QUU=tc;tcCm&wY7X z9A?*2ZzX-$J)FLlHe8^lP-*Un8^iLA;p)b(KKuMl5)N~x)lUn{S^Z(@FaAAGKW$vZ zxH0T{{8gPE>FxDO1hjw=4Xc>x2qj>uSQTk#_`{(!TWE1PHM>cg?p1aSv&NI+XE!pO!-llaIZhb`^-ZBg^v zcyDrqE`m)RBRPWkI{toaoC!Pgq7p>5j23`-PUIcaLQM6!a&10=5*7*Gt;Cj=z3+h%b3CK>A=&R z6MuYbn0wpTbhs_g)S3#uap#tS^2T7!OWBuFoulO)H&@hiH+((UF5WZr@0ktldkKUs z>v(b)kJPvZH4grfB5dl*_P9U$#xI$ncMdgH8sm{&)Uv?1rUN|`RH5i192e5NexCD}=F#AB6;P*CXm zN2E3K3g@v~A9Z7huU^FGv`1A$W9?BT@wY^K#MwPFMD|iarzK)OU(_N^U4;~#t}2Ry ztrL}XoT!ZJeB*P6De519@i?!hb#OYE`=B_HwDfp>{T$l){~%pNjBP1k+V75insS^w zZl;}kl)M3-iRICbZx4OLdKN#hgKv{4>Q~k-Rg1>1TJUH#ZsC&9(oe0$K_>iZQRL+S zT%pzH@XdmhbP$=i*un|F`;pLGu0wEj9D<9BypHh*x;L;X5Cc8B?FflP9CfV`$6qWi ztl5E3e_rvkPshh()#5FKuTv%#iOS3}TY1Y>XcLRW_)z+0;^=;;4B0D=wCL^77dlak ztNy8%={TyXuU_rpTw7Du2Al%@rm{%}E&AK{R#kh8KCKrWYf`{QL*;Nk_Dco#(FMBk*QQApHX&dA zS(dbPnq`T&U3Rd&fQVP{F1k<|-U7a0>vaepJ!YA3B3Q&Wj*ZbWQ#Hh^Y__m`x{m1x z8v)x%97;{Lmce&OOy{vhhI-ESej3-(`c#n9-BzL7Is7@FM*njNLGnB|s1i4D?Ec~R z$y%_yC;)nwCUd)%0Cf8u@#5C}ZTiJ+VfT=ca7VHiYk6(}e*OE0MY&R&hq{I$n#m8| zRRoJlA$vFe#A1VsubSvpYWX6Im|>nbXJ2g&e)MEI_z_239mJy>N}w~jeFjRqYn*Zf zkjH8jk=-&Xka(dXjMXdY@~6CdMTV(b9$83kn-j3tHREEvOR86zvibaF7cm4}6jT0c z)68E4xwX_TQ;qM5uk<7q<(o5^g%K@`pqL>QyIfS+_puDI7u+}-M&3Z;k!fMER__# zuDSPhZRrLjr0g{|bdxK2P?HV1Y8kF89e?F7gf4Ueg>PN-6RfyE1!?DLi6@jQE6wC5gSls%)U*PM#h zT%is(G!RDb{>{+#I8{7-YLI2Q z=4SC?=H_o21iT!@AQ?q70wzb1Hqz8uiMd)c$snQZ`7#2@c;uNt_x=-`B>X^D*^IEf z)jA|ljrlfJd&uiQbyy!jz-gxvU;V6-OD;MSa)E+|YOl^w~+k80Rhn+rL z?8Bu#TtVp90{h}kG53>N)nt2L&iOIxfYm&)b->b{W7!``o48vOOt=nE85@LRJ_e*v zer%aB>wsX=b--#=R(&bzZpokdEw>JkRzZyp>e$@25T%oa*Vo3~*G70S9nNCml3KS> zetoTNoKwD2`2k;>-jj~OG~cI}`uClr#W@XZ(8XfCm%S5v@?N~vr|`3(gHO1P@cZi> zhfV#^lf3H2%eEB~?Lg&z;WU4~zN(UC+iGQEI#y-F@#Q6+^D@R|OY;@dU zOCX5nnt1?BX*bt^96l{+5=UBW^=ji<6INt1@g&oZTnM^PI7?-w@m9H8YZcw9dEvBq z)#>slJ)W)bQ;~(_FsoC)I9YA)p6&ZG-_*A6lXEo%-I<>DUEgTeob=I`q1n0zvSaHv zX4}D{=hRQpZdGwgT20(m9GJ{C6kPS1pfTaHC6T36@}FSY(te_!liEL0)I=0_fF)1~ zE+u|;Y#WgkOl&VTdm9G;Z1rb@v(44t1*VuWK=;nakJhuc5d2jz{kygOMpNId9rWR5 z9}fGlOso@#RT1h>yJJAf?NQ?FFi*ZP`%y$QoC3IPLYU6|98Rmaablmg&((pms$Mv2 zAvkNFyS}zf`M}v03$Lk7S%`_Kg*4ZOf29lgUJBCEIa94$*Xtd#rSckn#Nf^MpT`?I zv4Wunb1lA%_v=J`%zL_YnWqA_4H{F# zL^c49MnbzxJAnkzI;+bQBQQ4N1O_5T!Q2t&^|ja0GbtXHD(sDk+ift&F0_c`egQWg zqt%b##wjd_o?ew$5dDJ0o3eT=sL+(!3%67O**KeT_?_i6Xum4Edw6XkTNQw{fT-o!u-ii!G8W#%>pLjp0dar@@nsJ(=K^ z8tSs8xbxkM9yew0X!)$&-;=-ba`pK38t=$i+*q8x#kaMn{&kA zgs|6~IO|@4362=#NAb~nTI`S@d8moO;YGa`%k|qmV<63jZrZ8#+ry^S1CPzFg&N=( z3M?LU}A7M4$m&NiTjP<*?9b#6r&nX_xSXgOaBj_YFoC0PyHUB zR!UF5^C?d?7=?=G|^)K>X3@pg}J6XlVrVF{I7xPXDxuSdHirP<6 zC2z*gIXkYi5sgN5NIhN>&F)!gM`we~$>KO{0QwcmQYImZwVSQbKLM ztYGq2{{BiA4*GDj4~Kmy2|@FBl_UlJVg+W$d(1Q%;Z`*m)5IYViUnmX*W%G?u7eq< zCJELSB3S#H)e>o2T+2AeZt3f5t>u*0m*XBGhgiMsRjS#QB(w<`eGGjOyQu^uS2L}W zJces#?uDR_!71eyBWzZ+YCc?Qp0dN6l^y1G-$*!mS9BYhJSZ0x6!H za);RHsBJ+qsZ4&7ajaInW{eSO9cjNGsfGl(d4}AX+E$vUJ28@XY-x(A_AA{Qg`;-> zl0iCzX!Zm_6FN}0mw6ABaoxw;W8^6qRs1I}rm{CIZ_;j~kGd$6zGpOyVB~cGkkz!s7ZZ0%+`?WrTKRbC z&ll@-s@OtviiosfKFu~TnCS8Oha3g=rF(5Hwb7bwAC zRf4qf`L`<;EnDDJSuD>Xg8{1>Jor0?bv$ zdm>9Ig1cO9*w}-Gv8kDmZL0!31m`XSNFS{sVL5 z(Aw`ga!a!D1$&9Y3{zN>1(|N+2G0Iq|Ke2PuYkkzB=2o;_R09BoHI1_>+-icE`N*J z$oA#uiD)3cy+!h`6jG9r*dDl4*jy07qBD3{yzgm>EMn;x7O{+Ui6r(8eFW^EOcHB_ zdx{d;6ecCHmuXH>5_?hv^-QE~mcaR=aN>MHBGYX#1w7iuP!uJy4;I0?4T&uJ8sZZ7 zNhHk!7)~C(xuV&JB$^$pZ(0Aw3TP=XEoQO}#Q#_Df;yw6qVBFfNlqZXlR6R53`r1V z3`urOkU_!Y6>~Geo#K#BL?;uo7WSemJ}u6VXkqXaXfM2J{WYau?Vpr(wP z?3HN;1+}-he+hxDGTFr{OC$uguKpT~k+oc821BnGF96%k!y@T$48whtV zhF&M^p<9(iyjE`3zw-!eo3{bL#47j{@z@Ny)E+w8NX?FZ{PHuU`uOS|LHAjZk3Y7q zr_?SN6IOd&qW1d9Yww|k_`WIns>azcPpxqs$7s(!VPIXw1ZVrkMf2;TX?9Eg>94rG zWY-_DPy->XvXe!>u~c=AbdOIPEJ-i6^b((MC-bL_^K$@E@Tbi2a5WyE%BA;jZ&#ka z-S@eS@dr}Y{}FipTOv>Yg*q6MZ`u;^M7U}}^YKX@#7Ogod=cO>bZ4T3+k4~$I zV%>$w)4)?<@5gNy@;c(tV*s;g+id(Ad=NSrJf?rFeWdQD;29gKyRN>N3;9`2MRU-pKfN zQA2WkHJnnL( z%qxh$CCi@+wn+8rC$ct66dL4D@+I7hw2M8`oiePsx=kR!ZH?deo5H#u?oFt>J6HD&qRTAn)82J zNMp*chtB=!-+Xg)RPIkXigZ3to{4P-+F3ltEj1UY&pE%=XON%GRUL%kJ{J-g8N8nJ zFk^LtTmM$@by9Wo9Emk}oX7h1J9k~QpRIX&4-_KcgcPTwi>}mcstY*Q&CWj0`Ihm% z(9gP*`k;>$sA6OKSVsK!QUdhOVrO%lr$2iIHiecyk*8Ea;IfTT5PVz>iYa7{C1U8U zQGw#AVSyfA4)TuoVqdF*TzWrxuRvi(&g=cDa&t+uGxz%JFX7>sfSebQPp8rAq;1BC zwBACFl_$=i-xE&93(Td3Gw45H3FFV8e-ZPl;nFkc>r$QT>Qg=KN4rz#zYVh+J2pn$ zDlS&+D zxyGARVbo3>YfSH#cbQEJ93fPgjZdlHn$OGJKHQh|{LR4MF>7V#^w2*2jXnYG{Hq8*;3Nca_)vK5K++eGa2|udDK{|%#M(* zy-`nhtQ*fAt@7SGM2{sV>PBJXuDhQ+(T)6cyd$XF`BPU+D+~6~c+j~vfqv*bt$f3;e@7k{mWwgt=o5H$)E4t+@HT)&Z zGa52pwCTmD4Yq20aZ{L^?OgJ;1$9uAhQH0$0~HQZVx6}BC#}2FTP$2z+p70K)P!!Q z^BmOP6UeujP=5w!g>o#lvET`5E54=Hr8y)pUEh=6q$lw5P=#-#&QrKyLgYA%2d9d# zZ{ZjJviX=p-nCl@!Db%{2Yx%vU2Sy!o#u#@oC((w)Dx9BT*67yTF1uaY(mwx(_`2` z%DRM2x!Q|-ruj?ZCQEZF%hD^YACg1WMT2;$f2_4>bLdod*WVv)ek`22G0wQev^Y&& zFYm6Kp0A_IOFwB86!v{)uKP=8?+-`s7F=k#dBxH|?xbdSy}a8MPe_JbFZkt-2TtPr z-H(L5$HSRFS|2PLmm zTQ~G>jknZJ7;$>D`lgwW1-Y;3v)PIX{KmIG7*Fy^^92dYo;o{L4*iQw?Cn3)q+YK{ zy}meAYEn1zIDNr$DtZum2Yq^iL&t4Wy`0LArd~l(c&Kg*!8WTNq?tUS$&4VCFw2nG zEL3tLz6snXguOd|6z+a8_){VrBw| z3KI@3#e{8dla9lM;*sEH4tjRoR@c8rW> zSKeSJxc0|y7@fuM4>aYlJ-!g+4J@SF;<(1a1$DS1md`$Xgmmxj#$sjk~ zjuB19$K1~UdlR2@d@PbPg>?3nj(;EezOgdm?cbZ6n<4+GspGjBE)>R?Vxi{}H*4m{ zG0E3S8XB9yqNH51g8<^$tj*jr8DYFKWx`k`kiQ{5I}u^1ePak?4X0s7k6g}g{y4Te z{;<6E4^J2$H&pjRr0qBs38N-S7}LoZy@wx=)YIJ5Xyf4jH)x|q(?(5^Mz^mO*bZ%& z`1eOl8*1Me+W5!66>Ti$H-8ZJ0{=%Fz#yJ9#?Z!5|9_&59k&hM4sF;{$Y|pwVc|G| zYU=aG2Fkzr^M=~zXrnp%tP`lN{JLnPo!|VfEq~m!q2oq7Dx3GZ8(QRbeBd{%4_|p# zEUr&k#@g0YB68vO1Sey??x|$o|2L+R9VZumKrB{BCdI6D`4e&pTPZw8;xeUyQO;`< zQqI=xOI*8zc+?55{Tb!c=dW~DAW|;8>C%_l8dK4492Fh2SX6WvzxjdmA3GIoemzt) zC`_OJ!VXi9*`CLf&6pL+VMaav?z6%QC7pe#R1kY4ooh$gf?pG-Y|-6Wg*@q*PXxI= zCnuo$Ct794>y!t%k0oBDv@d&;Rw(Cah0;>GLU}V>AyyXp-}TDwq8$xMaLpG`uQmRp zl6Z0H9%dg-XQxgwN1KN3jVOaATBN9Xj!YblROdt^yYrj>ho(Pv8Yw*)wF66cEn^$d zgt94XOWJzkudvlnSkEJl7Yu*&QtCz(&}uX_b<1pSlC%BN_Jne9%yM}`d!MP>m*@9Y zaxHP_o%z4gu^bcyxEo|%(UyO_d-$v+;w_aiO2Y9t!|rbM zfQn3UuV@4prb)CZ!#z{f`4x@-b7;|Ra|{niYf+poe0hneBshs{CpPOc`c8it{om_x zF4I}Oj6PjEA0H?b)?E{J4ZZeXVo#H1n5J##-eYh%-dJ zN^~XX%@C)~lF!2f#LRmy`!o5&#`*rtisw5ROjS1UR7KdkC!{sIo(=9a`+8JU%>+?X zKD3wDlUFH8J=$pnJ%-ueQ-U^frkcbSh%Oy3_BiDN7ixI#i3M=Z3aX7;GhXWT1a@Cl=*(^%bkDa5QwF@ zNrLKZcn%OZEZigWc1sP^u+yfEi0xeP9X++P8NcbajtlIzj>em)01C?#T)*4tDfT?( zL&(nUyPDkG{mA8)q`{Gv8C#leE%<$x5l`8SQ4UGT!~3rbe&6p*&wT8%2LCYW_MIyt z*V(R;q0TGuatM(YF^)WgBNTV`f)0=rQr6xQf}Wjh{LoRXTc8CLfYh7 z*ZoZU(ZcGM@TRy~VeTu?Q{L_U#U9@8NOj)9?)vBVcDw5@(bkTQLm=n9#SQ;TcpYn^ z^>nJad&^h$@LT)GBoMVrOjXmkrKByMy_{4Hwq-|KS@o$zgKiFitz;Ii~dkSqGU zH5v{M)W#Zm#e8g&;gwA>FkL0+WerSa7w;USjyQBfa|*}R{m8JeRYr+;%9NxRvR=g0 zVmxhPatSgIS*0GE?y^MO$FalV_pHa?+w(&e8$WfkB%jegCo>u>8GwjeHD|3(_OqXa z?P#AtBM||@tnR$TYpBxJXq6K7yc2}!|K-k|8$MCcDXu6Pj$qY&1tx-iGbdYp(_?JdUi$*jH3}ZPfW})*x(|11I21fZVSpzX%Ddrz>a>W~nf0%=r zh4GqrZnZ3A*W7AFi^CfeRYk4K#MEjzm|DY_#~qg-edRLGIfY?^cWP=a88*n+Bo^kN za2r#szz=RR4w>3IKgU|4og+-CM^=280$dCs}EUn96p5lYCtT&Ao{^*F0F;E(tr%?Qgpj zP{Z*mbY)ms&O)TcUlhn?)+~h4;~Y6pN}%P@SAIYB5vv{p@EQU9@e8QH+J16R8rS1# zVP*`2*VFP!$$hemxf)YZ`RfH$=cyC!w%;CS>%*-$L8hF?lX#@`j7HO!7>(nG&Sc`t z#rBoDApZ}BA^KiC7MxjyCZyMS-Q!`>J=`)nOQdE%dMms(u&8#vu4eZ*3#%Y=n%plG zy*9K}GVar%ioIM|#nbjYgS9-wZXM)Nv&(?^|jXWIu<-C=X=DtTdUW3ZEz*Y zL7#P^Zxekf3oM^z9d$}a zP#s1=9Lf83>HL?OO|~JINC%<`@vU|a&}04Za@XQyCkp2u3nS$xWU+~E;jp)?+CRZ2 z{@R`w4e2}H>Z7QBxw`^>t>Net|9}rlQV>5|^nFvRco!j~Q}+&1Ic9vT1R9)3a%Z6G z4ss`%f(M5Rd=XvUIPV};CW@laQkXoG`UD_q%04qS?;sxb+Zc=DS=2u^?;y{Vcn9eO zfH4U9N7nnB&OXdqpB*33!)a_Xt3lzf!?)$DD;>7J%Y zTU< z&!Y0e)@9Ub^=f8Xp%26hjqg|@7P4Q*dC#Fsh21@xRf-4y3Wq#j^0QBipav8z^alW2 z?b&1F4gj9X@~`Os(ma@@N7$YIquR+G^s@+s0S{hMp-2 z%z7gnwX;$QzEuilm&<|K>J^w*j_|P<%-^>}0n93}V{%t?88s9du#MR+>~&&Mkhzrg zSh_cbM!CN|IrCj+L+&Jy#?e9A+IXu>5*yc(7|(A0wHsw$_xG|7*_j$vWP zL_&#S0qo7N;Ezfu*<@XawZTd-NP{42ER<{_u32=#ekr5awle+E2_@^3T^qDSERU%C`i-JWzBNAWd#dYto z?bjW4GDWgffx@;iE4SYhd#D_Lm6x4UiFZRgzBlwOn}p*B?XUB8y>Ta2>~=l5rbNC@ zF+1rbeN*q=ZY$-q`0Tt-C(h2dUz$8O-;Q(T80dCh-Z?vN9Xja^T^c#2wZ#)+5*My^ zy0)HK716C{dKskvo;P33Jt(Q373n60+4wZ{S5Gt9C5(m_@yZbJz|MkkEQ-b3OiVZ0EkBkmSLYzPsLJ>92>TRFa@{I{yQTU5Wk z`CqlKjt2Xu%)fWzX{WOKX=uvc)0lmzDf{a4!9Ey@@XKycWA4N?T_g3uRXaK&Ti#)+r-0Y@2y)$lMZ7% zd`=gH7XGHwDqYuz8AA4z0$}deAddmejXa~tCsgyZw}Dd-I*A_#*{YKSUi^%wbDy4u zK~*|vdc0}i)tx|=boMC^u77`D0bKBf0=)ig%PgQZJG|sPf|5GVq0V&fbH$PZ6pnWV=Y1%wVr?omkM_de`D(@cE3Y}R?83wBvwSY`Nndc& zKl`s%sW=N8+lNi`3Z2P<{o`u=D;3fHh7slVOBnS(+1#Y~jNTC1WjD-B!dB#Z@;1;p24^HB7;U~pzfRyo&G zm%SxENZd;G&SH3-u|=D7>+>|j*SKs@p5fR z+t?srH*8zLZsVJ*oHMoatba!A?52>2Ru_nj#vUHdTpx5lORNZlkm2NRC1o?~Iur^n z4o+TE+i7t&^HLB7OEx8WJfE=ZwJ!(V-=;2i2j_Lf(z$a1L=hN_mcRx>R{;&9tH7Vi zm!itrq7u%k2=D)OXT4y$CZJG~E1`e}#dVjt1!`zo(n|%UHdHdr-VVJAPnvG*_ zvEA{Q;6mad?>$eA$<(%L1fhvGg$r*Np%h5$94`JV7*JN?-GRFKtI()k+e<7wHp_2t z?f2E^W7Xi`+K(vSHL_cf`J}4s8o^WCgW3`6rRQqIK~*t_k#C4L8-P;F%v?ohqUCDs z7tiG;2QdLH)Aa#lGfNDUh-O2Hq5Kl-&u*z%beuBv8I6vP-V&A%gk3Ln1Xmrz6g^t| zv#RS)bnWS_kN#P5^CSYYkrtnnN=TmsQP69VXrePsT8Ij1;AUVz;*oJ?QKj(bSS#y~ zh04!af)?v&Z{aM@+sGL0q1?wxqZnjbmHF6i#k;?bTwoBCA*v+)-g-wPxDik`aWxCC zsWl3uohy{ix%X?31j-^i7}1A&6#Z>=K>0#&)f4awfHM5eB2acg9tq8Sgs<;n<9#K$ z!oDj>^JgfKX_I25Ps3h#ByA5qJ`#_*H>ob*)mx^)<4thmNd6=5eRcGO;4CDJeGsSY z;ZJIxCd}8mH|v?!+#AbM30#Qad7Frt{zqw3>wr`OMGGUb(){HJ6g7fk_A#3+$02p( zJRhr|=QHd?80-+&2!pfOr?L?L6208QZY` zDB5tbZrwSPg4@LWBQ|YFIhF(7)$xhgQpXr_;^>ky$KaNkPBN7s7;`s93Z_>B+vGlD zzLfUE)TP^#+tRqtXrYj%5aCe`FL0kR`Uzbpb7bA^+zYp;PMarXMC=jB3-xF z_`76MstwqN7P?Oq3W=51Djn++6V10Clyp35;Ckq^utaYFMj zrwp903`X@*xH7epW33pkoy2q07Bk+l=1cW_TUK=qLUFS!m$wWiNBf9<1F}UD!M(I0 z38FY*0=C2IgO0Ow)9Jf`x67{mz)uI;3Jm;aGI?Lq z?7WchJU~~rr0mL;*MR^*_gsBj7rULKNZ*yh?9tH?$G)cpSA8195c~etiDlV**ZQ5h zMv#+kQ9oh2Gwz?;)le37DcRTKioWWKRs~n#{8B~dQB;}d245(P&XrAL-^HS%va;jF z`ZMNgrB4$+e#hT;Gm zs|+>(oxp#ZPldrP^?j9;8ba?~QOo^$a|ik>>HKhCm7X4;r@dvt`taOg1JF?5I#M47 z_w=R6LM!cjKy*P|Wp7p3JD)o42?M-~J!Z3Zw9vn0cqZ-ECFNp~e9w=?e!fg_V}10b zKE*pfxkexK?_LNlFN>VxUp2oWIycd4-RLWn1LKC?7K4HfTYDJtH2B8a)pxVhxn)r6 zonX#z*!BF*Mf6bXFXF?|CxouF`&m}~`GcO_IvRaS8&<{kXnGk@lbC?Yd}b|;$B$k2 zyIsLxl?Oa)p#tE88$H~iX~6*)*YN#`fIj2?#%#WMBJ4P5=eTL512JR6WF_|5l@iBZ z&6k4iHT=4c(HVEbM)J}7-Zp`J^f-C*70EYMz#zEsC$+!Qo2U0pl&SP@p3ZV{bKj?)M4H9A`0JIu{(5;*3SpqSI4 zT<}ihwLM-S_x>4bEGsL~7s$Xnb@lSv72;Rm+A{m7yUxy6?~L?R()4^Fp~abbC88Fk z(Mxq`rMaOEn+#JYvk{+ZGFEwn>- zTe@dm|41cGy(d;R&0LqxzIgc_O-G+t-4vwJZ`_%={}$w8^38sc9MxfN0TSuxtHCuN zQCDWZ803y5Lcz-`ntLy&^d63K_+7w=bme7|3=NoWn4&^l*%BEhJ^gXe$zdZ+`3qK zSzzJx4r^eIS-pHEPG4`+Mws;~GNeQ_gpzh^l(7!J8wMv2%y@*A7LiT3+q>K>prJ%l zC9-KICy6!Ab0PT9!a3#qmsY+q8kV13n`-L1qKbu9hkUS?U#5eT@WjZTE(j%iU#+8* z7QmIh&Hyi&7nlQh9kD9k7*4-WI1AnA{30;`Z&EX$OlQxlt)u3q;N+hQ@EZX9&nE)B zDr1;zp>CU(59dezBW~@{pW(XcJ!xt>x4c%IkgF)(Lr~P|x&a!!z1gzJMv?OUxeplJ|2?uJ*6P91k=CdaGuOeTv#e z4tiE>_Wu+)eEQ!Rm1&TJ-~o_OW~hNnfuYX)FC&b;%pyMKIKj!oO{4d4@^9-{mXQip z-I0ZD$1H>SGXGs|8)l7b^jnQ6<5XiUHLj@lV_MIXo=mND9bwLgG(nFAqXt6$8I1Jo ze;!63SrKC{((a;W2F$m-hUS2c8CrLkny!eTr{`*V9U=d$>3a4*-}J5@`KH_W<-Wi* z&w0=~-*~gy6?VP0Q*g~vVlWLImdG_TTzML1{1 zuOb=#%?<4S8e{0AcUZRNJoW=rMF$ul6#%W5*D9@nsV3x~4UC=@2j&g1i>BbD|2B5< zg(G(~FO$gY)P#+}o%ah(I*ejZNW|Hb1-XdlMQ{G}1KObm<|5+Z_3!4;CSv^_2aE6uF$M9a;Ro=mgDk6rgkF;w zpk1{SNnwOAN-NQ~$3x$lf9&oLeJ4ir`_kpld6qB`?NUC_IZz+2DZ2fI8lEn7s2!|Y zdw&1VXyQPA_pZ%b*%Hb=P9#ea^ai|3ntr48&=*Rky0}EvhR2yK-mWa(d$#GToSO zUA|j;x62e||MWTwmwN}|+B?nSb0zzEi53#pyIv^|770|duXgtucxvjWdJX9cA1?Lb zVjp%|Xgeo<52XceBmP+iQ4Zt4KApWQzrzaTI3*I_wo)hn8+#kO9LOAnLja|*v z6;)8K3ioyL6I?li-&++8dub{BAUo^|9PLwhRt;?T|t7BJ^3#G%lJ#?F!Qj$M^H zbf}uTc51i8AwzqRsA#X$n;P;NfVAn7o4setEeqAi>Gy~-s;ql#q*-X&GVO?Qz5gF| zZv!7?b>)v|03ngsXRN5HQl03u8pX_BsY~0m%XZUUyJfd*OIwx(YGEco67VMmPza(DUpo)67@$hTO8(#Px%ZiQ0wD=) z)&1x5$=tVd&pr3tbI(2Z^}%5wkph@eKKh)X6Rwc#Fh@ zz_<}6pqlZksU>2tf1_eD`yYky11<26Lwjli2TZ1c1DU5Nd_Ht5cA?Q%%MiGfgu-76 zeTI465ZcC5FnvSSXUHtc;0-PvYzs+zmvxp4c*X48XR*{`#Qx zAa!^ae1WL*WqPl6n~4MKLoIM4_5I+@GFdx`(&nxGTSWP4Ka5|m(QvC5Al4I^>3NX% z-*ksIq*l(vf-j;DVJU2`v1nsxLl2`qfG8}4F`V~5GxKIOUIFVWKawmQkF^VP=YG5( zRR31cG_Kt(2euBHI}fO5KgFI$58jD~){!^`W` zZ!jS7_)U7h^VSTY|FpA=^m} zsl_h>Y(XLMF%SPDW9NIRql$Q$m|&>T9KY9yFQXTP7DX=oxZDX8Hq^iKNnshM0Z zoNQV@L-OEo*8WVF?8dBRGmXU%z1)JWV6P~BW{e+=bHE7h<*O$hOivzkPTp2n3T;_s%tS6V%&%;@gL^#5e}K|p zFQ{alAoJC59hu+zZ*LFWfW7x&1>ceP+_Os7TYCOVdFOXkPAcz4LpQq$8l?y1^N(9^ z2|qmSFQA_Bj=YmJ$~)sk-W>qZm5iihGqWlm^34M~knitEPLXfPJV?Ifx*js&GnVF& zrzzY*j1gBy-7pKo`GeEI6Vp9PV@LdrH1F4=KmJunr>i9h;D2 z#^M(o?&48NCT>Hb*$6Z?-^a_gl&70=lQ=V5>V(85{85u^Y3Ly0I!ErTh#Sk1yr>LzHrtQ%d!qQW$z@ z>0}D6#(y30)0C18n*d7S7B5l_Rz$&w+>GPdxSlvIoK`$_~`n z)7dKZ?`$-_{Wl~|D>i4p#nEq>|L_uQGd|||&ZdR7dE_}qqd>o9{t1cp1#fe5qD7gi zYcbw-wC}->k@zrp$RR5a1D(0EC$L2ib?Hd?Cgb}lWnWySdMsWZ%1_JKhtKZ}#J51h zz;>zVk61Y6t+?ZK<_|1qXO3R&8EzEQo%z)JZwrX#-|_vI@lOAhwnG19T()5G9F#bL>Z698;Rdh(LnMj6ee}Th3I0T`j5*2=9lXe_Zkf^vMyNNEbkZ67XH}&9;zKpRtyAEppXUl4fl&6ekZQ-&lC^DSCW5IbuUw<6>mG%`tPdbnqe?uz2MYWblEce)iC7?1{ z2+)U?$!La0_CWa&qhUTO96Jh4H5Z=TaCSRF^0mMp!1K^DF=}FMU9lHE_O(o6#mRcY zBvv!#Dm88z$^VqBsk(Ck@uNLse;H6SrlUK> zVIWRIQZ$S9dq|IB=o;uW60$6=TM5|j+kY&bHM~-exn$pg9I>~6Egi?hnBO7iu2Nb< z^tOCyaG3(r5cvaSb)t!o=|xd~b=XcUDqN-RZ0 z&KmqjCJ%J>KAYpo1Bi-3TeF2>!GJx+!*Ru@T)wX$0{I-a0Q2G(ZH}0O3cup`!VQVo z6MIbL1*7$wthO!;*ZA=e;}%Ty7e5baw_ijWhEwczE%f^qPaZVnW-f&-gYk9-05&ar zIdWv5Ysk%f0Eu=Z4;(>(FTT*!Y9On$56~t%UTL$JQfY5TqWuz@X@6&2MW@)}WP94QVly%0Euv zgjB?FB#a45l`%&g9L*%o!4HL7Ly8fWDFMQDIxO)B$A}l{5|3~~hox-Hm1~$N!z}`J zETst${KNGDDB&v7W_&kIU8x3tHK`1$9W~z5i6(&tgYc*KfwA0B3)2jc%M_S83+wT? zy|`R4;*{03V&r0$(eMJ-G(ZDu!#}$V5wWA_lWp-Gc&b(R?)w)|-V-mNCEcCqbm>I) zRzwfgEpemB$^QvgBQHAFY2XDoA-1I#>RoS1cHGWlCLEhsg%qZQ#Hf5_(4Ax|KT^QTagH_DOtTfi0V=r7C+Y&?YcmAsjV<>dJE~ks-@HvpY zb;2h^cWq4DAB=73b21m^G7rYJUgO%Jaixf>6THt`#~;$1+BnyJA4yhjdEA2Mg7jM4 zDjrcu@u!PFJurhVb66|;n~jD4WJTkvpw_XRbnn4%<1OJZzRcKoUo>o`!o^)Co?U{P zFAZC}kL)f!QqXbOm>&vaT`7$vwpGv*O(0}7wZ;n1cF$Ys^jPc3aPe;Ii6c*ki#Hd% z<7xLCNViV_P%D9otRuxwT5mA%>4JAco>a(_38hmLSxKgsgsqO^BVlXvk*ABFAV6El zvpJB!st`clvlF760hPXpi$pig^jl!??$%-(Xc!Z9F*{mmyY9A5_v`+X-X{J26f z_H=pnVBKYz6h64jaN`~Rr^23Bd7!0V>OQE{FxF_gD^O`w@4+Ra8qbmtZ?4|Q6&=Ru zm!7ca;E)B+@xL7QJRh|t`-dubp+8gM>CcwiR(uF8e59+mv!Dwz;Mds7`616y77cz^ zSlcU#(_yQtxG!9=wV-Wm)ZdhhpZC?j2wqks6dP}%?d%>ZCtszhMb;?glB6F0wg!fZbsP!D*p+U zMk5bf>7&C{n)XeJr~72}jzY+M6`mKa(Nzb_L)Mm1aaw8~X4Rv#kSc`nuKKqZZ$m2j z7y9M_z7d{Z;n{kP<~}&xlx{o2dO94~Y#j(}ORgUO-%3QA5%O#fbOkz-@iK`>;jQ3WY`km>qyyWL zZ;HwXOuGYH18vD=m#cge3AV!1&b-%TGvmziLUgGonHjRC@(RWlP$K!SRQU_c#uM;!+bmkE@L3DkEsysWP3XGK~#+Ht7P3RF;CM^`t5ev=*yu6LHFPtE(^sx8uJ% z-DbdfajtRuPW=DBxyIdF=NiX4sisR08;i{#x4K-0lcR)j6)xKNAnn4yn^4Y8(en2D zziF(QbcKn%Ni!L~ri%;H*j?MXAIq?{J!a$g6ErMwG6su`mITxVo5;?d2n_$LenVtN z@^cs@Dgrw&%`Ch^<&PGpVr`|@Bqp63K~|v0nng&^t2_&L_FhZNEdH;^nxjt_y`aJL zq=cw}_Ffy9Wkb4&-$B17F1Y$=MI!EI6E@1HEMmIq|a*DvDn5>?HL=RjZVyh!)C{WtT_L$b0ZuR|8e6P zZ?acnSB+j>3SW*R|Ei9tM=o9M&fG-&%)u& z#&455Q4g*rzs0KntqfvQ7u&niAW_e^ML4+xOmmL)SvUdB`w^Lv3JhnY5arZ@iLMq! z=cxSrMpJbJCLZX;QZ4uJtd6La&ivECF=#}d$8znT)xS266P0RG>fBj#nL4z0`c7i+ zq#S#vaek27DU~pL8gIfCswf67aC{*)4r%Xn6dVEjQY@hr`V=HcH%{>Egh}xfYmu<_ftKerEg8^qN&AB{NlQ1a4v_JDmJFN{y4zn0TF$zzbcN88 zC1Iab8iokWNY5eA;`#1%?+7h!62O-pf;4*$CzoH?-5k41XtAEh@VpNdc~Y>vOpsNc zzGQsDFOGy8g%&p*z>@JCjNsf7;Jo4FGUJz@9~giEawhDMu(h4zF&koE!IK!QUgL-E zw}q3-&t1QJjulF8Jg365Gi>dFnGv?0IkE%x#8!X-88%-$kB5`1&%5Z%rmuuxfL3_$ z3dNyt@iSrT@R6P2;++LM0r^KlHhDV3$w$Zj^Vgc+38gm`R(SpxwtB+FeHGU4Lq~Sw zF$Ux+Xye!e^9Y062Oqxn8~+Ik!=4vI){cr|{B92&0R@kTiw}o^H|+mY$b;1pSd`Z# zSDs&-zd901Z$2mFc{*(MhKpYc74Hre>3=(1@VE!3Bi|t7O2Cq{{_b-y_S*$JqiB_21u0v3{)1;c{YNwiIQ2@{+CPX>9Iu;0 zo_17V+8-u;t^ySRvwDT04zqg6EQn3W^CYCGZ;~SJ3Cr z^*l2(S$H0?1@;2lwDA7*j{@5`V5>+@pB%Mb5rn`t@xPvY{sxo-Y^;*EB3U@e!FGA| z4ZnRe-R7meJ^e#jY!ho9+pr$k&ILA7&oR`Hpt)cYwr+^bvC~5Om70DS2Cm1~Ov=1l7fx+iO{!Qyha`HLh zz#&waB39n@)EQ$H)?=|&$a0Q<@N@I_PpnBF*ExCJX5 zf^lRA1U~Rga^;xs4_tC>dh_X?=eW(3pkN)@87k;S6I`2&PyFe{%YK$l8J>)1-;tdK z8w0(`WoMPQ{PUmEZD)I65kBteJ@RzH(}B&&rJvmR+0TC|ogVMm4%7BXS3zf>D;Y0( zyRD;SfK2hJx?ClUa&oohMB(o3-N|@`fN<_ z+Z{AzH!WH*Kb;!y>4aKSC}6(#ygKz*y6tp@p~=BOOMlX}p8rUv4G)ZnyKx6#v&OT! z?8j&3-EgUO}kpEz_SM#j@U z>8RD=IdWuI0cIR%gWvAheFD`p(XO>cw2866lHCv}OhyXNEmpo<0lC zEvDzDC=8EzE~|Xdddia5s$kwk@JTIL8D8qyd=ne-MS;ERf=Ix5l&fRhxWsEaIU}^O zu-VvRMVI5u^2YkNz4yKzPJaHKaPo%!u+>?gy4rXo6;6H{dTD!o8iBUt*ZZu4;>AF> zufF5z5Ox+G;FU@2i8OqG?hd12Jl!ou!!g)Y*C)gAqU)27#fuPGVeP#!xo|nc%a${Y zF({g3;mPGXygizny%gc4OPOxHiB~XJBe;4sgLq6PWIVDtQa%6&pAG9a9@!Wve=CSM zo=bQHyHZDyk~YixKzOA5Pe^I6h`+O-F6irB@b$27>wBAmrZyHmlaSxdFsc|@ZwBXmhH_b|#eUW74AzjQn*C*%1@%@(^|4{;tG&M$-7EP1# z#?V1Y9=hApR$)C%ziX0(dG&8q-n%2zxTrGJc+c!my(@E zzZ?E8OlP+r4jJ>W!*Q!)ZSXC=uCl^&b2T;usvt+M9^|smm%LVoRZpI4>4DtxJR8S2T*h?z!J0l=jub8EzE@tn-tyTOk|47xm_+*cOlNlc*M2P zMcfLwKKfB&r?~pjAJ~tWh2Wqk^#IN;3u*k&2jVIj7i65tTFd4QaK7P1Z?<1T2ymHrY9T$%-*nj<6J81XvLlL%d;p?yO`e-;lSD%_ast@P(>Xz$R_ zU&EnJ1wEP2{g}~`dEA9i%o{|>UAXPLRIwX%fWm`bb8kjiGj8DytP zH{iQ(kiv!jy2h^-V!AdJ3I5tI`Mv_zclpO|{|4Nmd+zW}gFE?4bv6Hh`F0p4!{m?$ zR?YTw8b;8Ta9~@yz0iq)p@D_hsJ~XCCxkI9!m8XI23Jce0&l@a#hT&cFhkO9$g^8T zVU18lO#ryhv#-MH2?hGGY!BG>aNuxyW1(lCiUFvK0qQ&ae%Kut?x%(WucSAFm_LLA zoEjrmVnB?FnGo{q2nU`Pm;*4$r0^YK47-yhI-iw?(JDy*-WLu)6$9ZD;Xp4+XAIZ` zI}g#os-h=&Izp;SprJPGc|r>JbO6$)67tE45~PGIn~6aE$BICYs@cYH;CbO3rh}-8 ziqEgGHenVaNfT&P)S2}iFc9d$Ih1eT&n-~&tZEZ|dxdV?Rl0G_L4A9Ue{w?3C@1Q0 zx?-H)dM3T!o2VQ^f4a9QQH7;VB1)oTLx(nNWGz`_lX8-RMFM1i0>Ih&k+4BKER&ap z*cqBmg3Xtph8P7lsE=i8dm7kcC&A`VR6&J|0vq(pGPR!#Y&An+OYos8V4A0Rw$;Tm zyC`8gJTswtpfG`fwXDu!a(DUJ{*pu`)DN)XARioSd)oFUOw|JWixQPtY|u?h)pK3I zRyh0$b-a{A#c^)9e6bzgk8I6+DE`EIs-lBp`6C059dlc{Tvh=wJ zraWsV+JT^YY|3cxKDZ}p*Wfs7COEC&Wq9h=@I6Dr=UX$uOa(6^RHugT8XCUPnh95tS7h|Ei(kCs{MGlB)2FFf?oUmZ9N`teGVa{A3yrm<4xBKbr(k zIL{195gjv4?N(~HimvhVKD!ZamV`QuGnU1990}70kuXn#*JQzuCm~C+NJW)~uO1p6 zQUQ`5jDeyc{xLOL_8_gQ_6K?W(8CK&umoJzC_8^C1o#pp(_aFAwav2&7a<0)V&wUB zsb08EOa){S{Fgbo;NPI*OW_y!PA-#cEgOh#J@H4aEty46U_yx8K9uuuox2GBE-CXP zh;hp7*Qpt}PMLl1J7wm%%FK6_N%##!x1RV}=IJOiH~(=zPfA+xCi01LuRvt(|1cAzBePMckJung zE{a&2XW=tw4=(}AS(uLpja&BGUqz|1KM?Ua1~x`^uAlf!tVT@14u$iS%u;2*gCi(T zfUsChNN)~ul~e*+L|mEu11K^@l{^6@M{v3-hSZ?Z&v1#v(s)@>Vi_O__2ObAE^SWt;}PP_4-1{ZCG7dti+7oMtA#&#q*$ygsmqTK#krmhobXMeo( z3qdU7PUFKjin+vw2X9KrB`@ZEKBJypCBXeKW6k7GT|W8B#N=}Muz82EbU)_E_SrlO zCHM1_GdyN;@|b9H9G=kHqgE@pXweoePh&a5EI)=ti;jx;_65}6S%v(Ze#xI!6x@49Q(825hFlGjXt^4hxUkR{}U&)p53+3aJ3 zXSJ>0213Z3G^~gwnxh3_r$4gaIsK6$Yv}%%q96Y(2ptTst{d_5frx?wmg9(l^h9ni z;gLiX5GIs(siZS9d=yCM| zhccxspof{x4j`0a?$3@Ood_JHW(k5S8c@)Dc$0=5p>F7o@J9mPl5%$ho4Oovzax^! zrJ7IW&*8daFL72!Kz592$-)WJwah74pk1oowuC-Xy&4^m>UkdP0Xp@KLu;jay8z(b zK*8B=kGNtBhz^aiC*94S^as=0k2fNo=0&ZCua`ary-0+jYOC0>(7VFCB?(oV>G%pR zTwg@EC7URdS@FfCNXTys3ZndapE^!{6#YhF>vs+wG3Rr!FKaelZ+H%s6m-JBY-f~6s=W_pD+ zudKqVo}n5AsWjg4pH5K%RL62wn55YVfdZlKXO?0G)50%UYt0mUs}eCh%wtA*n+yjX zATLN)5DGP%fgL!&IoPb z`a){~y{Ls32ZbCFJqQCL|}QJnu* z1hAd93Dub6$M)Py*fUbA04g4!Dhi<6DgxN++XRF?;Xqo-)KP#^QGnVX4sVKU6{V4O|{X+}>w8ao?2>-NOAn51-({7@GPYO+&k4}J&FzvR<(ix`R z=3|E-_q-L;Zu2AH7gi!rf`IB8({4i7K=+t76Ws%3O}lTpbdzcG(M>?!v^%A%h+R}F zT?O4lDMof*={LF6;ZnPWPbM$fM1|#6ZqP0?kUoWf#}uj&J=BgEM-OqN;cU6i8D3+E zaE8|=_#GwG48KxB_{_ovB3e((nYwiD{4(Ais1jAVT1GHh#4*6IspB2u!Lg|I^ytBY z%2g;}Kc!wOGFxG2@DHB_=){HiPc9?4ag&_k;)~{MYi*u3f6WH#RD zHgAuB( z`ZnKy|BWDCCoq09W-ee$1&D@$xjy&I_%39@GvkNAU4VB2oXXVOh$ke0C6aq<7EM_~ zdPMkVm3J;c#}GiE=0n<3vG{{qp6P{22|i;KQah&cA`+ z>zTIh7bshvV$JM$VoaX-MHFFw4JOw^V{k6qXSQY^%f-edE^+stW<2;&BoFvEH#;>r zY#LMZ>>1ilD?08e^p8=R20fVG@Cu_?1(Pq@V$eU#Z+Arb`qM2t4jXMBr#X7cfFS65sGh4rRW25neVnV0-{Kyxc~)3?E_mGT@Ad?!d3a z&ydK^NF<+y7eaz0aj<>x3~FP_fTf zU!G^nr!v;7F2P6m@dcNoc!d89V8RemVrSRgU+!p-r zI3!HM>j;WV{Qd~8aDu=ZT;yysjqBU&pASOChv7MMm3cKE&qt^lj1t-Aw^NX)j^SO_ zxxoD9brMrWybG@UW|fM(u+g00%;PUTN6}KG zA5CQ`sovERjaP+x|62ikF|W5p`HT&Dz29|m_2S&E4b8R8K>+LCz2V=X1fUCoNXraK?>#+T<)OphM!s- z1_Mp-;UWfoee~fP1ew)iuEVua{)KQ;fAN*(x-Y6AE=z7-^l5Y5a^S}wzG<)>k7Jx+ zJV^b@N3nmZWUSlxO};G)6zd*Wpb*Ec5Xazsbr8ks6&eh0;pE#?8K&IbfQKa*@h2qe z1Ng-sqiWAL*A?Z03j!p$yD{JX86w4xuM60sN=nFb21bEUwUvW zt??ldUAzNV|JHfNgO_~^(aCFld}aK7l7zK3;;kH4PwOm1VDmwD+MQ z&3ty+YIfLpOsZk2&xQUtFg?)e@0_vpP1*k}r)>&XK3c^nhH-RPG}; zb}2Jpz-WSt;XwQe_}9cR zi?)(4%G9F$91_55da%1;qZ^?^xI8HXSYT^nV>gb3+;c60zxmq)9??#+%nhBbw~NJ-kJS& z2xJ?BPdlSfK(&j{Rq(GHj?a=fBA*>7htEd*=U1=>`s+PEmOz%@gdQco?M2KAqEqyQ+BqKmMaq2C^Ju)8gx415exA znZQN_52(55uY$j8IDSYX`5`$@#t#R|6e#lJayLIdGMFEPUQ5VP@M8?Kg3urcl^Fp1 zW$y3iwpCao+-o!GsG@mX1%{Gq_ zKMSJ{E97&vLJ|DW(heT1s3a=Od!)G}&`Ha2{HuN!@zoN@5>M#Sa{QCb+Iqgy2>3Dr zR7O?|jfOX%{7HTfRw+dI;qQijKidPMS;;ymJu6Y!u9Ov9(XLLK?m&>?e4#j`273i>W04+{?~^S7)d0lk|Wz-tc#214pdH6<()}7b+13{9Yi#t zN2{v3m=%P!fKVDr^f$wQcsQaZkwi<5lM(GenF2*A|B2A4iEbWDG@;iLauia&K(eCM z4y@XpzD=~dP&DUS-lh>>UAQNt1mcExe;)T zyIya=)OK}XLXWls?~tsjUVSn(*AvRPI#`B!_2~AhgPuL7SG89Revy%r)k^_7QZ@+6 zRWAoBCvS0~M|YR|2G@(wqm{SWs$QjRm=ugNeDe&$IzGXm{66|uDL>}6SkO^^v@aIk z#SfcWeO0lUK}0vfeKUNo2Phc4&8?asy54 z1teZGY@NqmlL5}jq5;} z0!3xwIm1<#KMI$#bs_XxLXJY2Y?rLry42{p%+qzL1O1h{E;0Bazb9`O1&F$w2<57a z17!*n>+)@(LAT2TgX=T;W8t%49Pms4w)$w3IAP1x(4PwruY!XTpS=<*5I z_)Tn3w44v>M!F*WMet8z7d=_aNn%#{4}x;l)`7}(%cYpnW~Fek1hOqh=+Sn|In0{G zqb(S()EcO3KG-MKL_?m&46G*nRczov6{yU0 zHc4bPCC4BrS2Z0dQ=r(WZ(o7}oX&PY0@-R3T0Vz7ibj20vYOC1Se2HBG=21UDL)z; zyUfZjjhzyIR-juM1js77sBa0}W-ZV>_H&{MqU(;CC}Fd2#pG556c1!ELaZ#FhjFb9 zpzcL5%(Hc$C;_MLqp0yAbX|z9)G~;X9Db>#oWRy1&4bl0kuG5nwe-T2{h;;<%ryC1GV#`c!L4^_^|Y!&Hk|^L`X<`HW;xHKPh}R8mm<*_xFxh??=B z2y504_t&~+d7v0rkkzqKUG^NLl(4KB;ZCXjVnUm4zptNa%|54UChfFBn47Ili%DG0rbJZpGZq=p4U6=F!{JQi*9vrPG7e=&J_okH z>$dBHAH)pZcIZ`vWv?RKDfOyHgihUd4H7s7t#~&xKy)xem4~gkeSsYkZ1DzCBK(-M z&f^3X$^fGdCa?%_xV`!gMqaCV)R^ho4~+tIi5qjN#{8ft1C6;zVfJav zbnVhnU|xXa5Fj^p-|pf@0{t3%Zjuomvl_VeE&`0ejf5L>lg50%8*`n)9MhQT z+6za4xyX&#r!oJpn;U$&gR-G9)3q-e1!lEQtYxDQ#xc3^Yd2VX!7Yfl;l z=6P<+H5zlj8*`PyT&*$FwbxaT%#9VY8sYRo1W5CnZp<7RL354hmSy7F)uX^%;>KL6 zG2bSwrTN?mI}w<>;IMbowa1SFv+3qWrRK&L+?dN0H-efQbnTV5jm(W!S$ojjNFhLO zeBOBiiJ0BL?i zw2#KjwI^V%)R^hoKN)=0nA`2zzBrJ5&axAQtk~IrIErD#s z2t8UBmP*#M%=C+L)y>D+U^0$<3N|>5jZV1wNJWivDw}Q>({cF%9DhumW9C!<=9CW! z>-i&QY-nu|-cTzN@l_5p^=hyCI@r^?lb zR49}w#^b&kNzz7}oIH-}&&w=TS44(@404~}q-=O8B{=GilLhyQq4j0#>|l5D%My?? z(*oJX+27O50pa3XxE{UBUx^UT5n!>>zESeLm%M9vhP-&J4x->?uY+jhv%{gyuJ|lPKgB;hu<)2x@Lx>i=X#BYHIe$R$nxbQRZi2!~xo0{HFZE(J9;%ja20STO%HaJ9?1M~XOG&K5r zgB#@^cPkM}(K1G(w9+U>qx}3Ff@^KS@8?j=;1CsE`{}<|fu5o9UZC+-YrIt&??ks~ z_QSdc-aL($u6@78s}{UYUG>kQ)Gj~45{ou|;)^@R;N<&9?tpW=U1nPQa;8~mcIf8J zwuj%(R&Qb#amIjp37lH1-^n~9Sn~O2vk*P$^di6s-1C);)a{<3VF7zo8y0l!=Lj$Y z=1y8G4(2YJEWjLhWA0R#yEJCHcKs+Y7r7Tve6omATb!epst)vORY%wUm|%rz3}A?= zj4k=_%RvH{X)$OT=bSR2g(Efbu?)-yL?=4qi34Q{)X9#Zp28V~k&mGEQ`0+~&6D~Y z@$u4sbenZ69`tA)(6y)B#Ci|E+?p>|gCh+HpguXyHe+Q5oNbW>8Y~jPwRheKtmtYf zRDYKBnoN#xE=M}}O4*sl-Pwx3o4xmrRCX&WlC4!r)vDoo9C33gEPR?#8O1%BwjD}m ztztG%wE}LWzTF!c*bLRx@CU31N6P|l3=0S2#`TSbrPnuxOJ(7>4iqzEjFj^R z{YzRf@=$L8i;(mK>vS%opG-(3kw%B)7zE`qIvgldpiU+vgwp%}Jp)~Of;RM_>XC&c zL%ujd(uV-LU&GoDF)}X40j_VHoZ;kv_0KaN{+`^E6;-RZdn-9l#Ow|a+K^S4B@ooL zL7+Oq@ms>RS7>9Z_Ojgi!Yu1AuTi(VMm@Sl`K%GF!!CrKM(c#Xh-(Uingi8w4%JBF zh>hkzIgMt-%W(%VYbj2ZK+aO+Is+*fxvF*nvyRXeGj8?Sr`2c04QvRflPmSvqtz!} zJ1hV&`$g(c80eEvs!r3VZN-eX701!?bMSUjd0<6UD-XK%Yu76_`(P0`26++u8;4`F zB$Ca;8srXC&LAHzHPXvDZ;7_avYF7MHOO}{D`X=GLZKbSUk3mB;fR(*5-m9fNsy~U zJ5afkbw3k2HPJsBOf;cKd$R6Z$cl-O4_(dEdKai(yMX<(qLWVn_$bmc0%3uVPekAc zR6$|uRX!MPcly|tUsmVLPm_SdJ!1`CQ0FQ0GDd?lDQ{jLY%=k;!vCe=RGlP}Gm_(E zoN=H`f#R6oD}tms^SlHcg4PjwEg?s7zTmga3ZnZ!sIz>Sf&bRwh?YbWEjdm`v;&n} zQfzV)T|by;LXUPyv04+|1VWvTlYsy0!x1fsBX%4ID%Wv7;U=0>zMKMHN9fUZoYR=K z{u^dqZ6z**R?o#x<=h-DT)H>S?fE5SThWy z1{)Mubf-ZfYws{9;MxydN3!3`b;PQ6PV=tEZ{|5%x_tlEU{A+PC~NS)gRz7x4|1x8 z)!Nal!M-4QuuZ1(`UX$)zP&|h{~(7J@V$(q3N*&+VHTxF6%)!A+P_kCuyXAK1VA%G zZcn~b?;fve^mz4MH|BZ7jAcNLnXbJ|V=mR0%bYU+Wq}m+T2QPYS)~Snkfx>nAf<)W z!-XlsAhpaT?xIQ%36N5P!hWG^PdW9Xyvz?g`EXGbgDh&pwM47=)vs!mM^F?+*IrKm z@aq(6Rmu?qMU}usQ4F%E?@1@tMHL|uAU=YkD7yBiPraz7ajK{UTolD1i&B#XT~r++ zQB;heD2lF~xdwq#t5u2;4Lq%IQ51tLs>5BY6^I1LDuSXYy7v92UQ`ns0C*B`St~d! z>P%slQ!7NWRs?0O;MyN#Q80s39B{Gn7(x((ObcvC#E8Ec{ws#l*OCa%3_nwJpq!ba z5kHIt`K&$pssyqlBcZiM9m#aIH%eAr$tp?-cHFd-(6v7%wHm$yo3MhIjAwy zwSV&|as$`UTodYU_zQ>YOOnXGG$v2+$w&D+e$~Z+%FWHbCqkyJOiKdUzC`HJ9;~0s ztRUJ8`4kf1&xe22a70Vuh(tS3Iijy}6MflWq6s}(q9;n$(cMFxK@|&yqTG!c`|MDD@{fri_UZNW`!=;r{UQAMT7vb4^S}Aadm9A~#g%`Hm zD$FOGmRkY;Q^U2KB#zi}4pgq?_KNz_;e&)sxM{9H`tN`4Km#xoPH-S37hKFXeri%dzsq`!c;{sxB>O=Q>X_{JZuKvyLW-Bi6-%%GKrJ3tV+sB7tmO z2tC@m+{&!EdFt()r{10ukH6YHwN=^pDbZTkorP;Za|P@0Ud~fj{f6_@f5&g;6SeQ> zJXIY%*V~bAL)D(@Jar%P#2!-zOW1)%cOYcJ-{ND2`4MhT^6#w3+H&Q)d;`ymtiKqc zb-#jkSqr(%tISl_eiCUMvx%#g%n za}04#9$<)TNvCV~O(zeaTFGs=Ma~@EbxuDadRcEAH6bu)ou>+mZ@^j&hod!J`-i}a zbxs_$;k2vfQkH?K8M1;N@z=rMG@L4xM5-UjF{m}LDC%s`IZ(M}vIk{qq{r@WN+7F# z2tC?mvRjxH<(F#4jAHR(6&VXwtbhx#WRPv})oF-!Y@238QX~lqZqc>xb^|0-BQ*)- zILHmxzQGMprvPFafUbRs8-O=(QACXfplcTp08P*XTT;Xu{%-i+l|lV1DOoqccnM^i z;8X_nm-LJ=$bRaQ0Q6Ey(TGPj=bZGQz?Hv}g92Bcb*8$EG4+{L`p7&25*IudD z3~TW`)+wzQDur?%#@#>hW@l1cqrRta`eR)qYS5 zc%HD%nK9{I@J!~hU#lhE7AR+#EWyRgXH+Fd{C8B!=mJ&Hk6aNFMXy}@{Ew?9ISJl7 zG+uf01kKs$#@nFrCKTQ#jhC*y@iI~C8LXHhT+&RRqMr=4P36HtIjWMfaZFMNEz#yDwH-QHYlmrF2(U3X zQF5FSF<*^{UOghxwLdqNEEpbhzf6;KbL4@M#M~{KNo%VWN?Wbc+KR57Hww(nFha95 zw;({w_ew|5m`l_OdZ}JPr)&SGSUJPfT;|3c)R@&$pvIh03+8=#!JMug9R+3+GxRLY zl?agLd)zeVV<4vPmhl+68?Jrml2Py(YoA%n+)yUwyWN&v=tRv8ZrOt7N^M)xwLc}8VQ`}Tovu;^|6{|c9Z96xksK#eI}TKCGW!$ZmhLJ% zB9)tft|RnlC$kHfbp(O#lyyEW&|L_S(Tk)^&5l;^2JA=)i!fD%YkzzSFxP(*+qpL; z@GdLn)Te?9X+9!lYI+BJ&VMIXBy+8_fL_8Ef|kT={tu^Rz^^hg}OMG4pb zz~7vDQD|)`3NDL+!=luS0$LWkl|=Lq6xJVI`#(OaiW+V}NVpYMlU7vMGov#gm=JkX zqEaLu%fE2#2mti)L$4T1%jMII9L7tbZZLcYN9R1Rc@xH;m-1 zAl+=lV)hMav88@5)CC!lPuG2nu+OD@GVs3(E8*~@sCz0`>Kg!D%vQ)p$S_F$1Y|QYAG$^K#l!7Jy6rN-w^;@wi_DnbsBG}##^HC z{-+ynH-rv&d*F!l!?k}R0EncpvV9rnzeiPZ=<7l$}1Kk}USm$$v2>NSONKC51TErC;0uiuwEpT^@S zr_8QD=c4D~A9GxK1;3fPTi;K{{nX94AO0DPTf{t=hs0o^i>U;E9sGN+2J2>~C2o5b!pK?R-vsOr)wT5ibON}~;3S{?&*RL~05rB}hBs-SCslXx+{aM={d#x7`&0)I)K9F?6E5v<9We zouglJ69yFKVao5wLqFuk%r zmug8b(USfh$)k9Ds#BjH=rekt z|D9Y*(RHdKUM#C=ymaly+yLDeqG<`}5u2|4F9bL>>%NJDI~pYc7bZ7@RFOWBE=@}v zA^{R3D4L3{T`EN(15}#RK@;%5E3@Gx&^_60>RJh8W&KoU!+*!Dr^cTk8G*`|!3BR9 zB!418gyv5PA^}oLQ1FMY?d9pY5yplD6k2v{XhMLPe6JQwUbuEOuwv)TR!gi?IT&$(Kvt9~eiQ!qaBCfsh$@q4 zsh3Y1jDwa~9VkCj^jboW!fr2T))81f&&~20&GNAOqDmD?19Ph3 zurcY{*9yQgIg#$RM&37 z3KR$%@;e}e8s#;dktfDwZgvEP9Y*})qIb1MXjLppX_nBn9~Gh202u|)rvd2N^%?*j zGI!JGBwv*Ho(TS3>ZZ@-63F((`@vv!*XK)20NeX8Y&)h-2L5+tU-xcdfL0KnJ3Ew=28LcMR7l>=W^G_Ti^PX#f=a>%~#X^WCoLOn~^%P@DkTI_yJ z=?dV0akWaLqHBLjtou`2I;9ds85y`-&xFGPZ>*as-G~H84?!{B(6x8c+8u%2MQ%a$ ziJ%(sTivQ6UkR&M3oBjw8!`{mwQN@H(W2Xfu3a^XqPxXb*Dc+H04v4HWtYF^feuuv zM#zD257$0Mg3&X2po|=gu^aw(Wr{yZ>ZE(d1PNqC=!J0&}c;fm{Sr5p1`#)X5igwUnBk~j%H+ewt`(9ha7cRr)&QQ0Z_A2DAQ5yYSK89 z_Qqr#Lo_k)Xgb>LFDu_Qs1+&RsC6Q2bdficHE}3! zglR_YKWaO!_M9AT>%Ij>%JiZ)>SE!yScPxp!2W7g$X8YH!eR5#wLgosLw!sONBrcN zRx8}m9Mdx0r%HI41@hGJl|hDs={lx$%TlFyg3N|iETgNAX`PKsa!hMI7&7RXRyBY? zj@SxS@V^V&zxYnwU-Ot2W)&lg13v8~eMko2+Rx|OdYzhazJS*y9u^3vXHxR<@|c!< zy7rHx9W_8d0nn{=+tRh~XCT)#POWRop|oKhAi(~w5TncQR^|6d9ISe{_B$G2WPS|Y zJ$&H6iQVH}>*3vC7g*S%SxDEu@-M8yd)&i2RTa8)73kXcLBs149X^-@Jjt;NQ}@8$ zXz~ucCGm%7`C%ieE~DT?Jy(|+3rnETO5|Wh8Ap3?B}lhnZ|;33FYE@VXXeBIF7(Wy zE%(3b!Hj+?A;)shqbUR(*2uc5>BR|;I0-*+Fhlr(OLEo29n3h%BTj$$d6JBq>^=lY zwtQZl^G$@Emg$E7U3kQ4=$2tYf3-PPr@M+>x{6(*6LFhW#B@?O6(_U{S}AJ1fEDx1 zp$0X`q?j9G+e){7Gmal^q%rE1*QT_}O0ctFy+?Nzy7u)le2q?pKP$v26~6EU70w5O zejyOLxD_l829z$2uD#a{(5wJjGyq+Dog1K40i-klUHbk9a1SRwup^&#!ZTJ~Suvh0v{`+rF@I zu6$oTbn~apC9iR5AY$Qj@k`}STNFs|4O3a_Z1oqV+hxp zhD~raW6Lo!F_Jeia>*u=`1#PS8@Y7hh5r+TfIlC8A79nw!Gt_=fx?&4sjJ{tGZm1n z@PA6jcfxJa@sw=rqT}t3hh;BXcXBK_(ZJhqb*p5P`5Cr~yxG5Hx1M{yZ!pzTRs4Dd!;FQn}zwb5j@M8EdXn}`#6Nx31IVA+05-L>* z`2MbgzH9?CEA&yI&wV0(ZquOe!>^!VT8~Gqjg%-a3ZkUt%RC57mhfZ#en3SVANBW% zyVRc%7s?f`K7q$62J}Y^&B6&%Lfqv_b|H6l2uC3W)#BnCWa2(5vKxiWiYy~NDDis9 z4OcTwYd78shUFZ!_JnQ@{e5NVmeB0Xo@ zD9vy%^R4qGqiH>7?WupkX!W8Db4sUK-|sczZDbq@Z$kdmoe|Uy0~B$=WzS+-3@+1f zUsvd6g;Iz!8}Vk2xcVCetuqkUQ}|8aAE-JoC%lZ&>~Ih0n0e5`0IcN$PYW@j zijU7HN>v=CSBkgB`J)z0JtmZpE*J|Bp9{}gRgHAC{Dr9Xl4;zy$4th@6=~8*1?5^D zMV;iQtoKRUa`go{5a^}#gZHGMc};3wvwV+f-1K;02foz~&vv|dvFM{58gYFXI+=9} zs%0YtOC^~3_H#!mL<9hdg%IpL=9F%h+@mSUh|6RP$xbaifYB9VGc3J|P|4Mz?;}&5 zHKFpm7zOTk!+zuNtMD3}}&D ztMz?qJORhH#y85xfeSM7%BlnRHOsew-3Q6{H{sbe8orP|<~UbsNy0qM6)a7d<0WXO_m?FqC(r;9l3;m}RkXCaqz*8Z4rY$ZX8meqYyu=9 zBZDN(KO4|XHqoqgO{~o1Y?65})AA|2-vR#nkUoP5;pYX1N-?!BM+^coMy=9ZXo0H? zZmb8v@5~-r;ZHIbFr?t;P5`GXgx^4P>xrLb{=d>;?C&y+5jp$2MeJ=nwG5Zd(j;Mg zY)9Nj<;}z>hJrc?V~3q^7>|WVj(EW`DFqQ6GRwqWF5f1OV!SRvm{zz~Tzt+++(+fx zw_=|PJZ3VS71r@-l%ehK&mKI^{w4uN!~NLhnrpnCnrke^<`Wu4JSoS+ZY(hz$;H#; zcw&yH#_?1;o=SKq4?fa{#%3Kj97-L)Bi4cPA#j#h;?LYXFp#CA1*ECM*d7>+n&^UA zWoT-)UJ$MiamN|sKfzVMERs@(8lU6wI-Weo(+3<tbC4-sN%JP?nBt~midQ+Nc(r4Sm(dh2HR3mOUo1PMu5_8= zcPmr83>1hdekMFQQ{0YPy^bkPiAN;UqpXxlB<_$FIM~fwVnbNqBeDCtT}KC^o|XC# zNY?Px6{8{@D<|eN^*u&p$|lZBuyI66Tyh?@9+l6U(|teWTwQ%1#&i_ca>_Ya&fQba z_gc;;KlxXebD3|BLe96#p*pvmW3mZ3A2itaORw8Z2AeFMo5QoQp^xfkP$Id~9BSSgE zk)fR7$WYF3WauP@V~WLT!?9m?M%qw922_EIsI1`_)P`dawyn!>)IrB^)IrB^)IrB^ z)IrB^)WNcZDYm0f1zUkEqixVbm&n5E#+S~Rl{%9y#tkg%KrzlW=3|WxIbjg+F6dPlRg8x5M2WQuCL>nTf}Gz6HANUy ziNhog#33t|g=VX@p)w4Qi$28clBE>OZN9I218)Wf?1w-eobO64+s*n{dx$SU^JUB2 zro+bkN!Zn#Kd0P_U;mYeeQ~bQy9t5WSAvw+cOtaatncud<;RSMC$QF!h|al2P5MT7 z((rV?qGIMFaBmm#Fm^sbzP3GIr7U{VEblYo=#6>Cn#q@6J~g263}!H zvv8!$CuiX(XFfR#N7XRvAxyRW;0e-y{QL=0 zQxk$Zt|AZMH{oxQ zsa-W<5CB)fC3aP$rrsa-ex&+4gN5B$#5j_@0ZZawj{%!3!bJS zxo4M=0{Hn_v|XiHe-xW(PomUFEBX``>DVw>xh4%VV#l&yzx zezn4C^-u!@b0Zi+r3{q`KN6F%#*3Ilovb)ODL#Xh0&k*HRvdJ&C;{FON~QV|m9pZX zgC&VdS#i+8(nO`KIFy>{-m*m11T#q+Vo<5UM6EwRoS5w|2;+I1(<9bl)9Q;@Z$g`a z9S4e-J~5K+^@S62{Dm}H(!C|{o)NX)hPM>n4`ARdON9M~v1ShDB_GocCYBAMVlQKPB_-0777`)G1itr7|$%{vo6{ZR z{7nbcl6w9XjD=hjb?O)&CIx^KU5U2;l_!pq4Q-4AzM!eT92_a`j9N2GO=D$xYP5Kd zY28$YI-F}-Ga+&_O8^a|Gkw}E(ry*q_LLwm;LT8gp2Xd&eI9EnwwCq z0r(s(6O&Y|r8v{%IyFsJ6YvePYk(CVK#8`;3RTSpVp&hLneShKJz?ub)9T2)cIlWr z_x^28-;_akBG$Hu1yC$-kqg1t;%c?4NA5Q+&bllG#MPTGAWq=YgglXfqIu)7e<+|)MYWQI*7s$Ulc+6xu!p6-Z+ zD#&D=bFxVCK2vX)wGvqCXo{&=fKh8eZF8Ls4n;a$S9WUt z>}h1d2~(D40moZ>;%2AjGG$rxP4YRCj7~7!^YMg$t`;F8@4&!X@TC#G7Xv=(m|X}t z*?fE$PM(%NIxx#~XI1u~hZcSaYBk5c&rBJUr_QTn$G<8^9{)snRHI;49+j-q@T1Jr zLXjG`-i?sz>sTsh3OL>aSBa;R9H-~>Bi@qjUbQ0*PNG?%rcG;x--sVY-{ZlRDzDLS z4E_kXOzB+oxmii9sfXIb<4li=Oqw3E{w-tiq)2jMp}7u2Gq$kX0&ixvZNT&lQ-UJY zg{1i4x*DIG=lXT{zRU;Fa}S4%`H((3*m|66Jk`kpf|0S1P(&`qj&KBx0r7;c-aj=m zb~c-d1IVSOr#)vGM2m6ssE?Y}OwNdzo+nM~EliH4n#y+Iz);*~dbUQ3J4|c43F!3x zOHJrz&#nlJ#G(k>Kf?CU+Mhm|L3krj07a2x<)6$cyG-jKkwT}xxd($9_{QByB`jFw zH`Z*4G|mBmQyz~&EUnn(7S#am6!p-6ETnUt6fw8d$jT&m&p2xZ6~ z=rV=E1JFGj#Oh4XL7oob2xVVtTGRbfClpb`id9qfNfqZ2dLCFsY}IBl_zd=2hoSnGCe~xLP?XX=E^sx-bbM9oOl!>vR%F88uhCR#ME4YbC|(K=;*oFp$wtgr<%}Pxe=HpNASJJ1k@O zr3V01POW}587M{iM-j(5mB8O5!}NT_5I-BfQ>V7VbyQ9Yen;hW!SAS?Zumvzpd`X? zAiDL$&oW;==j{RG!eHK@^Hp^mHeqOUipIrXYA~^U*+{674`C!s$5{xSEy2=mNf{T$;Q<*GkZ2>^dHE6R zz%1j@_DNccLCr>rQ#q9uVbA@;x#mQ@BhYwLiRrPUo|#2a&wW0aX&B6Add=jxn0e#{ z7DcX;ohd12X1?i3snk15nB1(BSE*!gE*YwEV+3c(8Yh@X6l{}*UExA?9l52ll0Jp40(W7MA|oNIFyKVSCy zGlcV(p7<7{A%-K(95%dB=zr)__7)f{P<$O+6pew(%yJ)IVLuLL$tHGG*Rn#+;2wNl zvJ*o-hXNp@Dqxp3k<*055EK_lN*D?X4UWN7MPz=zM$SFN9u?a9ABy|uqm06!e=!ai z&`YwLKpx!|lAFY*yXjghWyh7Ia(PCPzj8?O$vKiQoO6@UEkO=idogJ34xhA2&*Mp2XRzVDsG5Yv8Jj8 z76JrP@f5y5GFsAQuQ>D7{}s+hR4*Qw04pl&zp1`wF)V_cppr3DkNR&ku|!}Nq?tAg zk(14WPR2(OKS|2?z$% z5Kzhe{ho8)nMp_lTw3W}qs%$)`Fx&pp7WgNdCr%FHwLRA9~okFaDo=nOtdE*VVWC| zW*Vig*+_7ewn~H%_$h6b2qF9v65bTN-cG&xF?-T6X8c{GxyYV$0(K57c%8APDL4zU zR~u^<2d}kLuS~Hgz01HaBk&4)((4SLiSSD$d;#XU)XS6YNe7wcOGq=pp7bKqd=Y72 z6k8Cy1_{a~!Q$X_1P1I$FEG3c;V_6GV`Fd{V1q$Kj3Xw(3t2*?J?Sl^wcUeG*%O$x zsvz^eWrH8P$DA^VyN4MtcvGVI9>r~)GKhl*szgQvf8FMkZO(jmQtc(Rk#7`=i_O>K zs!bW3Sx9|Z%7gesk|mANO~NJp^}yvH!}_#40GDxjpiTZUE~?!&xQuIu%Rg37%b$8O z-3AqeXk?Y@;4*nKw@+C-*S0iv;D$RZX;Prc`>*ekoHUc+l z5;+d;K5-wCQv)`3dYjZ(BIXg>1o6D?m|b>RR|L7u*SYsTDXBelo^Z?^P`e`LZrhZ@ zAZ$rH{*VZgSS+#4Ez}FmZMJ!U!EAKCF2G)>aSuk!gORfJj`>23d607uLF1g&$7EC_dkq{Sim*2R-{Q9MzNBAlqk7%#d8)JM#=Pdnz*g4J;w9`^;u z+-R3=jF@TLe1S-|NqXvH7#IM)EENGF@OWkc6tjqST=S@)x6?LvJJ^lhF7++u2Bm|J zxkp-Nj{_thm7W7PB$iR6qFP!@6a_R00(Hbs>cu38dbRxla`qx_jcS)X3xW+oZhiO? za$`d*G~Na^;q%h(z~%uJzZ3r52t_#z{ZkdXg|ntKjIR%SwuLy`(N6H7;o;%Dk(7Yj z)ku*VlBxzZL{T_S0llp@{NY2&>_H00*XQUmIqsy)s4kNO5Jh<?AEuR zfPeDe!H>qqd4~7EkW0z3RN41Y-Snzc(DdvSl%-fG3%^bku1J72%t8RWg5AcNKIc&d zRyD`$+nffAxF^%4SY+*(y~melAN#2kV!O{q++-#wCe02dAe9MHlmbIhXC`Qgq}pY> z>oY;D94bWTWTz}``*z#SyZE^ap9dV@F1vXrKTqQGbtolv^EQ4S!RKMem$I9m<>yoQ z?6(sO4x!~2{~;)CqwS_)uBdX#4&|Cos%+m0)`D>f^8~GQ7>D&V+F;bvd;=QkQ#6vE zic@4GNdSaN+CpRMfkncU?oz?tcmtg$iIXBowX2S#cGYA>UtlN{`)y5yvV9Zj(-$G$ z9)7}beJ6&8BgbAmm8omR7|flV({_(KCM0o5vj!bm%d4 z&-mdn_0^-8x<~rDHVjr(TdUgVhe<$+KZU7tB@=c&^w8;$6ea-1jea}@!xe&|+}eH$ zdhLQ9Snn9PMVSw@k;BTdoRMYai&>jeyGci&9zF2E{y`FY2SJ}ui{6w<*v0!@_iMgT>l4ro41r^lm=zs!_(kyoD9;$R)q zcoL~cc`XPQM-_^Mp z;q=qkvaH%^G=Be%7~IH#_L}yd_`Oh=i{IVjmiJ#W<=r+Oeh)}ds{b?Pc=%1pBvi^Fz`g0`*w$EGv&LE?58A*tA;yk-Yi+PouFN+s6$-~c4CWbEf=h5uL z>+i|@c0PAaj|68h zvg0h8>pWv&v{8V|UrdY+P<^S&hP?*8cP|v23kh*Y+K(WNT6pR&_Fc0w`LO4mQ65t1p)O zQ(UhZ?p|mcf5y#WNehU!3K=dm_DFCKg10jm$2LGC2!^sW5NhC;1X3;%^e`5GUV;JmB|#rNEFo_M?n>8|1W}!!9WMV=3DA%c z3!$5>(~u2^LgBS)J3K5oIjZESm!Lr>Xv-$xOkJ6;^6~UV03}lr4iQfX9?Fucdkhn~ zGC`JR4Q5!iD(jG3xvN%ZX#kx14=1t*JE+A=L)63LHD9|I$R0u<7Mf`H%`p!X^B6Gr z6fuB53V%}8mg*6L4|FU{sPHhByLAWjvb7)nt8}ga{GXJ4ELfd_A4CAcST5-wXK|0Q z{B-;s>}fzTOOT{YXKjGLl36=$MF>8m!U4d`lzni$3e)g=6%N7gRmesS=0oqq`-h$4Le|F|$M3kVJTVl);su|(;` z1^89YFIrz43yt}Q`rpErA}g3Muv`YFn5h&q3zqk(lxTk87K4k@6pmdl^AG*-GMYX7 zcDy(^=6>AASks6Nx#!bc=3_=SFn^se= zI{lI!`QiUM(#+b9f7lB1b)+eUf9f|?IQ^yHRP|#Ul_&y^n^Xaw(MMT=9IV|4ob%MG zb-9B@_G1gNnzudTb~)IAAsVtJ}A&5a)A6Uf_sjD(;r5VtBu0_qr0k0b&6*k`y(hR>)f6`xjc z1q0eup%Tz-V*sck<-3vzLQ>*q97tv5&LxY3GwAE1FHK($eZ3K1Dsu6&SPp$^vfk|o zxvZw_IVb-%w9X|9ftqwlEz@YnWVpxYqt4dMm4^43t)?4E{8M*ibzK-H+Z^U=N zzW9h^{B#?>cFQ{L4j4+Fn2aH_2mfwxAZIG!)$u__6WPx34Pu+3QwB4@Zd#CKsJRo> zHp{#GjyoS6IX8fLiQ_S6UOHv}K@^Nuggz(!y}(xz1%r`9!HpPE7`Z>>NP{Rmbv_I> zSHo5_?8JXq=*0ibU*kJe9o$#rgS|_}13y8`7HOXJ4@eY898wAVSbdh! z!?7Tw+Quv^?D&nKZ;X+7=qO}gsgf6R8~}eAU)V1I)?x*tjueeJE4T{gE#$?pL0*)+ zK?W&kZ(cAK;rcuVrhK)7d?lZJB_WX0V$V1$*v;fUcKkw=;y_1eBW zIr6w?K&~k}K@%cq4KO-L*1<)1!8i&!bn+Kqmr=ZtG}?&90cH1@gAw0JMR1EraJQjt zK#Bt0~ zZCE=_!j48R-Vrf=dT=s2a}PQb^wTp2{cMGO2{t6yq-eZBLuQBvgo7@-oy0@p7(qOw z^1QF(+;625zc6QzCcb{SrlLpdULbMVJQm|3dVtekjMF1_L&1EHeyZrvd&jVOEQh#} zYj+HN#_qs;DL$xDTpx@7k>9S^A^Xg@uNzv+9xv?z(3+Qai0gwxNL_MjYEJu6Rr~@l zVlPXYS<*IWADiE3wRDfF3ib}}rnOOJL2C4GBMGFD0HR;H3 zz7cmK%~lZ0NdQKtA4IOHvi(-EgwrAgalFaUGA%Nx5nmP61%rEt75= zGaxX@pC117@n=Bx%ERO5SAaj2c4AIoZ3yYj?dm=_4ww+T(dJJbKWptcHnXGC8=tAS zhdZ%3X9!zyxP7e9Xnm5lz4*Oq&agmN@q61*9P@$X?p5L$`EUGQg2iwU*1eqe=m(>| zH>&+0oH-44eC`s~EL0J-yOP)wnscF8o8fQiT7?XTzjZ@9-TB?d#YGzc&;@tC9PaQT zD6*D$@OLHTN#K>SwQ;@z#XS>6yU(x_ci)js(nJ3jrX zo@mxSlEk{;?Gd5A8io+I!R4wf9EB>9p;= zL6V)ez1K^!)3$e~Bs*<;rzF{F+dGM5s=cckL6NzQ-i=0=rbIiVu^~7b<=84~RA7E$ zJ7Y9sCTH6xBg4r^^Uz0()?!|-IeN5!{tbV@hRj&;FIQt{evdJKn{l!FlA*)1ZXCnw zMgQ`ygw$Lo$*QD2)U0~g&!7N*D)|%QPc47y`Ll{Y19r!cqbL#^I62a>5i>7}|MX`! zhpI&M+H03)A~4I@>n1Uk#9}(-7t$36*Fl|!2OC${#U+TRb=JitsfsAE*SS&omUIDo zU4G7IxxMa!oX<*oo%&LFv1OIz=jl3x`_? z2NCr207CH${8&c~3CBZJ=psZJ<&*zy5>7N!w2CzipR4s}AJXIV-}UE!`dp(w^H39F zAJ(6K_1U361L||F{!FU8>-48^&GN~=)SvAt_7VL_=8Tdb)t^!I`IvlSiIg4M#via` zaB#$856kB8V^2N#Wb@F3 zrd~4%(=_NcQCAR#fPU*9``dfIwQ%7=E)t~wx|3L6zza%$i7bvdp(PF@23n<+E=cgy`{R)ZVt~rmDv0qvoDA+noL!9>t!}{PyKd zZ(u4bY#u5w?)wpD3nzX{p*iTdz0R%kRyW)nFWqI|+Pb<&09|kIz%2p&p@?zAbDSo2 zq+uN7R|+TBZgLBD;qYmot~U1o9|+D5Kp^T0a8jd4)dhK&QW1Q9 z`Y`LEapG1N7_JCI5UAuPUzy9yJ=vx;uC%ZTXiLQS8Pv7|pGp)z;67FHEVc>f1njNY ziDS^W^5_AW%CYVCt#8?%p7&-nVivzRoWfPSXzsTsG_4Jz2_nOtk>;-QFq*<>#S3u5 zHMb^jid!32+2+LXa5CIHRARJF1up_`m;us)tw!#R9WkGdu-C{T02nPurrh%~gvQf6 zq&>qIlJxcP2UOJ(j519|Xu(=Lz9|$#YNh<$d?IADejDpJM)`zVJZ1zM{RSMGghJ^Kz5pbWSClXX10F z!|7Gd^OQ;l%+1o?@#2`V#husMV59k(k7L990ko6_fwmo~eu^$zZo#w4!a=p91=+bL zzBstrf*Q2Jg3SI5;#MNj3dD54-wpqRi0p;`A^6*n<`ES3WO&_-33i@^%+KeFENy6s z*LWTSttzCrjw6nL_OX}j=9h-Bfe`{n@dHed1YTUM?iLps)J`74iT^%i^Bdc&c=592 zBver~Z+SztZ&S5zXT10?8B#T`rJ>qpEB>kXr6Lj7kcm+SyfBOGDT^0&PU8OX^TV zIF&+;Pg~}@sg1?Hbl6NeXsIY_h!Ued!Q??X5P+lrLM6T2T}%*~2!cZpWaN+?!-t%h zhicqik@)PDk@(kE#iuGf7YkG?e0zO|Ei42)kHR%{Ro3zb3u^+uLXdgPH^Ba_Pj&g> zJm@=VzL8pA?CUkV2o|8fE!9<`LN7-Hw4jS(03{1WT?Pu6%w~5);(wlump&>@y+A-{ z^KJF*MOQBZ8f_U69svmRf{VlETLj>?U~M?Hkr2FQ`3{>$QmJBJci7x0Ff0hpLu84L zxEyUDP*^B03x=Hm0~WJ6I4L%_Cq6wPU^JpHd^^IvH&A?C27uNEz~orw3zn}JG`axQ zqvoTj&SGDWt{D4nQLhTU9HgO;&#iSvrq)W-3ZvxwzW8+2{!;7Sux}8x+L>CHHvsDp zh^^W@VyULDBw1L#t-9es6@oSP(2@vrM5gUWl0bQ;{s8JvN8)!4#7qC(Yy7b9$*}Kv zkk}0L+=CeyR-@?`2WM5AFIm1mKo>xtE)Sse7n%~ez5mRKeE_@q25N*^>Ua*S1AW2@(gUrhj@>9^^Y7Wm0 z>>KjH6$o946y$*q!rzTZ^1wFuA3~Z(P}q|s-{&C+zy?X)Zu1@i{#~D)1KaEbZu(OS zj9rF?@3bqn#GRJ*D(5GGDyJoB7TpVxg8EC-GsF$-#^E%Q3}LcQa>XFcqOsmLATCp& zexx{ly>b7)9+%mU^H`3lDqH=i`>abitDv=^u{L5h!>ObS>rAxn@#Z~-6LY#r?UL*B zyHC3UHV|tdVxlT{kl(GcmmZHYN$d4ksKP9H38p-w{L)f!u9zaul+VMVffkEfdi~4r ze}PLfNyC3T=Fi2LnEkg0=;?!}lAZy0LdN`lqhe|h-dbb+0R|&A&TbkNw{ZRPteQw{5_xviwPcpP6NUg?@KHY@h~M z%sDCafn~^ISR0LDC>Hj9_OQrJQ63a8r=_%q#wPSS?S5z%2wG5`c&BtP!-g0ZqpyU% zb~WwNzBPk7YY44_xfZ*0?Xf3X2y@6*&l?ME$K8%oyzH9+(2MjDTr5(-TKBa!nAUEJ z7eAYK5ftaDZYpY z@311<_qy%d6*1q5q&5I3%y8T$iXGIcjh{u@cNI{}1t{#Jw0#F6<}*kOc=`xiRHX$x z5I}T&?b=-h*N%r_Km7ixo8q&iEW7HF4XiifqaE8ZA-Jzcy-hR}Vzc2%JGCjdF$6|h z#PL72D5lm|G8ssCg-R>!;MLcr>y5HrjA~Zg;l#fKv3Ay53Xw-tfoS|#jqllr@7)?R z9Z4kxf_CiEiI^uMsZL;Cq%m)Olh8UmD7Yh1ib?f2 zdJfk?H?80|Fa$VvcRTUBdLr(-qaosGuH(ia-*MD(vu>=Ls~(Z+Bfh62@tWS6_?>-T zMzo_EF*M}LUeNfgr!4h;B(ECZ&KmPgJ&IHq;9f1;h{#)D9A7R+ zh*<$xNsH_!;yr^ibisb@=D}4Xh(nPa0~fliM+Mjvdr%D*9fk_jNeyz0LS~cEi?Uf3 zcgvK}MOQ4s4C-p2r}%jo6}K<0D!GUAA)MthoG1ONFc@WyN&w~!gvgYms5ML2;j|^BlO)R zGXKjq@+OQ6^jWuzBW=~8JTP+NrhI@&RU6DOg^CfaMO*A!g6+u8zy@ZF;=@iL13@ll zRoHn_3Ad0DXnLAr3grV>))UJ`OiFo`>?ldM`S`?NN)lt#+W=GTIJN^KV<9`B&J%Pq zqNxO?Ub-OtUw?oNK>)+gvPI$n7=f|DXi*ISO{zzLI2D*v4pW{n94|GUfK3IPHFT4f zPiQ#i!*;6MCoh59KL-`U-U5V5&=92{U%%NY##4-^06vS&Ek*@GtAGlSD@Sm!3bHi1 zerlvSbwQ;0c%hN_M{Im$F4$cu-pm&x_j1)i^B2(2sZQ@0Yjofmb+iW;8Sz@G<FT`CP{A-ERnf@m~n8`qK|65{IE-IwV^?3H6nNsS4nC6s?|nd5aBiUM&Veqepc7|xa6<;V50Laaa==@qz!PV6aCH{E z503O!=786(z!PV6@TXbu-bd%2Bhp)u174c~Pn^{-;*wc%;Jy#&&JpRwa-fSU=)_qa zY{@|P0g~R59PkVaaITC zWx*>wd!}4+ZrGlk171jhC(i1il?AW(?7{P&8}Mf2fLE!&6K8dBdKSE*vj?y6+<;e} z171LZC(i0%Fbkf@MrS3joTI)i$$`#K=pg;kX$=;`af@gXFMxiKmA?vea^$HT;@?19oz3AJPv6praQSOBeprWBh7y$~v){^=mk z1;(;#-{3vT$QQz?fNj)5DvkNQG`3bs#!&y|NWlXv-H`Y!NLVonfIiFYK|z%kPVTlc zAY5RXy$G2OMH;IcO~FR@1SDzbsIu-AhT4Z)g&^x9-w9lAYdrkA`E1yD_?Y=twL27s zSZkRZxem6Z+I=gWdIg_{Ec4lFcUw5M4;))Y(xvSdjsy1J*HjjnPr?E57 zGT%nxC<-Gay_VUHcB)dvqkSy1&m2M{g}nAer*P$RiQ9wpRpDZH8+H~heM!*VVm#~w z8_jK42s#X?(Vb217BneV$ol=}HuMDRad#5etw6>+icV@_)j*Qb?5I)E>?(IF?%QQM z?#wL?YhJwMM)xx&U@ns_sS1}6itn*nta}8T%q^#>+}%oeb~4ow4THID3@8LhsT77i zMO?Zun%tf#gs&=GifUCOY?0)~!}EfF4hUEQ@xEO%#s+%^JR%C z@nS*}Q^Y*KD>0>Bj3qHZ%L>kxn1C093x-fnF=K9&7??|NRRvnbK|54^ReItkG$wDN z)G?LrPSu%J-(h1R)N!AN!e{P6w&_dvNk1QVcPV;hFCNFx#MMEd5c9Zs1Z7P{O21c( zyNglBK$691qDd#*V<=3M%Sq%ck!aP&Csj?yjE6Uy$Bl;@gTI3w$66-4=ZNULW(vdF z>}D5UWp-oWUkCvGsISEBRc|%)1+=h77L97U?kYdnsv@2QV_LSDf@`eoDny{I z%pP+9p$H3lVdZQ;rkZLFkYus8#LWRIKbxorgmELtYF_YTtP(LLZc3U+;AGk8)Sc2! ztc@rHSTcJisCfy(%9$$LQ7l@pWzuaJl{b@=6jo$8s?pp{%z@5AmHqxnM`V<)mJ3#@;3K?!2Wtsz6UMPy1(!|k9VILid|zwCY2oL(dDGq?nW)_(GC z8hG2pm788cX0ko$p7~^EdObDL{8$u{K;E4_W8ZCAkIXIqRp z&+FqOizr((ur?{Pj^_nnqK4s<5wIzv0~v;QICkrc?IOm_yLh~{g2s2SG;MlrXAM9` zm}!8PCx)cI_AOk%>iata!7HrUX{t7?_f+(0>@D7ko>>nVVUJ&d7Lxu_W+(Pr8sN#oJeH60 z;jO@Ol6IroZG($l=t!7KPl&Yy{}|stmhWU=KE9dHZho8zt~c(T$^ubJ6wqi>J?1O= zYH_lO=;Bxd4f7!+(49n7(QwlC`kDwB8Yz7;5o6IGSoXlSh3jQEKCI;3BVO{I#!V5F zO)2|`*otmgB;U-8#-G8CVMu!Ie^Gb#DFVSY)U`fVA$Nn6utIiwh%nl!`qi0J>mEo< zp-!?gh1?wYr89>>`Z7IDgORu~M9}I8EZh|sb2PKI!)4)-#E+tI7`2j7aC?~)N&4V2 z30KB=wwGbOa2dvSkfM-2$#2AwKtl8*PRf8x!ZKKAst z?A|uylWx{-gLdn+8`5s2b_3dFA32GKq(!;lHiP8@wh-L0VbendD=@7JBS>lO0u_%3 zW30|_+^JcT;tBs+RAMJ;Lw4djp~%c<<jp}esj-}&mnPjCYSjPRuwPb>9@V+$_DW(;ik zIT32YWo{3RSb!oTT)@kcl-~PN%W)usA+v(jaXk`e_k4tL)?fl^ag$hijyVOjxZ7b_ z^80Bg0lRwkVJX&-VJYBKG%16PFhPKnTP_KjkB2+NGx~u3r$#Jp%^>#*usHBOjFj|G z{)E@AKQv-Bi{+dhPO?ALSQATr#LgpHlSkkKNJE)1_Ul9C$v;-8# zTt1Q?loosJ;5GA5_)+3e4f?noZZ3UN zR<=ZAO))M+eL%RyydrRm&C51_|G@iT6cMB5DV#l82QYAV+}v#xbWX!28vcmSd%RB+ zj4Pw8%2@LkUq0RGS^7^e2&z$I-W=qUTNJfa_$g5^*E_=AIU8Pbc7 zkH;UnJpOPr%O738hgm!V& zn^qAVGfC~o@xc3%yv_)tei27MMtcL?kffB+Eq8-+G-C#vp~5+_;YgF6Sc2L7uk!9d z{+T^8c8_B|w`UIBadlw#ofUfaUf4Eb{>Jp}SHm^k{~1(+`8)UU0QDI?pT|o5-taxd z4sRz=7?msOp6RGm<$ZADvG1FzFWx8cQQ-Q4j>o{6z%S!*1co1u#~jh^`MO-5wmdVf z)N&Y!46R1$YCTeA?xdnABBYG828^_?hP+{RM26XbanCeRM_{+H>?*jPu*~z5Ir4Ju zc)J8!#m{WK^{4r+4R*r?GLkF5vcfaJY8h7-V%->?NpY1GmctYCze7D>#QbkV_J7iN zAjNAXDG4}u6Z3)2nwf7J_smBAz&2yqmsw6%ih@7yYo-X`DJOb<3Io9+Dg=d|LQn*b zlJeiV|6ql=d2}Z5AI!($X~jk1SaFfstS$P%Z8^g3spzcI=qTaHLx=n)DKXx@xgw7l zeg|Dt8**kIp-2+}Mr4KCge?we)y7yh6?sLy`7{er>P;K*DJDM9a(FZxijLNAGV+W+ zJgu}iR(i3=5MSe^s7m*IaKvK=A(ora1_1E<5Dfv~>NZ@7!=A}X9mX5RR2XdlnZ87> zdNew7Q8)K;QA=c4i4HS2d*||Rcomom!#%4ytS}P>MJoruhsFRih54?9*O5j=q0>>-ioV5dB^zdD!`=->dnNc0OYnOy+9%QxC`tf5`v2 z@(aiRnd$eBg-}ejd1ws%eq*@#-Sbnw-+Gq%ecR2svgBEsD1Ht4{n^6bQ*#FJi#{>J z2=o86K5@2f*y^Y@d~f~!tq=A490C7~EV8h*oNZs^eMR*}J6YJ-8z-X3c24#CvxPr& z(;2`o4@7TFK?L+;3EdBnDFH*Osz^`@ttWJ-GsQ1$6y@Vs}>*t9+ zKMM$n22&-Ni3Y=CX{)HzVfmX1<9q1$6<9DIm0GQ5j-l^o71SkEz@TYH;f7c*RO=2_ zh_EDF6$T)5x(+WLG*Zbsjz%hF(7?g6#?VNmJjAoS-=Ic160BT}RFHv2%7!>M8tIt! znN#G^^JV?{H>8i2TK{k9qs|Q<>Z9*hAN9}vP#^tJAI)w{$qVJmKEHkXXz2PgfM4X_ z5A{*m>d9SuqqZi!bDe6#5A{*#anR-bE_rTU_sa^Y{GKDz4KGk{;l;|L5t z)JJpl(ZyfRnn3*!4Fa*Zb&;o~f!Yr0pRht&~1E!y_h{ z`T2u8pW#0f_+>nf!0^1&&p*iV_~cc&JZ&ufypL1?%|wmV-_HHu${L8%s+z*zb3Zus zbLtp4Jfie-y|*1}#%gc7><2&n{_o3iSNFNz?>*A2IcmT6Z%QBMes8}>Qn>S0bLN1@ znXye?sg=t_=mKjm)Jgna5^Vb(Vs?mpd6}@$+rB94p{GmkjB2a&RjRmzke4No1s(do zaWXd5WH+SGo6Jkvu_L|dSG++18hegbzp#z>C-C_wZcmqIZilJRuaqj(F$H}ZUuui{ zoH%YGT6Zhr<m_kaLlFh|h@CE^2D6E>bk(D{Vr|m?+qP2F0`K z{G<{zT>visj5TlA?u+k1AAGfJG<`5^bi18!e4Bx|OD-vu0Pzx52Ez287Y z(XT?Mzh6SQ1{ejn@-lFpKXl878ia1Ww^r0Se_}*%*`)%$qG2y`JTeYs$hb%2+y|F` z=P4NrnCML1E|DVh06d{W@*xVl#!#z7|-UNYcj57yMtWnGvxAXAY-Wnh}W?) zkTEM8pNuO>#;b@v;7Y>f-}%ITbI4f0L~nHfL}HYri!N2+!iv4f95Uu}H6Aw(gW(|^ zajw*T5z6$%fbDj@2TQ@L6sNEhhK*z?5l%U8s*=W=a+qrrD|S=hl%u&ZU$hV~;m#nq z-Z})B5irt$h>Wr!ym2faz!@yr;3Tvp;$kv(=io~H<$BR%9z`4oJCU{jr2p)=J;T9) z(+XUWB~nnKZQ7n69-pmpARQiO--f&SF0rc+R$-Uu4DgtC!21Xwhg@NWYzSqJ{>zY~ z962hzM3u-f!~2+F`!e;-$W(zB#&f|ivtam9L#A##Ht*Gd_ri0*FtcEkBZsOxvhMY# z{@MLj^{0J+uF}C}XchJhJkaKk#J>cwrI0d+2=Dc1SiDD&Z8zj^!g1g#ym}~N$_XVb zOjh$)JgTIWf_IgaLb>A#Eq7GitE3c$U7ZaRDJ5mB*))!nq9;pAB;I7%p(e`_LJD3> z0keOX;Mx^KL|q2^RtdL0<^vXK?O<_hejJq0Xt}CarirDv#pX+IB$

$sr;R zUZEwG4%Lfn{HrrT=tSv37LpNney+rw>0|WZsu4Yi6e8~6>PEJ{Uo)nFW=s%bZQoue zQTi79B2s}VLnY!vGD=oiu4NUJz}I1F^+e;nzZvB9_bQQJEAUtdB;1oI=hAFB zqFQ)e&P?8*)m_dY(6X+{w-ty>x7rn$eemQHKqTTyXwjE3* zbt18VoYyPCdpvUP%|TC-GlM+zI*8t>()%cKW{y#~F(`{0`a{TB#E~4C$F6|PjhDxZ zG~S@Y<+8j-vK}e3kVBzwLCy=5eh6~@{ofLSCCiGnc=aA~i;%MtYJ{ADH(%WIII|L3 zgfsuzgcc0rb0f5PoSDNoS9akf%5URhS#^P?NRb35VlT^`Ui~Cxzf%QarO2C=5^f7}IREVE5 zD8?$hB4R0#;eDzAa=uwgfTU*;8Q)R@Xw9)i zhjS*lX*0=Y@@hX}2d`G5hi4{Xf1=+ji6!v%i1fF`OoIMAy_p0AoE1C9reQIY2n~;x zJkCEeiO{f;IL0@V2n~A@$5=EhLdQ9z;aZYcj=b<|p<$_H40&U08kYWCMbQj!CCQcX zcmCN(goXvo_mDM&hCNxsqhXIBK^up$y3$y)(RQf-j3?Mqd>mQ$15R#wHQ(y z_q>G&14>=RQW4exmti&W%eW>(@bA_uF-X;*Q!Rm;hum0^p;;pmzlE!5G?bx;DB}3X zy~L7%+5|tCi>gH(Z5_3C6<+`3%9yd{ZCfn#;}|=r){i!JFl-EC2lS>fjR0e;3}|DA z)-BYEj8YgM&y_P4jJG25U@$5;;_(iWBoKr>i7PVFU~P;;TeQRFpRooHK64f26ynsT z0Ft?<8fx8%K_hf0XgD&0#$1ijDCUkJjiMew9*Wv{?_GKC2@u^2N3#{4*iIDTiSL$igp6GLAZMUQ=aE2Xmq>{NECnUz=@N}KJ>yt(HK*wu zgVQinmXyb<7w+q@8 z6ugB+C2Dvb4J{*i$48m7N{j zK!F(@E1Y(IrIfe|MYB(naQSDfIe*N|nKeZL62z%wi8Eb{VQ+e5{0)o_tQ-rhKApa5o;6)kC<&V36GdX780J()?3@2$=Kk9|@$5?tfPsNd} z!7pq5$dyWJN%|$6uvIj(N+hY3kQ)0bMPiPjzPdGTo{t~Xb2B_j;7{_7(^5` zpDLn=QF;uWO7BrTvn5o~7T?Db>JuXoA5F~yEfA(qGHUGwSi|};&f3d=Vj*NAS75kn zRfLc;S%SGxQo=HFz6}AG0!0eJt9_*D0GYF&Vc=E{!yFjt5fLKmp1}bTrSPhEtEz$C z#-TDo5INuI9ax@T2myAU?Iddjgj_E8svRJ(USkIcw-je~1U#k`W^If)^Bo{8WIU^B z?jD}8cYpxE@#PTg6(|yWr${N7sY{3gS|A{9201LP0cURk=Em`CBj+K>o?iF>`DTTW zu_;)sz(_O7j6OpCI4>z!z|069cr#DtsH|N?DA*G`LV6TuC|G2V^NxbYlsz&OEU_7* zNLJ|3$c>`l-xj$8?8p-=#uqq*f|boA%Y!rQSHumhzdSq6`inLR1rU$ueXBAS^fcl~BCFhFi}aW9|{0%=w|o zXU+iwzFldJC<^N+JV1aqX^*DcjvODZaqp_bIW8X8`UCZ{>d5nG+4pdHelp^2jkxb{ z^8{XW#myt}Tk7@I9@uIHy9s}=5r9fb^WBSl9RNRXZ4^I-)g8m+@AfwLU5~>*U%Knc zbu$o*himNwg?o3kKE1nKB;$iutXncFn(e~LrX8;1zUsI~(rug3wyBr%af~jze&z1A zcN~b#E2zY?B=f@!Tsc3ePTvh7SU-fj zO6v5Qw~-w;4~6;WFS6rv>Pea{dzd=mTo_mvVq)|OV9jlBvU~tTn*zYXh{#%)@Z7UK za|<8TGxy+77(Bb}WqW@385)$!nHudx$pFn*!q0&Eba$se1`Hzc8|!UfZ^VUzCCWRm zjwHT^6#BVk-9-dSAmcmAMIfn2*NycEgSaTv%;$wOZw{lKwapVS16N7000=j~9cr3m zH@}=DD2QkbE}|K%0fpLtX7xDb)v<_rRgRR1eQ|zb`29%YMnT4=v9LD8{772PuS)qE ztErlgU$5_RxjDrKOQOMg&#=Mv9YTY-e^ifdXa8cju3y+T;{D?#?y#_V?y`= zuI%u{BXUvGIzJlF98AwcVYx%Mfk!B#D3&e<2Hke;l7{4nrFMI?+o#W21hf^;L}a4nKfe*cNYXnU1LV@)iqD)$*2d zeywg<04KG{z}x9ZQ=Nu;EY)>cDm4*rtsk#i-9q^Ay8P-ERVw(%kY%*~oDVQ{CG+6q z+*jsrDd0&;!{1uK=9fpOS_|q?0wxK+v1|`v2>=#zJJ6c$9=6aYr4~ppV1b~57PvsU zg)W+EfqY7;-3^GUbYJw&XS+j|`)alOOtpKW+I_m(eXiPl!*bt9tuK1?^6DqQ?{3@i zN?7?);T?yXhXQL+SDt0u&>x<3Xm+CL(_!CJ)$Yk^b8oe|wc58coZ2|iG7pA*do4F* znfuJ+z9UwC_Z!FFFRqmJCE%w+d65d z<=X@dTIzj!^HrBA1db{Mj;1yNfun)|domPuyN%X)03QRi)G`Oc?j|xO%j^xi>){Jp zW_Q?4!B=jXLt(cIzNwbk6LveTs@w4FJ^IIdJC4pYpUUBf&B+iMfc#+ANhQfOZT^7y z9KXKW?KAHG-FJtF59XtfnQw;WR$6Xdf#uqTmb;|La%<7F^~G*oiMwdb=jp9c_oa2C zvxLpd=C?-dEJHJ8d^+H1a%Mb!`XR!_@fYgwL%Yv9#4o2G*NVm+s@%O}VbM*fr+SvssR zVW-q2{uhyOKw2~K^v)FsYO|ZyhnVSCIA|YP+Qp)fhaLI7|IT})Rv?jQBniQfW8PN) zV_Z0;Bii6Hg0J$GaB>RpOCg6ZKfgjPhwl8V_wEsC)bt;{dVIM5+ZZ}E%Z3$UMG`+E z%p{-2&#}}xSvzB?mU|rJ(!B3_JD*!J!JNU_WI)s&tYFe51U!nAA^aPa8c7#%>@+Z8 zF5C;)DSAw0r&7=sr_vstOFtcL{q=r|y+8D09_0YaxxRpuG6Y!Iew@o9@$Z3R4x{6a zkU&B0-Zdhgr65b~GSL#QQ_uJt_kR@QzJDry+ITkti{=3kjFocE(18y2r~T+RFtO;T*sc=(1wD|% zQb-*o1W>34f+YlxJ->qB8vjb6+YL;i4GeCJ?wj}v-}aXZm*+Dnwh5(=(LI;=(7hv`Qsamn6xj!s}t~&0gMAXKi^Izuf?=7$+(w- z#&B?B=%43c?qA;|;w4AJl2SGWm|K866J0KBPWVizy1h{nG#|gBgP#5lCU0K9L@m>z zfJK4R6(9+ky_-P)9Jw)ixIl#5b(N>fEeV>Bn;rBVoQ2$V%pGEGJ9N6-l3?7cLh;5n z)f`|i^8##1)EkAhVhT(by)1eRhr}PO$9=IF9x>Ite6&>FJDykv;c6mPZ1tk&L|h+{ z^xyf4ow#=elCBMX9$SiLc7OM31dxK(=1D;6yQOBb4e#~wGuAqhX+QHHhdMypgKA)dv&GL$FKXYde=1UJD_@a<#lfY%s)eg*hb z$)6B^YWY*op9V_*QVm?rO#E)w?kepjwcDfJKJ5-@m#8qGU%LVAR%$n-T}tsxSFha$ zxFes(Mt{h;%L|M(Ee7es-NydNXB)>_ile9yLhsTOtnrR#`2s51tfff8Q+)--n&pOS z#}Y&eJDDU3x$*+9{GYP?g(<7(9*Ua2tWD=vb7a7)GjzHjt@{D0TM;=BsDbDn|SX_(K^fFu1>!o&P#dn)_qj1g57;ma2 zjWtne65U#&nL(A~`|bccqcR}+YPISjwv{}c`xD(F=%YGPR>Oy8Wel7vt|I(Rjb+>|8#UIb!5k|p$c*Qvy>{2V>?8ic8&f`dqZ#j< zCG^@|a~ia}NW1mgtg!{1QzQaaEDd%r|~80k5JrJ()?Q3;e;f zRlb&_v1|fifygeHvO*0EtNL*fs%e#K`l*649RcNEB!Nq>;Sw*U9z^jKhFzT?tm6l) zujxN7BGmJ!2SP-^Mv;o$%wbbbuB~y8MJirIGUy5EFCk?_XLoQ~`mgO{$8FaRdU(!;^2=9E(ph3 zikQ*MWjAkF;#pno1a!spzt8r8dxD-u*y9$l!CYA-UP+LkKC}yH_s7J!myqEx`iU^% z+eQSdBC>RPKN}c9jkUk<{hM$5%jRITzYu$uj2li4J{LOqbZGml(c^fpea+Lx4O?di zT4&sk(jsvw?dKE2S4sZuFCmSwW($*4sw4;f;Y}?Qi3o%ONnMk8SnyJLBk}v$ApmFy zbYR@~Z2~#7+eq;0HIM#v30{3dKvGuZ+IyM1=>=XEmSk3tKsVed{)JW1y03A&_F(#s zivV<&WJLn6JPkv}zK59&z;yrM(;n!f5@zc^_zaL@U1$jc5^<$$s8B4xxNjDs7PjFN zM%4S+@VIJRu8s%YPLvi*{fyaR@>lri)=&W4y@_b8LOjvxfXlRFp!GMCPz?^$$g)iz z(uilk^NM@@InZ*goHd#Ej)mRDQKv_uaZ?hhOay<_zakbFutK-P3=QKBr*L9 zT+?}Q7v$;T^>*_{n!F2}uw7d1&8JS=gM8VilTOu<{u z>WuqN;u5r2x9v+hSlMSDC$5YSH1GMSkf-`CZ0?IXiIt%**mycPxzI9hzxuiwUmiWz z%=?-TgB)jic*l4xjS;p3duXVCI?BqC2OOvd^_VstFwnZ1Ywuy4 z&S~bDbK3@Stv%LoHlg)~CpI179ruu3W*%sQ*$O$Ykepc8X-+m+Zs*{3RmD9h+Z^nF zf^(63z;1qN0K_%0(D<`W3yu2ZQKKQ*hgN7vA{G}6KFt=HJZ+9@noBFbsytWtwP(sP zbUYUAu6|Lu*K{fOx}Pa`@=xIE@rY!pg~oRW3b0st`>)`8Q+!y*{O%j#!yaltum_RvCfl{ zmhY(6E&sE*y5;{$d#3z=9<=;_QSLQ0%DwIy*a|oG5I1%7NTeABq3H8tK!6QnqHX zw5crHW8627WBd^M!**Y{Q?C{{zGIQNa|nYnw>r$vcA~(fyny>A3NDLT(*siF-lkW% z4jtf1;5WCEgKosYE^PXF1|3~3g|z_cLOn3c067xW)$?sdN7wur*qw3TjJL7a49TGe zt2XALTmV9OzXaoCao5!^-N<(oGFsNtknqTpl3n(pbJ9P9*0NyAD3BuL;lyn_PrPbuJ?Yyn=y zN3!T_5=e3bP*^bvdl!WjoKo1ky0B_vP1A(D8xjTA3nVZxYfy5EgB=A5tF;M*okU?1 zPALr6;|OXf%#p$->B3S`oRqp@72Ov8E$Sy>E zEF0CyA_ooYSZLbf;1a9yUAiS!ofW31CCr zWZjW#f5H*nbm-s{p5TdVnQ*2V(q5RGZrV{Y0%oz| zFUL?~5=eMLXgAb0O5ZugeKp=j$mg_@)8U{5S768~4?C(=?q^PmpNlUOc$ULpFEcJh!0LSmb_ zCrdo)y}yFzrWO27tl$%1jL*diuB0$K^I+4fkO_sbXi1`U*6D|3rLgI7%C}Kgh_)DD zeUNX5;1<%4Fv_Y7%av~*BZNx6eT)Joc=nrF`Szz;zI{mYc=Bzrl5g!ql=3ave=XqW zToj@pJEOk>~e^nrnZ=8aU!Yvan|)TqV60vl9pivqO3f2Jie7D4n~M z0>*ufB4|#9pgH9K?th2)x*jPxzhzQ1pr#B_=@)!Fn~|6NFEyPK3S z`^0#{Y`--7!7uA(e+e607;?pC?U}NQ9yI$3j>r)%Lp@h?Jw)NwHtzd9 zFb{K&$geLdap6@ilGQ?s?ah^8F&`@V_1zKj>)|GBh{Un`1L+65wEhp>|KARNq78a@ zj=B;8-e9BPn-GsR^U+X^kZgIayv!m$xK0t(HOpz>y6<-&+1hcazkqsC#O*Q%A64>f z6EA)oiah4Yq!IU+ns3R1W8|=Flsx)eRxDhPLLlWO7 zPEdj^Y=euGbXzcSgmC+uVeLji5N>O-!tD_y+)mCBZi^>UwrvGi1a>Uvq6jm@os_la?xestas;$XNwO-a7sdf}T?;+IQ2_ftdgs``qG8_SUJtKfo zs4cyIv`l*%fp*%0U@87VmOW@yJ^^iVy;b=#*q~Lp$D(c-s(b^{4Y37NFQ?=~@}VuB z+X0tAl6@#h8Zlb`CnZ_;BrQcGJ}!BM(59p1S)(5nbCkK@Kp}cTD%L`6#C|6)OoxHI4 z@pCFK)Lf&e>zdmjmKyhcex$sxAtNu`MwZETqw#{ zV(QlP3kx=E6Uur`ndM}mk+}CTcI`Hc)d7RzIfx^f^F(NiFHb9-Sy_q=vR#pDB~8Z@cS_W^R!q+AHC*DOSM^;2#cyC16&TWo>-HqIiS`b8V-a>$1h&{QoIQ--Lr=pDHz6*mBvHh{IyT}(S2*&Sa zU@Cn<%nCxQ#JNABJOcv?qt*&uKniW=2U>=GiqhZ*If@67>^(+$RzqnIbyope!LM6^ zt53*Pu5z(;@KwiJXzPx`g+5aH7qL=o!&&ebzSx2`A3YbqgDr;({vscqd|B%{aY56w z;rK+^5`A~V{_(Nr)(s+eMQ8KS_l()w!tPHvq`i(zHgf-v(u`QkV+_ddtvHh2iFr5N zCEFmd%L1LgpAFbR@Rl%O9e*4b>eG?*|6y9yV9m*BD*4Igp?u@suLBG0Wp2Y>X7K(w zLHx}9bZTG8q!d4YC)MYl)XlKVQ~L@hrBbPquy1Z5qo$<#=*|tOlvk$uN>s{Er1trl z(vOryO!*lU!jxrF1Vc(y%1=r?*l3QFOfl!PD1<3LB}Fjg3e=(!6C&T-;{Ja?`-J0j zgYMSm{nv-%b4tVU`2ly=(pQ1$$w|lDO-uLlb+}0}3*9YCU+ROJ#!9c8v{N8LP~JNX zTDqT6NPBpKK*NZ)zQwJu&D49&93*dAwH2wtt{;U)Ku-V{G zdKMas;qJNgJ0MwkudjHaak3M>yXO=~5_7@m`CJA_aS_LjCOw>cn7{}>Bh)a&tRZXz zgCAS0NWkTq1!0hhk~{u3uoh{oF?n#@o+1-hP4c_H&Fk zS!3RbBP@**BVACYQOME_NjRsTfF8M@D~-ev_gNQjti5f;Z^606`8c;Y2j>>=Dz@U^ zDzV~oOVO+G+wrvIUFCdUvTkhv<-YMx7WjEx^N9(KH#MIqXq?h~BLB_>mb=d~k62|X zcav3y(|Au?WxLE{awM;x6O83Cy|w&^2z~lk+uIg0ZfWPs__egeXpy{ ziG}4lVTr?p$PvKgD4vj4#tfEWv`lLS$J?ArU7p$qYI;5Fdm2;i0zkm$zxt4g6QSK$ zOWdy_?zdU)pk)HBot8Unl|AkDTkb1X*$d{omN{r1cAx5Bja-Z~Uj)_`tmI`cGf&x0 zbFXEdG*9;bf0E#7NwCXu_giIy7J8*@z4^9fZZ-EFywe;61R>)mn^5E9;0`!jcrw(2 z?VqPK!eiM+_`mGE4SbbnegB^$v<-?qQR@s^ZK6>@JI%43g6(Whds6N*4=uB;MXfeY ztynvYN(DD;QxlYXC#h^>{@CQNIJ>P*Hra-bc2pA{LZA){p#AXGL#8#Xp$|yVzElsb&xBUIc`gt5Hu_km~d*-k0Lqb`vd%JeaBON)2QnxYMb4 zpIHbSMBzl2RkAbnAbU1b1N~nuB3LW25pQSnh7qLuvd}v@jOktb`b^@f#QF@5XQt?# zD*4t(tv@CTQr*?PY-z1-x9&co?slgJY`YehMK0t>^}}9CcOW$gv08tafjz1AYD~d2 zMtsV?<$0+NACK|MKpzkM;%GDG+fEFdo`F`cUsYF9eZmLY1+7NM7m(6@=uYo)-*s#BZ8>GV$5T~WHsh-o)kFy`Z# zuoLM^rfr^7@d3r(0JEeP9Zr7{`zVvzGCwAD4WvGrPOQ$Lz;i`veX&eCQ-jjI%@Q3J zi3VbfPNo)oVFASKt==1UJMERq|um&~kNj*TIEkvHv?}&fegu(4i?P*^(p}hmNaY)Aj_`26Utz%T#YAS}Fozdk>~Mpy{A@P^d2KfT9Pb&0B#V2Q#UIknFs1x7=G7 ztgC*&#U~0MOC2nUv>sdyj0~<`mdNvqZz5!o%gGH08FaNTlfSbD(Hp%b(ROPlh3FnL zr-}*hcS2f+m>rqYD{9CDnS=Edo>wl#ol{_6mvNR75gKK zP+`N5I4+GDY|J6gZl0hkJO=N?khWCsC{z5@ZQggauR+Ay!5A54cGX8&afwztt?ltZ zgDxWJ#h0 z%o*ml7mY--^j1#Gp=0`NVj7HT1}XwMAPSX!OmT=?1>7uFDNvguK)d&3s-Fs)!1 zVU%ee|BYDA1^lt3W=XL%+js&01q5*s*)$mEjhp}>k!q6xa3JIfxFK9+VipW>B*PMP zzfTH)ec;3_Z1d14lRRNwOtOXy2Mme0-EPCgEWx6R9*fZFA}q4pJd}_KJduM#zl))W zqZuHAfZHM<0{L?J@NJZ7e*0fSvkS~ZUnBFK$`oJl7cs>e1V0JEODumb8J7ep4@8uv5DxJ&0&Tb; z1--%{=H6l;V$jQpnEM`wzzP-r9pR8mzwQYJha`?B`iW2)28rB~QU9(?YFnoIu%T-& z9<0gx9#=8OZx_kj$w0NI853_4 z$t3s4brHz+i{|yCPV=A5iD?$Leg>>56r$wgFoH$zVI|&hJ?Jf6w(-y5m|y~Sr$`bj zL>G55si!=_Vv~kfCVeW|?FdE>Mp?*T{#s11haktGcV)3o+t}%2;Vx3m)tfAFL$?Jf zaXAHY3A~25vCZuypdGpUVsha|H>NMiqazHJC0}%4l*#?(Eit*Paadau$1-eiSmntr zfXq)pf-=odDNBP8`$TOz>{gd86|H0!w>o9qV3Vh~CzZxb*Y^p(iBGcf9&Uu#g>aks zcsSPowNV`)-!Yp>6}s+B*#nU0G(>LmbYBst20mj0BwQ_7jLqQzrW(lXbSM$mNgm|C zjj+v1S?lJ#9!_`H&}54~9pTOc~|uz+Zor{v7a$ zX(5rrX=Q4c)U5Ti7i8XGGV2lPAPus$E{&sX`as`*8R>510A(cnIz%_Oz~!JXH~X+T z6R!6uTZdf9|5+My^mDe0zk;SKA8*5{9Ugymda7;aWulTnH+W6Phska&4?wSxmqrf* zeRmt-O5{nRPue5QJ$0cXqFq_d??$}A3Bm!fh2)A6PKDB(QP%h+UzP!G@=}*y>qv7X zBm?OCJ^hAFBFN3a&&CHRE%?%9WQ}$QKbfA854Y?+^jkJpqs<6%!yCMz<#SP;LzwLTQyCz5bXP^)>v4u{By##|$=ZP9HJpJMWYyDszB=@A(UWBI^oXfQ8;nZfstJ0gEtuZfNM)V*S=EV+TR#G zUE)C-@l=KuYmEqmi`7rc51E-sYouqmT9p_Oqs`2iVw2YNcyngDVvCux@l1MVC8WyM zM3H8OnnW&YLQ5lFf**T1tnzsd67qgbx!(TETbI1$rty6j!m(%;#inO}XVi3~ zXXpq{?MW$Go6{Q6C%?|JksYiEiInD%sE8T!lVX{I9w-d|=4}}!?{LQ45vv)Em{?pZ zMXLE^v^d4JA})_M)7H<7nWky3y_dJHc>jM-TGj^BB2;$*(*{HjI)Yg}A{IEMX%ib$ zPg(>&pcNx)Olus|C?c(a17^@Y&O6Cmr8e-H5*Re0GqO#UKr*fkBok}qBa#d#!L;x{No+>o|phJmyXxgL<@v z8`dc%RCekp0LNn0l6qKZ7XH&iks<*o9WS$7C0$JOH9`KmW0t6_Vzj3v;t3Bl8j`GF*tQhlhHC~S(=Jd2k7j$sTyMzwXu_Y zjM6tGlF>rVmZ%NGX8X870ZjEJt&c14?4;}CPKnJ9eWu7Z>l5vlwk|t+`_@1B8$tLL zUfI4RWt(haK+7ydj?r1YN#p$TAU zZwe5bC-bm%TAKGtHz1jfmm~;O}U=|IR;)xwRJcT6=kG%RAn5^y{Ix zB?FOZ4nwm9eFJBEm4qyyUBhNtsirZWgJ!PCVe+z4 zFo!bKM7Od;G*LWaV0cvA1RNf1j(zvjF~>C1xEfsc2mkyk7Ma1ZD1&YKmFu7 zu$G@iz|82=h?nutHpek3%%(zt0Tf0-fkj~k%Q~G6!>?^pFv9EczNOLQ3a_sESRq-z zf{sSji@T%EtS>ag%uSr=&t@eC%K zzQANkV8P@fj{AX_E(WhF!vn+B^$%Q0MX~?*W3b2;e>su!+maeX@$fB=aGP8W|9Lqdxcjf zTaMculJ$pu3d4$YM(tQa)O6F@!ATNoj#~&(Go!6*o34Xv%H6ZBI+JK`ZAtF=>F$-} zeQfz+(a3TUJo9MG`s?ACsSL!Cp=0oJ)T5*nDL+FM79(I6;mz#WfiX)I-IpQ(ct8bo zC$)tV8jZU)z{v2#+9;?cZ7>Xt+Q_6xJ&iWImVN?u?PyK4%1D`ui>_aWV0xU*qb6dWMB-IF(O~DTU4fC z`Ok$yps`H#kjiWkhe#07CJh-Lqs)-X0AWTQkbUmsk$sXZTi3emJ@pIc-Ggy{b_8tU zfF(q(ars4NLq%)#EhXru?~ZKj=!VMt0^DzywY|DQtiO8v;Y3K^Y`bM#0vsWNR>UPw^Ipo zYS)g2eYT*~r^>(zux5P($DA*V;8-D5Hdu_u2)mR4k13NKMF1-^=;rN85E&+n=PNYx zJAhhR!GURWQg*ix8k|(n!Oe`*gTZ+ky!=vrX9{y;|F6GH~2$UVZ>979_C0pWs*$F5E z)KmaXmM4?SKz}JNa~k7N21U%@$H=UZC&QBQaUPm=#5!gr+9L3$Jek)^EEBmD(BJO> zoBiOLm}$zB?Ih*%{$D?vU~ir~fNvO>)dY`&n(%062{bbT4Vn=WVr2G^FHoE%D?~t- zCDZemvf(l*nHngDWd*Htu*}!56xpa_*_*G9`K48Bhsj%f=ntO1W4`zmO_vsFnNS9} z(vX?Dt?{!IppE6JzzEziLmnGIT9yn~XYSt@fu$w5jG+~|xQZ{;L z#NhPO1?WN}zY9?I!K+|e49fOrTJKDDSAF3#WEE|rP|-l#`LSru!w(agaTdU|VIt(= zm7cP3qHw%|rA>IS;*onLpbQ3M#u_TH=`T)oIBr=JpfcY?q>|L3O`%Z}np7Ee6&wGN zSjE~f$8IlNh`iAYszz$4{S-bYKs`ZOoc zZ2fWF!nJQm?f1ZpGPa0;2*5k*Z;izRbhqgseXRW(3sC~@{8CDFPI__9vMW4_jUzl-F1<@<`q+M~8W6hLjqLo8#aEUTjSW^i!$zpJ8 zk@Z*mZT^&!;{Iqe@!~6DCJM%pS!;RCcV_?HtMl;=m1J|HadYhKOO26k_~W2yH1ms- zb9x1KutX0@MwAB3%4%?SU4d!$_U$%SQqVDR(AZ+h5b$%43KCM}0kqqja(kF^NhxEl zoTw#0Z2}DG*ig0if((jGDXU0xU~zLwiR>M1g!gPN_KZS!_g&iB@|GDtzvC-x+G~(5 zT1vz%>rhI>4ZRsLXuUj?Y7o(@wJANeq#Ol#Kr23M!hKKbvA*qb86pRBQEYRv9IZAD z2){@jsYzvQ?(`UCr1P#Fcoen6G?=wR)9{xWghD${q#i5b+Pw)XNM6>0oHi&mmZmwx|sRV{JTOu(GHPm^|7n`$#rs znPy#n#R#nG&39h?m&}K*J&|K>5$H}0^O;HF<@rHq?oLRfH@9NmNe2a`Y!FfAa-e54l|_j z#LqtV@zwcd5!jnOO%Zkyfq~VhBrrB<1dw7TlIa(7OHSEr^z?JM%-F$}r5XHVtiXW7 zW&wLyc0AaBE;9wDB;pT?s_g0Rl;fvednrou-)BUppPbY^ef(65&fYvV=0LnsW6IXr zC7l0ZSq|HYZHsR|N7p59#OEl~0(${?B`a8c=&0u&hQyi#0=L)oBH!EkEs{f?`09$nXhYj_FX_o%kmcqA9+Ir)Z79E zc^w`jnx?hI*YB44f3dK-mT7EJX`8|fcf$jMj$ePxT}XOD=-qZ=gAMm83TZEI|67b5 zlm~|uOEea8X7`9zWWy+6AD5X->p#z^w&LyqFf_MV^yIWkiTI9} zuqONEa0RcuEMmhN_KUTycuVEi(;MMJl)kf_7w-}mzThlZNnteF$kgBs0LDgN+X<)L z7t(fM8Jl^v$5C7Yi#?&MtVfq3#4NJ=`*nvCR%}~13z$I1qs)NUTnYo+o=6Q9o?|-Z z_4_98i07{gws50qF(9EAXkb)|cI~g(&4v^98nyfVC*155dSi%Sqe{l~45PTp?%)15 z7dWIXWE!@yu}mB|qQP*Ai=)heWEu`=@Se7v7)L=}6PEw#>vy09(JF*1WeesIV1g`H z@jy%TMW@Dm5OPFJ*c>yVOLhVz5TbWn+F;RBJAF|D;}IJdc8dpahq}l)x}9})b(ER# z%DR{d>rjJZBxNU^UHQQVm=NU{Eh-u)_?-1qBWt#-Gth;?V-6ZH2+@X<6|#hG8~Tyc zIZ}|bkP;i7g$ay7>@l;u8+3zX5u_Y2_oZ!zemVTWD=&e52fYOeji3$P4rECd#Sp@x*+(x#<@_={ux=W5#_ zzbuc%W;|WjVQQvH%9iyJ5DJMGe;V46k!Zg?Q>qgt&r0zIvfv_@Q4x>q$`*tCb&y0w4rb_`7}#7x$p?>`-AYXO^&%$@tpUf ztf^+G``;o~@fr@}R)-&p>|*)IVKI%0+Tld8Qj7v84qOx~g`Y)THSV1sPTdO|R(i82 zxP==W@CD#ly2ls*btKMZE6g)Ev#@Wfa)p9pz%fdqWM4V=0&rl;Fk}jC8^rs52Gf+X zme^UKT@bQe+z$)zjE+I>F6fD;Ng>KEn7|)>1`JGz8KB`p8vx;~hU*%xfdPxX3KSUd zdG&TbiBk`LfQV4APfBdN#XUlBF%Kypa#Dsxj4e4y&*^~YkGl;35q8HV0vpiU^Xqwx9Fy)O~&bW4f^021^fWK#4LS zY!+#;?uN^<2*yn@qwE3niCY`Q2=)lF?B;0dzR^~P?SBL(w2Vs|_gIVc?z(e&Kf_ui z+q6+KYC@4w1i@pC2%(Se+orPvtZ}=qPu3u>0X!yrnl(5cZP8Vojr$fO*UGy49lEny zamg$1CUE(R+tjn&4m_dT9S)6QQ&~fv$00XowICL zU(zbG0#ZEb7Ku}W<}L4wd7xp_I?%y;FTC#l74X2el$59eN`If$U#9xChZ%9B@?gKG z1dsNmc6l{GwNY%0`o0v7Vhe0SzE0t{8$gmvbY9fh!}A;>ZScT`8YPx63gd>ZRLp`H zA3WHbehn^hsdtHm;CQ1EqOc%s|og`wCZa1&Xtk$+hP4ID@9;M6zPS8ga#w5w3>3>fs$_&UZg+)Do{*t zsoH3VS2!3Ru@K5FU^DDd0i1?#<0y|KfA$`2I_oPQJ}|0&=WEW{`(HSSSwag}iywa| ze%x$Y4OC!=*srAr;056GPFoNOezucs1Q)pN2813s8G3|gb`+KH0`>v%R@@CD_R3xi zH%Z5SC&1}n|FBdw$S)<|wd&^2pc>1(Y7_>N45J)q*zT8LFuG=I7bJQ%Xc*-(35+2O zGB`F3>7pRRxuO_LAm-TZ4ze?_#_5&~#Y!B+D2$|ke16OTj~rKg;FIfq{B9V~=ow(c zC>ulE;A~k7fao*{lfBA}-~$am3o^KYBwj?B6GH^Xpludc(0i9)QbBk3xLgjV;>I5sVyd;s5hHWAZ&lTJoCfHc9Yf zli$3Qo7jPdLSn^-b#ZB=_)j=FNLN&%FZLb+&rPSSR@lu47X5Bx1 zilqqO`kQwMB6OQqa3kp@lWxE2eSd*U*krtpNV?@VNcL+*4~YV0%ITp{G$}(d0SfT& zhH{`lBMO6wGL<8J--ic|1!#wHQ4SH~fP;>W8&ttw0Y|Vi6#zlS0h&PJ`agX->3@5y z6Vd1)G3Q%^it332%~`DLBXQb;@~?MVF=NzlU{#t z%dJj)bkw$7nFbTW;DJDm(kiyH1PwL<&|uMzfU)wv9~k|cML!H=TO5uB`r#fA0G7;( z;3^8lDjyt#V*roSguLWwmH*pf4*2x?it3-<{oyaN7}{LopO_zLG!ojhr-5ZCY}2B* zAOp^_==O`Tm~7=Dmr!B(IBg+vV#PT|d%FkxKAJ~V0ZX~;)Gb!Gbg?vxdJlQDt+@(e zO)B7$A`mO`Pr`(i1t)OQ^+>050BIvdqxZb2_m^u~WNPU&GXk6d%kb3C zp~Ksxq;!u-XjYaD>WGCNhY)lM$}z3~)Dkw^N+qnf&nrQ+%i*wUU?;OqTwtXnZ?v(w zTJ|_-g$oOLsDOnm4l!v&y6^PTUk&|kjz#0f{bW&+e_K8A1|0|(Ek}uXU@~lD$=zYC z-=m967qc#fWj3}x=Lsg;O^-P>BjOP}(=imD2W(mq6Q2?bv@=g@^LT)BbZmu}Mj5Qe za6Hfo26tSd8aS;y2&>?Mn}F6XpG^!DC*MD=`_tk<1drJ~F!q+OL$cr8BN9waS&^al z*VqOhK|BV4GJTDO7zXOtSMGQAX;F*Y83Y6Sj--{kIsS%Z3jmQSU$nNL;4RQ zVnE=sq_S}cK*U-z{12jk&@s=**BTr%BGxTHevbuBKl`XK!--5R`qH+h(@K5oTRio) z?|w(?lFEi<^8&pA$8rR$&>wrtY)3a{Zl0WFGFszI=eo4a*UcG5qX1SWifYV)g@%2L zMYUhT3XA~zNhi!CM0Br(N}pUYnt64O?w($n|NhOf#B~}^H`9t`?`wSKlahEev6>d) zw>XLQ0^7aD0+&qT={yHnD|~~KE$zdaL@m!@J+GHG)-7@OD1O=-bfhdYl};_@Q<6dB zXYiDZCvDDBPA}y@I5(zT$DU}9ZN(=)+06Sx3P-aW<#VE4iMtKENNjB4lPW`b7v1N5 zMo=y^=;Q{Ww$592ZqdSAB6h;Csl-fBBAE$eYa1C^D2=S-v}*c~-W1cWb2)ahF{SoD zZkgXF+LzL6L4Q;Cxh6R+rNdC2$`;%d>!gHEq_gTjb}BD!Zfd}s9Lwz7eonI$oM5r7 z0R1dA1TY@O1k$W_2(HcYT#9^I<28OL^xsiL?oZ0lVWUB}OHR)Yj*I;$6$^I_a8*G>nt6`^aD5lc~Z1TslMW{j#ZnhLT9D$ z7MaK@srenc*k(cX-@0Q(6ST7%2)qJPkS81mp4U6e`DHqd$Vjj<6 z{QG@OSLdUcZceH+rW*|OF&(ipu#wBRn9i21*gsA&2U!%;k()-ET$`??V}>buGqlK5l=JWyOR;&is{=jt&1lA!%cmM z*gR&7exiJ>fte_vOJh-IXd|FAbP*l_%|sF1bQY=MsOY_yI=L=!&W7oRX9^)5WdJ2u zOt(>=S(69Br`Ov5_w0yx+bz^w`ROI&KOcmdn(0ORBwWh!c1*wx+3BviEYn@aunVB!!SaX(c$AeUQ58{hg1-N5vRMcyT&|`*MyNg#K2$h2J=CSEKBL*yp8;^pVR92 zw!b;W>t)EY>eQoO8$VCAo~@gjBv={IGZ}H+_-Oi z%#G;0$=ZjO{^^Z6Z*mc&Yg~H`L%ZaB{ffn^B!p3ch6kvS7-j<=S%UnV#%sc^<|5GZ zushHT3!sSnjDH!30fND}INrkQkH-A+g)%w=2VyP2qIxIQ7(7r_av5J3d5-60NpJuA ztHhiD1StCAH_&q=+nwbz-+Ohpn52}2n3U1@cb;R4G=X5LkRI-LCs8nI!R)6^b22|F z<&dptcOeTwSq8htCc7*{D&AsuZV)-l>=;c^xuFH8WO|{2meC$Kty=O=uY?iq=tF;o z>#{dZ{Fmf+i%%uhf}n_1$@vPTMut0G^4=u$cm44()9%CK|0(XBOyjJ4#Zoc%T|wHQW1GZ+4Oq z^2;&{+AvP?PpyGHBkto_Z6k;DZ9maU`qnQU(ODeSwZUfC zNVK0;)_l3#v&LqJIg)kKO|RPbB^cA<8KV_-0Xx^HNBvID4~;t}a`w_h6MhmSe4*PG zd#m>b;mYFBj{hjHs zBQ2dpM2N}mjfQQJ$4ntA-t$2Q)e!tROD244Z;MvZXT~hCy{58RE!LuB)ZVHID}HcuJ%;zftsdT~Ia-_3 zRcLEZ8BVGXkJM{5%s!^`fCyR$LDyTCOjz?z&EMcenlYK08NyC|Jh4qPyilKMZ9elC zpUPj$%!dZ4I>PG!)I$zivxr=Qv;%G*~CBl*DY5>(r;A1VH0MsAA@1u(3Eo3C1=jL zl&a41uu(Wk5-+k% z2BjjA)oknfK&1Pcg^HziC~mK1T=3dgc18BRR1eXo!ANT06|*ll7}b_{hy#4#Ow9J5 zGHB;zvaEK?)5#r913p_b%gt4q)G$bM04v_{y|(>XC$&!Bp|;^tvw7@DXuaw1P+A6L zj$U))j5eIuHhkr(vm&vrRAo+VY&-R01H@nQmv8#}Mklrg>rW^3)tmZzv6V!Hm|);XZ`dr^U_I;+^9z z%6di2 zeQ(cA{|7feW_HbW#wps;oBALw7apZG_Q<8~IkRo7lb&XH%tSKP&!!$dOs_VkHimBg zLdFKkNDQFC`=FeT$k+(@6Muf?kK1$MR=h3FR^tbowdqm7?n|vsZERo7V@p1`w&4eL z0l=V#C;DFI zIs2-N(ll~YO+~PNY)x%rP^M*f(I?k>82kYK*!??z^O0tKn);-4%rG!Qt&eVoQ*?FF4#ymmUq~?@5LN zv6jXUrff}q=Mmql)I(xZX5-7>oeStru6odQCzm+tx|2;_wu|n}eJ#z-es#cWgc(Xa z-TOq%k)dq($;u$?%}p8%65ZLbzJgKQ{5?T3yDkXNtx?{iJnR0PTa)f!{ZmJ~_qN}CB*;h;BCR=4= zYouWnR=Vk#@}PBIP5C|cE9_%gX8LY@N4>ATv23U-Xj)tKS3I4ZIJPEge}QYh|8>4^ z>QjgB(qFmH%C>&8Hrw=# z+Op*QXW-`v#NG3!lr#H;XUk!MSh1AP>HB3jymW@|?A^BSEBW5#ueb62T(0{bSMgI_ ztM#9Cd`djs_DMJGx+oUu{HfC2HdTy}6q8hXq5oW}>omTcPyLe&8YF|6;{5ey>#C$y ze6O=7jPJ{=yW;=kyUS=Xy%LiyGf_lBxTZ)3b;*g;p@x_87(!5c{dCV=KmyhQB%n_? zJ`TQ4?0dUtLQ7OgBDhPRP_xiJTWqjtY_ZDepn5r-o6ray`ZG(^HR=-oRF^B;TvOre zRvc5EmHxL~7Z;Kf&zQww!^ziVU^yt~|1^^5KWE^D)6nPH!$7qmIMK1*!z5FXmHvtM3c>9_e!<-y=Pr%XjI&Y_5lA zBh?J@RGg>5q4r=(XR=j|$3*F^j}Z%>^`VOmAM`gcgqWE2F-c-?;9$#FOY~DsC z#&1ZGe=`HguQ21{v2q?er#u+CtUQ~)d}20#1unX|W`_EX;xzEd^~t(6)4pF(r|YwH zziIHC+pdz%*wgrv%OwjHkxq2-IpBR<7vI^QT&B#LEBZ|NFPNY$yGKvlty|N=Bk7Nt zQ#Up2;gVc}^TwD!7F+0h$C05SP){!0-`o5x9%x-uBNfx{+5AqPS63$ZBj{7BZp=TF zY`zdx$m&qxvx5AUmBEz#$>!JErH6tk19M)T9dkJ_q$Byw@myT~ifq%ZlgpCL34VAT zYg6Z7L3aK6A^xQvy5T*^^R#HdwU-@QKW)nTWa}o{%jR!|{o~(2!uJiZb&2P3i}5_C z8%?V#vQzfovN2dWm-1)wzudrd>12Zi55CN(^~xDIGs3UPh7dy);+Ysbg=zCQ%npJ) zE&|qHBC)%OOk7ZXRaB0Q6h*JYpP-19_t3{O7eiO-Zu%ovMNT|e`E@Qt9h$2OW~xy-)9q$%ymRzWRb zOt$^0vD3!fTAO2XVmX(jW$IWq|1~sjW6=KVvDq;ntqmrDU>DUawI`gB=TL2N4lZAf z${Y5aG7u!M7!Y1N6eO>FB$)rut?vl(Jcse{99$u%PKfLK8f*vh3+g&1mEZqwi{4|71*U`r@BajMu;5ZuOIy z4ztuoeM(r7)aFJ~Tfm)#CQ26_B{lCcoZ|7@8mTO5yvjE&FIUEQxuGJpVm#ow18c1~ zDtN6^K_0ACN9yc4`j=~E)qy#}yUWTj(3KV3DTWePr9Tp>A%QN!60`?MsOo>EH4U7t zD&wxXO#>F{mHeeX%Vu9@6cvD=+-KBpM4pq9w8Ri~P<^8>1uQtWrhiPtlt?}_-ym(7 zuJSXo;WV63eOY#Wz3B&^A_Om0iXC`vBF|NgaD6)0gLLEZvB_`0j%bjhi`?;gM#<^THB zp+1fCvO^s~)0&ED7u_;B*}8!T8B4(6@fg?Dm1d6o8DE39tIUOW)-+P&l_UAiWs$`~LC-}Fkg4Si$1p}*+>vVCUX>C>C zh4^x-$-_^$y__EC-?WQ9SD9=c;#+c(1KP7Bj7Bc#pPHIgB8de9CW%IFDyq*?vF5hq z{BP=ML{deg8mm1NB!ez-MV2O)R>h|qzCd9v{H##n)ipDuZ$zri__NJc>WVITv$v^o zbl)JOkM!s!5ku~5a&O`dM~0lx)u=p7@7_VE^y8zY^k#vF=C@3n|G&xRJGheW7+Z5* zpW+!xF_{l~?3AScD-0hsKy4aKB(ZRfgq&S^Fr-NA5l zjYwRon(*g$@i`3tOIz(Wz0~a>q{?tw*@Ak6-mCNnY$+PB7Tjy{ys|j9e+Hkr!oywc zh$2DwM`!=}EBH7g$%j{y2Js7tIQi*wAx-L2UC^h*E){KvJlaeyIHj#PczM}pgZ$XH z+m+VFr6`SfO?-6qb=_EJhPr?U+WdFbuYZy9n8d0~Z2D8DKhxE4n?2+P$@<;ne-HT2 z3TV=G^K>-W#`P0|0N1;?te%S9vi`_(M4jv9TGTn!t$)4~bVq(lS49_w+*~v0e@xbo z9{YrURF*y-O zot)$VlMJNMT3lf(nAGwtd4;*^d_(VBQFmdR29hMbxBNRl`26E99vLb`?lm_o1PVIc zh;(g*2|gG)8*w^g2_eR;q%PXV5zT-e)wc?+f`Aw0e&Lx9#`c z7@Gc_sR*-}FM6_(PmR{7igbYgF;PEO>IY@p?9-1osnZ_fdZVr*RjHI}mTFd(`!5x< zk_JUvb%#mSw(p6vx26%LD?;5=n+!|q-=qe_oPVjxV)?B z8(p0%y=chsZDuYUTayjjdN;iB`60Z5#JFZ*gzuNCam3fGo@7IkWJiOG<}i3vpR?hn zZ1_;n%J4CN6+_5}G=zLZHa`bH^JV^j4VS#E>jdohGaHP2Pd9ZL&tTF_Q8Htp$Knmq z&~a8YbetOv9V?aftVlL%#weHn1d>Svd9@O$t&^$TfgdYYsp?uD_xOBX&BXLd@$4Q@ zfkrbB`H}QhF2yCosZwFah_z+6oEtPNs6cBHZ4S1aJsQflyswUtl;R_Og0 zfc1uG%u<3+XBh98N8O?k5-1v5f^yHA+8{q}T7GJIu(FlsDydj{s|F-`4J9wS=T9<2ePQXHX5bo^F+*~I7 zH{JUY>LZplQbZNhGO{SYw~k-Iq;B%JYfAY*or;n=wY|6 z!1o?L8~OiU{kcbf?xtoq$04nIH6r;}IHfKjzN=M~>$`RRZ@Av{_$8{VlLD%%i_b>> z&$j=s^`%&r?gq^BGOg;JBE{KvT`JN>He0*xt1JlKRyD zHXZpuI{AOrria$%lZp2B-D42vIV>P(f8xws>unXN)mas3CF?6XpbdT)HS6DKM4Gb|;8nIuEUp&Z{HL>Y5l$QpZVi_xAp| zBq;SlIjYi!z9lS$(cc=a+nUp$OrJwI1$l-&R$c1M}LO- zpI4s5|2+F8`JdZ{`ybVS|FPb@82_W^rKD9-(uu+CM>J4-$u4N?xFQ$SJXWF`(F+yl zb6&vz+-Cmg=9BoJvx@wWG0bRqvHs`j^3&&k)Dig~eHQ#rFx>x4=XN65{4a26B!A)j zQ8vHi5sR&nKO$@g?RzJCj|4go+V|B)KFR%@$WQZ4?q?N0$H-N=pE$Ey$yrA~<%A1}$GuiSb257eLGWC#;9|eE*JMUk)>)$Y+SUkGTl*GH+pQ(iJ z*^q&aPuoY3GI8w;jk*>f4-KZHD1b>=(3m=1lLB{qYOHP(L4H}M2Pdr$rW_%qa73{A z4#TsGF(hUy5Nd=E0m;*Y#DmG7pIfou-1mvUQ=Xg0oIQ0W2D2d_O@npG`Q0E@h0lrE z)~R5oW(Qn=6azG6&2dezP%vX@d`&}4;@)IE5dm-;3FuFQ{xCpMx|WA3^iX|jLp@XP z^FKj*$@Ab(I-gAEuN_-Y;IGfm8807Jo;p-uV*cXg;k*@ffznjRE9MQPcBI1xLYAql zt`858Kd29XRUd9ihpSm@S$?1a>+&(z#*@PQA_`t#xrpMuA=;XdQ>N5tcWEVgs}t&jDA zR#+d$YQKRKIQ*+sZ~D%#9*@l7Xxl&$d&gv2oK|^NI0awpSfQB?pHH@YoPO3Py6eYG z9m|_A>c`9}uMg+&bzS|Ko5$COH?x%Jq4bzHq{D0ZWnr{jR$qZrtOM+|$vQPC6OahxR3p3@R2&C$n zrFPGoJ-2HE8gUCd7~_p-=IR9|&gh}(NFDAGD=(O`>A$f4#F35O?*HE2OZ?Qx+Q=Tn z-`o4|?Oh20M(nF`3o`s4V)(_jzB!oGB|En40Jh#`_Uw^1Su`L;BbTCxZ|MP|dmGp4 z_+K8O5Z#Mig93WwZ&uo)$t&8KP@>9Q^2&i}^ABmJ)@C$paO-m_xG|-dsW!-k&-T9c z_~6jA5Oi|;TH&IiVP(N(44Z#d%242GsddkcT7~J<|3XIq3d*ryeCdVCJGuX$qh5lNUu9Jr?aw&y@qH?@$O7{9gdn1e$7 zTOKb)ReL~HOb`R}F6$fjSSGQDwfe6#Xa%lfV@skv$X~p*Z3vt)Z&fYl6?9{A zcUVb2?!ioAZ$uWTskU`l%44sXy1iSTOzjv>U-Gj4aR)hb#F4h&HtVqUrMg2kvP1<& zi9Xf1B;|2fOyABePZrnLU*OmFaRNS z`-UN7NnRt^m-LbK=?F~kIFr1v z3{fV_SeCrv*i}C+wzPd)o*GVB`hUb@h93Rnj>WddPQwGKHK&%#I%QGPZxWtjnm@A>;%JOvLvCNp8D>C8DsPMrt z?+tIR2tVL_zk$#q9BVO$5Y;9*nSaA`SGsWazN3V*^;2hvFwJ2%+NaG{YBukrDfTK= zQ~`ixh|Lcg6>w`iO_5}&UT@~k9u+vKfCbv{*`#~|5g8ba(g}9{&l#$ zdQUV;-t`0KU8S}!6c1mze?4VH91Rcqu9Ap2B7Qm1zm~+q;r^9ae-e3l5OYe$`XXXQ z0ldV{wGK*7zjI}kjx?b#ZkQxT3-HBfnq!T|4c&Sw&Jp-&q$(RX{Iza*m}|oe;H!og zb-u`ONb7L5kawwH|L z-I{`;fdu)hlKJtI=U->OVE(nii2gqQ-&l02{A*Pa-X{ObbnpoISFS4m+Tg|ym8#q4 zUkPBpP5$+UcfY%X_Kv~dhu8XTZj|v z{Ra^%Av@brXIrC$?19pu!(Nw=-9L`))$AG!_t{~><2Gdy`>cj2Rk&nIG-hb?IXK1) zE32e0lRAa@`kMxo+hnj14-SklJoFZ;El{*sHWCMRpzLhG+(QddOz*tpvR zTY8H9#9k04t?eJDgTa)aA<60Uv0LMO?2;%SyEW=__m-aGd~AP{zKTM+;P|8(tK=`hD8nF@1ro9{k$n1x0UJ|#^5E12*O7lhBd!%;S$G6+g z(jPbeCh_qS^0zm-{A~kjjJtW+^S7sV6H4tAC2@aTlEf|KZ%^qoTt4^r{^IxkqQoix z-e0_I{-QMh`|000|7(cD#^T_(HvCSVd=Hr6wB~<%E&to_67#=){(PzRFiru_dchR1 zcE{?(G#l>UQOy!Y%L0#tyv796_JOlh@8ZIO}Z&+w}?l$n;mCUDKKR%tGQvtR+C!N0; zJoou?nQO1A&)>$%)vIeNQakkg*nbE!OGpUYe08#=Uw{rE>G#CdhtH)$-i-C@boh*p zs?hW`Tc0@3N5|~&vOA9L$&X)W3E_E`U0N3y!f1M>3Z(2sy>(w6Ht&8%(5Y-p<>GU5vLR1;SLlI@AIpLT<#)-ulTxGm{MtGeg zj`Of!lpP18`Zz}mPDL5URZ&Jbrto;_xKj+Xv|jSEqvH;{jPSmgL^2i~_2JXWmf_>y zm8{%GQMXwcVV`=x&_q_65PlJaiN)?vy>YwsiXa1vjwYppS4Cj) zrO;%W;N(U=xC_Ksk`LzW7gDK?o`W24!5ZcrRc*+43HN%~%;VUxR%aeX=R+E8OhlC3BNyC><<3UMwx2 zu6Pl&9W>f_Z;=c&lUN_=-1knZnS4x%xj<8V=IYVpV|}Uk!$6$BmXKqJvVmRtOdboa-I?=Rke*M}SuwVicSX%2%5(Fwh*^d&|sv;JPLF?pM7C z-%V9}G%r}pTW|TL+#AlPRDE8NQGVibJ!vVjZu|DMJI%MMf+s4RWlQ`)u z_-hU9i#>oJ*uMx5Q0lLl3v|vTn!Y==zaD|6Qh&{;-ur8bjF7|}WK0jITWuu>^;rT| zM`&BHZ$8L;(DnLdy`K29nXnz=Cw(1I@E9~uRWY39aWzw_1gpW;kIPU5qRzZRixL;N-- za2Pw9g*-`q`h4Z5t&V8bE+J#2{Pc%**cfN#NU7;&`au5GPPZ83n{9;gn+sVOd>5A# z99S@;vp@1v=UNhahn{3B)Z}~W^Z*-Nn8sXe&qnKFEX%HA6qLJlsVBNe(p<4^%0}(# zN$p@a3|}}YYlmB_V*#&L)YmD`UgtkJKJOjK9Vh%=K9_4YrXqQ-tu4%NPwG~0<|^zq>Lx$R9p^ccn{|vw>*h@j znjUXcSGb`Q%s}bv(mu?7`QF9UtNsnIZ-%O9h$RT^stgLho^8FHu4)~UcInhvlM3?u zsz49#$G2`*`MW=$D{N$-FmndYej9d+J6#AN1!7_y zr|68yPU2)4q=U9_ypg2+zGFi}aYyD$PuYr|2spBgiVS4Y3xO=!FYDW``wX*hS6fwj zWU}vQ9iR4y-oSi!9e;{@q$wP!e3gB^aF3QMAwuJpa6k>WpBT{ zHqh4h5|XZ`f`~UUY0YoPebV&`X27I_)GZN<$Lcr#(Lr%Zb?aBQ>GIma(u&Vi&)Od! zbN6KKGun<3-9q#`*z)v(tH;i=p+oy1qALGNUo4Ss-&7Bu<@z2srC(~wjHV!#?=idQ zwQG6~Ywc7a`r73y$f17I)z=xSAfj^iTV-I=MchhXpp8$CxT7%7+83VC;=1G=@6=^% zd%BdNp?LW|>mmLlxhcH(Ked2=O2@nb3_{8;gDA2GG4K@r@7uj3?`hPf zQF4J_-6|LOE$fAj>vP}!SY5cK7FUQJm%2jTu^!4ewq7AuXl1wzvrhD0C-sK6A5~T6 z5F1B!h;yiYq$*G95a;0#>2Tx_Rlj~YhiJb>c8IsFw3|%WzEp>J;lpx>-#7LZ`NV}T z{w+o&{6^3sf9Q-=u29yl&szUk=Rf7tbiKiU&hnp)eBv?}@&T_+b@*AqPdIozQ?GKI zH=E-$kCbd)#*?Lvvy7)@C~_RCr*Eb%G!1?!`R#vHwcc^==X>IA_Q*LmJ^F^!J3DJHP_yc0a= za$mQcjR+{XHT}Y^H4O8hYqe-W9&|4EdGX0Z@&2%#!Ir(Y{ot~Jx&hseW^r|KkefEln>MNt6)fPhoc~YorUP6|%(i)Sys5$} z?sKj-(VHK&FW8#%qi@yaB0tLd1(pKt50Y%@zxY}2LigZ8WiN&);`0;4HJ=(659N%O z+vn8+P;9x&f4hg@|I^5yVA7gk%A?6UB*3YvPrKQkJGDP2Lb zzMIh)l-OYi*Xa}r_TN3)yO!e~PUwju7~RHgigx;ubzCFboYhc>Hf+`wG7rQA*r7%E z`LS>~2C-b{yq}XG?US=d{TjasKbiPJkLbF6t)%Kse~9u$(RmrCmiN?I|5K-0ys+2t z9bpryGH2C}im=lU{x-r^pYPEh1SMhj^OYRlEIz!Xo1RNYVs1msZ7(F|f3s4<6mA4D zPn{(h*IL7dC{Cx0Cq5tizJ|qFA=sC)Z`+nfyC5`Rm7K@@yQ- z-!`80J52XTc?a@SEA`o%zy4e)DL=G+s_8j4X3cr6_x_=YN)?n)=t@KS~L zc6>~(rn~jWpMP@Pjj3bp>(0T*CUR-H!pwjSc(C=H+Qi0mibTiyiu%_7p8xNk|DSZ~ z5GTl=!`)gcTVZ2InP+dNb?mFsi8gtlkOnwvoCcV+%e4OFD+j)GaXR$?XP2Kt)sx}X zsvHf?R2w~Mb}NMZXJ7YoWo$@thNJi^GOhpe!Gl-+Q#y4&=gh0c3wdZIZPX_?a=cBa zr&qSNRH}ArTj*MtKwtE;EuGjyu`!ci7sf;N zspnXaUwK(;%Lhd#w_4Jv2ccC@*6{QGbmG2rLPzt9LEU;4LM4Zsr^G*AUEjWL0+;I` zZgDzspgzG{d3a$?1=kiPc5;>eInK>CkJ*`cHj{W-XS?f>MTrM_gsvU*Oq$Nmwduq_ zeWIs6wVIAq@QS|r)bqv(4guo!UA%8TonRXRXXLAnmPAMDV0hRu`Dz|mT3o&|F0XE0 z$L(cBX;E-A=U`9mj9bq}>3CP`lcW%nAu zx%b<|Ls!a(x-%-}=xs?Igj!l(?pude-}(f4k3JoZI_-t!m=qJcBqCNcb(>ChtIl&0 z&&7N)RfA7noyGQ*5!)q{h0I_?1m`3XFRz&G#)#!n5vO@bN<1>6ViA{03XXb>ff2){ zv^eVca4B_01dk}CJ4cpMf#(&aQhGSzw=qHX=B0!(6iKN_LMx&Y!z8roLT~U!z>D(Xp;v{wi>s;3> zi);ujIGLM-vXvuCXGP5GVbZ~&jch|*aS7Q_k#tZSS7MlSI!BfcKE!o*Wa-2tRurTI z4KFO6*btn87E1@+9Z@BQz%DxJ2t7blSppx{L5AnF&8&XSR(1COGJ74sT3 zB+y2@9&S5};}XN9L;M<1I%`LkPVA6Jmd^5s#3Jcng)b}}H0NZtL$^ni4mNc%>D(C= zDU}Y|7J0T4EZAZYj{8LEpam}=9VG6+MH~Ul7oZ;_O9yZ>vhAP*BYU>k7Y?(X$ZDZ6 ziaqjdc%c`votVTT=@fj5sZ5F2H)`nH$)p2!MwCwM3{SM3*xV!?fssW8n6T_rB3c=X zNN@zS6XOI_=mq2y#Q{+W2n4W%%mF*F@NmrfiWt0^DJ?#kuy7`ku;LOHQwi)Nno<-1 zampgtM`5Bkk>(Uw0qgX!NaPBbIB@sEP$7;iCqjkTIt&pmD#Z&JcVtx_UKm}l$cb4p zD~Ri^g1Abw#;hp@Ir0;L90N^KQDBUhRALwOfJqFC5{VGMvnJk^R?I2W!h-)I9s!Gf z!#kxMAZ08S@x9pT!QNE{aEoMR4Dr6d1VKdZNCU3>qc~Mx$%PrRJe5;*90R zg8*4cEJEW2en~7X=D3Y^p}W|j6_7YPQX|HXBrGHu2}|)z^u*p$f`X$D7fVR67R;>{ zO+o~6sg`7dzC^FKyt}NJ_DISvjNei$VH&`j*109ATVl4GLJDd`U5R`qA0blddYs)cM8FdT zTh7oj@jyCd9V%R2W@9cJO0=k!bD~-vW~`M?toNgpLbvWL8Ei4qD)eP3Jv3W^7!6G) zhyry6DkReav(~}`Du)44mmpm15lLOH%?TzX=()?NLzswE(p^Fi;DHf+j=y}tlA1(|9>C`haxmaqj(XOTXHNMtJaZ@xXk^Nk7bq%k2t3VbliFGlD)E$XRS5i-BE+C^U z353TIkHJLt8(l!oLKIkCsU!TH>xk}v@O2ZUy(|Hx@_}^fS&Cx>y%&%K%A_7w%Ai79 zPAY?@j=G>}J?S66!kWd?OQFQ2kl-3m3|+$6TOqFmn_a`grgbd*;fM(Ldw`dPak-ZR zbHdjy;^?E+sAEv7ip45S^ty?&tn^TCY;K4@+-%OSF(in+H=CG zl_A-y+t(@+R(#dPu#wGMArI zmCIjA26rl1QRS`kQz!fEu4cDyf3A_HlP!9Qgbujno+j2;e(~P)QKij-3#Lxjr5U_& zqx#m@DSO7H8M-umr2JWM`_wws_|>t&(9|Fs?#bn^tqWFe{^pbaraW3UwVKzO1i{Ml zZu-!>l}!s$?V8|Hx>uhA>I|Pf{>t(3~9u#0ku&178JT5~~=FKoRW$R^fKOZ__AzM50C%Qvh#pmfr-)(c;uQVX)F zN3!i5FfLkvg2z&uldotUTb@mH<#_vcdpjjB`j?H(N?Y;%IMxN+RI@ObdLU?DXC>8f zvAx$P>ySjQ_2Mzv#5Se(XXH}P1!`Sy-jI-1zI$-daV6Dqt>@AUH-*4k6tbx!+4gp7 zT;Zmx=wFwPbDb$2tj+S$I+T~sgVOcsxzygEy@Q_ZfB&1WSL!WD38b6W^s^O6Kv)HhUn}8 z5)s)%TQE%nE3R5-gz|(V&*udR9S?)Zd&4CF7>p@2u?%MwruLSQwzU7f(HkSYjo6j z(y2D$ljd7hYejLb@N=7*U#MCg-MyYg%Zq8UN=s;xklg9%@JIE+8qXx;XiVC?E;r`0 zHRUm%tE4RO*;+)sjgB0_uQ!&PJpz@+6XbSGoQAqsM`*=#1ZB+eDq|@3nqegu2Z_U; zk-0G(J{=b;sFq4~#igL%3T$4Zejw@>&>s=g6BARcG;mHgJ7W$Msfp?xDCmZ#ez7+w z^%6!Gl%Z1s!${Q4?vn~%#jp!s3?fX=y|7huWn6Tagw>sbs*Wtyi_y^MV_Hh3xjbe7 z49`fKrshbqLt2?-^G?J=djMHN5^r8yFG;H3Q047?m@F$|saQ#5IS@00K}lSU4tY0G zssT`1>>G^nac8($&?%>wcg3WPAj_VZ{$a9&vjsb!Cp$NFE*5A(G90H;EYPZ0DyFUQ zCbDKR2K70)Kzrk&P-3N|bIj<(-5E)iW`8jyrIM_S$sbXYs(fY4J_y+)YYYb?F%HJ^ z7$(N$#bSg(#U^=iO_d!C}Awc zaB!HfmN0r_VVI~E82uK$q;xozf?Kvgqu3z>P}zaFY@~Hq=260xilTMCC^yY^@Vy=8 zL5L%9w@xO_u9%|QT)4}4b&S|n%8ru?v^!=e;OsiQe&RkK&D8ILi6L%u%tF5U+!IU3 zY93~psAd$veX-5$#-z9uln%E{Y$Ot_I>B@)sO2$F3H~w?th%{inhbuY_p+!;6pTea z!E33H6H;0HQ!H4bjm$G9gfVg~8T0|tcSNoht9}82-W3b zL|7Sf&S_gQ?~D!tdn^#=m}0~1j3pAWrr0o1oq~rgz%D0DIDIl$DOtHwl!pD;d z@3W%0AiZIs-nrL-m~c9HKx(=)b|=N5iSdOj04OYY?PW-j81@KBl!nT?VrfL4%3Of= zux)W!=&=avWQYbwGK7BfDv{$LniXVN9JG-kKBjV7;#V;>BUmJyjV#jZV+47ov1&Eq zVx)A1VTT!IQP``>VvQxjELaz%3-MBsRxl7;a1x=yz=ByCR1yMt zNY+8}f?YyQv0V-mYDLV%DksrwxF(Y5U9nV#Stai51-xrlTnu3jx5}QlC^yZP9q#Fk z`%&vXA;jRT_pLB4@~x#pq{Y}G zi-hPUh~|xGmN2X!!6LInvatkDKs`vHAiNRGvIg}20s=&lqX1cK1>Pt-V_7(#Rce$4 zVVJ6-S;hFZH!h2)h7U-(i{)sD8Q7yCr#C+C7aZ)c;j{Cy*t{oe1oNb41)&aOijSHw zI~MBj_b38@!Q!%gzik#N=9#imXM9W(?&eG9`=D7TX8G6T4{V689XEEG<~ z@*Un4hvl%C7Zmbm6#^qEj{t+JVs=*L!tN0wC|)P>zM^SCDI7vcPHM0k9Y#?!MnkeB zY~Wa2PSz?gj+7&CTORl6WZ-srOp`sa)JA|x-7p@F83Ji1AR=@llC7v&X#KJ*jbZs> z!Ing!;#7bs{4i*XRz`;F1S_dl7NklC<#AzVBu}+m3TAQN5~chSDtHo^iGStrPrZjg zABr>#C(n|?!>%@^SMo#+_Qb4|7Z#rxe_EbNckxoPC4KE>)PbGl#uQ1-oO4Oa3E)5; z&WRN}z$#-o8dorMbG@=8I*12)%srsQpSq?#5ZKkp6KvP9kZQ?x+5ITelfG;3h#j_9)ACLKu#?+!>|SqU@1mqk0CEMl1Mj*D)!`a?4h#>!xv* zfGPB+Tiq-j!5Aq-Xz!dI=TuXr*g+G;0*iVtixPb+U7#umsm4e?R2(zj6 zxeIQpnQ4SYXfCU~>KfEVT8iUh_G9j})U&|_e(8CtFW}O|Txw%*fnKzh+A0003z&Ne zf~MZaplMyBmP}8y)Z{Y19ZpY>TIPvkw@nKlx7mSQcr+L8nWk4mZ*VKa$v~S)Fac85 z%LK?90wzaDX-~|B8>WTNG6RqecTEd_l?&gQWAY;x-d2$dnU@H!1&uN<5njuBwefoo7tnnFc&lk_jqRi3J%AO_`wyoFO}s<0YA{b!9qNlCLVvMd>_`lKH60 zS16TzAMXg4E--b3E_k}MEkzSGnyS)gt^cg^pVR$kga4f6KO6n$LjSqce=hf*ZT_>% zfA;v#0smP>myC=0Q=vbo0PCHzc{V%Ll?V6m+SIb7SO60{^~vrQ&AvtNhHT^eJN)%7 zKF@+ddZwH2uj2n`_DRe@Ud8vX?~aO`+$p zrBpA8ydilr1vn7NO>FU|NY(5PxYT}?h5VYoBYDS%#cz}si}4$a`C&75ys&(}o-$46 zg|gu?(-6IXuh}MB+I!9nKGUVCf<`??pg_y!29q}HfdMPo;`Vulw#OK&(VinCsmI^$ zwa=UsknZMdlMjX~7FCGu;@9+XXy$tMKiO;3Z&;XbX%R*@t=>e)M)ZvtLo4FCH0jpw1begrbEubVEO$U zIdQ+er(b8p>Gr@Moa)h$sXos7^~B~x7n!%A^-V*( zCa0Z~#yO{eGjnJ+*>WSy!p)wa5g9tHsV2kEi6SI}Rh`2X=D$B%bMF7k-kZSH__gn& zn&&~KK}o47(L|I`A?;F$LK&knMuW;ssVI#yMP!PQS%uIniAd&5A(SyP7CP%*Yu)er zefRl&&pV#q`TRfU-9A~Z=ULCa?q}N9zOL)uJ>;||^3(d)@6)y_1&@eTCjTeV^H2Ud zV^yotD%PQoP5dq$@cs`pNK5{oTkWqLS!lj0H;dk;o-i2_N;ayllmcv~L*AcwnE(8Q~BUiKqY1z$B?!pjQ zi;rscgGaSCkOlNEY})>V-hv_Y7WAXHUGevwX|OKgF#SFY|NdUWz0w9LekamR;ZEd#;eg$Y%+ycfCOzsw~dPbCxiMBZB~SQ6x(^;AmQ0+W-s9ylIuiHmL614R=( z$@>^!TcVFKxZ*Z$i9UMpp`Cmd6_DGTd=thkaW=V|gW&ci3;oEahXC@?j$DJv^lm2a zPwolzE(wnbw-S_=Shxg`K8)DT!+As^Y@MA}^v2+{pQA1m7gr2zW%F#cOD zJS^U_Rv@PH%i*{)c~2}Ch;9E#^G+ZiQA@~IL_U#YqDu~lmca6kz_QXUfqaB*5a^RA zuif;Y2`tOp$pcwTgZtalJ)zkpp~fZQEiF2@$)1NrcbM%O042P2IndpJ z4_IV}$ej;wTE^@aKR^x>ejg6*?+SW=Q|T7HziEe@Tv77vdAPsXiR~!2+fFZ2 zrKFAQ{)RjFZ|-kF%v)pf+0BJ~i!kA%AfXMi&;#8?(%v&G#gllf3uzl?n6Np@kjJNW{%l;wkFZ8FY{+@gLkKJKzx!gHlqDOi^9(v7^kUlv6F-UzuUjs7S| z9$X+OeI-%UK++M2{0<)=h$+e-D@7tqNXe0&TQUKrv+&u{(au^>5APY`pK z4hw(wMhwnN;tA-ICjzR4tCRm_VA8mBvdAUTSGqZYt}7)sMJTy(;8IE?A;>Q_g2W}{ zYNAgj3RQ+Bq{u@{kmy2ikz8VMlacx)dy;d@YlUuXA)N4@{Nk4QUPh? z9HArOsB~K1QqXakJSSNx{tNu+2s?U}K3|~#Z{;M8Jo$UqzMAk33~x>Fg5TjDhZp<~ zI{`1)Pg0>mk1TxZAaABoWHJ93OWx7o@7cgdq{U4-^!&!sk7nIqDG5_TT0c0V2T?SD83#3q6e#rp;rXIHRY1+-t=@!Xdv$f zc+0M=Od4yGS1qtI$F0~RDcB#22c~p}0qW+j(wg~z3Zc8rBEi@lijzd4^ zk^{JlEQ_HzlLLsq=)u}z=oP_lO?$qOJ1p+OKYak_lI`9Yy6Lx*H?Qb+e)!6T^Ajie zvD>lj8@nB2$)w~Y*?tR`6(mXt>?D;omXseCDgRr(Avj}X&?B~S`=={}|0)%bH}x{X z*;C~9qo22xj@?iya2A1gaiwFWN(B={VLe+a_SdE2e_bl^*QEsEa4bPF8lgO`RY|wa zae`a&keeUi&CMm@j^j8N@{!P+{C&1@g5xJvn5hzr@13TR!0L zFZ5lXe6V}v*rE1B5K}H9uzeKqnmj{QdeRif$&OPTr#en6pZV8)g!#(J-ard6VI=hb z`}%+92#5ed{KHF{|BfvMEwT*z06y@-K79Cu7hHkx!u~GW`|EP-^TmJJ9^>G0oKKT4 zP~|PWb-)Yf!M+At{Fmjp9$Uabc;Wac+WTw%YC?TH8lHSP#=$;c+zIo<7MEk*#(V*` zxStpgm*f1n9nO#Au*Ky#4=%?Rm*erm<-+sg@em%5ec|meo^Tw@7nkF4!1%ZxJ{}N{TNB>m z@xtZsT& zp4i9n@CRDprAPno)Cv2z9^+tK9Ea;ME}nND<}Zzifzzyn+?o%+9~NdrdRr;CJgqB- zXAi=k_=G=Vd@oC)ROh?7vz!b>;Q0M<87{|V!Rk>9&z@9sxjW2Iqm$&i`tugS2M^g;s=L2We(s^z zems7zz2Qyiy>Vviv{Xkd3=!*LBa>Zgxzi-0%}hEW$m4A%5m7O52}vnw8Cf}b1w|!g zp;tuU!jQoE!3*aH2P~K#7921=EO0^KtR+DU1H+fh2nY;U?yRD!)&}CPB-1| z>b7?bUyd1@o9ZQRy;FMny&u|v7sopH%T4til3O$5)P&}hOW$@I?pG$;>)6#_JCDjO zFtgrfH2X)CW1*DsBZWE9Qq>B@o(glPkKdajy{<>W)UoHsxT|0NE*YKF-1YR5fdeM~ zkSh+~JLzSfT*|voi>D5Yie4QP8@Fa{e8RfKq~w&;wDsv5Hg4LyC1dNh%8HB>nJyOkI@(AYwQ>rbIWd14f&2v#U$bWliX<(aFfP?P^h7S|5GepmPg#R%y$* z?jIr7dcfSHex>cvfXa|0?=tl(n@^jmsOF7*zdy%FM>lN!{LW=p^xX#=8QH3IOEK^W z>>JoUyXyM)sL;AHrOfoyXT21H&-mZguqk;`x;*1y(=zv*mdr*-3(K65Gu1qt#QtKzV-onzVUw`WX18r=l&+rcj zocZ`j(T6|&;QJGBK=!g2-l>y?6ZZbP41Tk43S1mAeL;X;KdZhomV^iD&8w%hU#Sxz zxa9SJZ{c2r`xNe9Anrhw0E2YMk0JT#OMc)FEJ7ZN;=>2lXL8+Ni-di9h=Y#5-2eJa@1jSZ%P*fc zIb5P4T3Gfli$QYib;!jfyp+ZKwEh2k4XQfc4?mr8_-U zN8GfBUpsYbvF{z}K!2OU+ce&m^Y$xm4HmI+<9WO0f2qB|=gC{i<~Lf!+TFap&D)MB zw!Hgl*4oFgb~$e=c>A5VePY@AHN3sc+mCTVUXq;-iL-W!1Z$NgSzFHANGaAgk!J0~|E1PmhRwHD zm$hBG|82YePnHXh`?G$g(DwU;`na7dUp`Wg%|EWk-?pBAvRruFpY9u4aXaDh!uvm($5lySdAn`+*IM8Be{DOQ@7=$-J;wQ0+k8I%>`b;F z&vIC6bda^zv;Ve_%XRpA?8ok4<2LPK?ZpGE&DqIXm))$rv7fckS*&f`%i7I+`$v4f zPdtxmK2PU;Y}|aly*FR}_z+t@l*jqa=bx0zmdp8!pr0oLeg8A9_2~ah9L%TZg#Tv}AoSGd1{ z-;am>L-*x0J`c7fJZ{8zmd9sr*3RSOqIj$4@z33VTls$dz2o!W_5a*){j=ls&z_$@ zi}T;*|MU4+&+m^z{JK8cx!W*_2={U8gFxtvgO`KSR2awi+Dek_cM7r zm2VgGC;e)^{4sCMkFmHo&%fL5<9YqNad7+X{P z<#_$!a%}(Jeh=pNl_zi2c&p3Xe>4ux)4}t^{(swl?>_i@$M2s#KYuUYf7k!*`I^e_ z1DSvEeh@yM7zghYJb%~U&Gt@ ze=&}5-2e9f=ktZfrJf&W3*O@Lf3?Lp$N$Ci_kwRHeuCwV*TE*<7o1|to$^@Q#@liE ztS?)@+G5@=Kh64fXIR_9+kIzQKcJAchUZxOlef3dv;K<0`djGuJ z>T2E034?##YEYjwELd}$#tW4qkBU3>S&vSaCj>Z{^!Tf{oFEKUjb<=?nFHNE%Y@rNo$pRuXioV}tT^5?u~+rz~_ zI_(JY4G3MUw`S7yz?Xdwh-&*89XWdZ>{p$U)93VeSgAD5d9T5vF~8YL*g_@?Iz#cusb1q}k=N=(s*%>ARbX_l%m^ z^*~7CsIt9df-Y$_rQa}=+!Eud zqpP=1Y7I7<{eE?7c(DJz#cGSIVx>hdCAD=FrM(IA%>K6bN71Lnp_M(38sCLuP!ssU z0FHyXo%>rj7Uv%%M8om0$rrT3G101(D1hUVIa=!&92?E(`SoyohKY*pg=16{9O4AW zDd}XR2OO(sc^$Xmcm*dc`vk}A#AbCnIBwP|myF=pZR|PcIvl?`*N<6n44)f~wt?fA ze>*7=j%DEX!;9c}Mu?jF!ZD3$+`j;h>#cUj3vg`ny*kIh@y&fQ^F176WvjftaGdS+ z+cV%;H!6N8g5zD5dSD0~bE6#D4RG9pSBo{ku@70GC=18`r+M8-I0rp1_nZvp;a%^F ziEu8SoZ7Sl&c|c_V~KE14xC&x7|zSfqwk#I+}K&KR)g~sAokG>&XI`4u=8-9)^GV< z3+KwB$XgQ5m*&_Hci@~U9}FA^=dHJ1=ma=-XKtLcg7a5ZTXzP|p;xZs7&wnx-=sW& zb9q3J`4rBl|HR7|;hbJs=lC4X>%!;$i{RYuJ#+F7oZp`(KTLsh>}Req9L{rCZp&^s z*KchDy2AN3*7Y}lbKZPm^NdP!*w8CQw=TN%UK#jvyU8lww{3R@ zZyWQ6I zT)VdO{22$&)So#cBPt;+A}%7LkhNggX#LTnGlSkA8E|jFfQ~WZzWev=-!Fgm!sEK& zx;n*glI>qwzkJ#JDeA+LA4`^4Jiaz9cz1B{eESbS*RNc^{(H96p|Rt}j&&~i)yr>( zpPzMLWWxFC^XCVe)*Q|ppP9K%BuP9)G$o~OQkT%Z1$*}fX%6<2w~&{Q{kpDW*~ewe zqUJu$x4va<{bkUcrf%Wgx}AFD?A4Id(4c?n@YlP`?%v(L_1)Am^RlwxlQ+*dJ7Z>M zvU%x@QI?}dO?j%n_xF?Ezi%H^Up>Kb!h{RG9S?Nz?$V{{eZkH}rHdA&FL<+W;KP9f zv+j;x_Ttow7peyLlXi~Wxzpg6#?6*jEiHN*SIu>`c6A+ba8p+O==%CS$Bo*2R`~c_ zPpy``EOz^;|Xj>51PbPF$YSb%;Mq(&srFL;o5}@sfGRPrp%c#B~8yWO4&hKS?Y^e>*sHuKR-$=QNJR0<;ub1RBuZ639tQ@r*9dqP% z^hs1tO#JF4GA3t#PR_};jn`K+uUO$Su>Ikt1)DaFKe99Bp7XtXA#W@a+pn~@*OZ1D zyx;l${kiY!FD-w!e0k{A=NdEPX3kueld}Jj*P}x(Oki|rM)ZKQOhqz*e9h#W~da^!fP`Rj=h z6DNMq&JT(i5ED}{vm>tG)qedZSAMehU+?d)A}*^eDlICy!Ntb*Q2L=mkDnbl7J5H4 zv@-d+VwF@?)eWl^RayaBT6XCnVJ@~VF4K-}TXTQ-{ri?bx|M(W@afZm2ZB-0bDuvy zThRO2q|ix|&MTz%kM9~EKh&fud)wG;+vMDe`u5D|*|RvHE!nEd%F1_zYxD88NS1&)}peaqBmy?eb>j83v* za&pzu%U_0k9x`N7zmHe9%-jMWDe3D+%&h^}wXa`aFn+C*>0wjTr*BVfiM$vY`BLk6 zz-p`2tBp?_{C#KDojc_N7Twbh($)@NG^sTIeSUt?aFfo*)*L(5?bee;bMxoUeZ5Pe z&~u8X=Y(}`Do!#^PB!hDS6bh+wjS|o*YZu%kf!-x8n(tk;=T^T}3QPzL6q_^qY++qtq3hHQf#&DU%~N)~@+j$5 zQsTEey6Ew=$B%#71U2Y{=;(}mWp?h@&0oK|ZwnafZsP79Y1`149+sZo_WFEk#N~*H z0rI*QlA4l|M`bb$*Qu;qH)@H)kCUHHo{YQU>;JO&<;#^i140yS6ct|$_5a>|dH3$) zD!vVzv1!JPLHT>%-&%C*R3ul5A3vM)AqY8~!(LG)|Cn+;?=}zTNlT zhd(>^?3qW|ck}66r%xZY%<1E)ucuD+AGWWHeyqN}w9%c7+g-PBe?NF;i|%4w-RWz_ z_88uI`0x`OenwuhyL4&v3)53S@BaL0D6OU^t}HJ8e2?_WF}`EQ7@1!>zjf-?tv%{1 zM$bPue|}(B+t~{J6%>{;3)^2N%PT7tYGhG~X|za#Hn zw0mo3w{6rA%iPVmxh>H*hFr4RjcAh57a-Hb@1RU@73Ytz}a;WgpmT|UY@|Jw2Ot6S1=*^v?>NA7d#DRX$; z;lue#TLvfSCM4t;kJzQ=sis!=WZ0yqd!Iht-^b&)x{td0xA3}}K}~}ON!HZ{&pA71 zj-yInfsCPy%-x0~IU$ciLV`oR?-x8PDA2ud`daO*+S)spR@%MW@b2BSxCdreHLhNr z9Xp}-ur9-f_32xdmoYITCuM>HGJx z&e`{Ga0Rug~FsJBR<_9R5u> z{7>QVf1AVq1rGmB9RAZe{AY3aSLN_;z~Nty!~X~l|9d$6U+3_@oWuV_4*#AU{x5U* zSL5)1pTqxP4*#hf{?j=8OL6#r#Nq!YhyT7D{uguj-@@Tvl*9i*4*xkE{=ahgKgr?W zg~R`N4*ww>{%bh=pX2Z!%He+*hyP<7{+&4dcjfSZi^IPUhkr8;|MndI4|DiG&f)(9 zhyMZ&|C2fVt8n<=z~TQfhyO|r|2H`N+j01x#^Im*#cvA#2RQtn?kX;_yF?!~Y--|Ir-&$8z|e!Qp=|hks=b|G6CgYdQR1YQW=kR}m!~bXw|Arj? zpL6&(;_%;t!+#)$|0Nv$=WzHx$l+g$!~bs%|JykHw{ZC1%HcnT!@oF(|Ct>A8#w%z za`^wn;opJ7zYd3gO%DHw9R9~}_?O`DpTyzcmc#!c4*%L5{vUGqpUUBX7l;3N4*#<_ z{L6CqU(4bDBZvPm4*y;p{zW+an{xQi=J4Oj;lB%qe>V>Q`#AjPbNJ8W@L$N`e?N!+ zZyf$5Is7|v_`l2HKbXV6E{Fd+9R8ni_@B+;zYmB1cO3pBIQ*~S@IQ~ke;H%{_beFu z?>UmO|1;|u`){vd?Ei`?WB;A!Gxjed%Gkd`7GwXJL5%%(jA86w{w!nvir*Of-~5TO ze~ZVA{m-{&?EiZglO=9dnNRzSu*sqNJN6lsI|H~l8 z{!cw(>|g&BWB=Q?GWI`wGGqTHn;H9`@|3av+eaDuztEep|EBkh{iiQr>_6)+WB;lK zjQtz@V(edUBV+#~4l?$?=Qv~k*Han$Up|(x|A}gh{d=xr?Emr<#{SjrF!q06gR%d? zvl#nNEoAIJO^>mEsV|KEKT2fm|K@VW{`<-@_P_WVWB*%jGxjg)!Px)8)r|e;$T9Z+ z)r+zJlWmOsy9{LPfBX@~{zKj{_Fq%V*#EijjQxjRW$b@h4rBkv%ozK3N@483t3G4@ zw-Olp_nFApznMQ{|MrTE{U3H_?EiQkWB(tt8T&7o$=LtoO2+RtYhrork%0>BYuqiSCljM zU%!&E|4WA$`+wle*njh7#{TD4Gxjewhp~Uxsf_)n>|pHQZ#QHAKW!NMANh*0|L)ru z`;W9`?7!_bWB&u>8T&sf!`T0*C5-*Y-C*p0r4D2NuZA-AKdyqY|3UeT{YSeq_CMB= zvHuw#82jJ5g|UBSSH}KxPcrsj+l8_Ji;ax^zYSyTUp<4d|BdGv``_8Z*#C_aDaCzqAo!|L+Gg_CI|MWB(^MF!n$C1!Mn) z(v1B--^19ykvU`kJ?a_z5A4d=|B`0L{^#sv?Em0T#{RVgjQ#(PWbA+2D8~L^#Q)*Y0HO z|Konf{=@b$_V1<6*uO|G#{Nz3G4`K5gR%eCCdU4|d}Qq3Es3%JeNK%1=PNPxpJ&Y2 zf8i6x{`dD`?EhOhWB-zMjQu;RF!q19fwBMKP{#gsFEI9h=MrQ8&*B*SpB>BCf1kdL z{l6Q>*nfm4WB+T;F!n$19b^AxovHXwOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R z{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ z_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K z;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#4*vow{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~5dW$8PfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz z04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF< z0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb z1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y z6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&- zOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$S zF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_0K9*w0RZnGY5>6dhZ+Fz z{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ zynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ zynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm{L6CqKf&RD7l;3O9RA}t z{9oYkKZV1;GKc@q9R9Cx_#evQUxLH`EDryT9R7Q8_;=*+pUB}qhr|C04*#1t{NLm7 z-_GIxJ%|709R6o=_U%o5O!s4*y3v{O57_ z_vY}wfx~|f4*vlh{y%c~U&!HKg~PuChkt1f|K%M1-*WhWz~O&4hyP>_|3f(Z|E2zq z!~b;-|E3)NBRTx9=J0=q!@o9%|9lSr$2k1YIs6xL_&4Y9U&7)4F^7L04*$P6{JV4bPv`I-!Qo$$!~Z%C|0g;8zvS?* z$l<>`hyNKI{%>*kKfvLCGl%~l9R4qI_&4J4@5|vomcxG-hksiR|85-qr*imT%;DdL z!+#Qo{~H|s_i^}t#^HZDhyPO?{`EQhZ|Cr@%i(`GhyP0){(o}#7w7OlhQt3>4*&Bx z{3~$yZ{zU)gv0+z4*!N6{_QyY=W_VJ#^Jv+hyPR#{~jFvPjmQx!{L80hyQ2}{~I~{ zf8+3fmczd)hyOkt{%>;lf5qW{0f+wz4*y~t{>O9pAHm^&6^H+W9R7QA_&>+tzm&tj z7l;3c9RB4v{O{oKAH?C`lEZ&EhySk}{zr27Kg{7jfy2KVhySM>{?$4B5907Yhr_=N zhyM@`{{F>Cvx2ez%VLcEn`ATgFKf)$|B2s>{qHJd?0?<~#{T2X82i6)jj{hJa~S(q zc3|xP^Ebx+ugEd>KlD3e{}O79{m+VK?7#6eWB_27zWB>iGGWPGkp0R&XX~zB!r8D*)dY`fXDk;YPwE`IX zcd=#c|Nd~s{y%+S?EiT#WB-#v8T*g#%Gm$5v5fuq%wX)_s*17y<86%nH^(scuQZsk z|Jw^0`;QvL*nd$OWB)a(jQ#hoW$a%tgt7mQ2aNqM{leIP+ET{;r%h+x6J$t|EKK#x;A6~riU5(kG#m(|7t77 z{_m_}>|Z;GvH$${jQt;5!`T1ae8&Dgr!e;KB*WN$>l?=YElL>s|B%Vpzx_|f{>Qm6 z_P^&OWB;#H8T$`RVC=uJjolW|5F1Q`(ONvv45Ke#{QFJ8T-HC&)EOI zqm2DOJI2`m^sS8jpZdz!zkV!Z|Jz*|``2B}*#Gd(jQwA-W9>!l^OdVjQvLsW$b_BT*m&twKMjA_Az7ss&0(^_c_kk|IK-f{l7ZL z*#ClkjQv*(Wb9u|p0WS&PK^DJP+;tT)lOk$Wd&pZ;Wdo?f9+uGf20Is|A*Hx_Mf23*uR=5WB*V0GWM_T z!`T0zCdU5foMr4^#*nf9kVlOD7d&I^zjhX5|L-<1_J37_vHxLR82itd$k>1OA;$iV zcQN)qc|K$R-!C!tzorKj|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9< z02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb z095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz z0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj< z2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=Z zCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Nav zm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&ev zVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)x zi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA# zCnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{ zpO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc( ze_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D z|A`6k7yRd60HoqSF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~ zsQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp} zpyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_ zfQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz z04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF< z0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb z1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y z6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&- zOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$S zF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRIDzQ;csBgz+u@m8F-`1fHXc^{vz zgMSwWpT8sgd>-NF_Xt1V2jk#8_?#ci2jk(q_*@{&599N+{_-3k%oq0u=M{c#5XQlI za2)1?`-Su3{$hR@ANK?EzM$@9QJWN&WC;6 z9`nQN4&w`7FT&R!#>YHyUcA2XddBM%=f~~vIN*BWJn*<U5W1hGlm=Ep` zZijJky>K2l59W*UFmK#noEPI`o_IVlAKV|@4&&l_;XH62%opQf-oo=@e9RM%C+36u zgY)A!Y;it}gY#mG^I}|VF&=J@^I(g4;{M`%!t-D}9FK8vJjTay*y4EX<2;x*&V$=y zJRFbXa6Qh8aj+HMAB>B~1=r(pY;hhOhx1_{=fn9i4z|McV;}be_g}b=@o_$!2d^W% z-tfA`>mRR2+#ct{{lGXlA6{RWKjwq`kNbgnU>uwW$6-Dg59h`0Fh7is`+<32zPLX) zFXn}LV;r0Z$6-Dg59h`0Fh7is`+<32zPLX)FXn}LV;r0Z$6-Dg59h`0Fh7is`+<32 zzPLX)FXn}LV;r0Z$6-Dg59h`0Fh7is`+<32zPLX)FXn}L<9dvP>v2BJ2jgKrm>+JB z@r2{xyu#ZF$HQ^B9OGepoDbt*p4i8HaXF61?QtB&#qqcvmt!6{9`^_1;W(TJ*9+&3 zaq#%zd>9v(9Y+1Lwp00`C{RKQLe14&&l_;XH62%opQf z-oo=@e9RN~1M|WC!R;_Et{2V&=fQk29_Eevi}PZ9%oC3%=7al#+hJT>FPsO?gZW}S z%v*R~jE{NZ@x**^e{egDi|d8+z;&7 z59Wa_#>4F~4{ULNF>jntcpi+0<1sFd$M`r7TO5yloCov9d2oA-hvRV^uE%*X4z|Mk zgK_b=;Cft+EzX1Ea6atgd^kVG!B%*F?Bjmm{tNdpKF){pV2kVj-uA+I;P$wGm=DIo z`EWh%7q)nP;{Ar#F3y;TnFfWWN z90&8lc$hct$Diei`;GJBc-#-+?Jz#hC!8P7i~EcFiSyuoV*a>47#I5(2ahY}hj|Id z#k}!2VcwW0&WCwn9+*Ea$L(-l%p3Em-1 zdwO&Hr7xdvo%K>?u3b)bY~0aV=S;tE{2kW1VDQHQ-KGutGJ4;Q)h~~%8ml;_d(cqR zq}dXg^Da2H=iZO$zC?ees#Z-xpPJF-rmu!_(c(qX-B<$UkTsPYR6 z6P|oAJUH~g@XL3X-1)k^$62ukrMHilZajYeVUw|^M?YEDoGpF}bvw-%(e;eY>VTa+ z9gjGTOz$;yoO#mTeJkeN-ef1`bIM`O;cnk72F`1YzyB)XsdkKuoBj9S$zF%js_(^3 z*9)DM-PcrR(v?i3+M*XhV|~eAT6+08ujIzeV`a9Z{0llsD{JZ*TiA%mbk@>0v9uMH zRq5KJx78pqIaO@~(|&g1@@hJUefkfUQ0UUlsIT=9Nkw(to@N7vN-1e{?`1yFJ|u6K zX-=D7ip@mN%ttGfopt&emp2@jKBAbR_94Va{GODX><^nhqCv?$B|hn>iwvkzO@%n64s91tWuBEw$;LU!QjN*ASg9x8@7#TGA9_=bkZ~ zvsfTC%zCm);b6mL{f%ZaQ*>3TvRpOR?NX8n7;O~ifrXPhsUVRoHnJ!eaC*; ze!F)qK2YK%vE{MnU~j*iq>I7Ey1gwPjeL7nO{t4!gF$4SY(lJj$WFUC64k>bZAv#3 zCI#w?9XQmqy=6+THQwXGJr?iUF}!#7pk9MLOOACJ+ii!gvEThzlc*9UHH&A%wmJAE z$ZCe_yX#q0OUM^w9Z=Q`Op=^*R>Ed!eE%S)x+I+;Bf1VaJZGe0S`P*7@r4Fbg3j?V zrc-t%8?G5~J#$xSmCEoQ&E=l&17wbMZu?-o$ZFmFH7kB>w~{;Ht=HD*p_S;}TX{uT zuhmz2cac7ByTkEKmsoM1^pd0PvBO0BxcE(I9i}g$e#m0qH~p*>xpA5gzhsSePRvg6 zbue78Z-0pM9zB(T54~)Tj8T@^v>-?4-hSzI6$2kB26>4)&Dhi+H6Tayuw_L^vi2j9 z@tbGZRK+x;n2xg4379J1{B8M(L!xgF41XpzYS`hMKW{5MpHvezXw{Fe8!|=aZ&=^G zu4D1mnr9|aA(wYAj3|%koj%Vh;6#Yedhz!|<43-HD;6s8{P63^UVEj_%yGQ9yy9{4 zdhb_m@}CtRKKZ;ywynrLM>F`e^4#1T6AcQkR(3oypP)ZIOjS31hgNWsplh{Mr~1!7 zE|0q8IJW8Q%P&0(oPA$ESdtc(o|JX@Vw~paQEP$^>PDvAT~V4pHfh*^lv00-fxTv5 zpR?d%UgnU?QU$N`BNZbRSFafMa8*m?_Q?Sa!}=L6-eprPzQSzB;QsTbRVvE)y;)cG z>F{~)uxa-cgI#om#FhObH(xtD9G-sxr^{mzi6|;677QRLH)Z9!% zqvxXL&7YrE>qtsHuw5k4JNxbSyw-aQ&27fm7mdGQeD3&gpLcCeG2M$hPaYDjGiUd- zy9JFc>$Yw^vNl`ueLv+9mruNI>N)sFj{_y9%F6k6Dlg?NKj^A?pLpck>1^Onsh15G z9oBSdxW2c%XNHtV{4eW^2AdQVHgq!G<`I$XZ+&~mNQdh`;~d-uJxi=xdZNN??$EhE zTTWKj*l(QIb&H?zNb%zocsReu;NzPGt(b?p5M)%b9T~&G= zO=+Aioe^hwz`xbb6ZY^c);jUH|yj#kt1-=kztayOG(AJ*#&`PaT`} zYo^Q6*{iOl$(voY+frC`zNu_lxXg?5$WK4I?)3PZ$_E-YE3JKH-rZ)~ zM2m4A&F^L$x!p@Gc|g+(qdLox$1a5|+Y&hXuI=NK3E#I4zwy+&*uvgm%i#U@Z$@n1 zcHl?<*3siayyM4@b`8HWSN+J*#*>HKE`_MLn*;}}uWh+u=`cH?_n8Uv?1DQACvSCdQz1i1Ih?yzv{}k$rm0!4$H&Wz9DAw^IN7dy$D%K6(^{Of?QF@|<|_Lt-JP4xM!POqB*Hyj!5Wxx5_(y_v${w z2TwjV^ZBe#15K5uKQcJmtyk>5CB1UTA2aIGar|ja(LtA$`nLj?x8HgtnE$Hb!MrSu z`%Y_DKauW#!RyhsxvzW3>h&0}qqgArd(YEJ+Eb!d4Q%q+x$n}8V}r|1jGnu7)w9}` z2&wiJYi@Q;h+pt{;mca1pfks^-V9RNbjGRl_U(@rujYik@9R4JoK2hMkGHd~EZ$yh zXB8%9*BZXPSNj0}J7W)dw96juH_dbH)2n;7*6eFKXVF(TD%`~@ZT{NZohS57P7yo5 z-q^8gcfrgTtGm5=cIUL!B9}oyV&S=8ru*MtS&*K|W23)YVq($$ml?~y=k4pUJ3noXoLYk4;PJPobhkCTGSaR8#?zM{ z9I?9p^X;R=xM^@L*Yw$FE+BinOU+mwT5 zuykh6)%)I7ua6vmYgYb|2*Kno8@oNRkDiqAtJ8eRn()&<7Z{H@HX^6HbN~3MW=E&L zI=ZXRw`~ngM{61#iUPlCjyWf{r8z+BNxwIv7KF{%qGcl0$u1p9dzK@M_KSDP z&yPA2H0s{U@(mgRn^!b{UGz?W*}{20%q%7S7kzFGZW1JnJ^KCo-Zh`@KJfBa{^|DW zVYT|B%CT)1v?h1DIrmn;l+-n|=W6O+?=xn{prd}{ZOUe>9B}ugp3~^ z9N{v1;`Cv+j(l0V>1@>2hP58!o*(smvio}P@wd%?4eFV3?@p@xJ@@p_Rf9BKBZgFO zy*{{j{jtN#oPYN%O}q0o)a%{Gkl9m>CwGm>-X%Ry_VUe(QGvA@1JhP1t@`xqjOw`` zTEmS!-L-=+oKSJ-NZqR)sbkmu*|Q3ZE(+`V49uBxZFs`WYx%!BduYDUpSkct)Puz7 za_$on?-ZJ>nDqOl(a`DVqV3m9ombwjBekXPVVNawiY`qce}K?B`9*ot^wie$#UgLI zmg!_}Z~t&B_uIzLJy(Qn6&pHl(;okZy%yVdxo%5z-I1px)9Lot0m1E<>X|so2Qy%~I z(b-3>k}U%Aw{7aOQ-WP;%wPUIu4noFxR1el?LN|bzi6J(h&g$^ZvS>o-R%de9vqrG zL35t`^R}%j2VYMqc-2dJ)u<(=?QbU8jaX&bD89ee*4L_U+^C%+#4s{C&5=^Y=cp z6uO^2`*`X7&IOnEObA*QfBV?!r=v6G#U4$Y@oQh{;m2-IHg*gWT)Z)9oy5Swg~LjN z)cqZTznxq#_Dr(Je1%}KDCwu&EW2&FY#@=f{?78NhQ@E5F0VFt=^Ha?!lte96$%bn zZL_oxZd@?__GP{HR}oQh+nqBT zAG@|B=`ZiL^xBK(UY=c6veLL2E%*;)Z@X0>$*5LeAU59fbPkgow zQJZ#Pc2mf%EQ3!gEaE?oj_DlGH81eCny7ln*zkU;?`5VM+g~4|xXDYV>a4fu2H*Mh z76}epKiRESo#SP{aooY!wO0;SKc2dKSF@>gFMTzW_N5*j-3PWr8uu98%k#6XXyTfw z-C71ooh#j}SQ;u(Rcv6^V|JYMth(d*Q7O0fhHj2Nx8do!oB89;h$rr@eKu&$w0^gb zyv-9#uHLQgqGcEUt0JSQf3(OVqa)eggPYbad3E+_zj`(0r^c##=Jv?CDBsI(TG#mz z(_BIqeK_XV?$wl8JY>YToHdt@tloBV;dCc)nW-17%4RM-?{l(h(5$3!lC8ZLT`s7! z{pwh6UB9#W!+iZNFPG_Dk`L(IYux1V8wXTuuwA@pj7EuZ5?#&^`q6a_dWSLbzzhkI#{M9Er%ac#7 zJfo33HqJ(6SiuR0I>q`=2Y-yZ{jlxYh?gq|4_DMvQ59TTJZN;)&ze$gUpO|3F^f=B}Z!x(AihLStM`oNoE%z9e)@ zNv>J%JBpK&4{a%F>yg=7|Iz&F&d<^5pMooIuM*fFc=&Uc`ZMuYV>$11&)s)U1J$~d%di-srxbL2s zP41_CVgwN`({;Soe;sYT_kCqubmKWusf>5;R!A7OCx|w0j#G`WIQ%ZGmqwIz-);)! z^HR!E7ryB^T--nPgSStS-J^+CV<%@BjGSzBooH>dYIpP><6c*4xIb(E`|JM~d+!|| zMfJt~ZxTvq3nEooqzFix?Yn>)dhbQ5VRmLV1VR#0=x7u~P(V~vL{LOj5YV6?s3?f2 zAfhNLD2iARL{wDN7((`WpWU5wzWRGTzt{7ZtI5sI&fK|k?HDvmcyN94 zmX`-U@$;gI^AksGd;L!5_5GGMo7JS@mw*4b@R?Tvv43VRJ+i)we($j6^J2dq{loCZ z%bu&Xf7zkQ&s?+o{GRJ(R`5RCtIOf--kDD~JXzy>uN1g9>{C&;p_<|ajr}|E`cRtyw$M6@TUi9C3=I(Lo zsKDcorM_9E{n7h7jO%shotb_5Z94hRZ?8P|q~ne4A87uOyHnna&smUj-HVqGj9l4e z>9OElk4^bw^xN$&K2l@lz78Eys!Xl&)nBXj3_sqv>8Yn1R@?sZi9>5PbsziI551mW z^~h6;Y@by=`=H;Q@z)c1jT-cw+NA27y5HP5=N|TRwX0Z9hH#Oi%ZZC(l(ePFjCCd-T_)$=mOp{X>uW2VZ`&P4&!$$9`L%I{IO? z&qE96uC0{t()ZtvpHnOK^;thD+TV4jRGxFD#`ixTdGwxj{eK?NZt#*_@7(zG=qVQq zoUe?%x^{GajHgZRBYOrOP@b>unx5^OGr9hSC3BuRlH}_C*pHju`1O(7f9}v`#_Xl9 z&1v@KQ=a-0v-37p>Dpt&kk6i&_tl8%_vFnyl)QNN7oXh}*Qe2@dH2Qd{pyPk|Lz`j zWd4}B-XTr$XDo~{Y`?#CCbxwzBHcGuTKoJ z1fH9f)%*Lom7;E1P;uIrf-YNkIA6W+aJwfCIuojFto~`MUN6mQ`QgmWsNdf{@x`Ez z-aYwoosRu~Y+Cj8&%WRB+UBSpv;RuF_4>>46-byT&?wIev8{arTR17)_&jZs&fsJ zPqk??b;zpMmcH=Og0(31ZCaf5#&-{0 z<=Zgko85bxywJOT=k%k8kNq)n#2Si|t$HwO{#43w_^;8N0e?_h~umbp6M@ z>qpP%^ZKcE9X2Q4@@Shuw#%>HyQbZup2pR6)>b$$Z~Fu9+}FZ&>$PQAUM;H{qb)%1U07)Km6o>+73<9(NH7t3obsp}2Tt$+UVFZ&-_xqW=)1Al${ zapNX+-g#?{bJX%{z4cz3HKpay+{tx+eWC5{=m+z5=l#^EVvEmzJDogx-iQaj$Z7NS zv(L31@bkJG`gK0`;N))Yr+&4=b6bbntzO%lzit1-T4So+p0?up#eaFetoikXo9-UA z-vrJwT8Ff(Ki0j`K}XF$FIwL_r|Zg*Nv|A(w1+=cKUGk-!+H6 z_xE?LKle_1NuD|dpEgRlR%`{lSHiFb@O zvhHYMORe}puN$W?{%+jOSM3}5$m8msAI@!zpS1s#bBEv9``Ztx1A8@2s;&3?b4|Cj zn&YqgrOOvbAG`bJH~*Mqoi?hg{kl6RS;zk|wo%@uH+o-_ckjS?PxSg`)3H%)PmCS* zuCecV*ZVW7o~YRChO0K+`p&uAYgFCx(%reshX=o%J9fnS$JUKL+;_{1U)AW5`rU+! zbDn;2|1C$pxpe%4_Xl5aJ@R6$)IV-~yWyv6?)bEMwWPSOGOPB!TtEJ&T6ZpgFE{y_ zcT+m=X?ft&erdN~GvU!;sS6|w4PX+sXJ?HPc`^nEX*Sh%Z_~4hf4Y;Gi#&P|o zZC&~J(hftOdHU;b&z^MEzVok-A2=RwEWT~P<%Tteyy1aWpRByS`QF2g-@2fmSfU2^?{?hq>y+;YHaJxA)VW7r zZqnrNgka58-3y)>xhv=K0n4UOney@6rI(*-{@%u#AKG5~uHAzR>m2RlZFwl+;kFg7S+uYVIJzE8o9_a@id zF{DG>EA5Vb_VVnfpX$-!z8Z}ejySua_MX1a-rD7>CY^rkV{JMsqsoq|-&gDX7&{_Os6wcG3VpPjt)`TQSRjjb^_bMo=z>4{3C zjALhK=2X2;?X-W~iC5JriFNP1aOuWj4}9{&g2x7=ue`WSuQFlP*LR)0T-}rP_R($5 ziLGkvc6{gh;#8xno!xgmd*u0B@7X@|`U!eg2=% z&0DrgchY`Jlnq zySJWc`}#9q+7_Oi@N>`8H{SJYw?>U--F@c5N9$${Jor?b$}i1q)3KYc{nH1Z|NWNh zo_MQLt0~oI?%Q4a{jb0HWZFxeJ>wJmA9-Zt_w_#7bGvi+z4Mp+UiW;yo?7$3)#L9` zU;ibu$&Ib+?7ZWPE%nznj5)O@{>xnT)R~*_|H1R@xS17_{KND99(_aa&VRmokDju= zN8OvEF04B6*jnn`tp~o>*U{wN_MLh(x_VveB}E@bjHP+%hO^8pYQNS%nhGkdZA$T;vPSL^nSJHdJMVrV~Zt+ znosln)itVyJE{4pk3Wib-*V@`SHcPFlS z;r>?+Z_P`7=kc@EosT(Us|;S7@N$c>&D#F({I3bu^{@G7wlk&i!be}YzVn`+w{E}h z-i_Xd-@JMB?OwURe0B40&$j=w+Eh!YSwCl`{xbWbe^b3BjXxgu)Kw!sE?BtYqqe_& zZ^@}Qci*qwGxxSwl{uqXyGbK5_dR)j#(>xEtM{^Yan;f(-*5f3>%rZ19$wIE+Kt!V zx%jF+gIZshUw`?qwl@vkk@4vEsZ;-cbMo!=YCV_puGZzD8?1FsJTYqYfc#|>PS#0r z{kr6@H$ERW`1#2SH z46goy5j(EqKU z`@}mH8w@|TVQl)m=SKhd$3xyPvhLk>!@b(G%d>yjyv*f$d`o(@z4zsv+&fPrg0v)^o4#-+c2;uJ>1r{`}LVn==;H@pXT?e~YSXYvi`c9{Ts6b$@$t z&iaPm?izHBbJ$gDw%RI=`DN}?&AZNYEPAN&HKX6@<$ir_%f~*y`tQjDpPuz-2jlZ! zoNsoyZBy%k7wb>`KCZTZMz#5eS1;)?^PxKue>(N<_@95zpMAjM&U!rlrD^x?@U1>l zY4KZgY&p*@NWHe1cTxX$zmICAJpQ5I84O(Na{0@a^WxHf{O0^OM_>B0|H;^M@4Pm)85|N<@2_?&+i*K{gXG=w=DScjzL$yHD*X_|M+3wc5Zy#?T4Z|9;p1o zq1(Q_x?z={au4>l9QgZqKf88m@wY!c`a$+%zb0R`dc^GwZf^O>)W3d@8Mg7SKF|H} z{m!}{thx2$lW!k8am}l3qPtBv-Sd&bCvIu=ai5oz{AYKyTYS~T>#sf9_SJi;{PE&L z(LdBVx8vS%(O=$t?aH}{JGQKNa_^Zjm!kT=wqRi5(Is78{(Zn#8#+AJw(sVp_NM#u zhqoW|%0o+kk9lF@@!MW|?ZbB$Ja@;WH@a_sHD~qbPfb0W@bXQYrh5`AbbR6Xa9h8F zV@51&I&%BNi~3&wdLU`}(GFj%f3V%1UGLv=Rr|ejH~v=Rk!_1xyzUv&C@(g9Ud-u{ zgAN=?YxeQY@85cU>xz;5%a)(D?%K|>XT6fW@X6bZ+l%5iCCzX1%!0e; z{Gl95nDf@`Ge6G$uIJ<(KkWXZV$JOtPkv*)d2!0DYmTk^^XzMfUs-ckrziC{c7HhK z;d_n+9=he5Yd3d&^YrOwwOT7yEKBO!^Th_MUcI~NjnCbsf4lvQE=z2GzxI5?PhL&< zVqGuoU1Q~=*A=u`bbi>HnZ5`p&5UjPD|eNQ@c^W{MMj$w z(qb!DKh$&5sv%i*2A#3C*=X(Y+33T@(1a1k?rZhNL%&o_|FwnvK(nW`j8xycH!D@O zRIyg7RJmqMwd&QYSYoS1*Q^#5Q>l`*YL$wWYs6S%s@AYpkE&cTD!Ovzik2!>YE+G` zS+RpOIf@7O!ynDyN`FUgeT-f^Y`sdedNZ-5j@&nho zZ~E&!=ToPDoqpU_x57Iu-fZwt#nqK-XMgi!>ld=BENFjCqm*&$hIje&#kSveS~%iE z%TICn+s02h^t!MAz%d^j`Q_P5Jq9`M?Dco_Z9}_0zH!)-@%P@p*89iqmp;F?R`B+gT&)*JMR4KpU)KIDt$*RNRI`{!MCPTo@O#3_5{s{JapoUrfc7XN(@ zemDEf0nfB$pA6oVJo@4}W6pE2ugq%IvGLQ}-#+_gX0rjW-E()^jXMH;WB#hX)#j_EPb{gi=lkxHyFJpOX3of0>zQ>}W?h$A2WHl7 znRQ@hy_Z=BX4Zw7*O}*==b4|I{hR%o{h9rkpPT)d=b8PP=bQbS*O~QZ=5^-z=6UAl zX8&ftW`AZs=I2AAcHMRM?G_D&-qyXIDZa`~gXC*52ypyR${r<#1;|H9*^ zJu~axId$E(s%;OBNvwF|p^LR9zIOb<`OnNp_T&Z6)5g7#7mTC8FzrZQa29R+ zcX`46v_sG41!E~>tX20?a18CFhL?gHQ+)jI>+$Cmx3c{FZeG7KbAJ>QZSB!#|w4ygPB*+fBpR6 zUfQ^Z`N0OYc`k2$P`{e~X|ri3b;%FzqTM?(KNwqw`}p&N?P>Q;%MZ?@9XdTfxSzIG zW`3|vUEa^;dfG|Z`N5^MaryLH-(txw$Pf0VwN$+v+)jI>{^ej?1Nv)xIXH>-NYl%~ zb+o5iTn?V1&1ro(*uEk2wCi$k9&P;3mxDR9Lt_ep=V_0$C><a zl+S4`pB4m<&>p!l7;M~>=ZOynC(*|D3+KTW-3h%k_?y&E>G1lgv+Ahuq*TVpO_YYjw9a=x&Yc zZf(=es`Rm*ids-XQPHtcRZ#PsHb=;a)oz`<_C53VWiU{9-;i4S#OG)*$*I^6#_Hthrc z4$TjZjJZ9>#m4oQ<2|hks$hxd*qW}`D;YB*jEc#QmWh*oCUC6QO}WA5{4M8CmXz03H|vFlF)uVP@1tIPG?1=Wa-YQ+xxuY223?*UoN8PAJ{3+Y(U$W1Lu1;? z{Cr1$XE){rJBR1zNK}kHG(Ro*%)(p`+?*F2DxYz$kRC?I_@W|8BRZ$>Q5(+7+>#d@ z8}5U3t{r8~jT&#wjz;|WSrIL(kJ9jfoFj8DK5*UEyx>idz6gz&O@%fG3$AhA0(Wq4DL3>(PMfbF> zuI%F2MUD*@xh|$FInfbaX;D&FayU=c@dDR11{YK@sLQEi#@9HS)MzBmy zOh4mE5TCcgMpF^x)mwl}uCPWm#o>KNGgo|l3Th+imXQ`bdo zWAsnOOe1%Vik<~-#G)WKafP@9yT;`b4~^_|DQK4sS>?^|-V(YLeXzVi^|J1*6tkg< z^*|*|SEb(8N(-)6hM6mgC&N&d5u_Jl>ao|B~`@vQl{iAm%_`S|TF{ z#$5{LZ@xlbE8Hd4?Aa@fZG}7LrgCr7%gRS5%e^Y}QFOU775YfK;z#8hyU<0Ks##aL z`&!qz2U@+M15Z`pKz9!Gwr=Dn$K6jxRJV3{M|W1_XaeVk&N(Gr6~4PGs`$J9CEmqV ziS!0+;9ik?bc-(U=%aGyB=a8UOZ4-|6*Q3nUspNOSvPKh(u9ZD)x1TChl`GhoLk~( z#s3dSJC%DboM1Uq`F6u%4h3y@GJ_QIn{Mes@Q|@z`Pg{-*fRLak@f%8A*;Ohg~J;wPV8@skl(`hW#Mg?!ex6`YK$UwEEFao>ti+_xw? zrdlDE4F&Qmz|rCpcXQpk)~pX4QMv20qIwCt^rE%AA$GH_z`n)NMRoegiO&yyE;7kD zL=>ZAc0@%&p-FO2g>$M8&JWJOzLtB>oRXL|y=wXQ%mL5!q>F6&>pC_+D9=SofOMcLMCA?88 z-r82KRl@Bvo|cSnGW~t0f?0jsBg3nDFp`Cg5N~7nbO5iFuO}gFlHCFME@rxSg^+G%vS@eYl#k=l*FPEpfL` zYLq9SA)c&p9oFD)0=5p|!$UKJQz)<{;f}8RGqVLsw{R|#zG<+SZwv-so7!Odc)OU_3zKIOrvlJgPf zjxTWSgdZ*k8IK0CMRFDLdobbQXP;i7#IuW?&*7S-wF-i1%dT+$b+t;&f173H&;L4n=Nh^Y=e%Vt zd5PF7^p{;yHY%0-JZNvl=x42qD~_?QsEBIuv#w%q4#td*;;6yVZpDw*iQ(wD$WbP@ zVjnrzBIl0es9ec#M0VFPzUogG1cfs$E+3eo@Elbl`h@U41rv7`M(zS+@{wo>`Qi#A zGBHt^Tz;Ou;x`rqM_kFLtt-i)L=iVu@Iw)i7T{+u zLC{kq?;$zaYsRH-TMs}`9wBvcoS#!6DkG!B1niYdrLPP0^~JV=;HE3dFQBVfjv;1Q zx$7P7tE=R;wig5sOXp>Ep(lZHiN3a9VUA>6i|K3sj)LIx|8iUp{Eu;cOkZutwW;Oz zRc2g$uh3UKTDo98&oFJfAO?XDMlWi+mX$3AUZUxu-e=g9d+FdRuGV3sc@;c}y>B+_DP2tZkN7 zBqy|}QeUfgLFGQy_>_>L!YhVwYb5Cx=D+DDwqvj`=P2F%_xf)J{+ogSX5haW_-_XO zn}Ppk;J+F8ZwCIGf&XUUzZv-dcLr8m6(8zwQlynISYD;uapA)jQYqnAt@uzY^sKyA z-P$MALO+CGDH6?EEQFw;S8SvubPvCed`{>WejjQ7C!ols`$|gkC~}%4>1O z_)u#e9}{_RK9_Kv@}le_^fK>X5DY(0gUI>8$a`~sFGSuKM4m5l`Tw(~R%9JY-_RXd z-`ozn^w4#I ztjw%*qkUXPR!WAJZqVV(&}DujE-AC4Ig)Uz*z69c%kA;{RKKPhfmtO#wiJEdt$UB2 zy?T$i;^*P(6DKE4nVLK;B{gk&dPZi}jG41$&nbS1DIdj;75_VDowa}KMwKjU8{C`! z)F;S!_1D(i@=ImQV*|6Fe(=u9mL~ZX`r3DyQj47SdiuAqM)sF224%kI&YV%P?$Jpb zVz2MMJ}N2k{`*eN8<4;M&a7p-22Zbdq*uotGp2NEHqY35d#6J`{_y#`O+OzWyKU#A z+pbNkF#G$_hYuZVwEoLc?>)dbmG+Q$~;g(-3xfb3qrA@xC>N}m@Z@1-(%s)DQ`0c{ouUBvWtLN+k zPn;X!d_89P1CFbA9?$wT=BGQ_AKP@3>z2t|8>g?G-*tlH);pK?{qno%6W4v+_wSDa zb`xgK-% zueGRNv&MCA(^_mwuHNmY)sOV)vvteVa|2T5>%Hg1PtJ1aB9YxwpxJL# zx9?otc<0l3AH2Q%!s_j-Z)=deq5H7E_Xj%c^(k|@ytyIuv!k7xJons?=N|aDPUk_R z7cKt1f7kT`d)0SUsMx>Ff}}o`Jnir3@Yd%0s~mh_PD96yeU2WyYtQ%Zy#1JOWR;eC z3Kne{cK)qrf39bJ=VH?{(R)6waodK^HVzx>+PB5sY5!9nwp;dL(uzut-hZgwl8dYN zpBU7o=k_H{PrBDk&)qq=Tepbu*`-S++qC#vFd42Q!8daee(6qjXL~(`{51mPMvr>b#MQ%>rbvq=`+8{;a7fn_vOCl zewp6n?%9Ebb*{~hic>3Z{_)kRdB;~4jMEOk9j#nia^ROEj~$*HcdXH`{qNu1_mM^~ zeD+EGi+RJ_e7*SD4NcB0dhfmlYk$d}_~_%;Dj(O5%bnTetKIgl8xGIe)~`ZN_SGM~ zVypLS;+f?k%DlM#{J;J?Ju4+MX}JR%M3L=NlnQtIxC@f=%d1`LhlP7^FmhG zkC}e(Qsg})GbLW8zv+=WElo{V{mF)9MAEdhWFsMb#3**d!Rj# zOLD3f>Tg79R=Oq^=|;l9R87rHN@eg#^pmD$PPQZ`r5F}1H92cqiX|;QRWo!faq)o^ zJx0HjOe4`qXA%-qxSf%r^V}&$hPk^UeAUooH50o&EumNWpU2J&KfmdRuZp}kaYBR0 z`$E4T8H_m}rX@A+V;Pu~i5IeTPf9E{Bg31WqR-kbeB zQ|kJyrQW|->iqC1itw;0FQz=1{hH%3<<5K_a~!6A_Dh+8!s`|>5EdpS)0l<0A@n_Z z8d|btM5dk~Q)cO{W@Lu{8VtO#3|6P2BR40dxSf^}vol5)Tla41>FVszswRZ&2@nbM zVZMsiuUAUeG$S1u)Dyy&B&Fzx>$Iel1csDlSf;77B7Y%+87wlYU+g||eZuI_nP%s- zMg8}jjm1dPBApiml98$=OyxmCe~2+lkQ;~IB^xQ0 zUUE``NVX**{7|LupD=iwF?ds7}F-4w=GrRAx2(kvb; zJZF&^EjGuaLeCj-5uwRQ2+xnqOZd@JQWH{=l3C2z{^GMPtB0nt&Kbq}8>FULrW&)u zAB2XMXrx4h1S2H#&&LVjxs<;qs~MBAA$>zlc;a+5Q?+Cmj9Okr^VdBoGhu|0X~{y& z(vxS4ZA(s_$;DY|Y5b17iq6L!=?S9^Ei<+7!xH@sH*f_>GmJtLl@>8*p=A}@Cf=l| zzrypwlbI0`!(yKgQn9kLB8tPGx?xFAotY3;pRfyyyeaPB%lLQsu#@}>JNKShsF+y5 zk%9^mQZfw9l9--qWMn3Xp192QTKep?%+yYibIdl}S)cHQXk8c+&_k_T!}4a@ow}vo zUlVz6%41xq_mOG8qWleY+3c2K@@uF~u{$lpLcbII$rvCz7hh@okuy3)+VJ?hhptK( zNepHQs41ygnIR*i8)*U+3^fq8SSbP~B61x1JA6VCXdpc#apBX@bppc71Ubcgj4QW# z{FOf|=aao^$@Am1lJCp8By^}&sr%$4hOb)}Y10DX_ZK4Vk;wUzjPUVLC*}NF5&1km za$Py6{HsG{)+>xHGCKLQl9Ex(@IoaBR!dIGY{?>}bZ}VWES=*lX=(~iz0|8reS zfr}J1Iox64RUu=X0D_yTrt1luRQO5wkCLBfaY9;Vx@CfDnc%lfFf0=SmI*1A2^`6^ zOqgMrFiTPRWf2P}eaZQuUvd#65$qX8VHkE3ZAH+OAN*udflQfr06Z{$L$11oZ&I5W z!m5@wZOf5w^ZC+1XPM!LYaeH6Yl-V{W1OW$#7&OZ!_IG_W&A`$JZ(Imq^gnM6T@!` zPYD}VE)M%J{wQ=|{2iK*IIJc{gtuXH9%q>kK+c*LXNj9@@ncwViQ_FDJ6gJMN(P3L zTctYLuZAfn242< zBN)YWBO!bsJRg&dSqYIzws;*b#c-((!|v2pWWkelpc@6ZfJ_l z(44AUS2d4aQ&hjt9q>Dxn&NlqHj7&F3SITO9DYT21iW6|=kq%hyVs$*eTG{%bhqDc zfrcr5h3a<(oIbZd;J2$ThvK)}e1U+&p*U;-Lvi~R%QR*{O*G>4q(mOh;xxRv&KYi( zV)xlqze{!66tCt`Rj0@2RQ$#JmcRdr_0d&_16s+hI_-ME=J0u34wv2QbZZR3;nnog z{e@YkK7IT3A24vx;2}eY4IeRb)aaYXj2(C7I~8$M)FQcj9(Taw)4dMep(?uOW9Bu7 z=5_}hMnLzLzF#5zRn*D<)nBFi?=>q8mu~2t<632e2)d+{w5&`a^;%`LkMr|qVrr&* zmXwl_X{fp-Bx2Ka@ip>t*mSqXQt39gYWN&BzsI4ue7eU_G{x)FOxiVkGQa)0;j(Lf zE;Aes!|Ap=U54Tc_;tUIRN>G{y;P^utJplM8nD}RugmTVXf{PPyc}_R?7lMV!#`f& zP*ktY?Q}VP0mEzadOh^uHf)+lu{q1ghwkz5kwfvSs>?47qoH~cR20K$v+Js_)Nm|{ z6UlaY?E$;fru!W(n`XHA*BnqK!xK=9GUMkd{Z5@_)*N0Q!AEO&{0uLkX^P9?Hs{m4 zP^VkO&gTs%D1+iOkPpS@^BP*f>*Pjd#-nLAkITUHoiKA&NC`#c`I+ifd- zzE4qXF2(0{Xu91QKvCU3wh9bsy*Pau^=|L zO)s;)nj@g;4&CFn`Rs;MQ9OFUkA7tx$1zf7jZL?{1ERxga z<3Qm+B7e9%21}#b?S8|d`CKklbNY1EZrE*#$M5#2=6p&yv%Ju6AJ)!r8E(H*?2_H( z@&}B7&*fHZUZ0|(bBaePTxZqi^EnKM+v!o9JYJWg+1;$8uISz(xuYY8 zN3%P;K8J2cz{E1CdcX?<&dPfYKW2&{7p{X?2@x~lviU!e|0nZ*lJL@#lh7w8YJde& z?M}bb8*sTDnqP6-7>-{H=yr$4sUQaEVdOPss_@xDX$z|@#I|tTLT`sp@M3HXr^6FK zzEw{^LsE4c^62*&s{H5hc-(G}ztHYr;(eOe=W`o|qH-6YDl7L-lHQ)uGz`n$L+QDR#f#?)8!g(VRBa z&#%}5UKCb!+f~iwXFBbLdSZ7dXsexb6_@U{+r4flzRlzDqa;Ya!>+2xpW)=a;z#ij zbqxjbnDdSQ^LnvQtOk;yX)fKbx^&hDp%=^HS7aJp8gARgc|Poco&QaBvuHk#rutNu z%O?tB_&hSdKAeBR4IEH?hQfdNZJQH?^a4NJSae2GI1lzB*^)6CfC+EBKSZ|llha19I_`R;eahcEOS3Rh;9|cux_$|-_|0y^n zT{Y}Xn_p2JZW~6!ZS#0kAJ1u10s*%zU>Cz#q<3b2sD|!Vv4nQT?eL=TE=|GsIuz`@ zTM^siV76U83_j-H?FqOINLQ@9Pe-q{LOD14(*iDLU-fvrYQXEj_Om{Q%ZJZUoIcba zr@)iiYz7bDQC&7QfCY3Z4v!iz3?FtTuU~_tXUO#GNj@xXp zRtho{aDp*ihSv{3Qye%MpQ-`b6ptMUi4gh~dIdA!NW6Zx0*Z44cya?{>~(XNU$q$? z4ZDhvsfMQ77?>B=Qz)nA{TvP-PXHv;yt?Lb_?RJ&>Shl8m`opd4!`NQaVNVP;5Iyn zm$Au$W2yZb2oq@rv)Zw*h-APOFnB7!r$h5P5h3$FW=o&4wrCDh<}pBVIJ$u5@!Bwre5`dl|*iQh@J<3WdoA|o&s2o z0R7qUwq6fCYIfEcwXykir^gA(@-i@o7x_>FL<9KFGI&GR)qumL+I(n<2k)q1k~|L7 z(g3X3cz8RLsDjebb&sLi6;z&=+v#_?bkqR|WcLBwkt-A$yyC{gvd*dl`Smjnms3aG zalq(}S4;(x<8ua7S4g)D?VPzD+*QRixEU9qOi{5py2o#zh(J0gcFd#M+(y9Z_WCh~ zoa6C<91uH?;$Rt3%z$olX&@7uU-1NdxFX%*H&hoI=+ls0#NF%CJgNt;$u%ygp&_+6 zd`)#Yon`Ec7xD4=Jz`EAHV1>!aG)N$7i56-0y_pg9*-QF zWJ28@-48nVqt;yJ1g!dPs!X^~9$TK?YdFwBmx^8#>KQ9%_Yx~Iat+L@>IzoKX&4Mc z133gVEF5OY?bQ{QN!7Ul2u3elC!wb>JuaKqgEhl^D7FwXG+b_hIf_s5ViR=T8;T(m z-AQl?hA))6fR4N2Gmp*`0&P(_%!&)~3>er3A0Xf5GLSeOL#hTgxwmM^RI=Ki@R1qx$J@O!@hB_;0;XZP-FRoMP!1dkB|It^ z5N*LG25cw_=gL(c7x)Mt=62ih>evXU4rTY?JH|7uL1WZ6UFu??USWgE*Q{gCUyUQRp!b|!IH#y`tJQ#AN%=o+#A1QKg1)jkrhy+H%aN-tqyI}+1 z8k$$p;Vd+lh7rVyI_)->H=qhq_7&n{b9~rbuhSo}2mHV^CXOI0VEFBt>Sv<3&=6=N zeg%;hQbY6F&_oxOgWGb*?8j^|&|c7y3%Z0T40!LySP&`le5#Mzc+hd=hF}n`1K2h+*xz?(-0% z=?=~_`!QRe4Zn|U;5R*-WkbZBZlB+YCfanMgB{UU=|aQb&=uwp(y8bo=EcqTn?Wo4(sD(vh*U{Yu*nB;=`{4sW9>QWFeOjFW?0BTA-q? zJG@A^!=`|HfT&Ec;U*4c?mS%O!~g}*(m^SR8{hCE|@Bq#)sf_S_x$i0A}!M?#Lh-Y#!2LN)gkDoKa3k1*@N?qgmfdo!x zfC$?VVoOyKbvHKA#=TUh1~xVCW412DgH=&f-HB-U?U*kwW9Ep?Aed@_i7uh+@IgcZ zpah>A9rb8{aDb8@7{FSgkRWa%8l0yOE9t}kI$%r+{fv1(Vh2n+|1hA-@H?=3P?j(l zP^6d|bk6W<*h;%yj0F!vT;fLwK(v0JjzGFp33qHja~2g31x^CD3HH_%fg<)Y^C_ey zde5X0m9W}y55!mqEVKa*f-u?UAkZ;1;3%j-aR<<29-A=SZ5O-;twrSHMI-TM09KTk zIK$>)5eWA^#q=+PC|TA3@~){sE|8T=^ZKc-(>0I>YU##2!bsAA*mIYczytKCV?!}@ z*hvB%Y&=T``vX*FCW%Ba?M|X=u!#%13CKrjb&0Tbc^KF!_%b&LNQZJNV_%qB0X>K) zme=it{_&wI1a{240<=*O5W5Z7=0t8hP%mBrPaV^X`36oKHpQ@^K}Zk)A4UjZXJ{@D z{Ea~{fVT&nDt;#@Ou<6XJ(Gt7VfH!A5h%l7K@OmbtcsKP#RrECZH31KfI=hs9sKLo zjD#61+dFhI&n?tC$`;AoK7HOL#jZ)W#Ut~zyMYRmX1Kq z4-~@B5SPF?5QoC)It8bq3m77|7)l}kINyzg0(ZF`a2U-4O0qo21ry+hzQnd^%pp+= zAPfxeayVE8!X=*%>cZi0gF6Wt?PcsA!s{~};=a9v8JIrUVtkYWZ5)b}AvKPoF z2Hoys3?9D*?iDIeC|;;!7v56Coamrk+$YG)=EYKIFxqa!(BqXj(j7nxZBQTRzi_z@ zCw`*L{Gk4LD8mb^z)v$X7-)tNc51_)uw@&O~MOP-#Uq)mK9$#<-QS5C6XZK;ffLH4<>8VGqOl`9K1G@Epd)hUdm^ zvqn%aOgdTteGV7`*89CSKf#F5&X_Z|f&a&)n10G^iQoZ5PKOT7NsOR4Nj2!;7l;Tz zB^VaE0jPwE;{^RUWINc=X2bMgh}>EkePVpJki-CkNm=+M`X*lT8xq8NJOS{k-9d=! zb}Gc=ggV4d1SZ5NSS6=Y#6R)SLP5cKfRsqq@w}Kg{uX46o&)oRpJPddiia1$iK8e) zs5pCnA-_#(hT(b$*2v-bN!2h4p{@*EF@6&OC&4Wg1a=oc2t;xbpsNwwITgRDPAwh* zL4*(^5@^G1Gxq>O;xAw z*dI(7a;Bk?Hqz1XBxGc;h+KkOCY)D+O2h>M`C#kq#9i2E?)6tkV?!~gwrWLUx0jJpTVo#n|UCd zae{m_SR@j9NTE0p2LgawgWrOd!?**ioH*71tQHOv1R(BN!cK4kfhdR$RlvLw-jWXG zWEf~aIZ_*Oy>C@Dw>G0Gka5X_;3S|`JC;#rv*PyyhM^r{O~ zCcK#f2^~O&5ik~pc`$(T@DQ+5(iJ5Xh#CPHjsm_AluMXR1P$myl_6Ak1~+jSuwU>u zh>kopQJ9ND3H&S68Ze;5V0c3wNWi{AI7FTWk%iKQXg~@i{Yj#sOeisqin4-{F_VZ0lI?NwxtF*W?+w!gjR|@s!-su>7sq^Qu26wS zu|c^A>)Y%;Q1AL8VY%6Usyu4u}zupbNOYAV)%Nn-6;rawfo~*aq@h!Z4%}`-6SP z1~_DCAT^-`89fXE!i{axeF`ip6ulqJPsoSkh1Mr83y;jQBGA47c7aD{(U}(=1=dM| zh1ZKDs5u~+Vxk@g6cKCzaT%c@sQ`SZfOmodkUIvNFq2FgBF>tF<89=jU?QaU2%+(# zHGUQks6xOD`~*CLIuJw(JusInFs28F)(KTBrbS`!JQ7mri_A~rc4hg`nAFf-tK9j%A!CXj^mCliWMfrBCciSt4Z z;UqC;_(uelViEij`YIVYbO)t|y@SA%gp2_cK!TyXP;sCSI*B7D_|^TyB>@}DEHEEp zhM6KdHUdTCnGzb0L}~_pgmA+EuEQGu4Pn3ZP_{^v7t07KhTSLDCZdqg*9!;9lS9N% zf`I6feQ@Ds;JY=Z73|Dd06;hmvOJRb06hQ~sOXZwgQmiR>uASZV7R4rSS4F zv*-a~gkgj16L!a?LB>ez2lEKsO#ncVjuZ`%^unLP{J>Tb9+8mZY}}mGRf%GPIEhnq zxM)BDJ_v8`rAs(QH)8I_yF#P@A4}At$prmdd~Xmxgi5^OmiF_mvnnyTr zqB`O$>WE;QNf1JU68zc;{p@At3ug^LXM7akQ74FHhm7%}AlNWmgm@|<24O`dDWD(@ zpjZdERAe3wz0~k5EGL$bAetn+3q}@-fJBej9^znV8#jcw5W>QXlQ@DvptwQcfQxx% znM?O45FT=sJdwyfC>%yfqu>R1DDemRJOyE;at&`Hv=z1i7L3drSq%klvUGov8^Z$o zygUNg2_Gm0)(55&=!Ta2fes<2FY~j0QbMg@yZa3V=UWCL^O!Uuv$NOe$cME;zByd=0_up=iYQLC2`7b%-;AICO|#LUSz zIP7u$*$8au=Yda0QYB-AGK+peMnRI3?YDz*ph=hu2nUQFTpE%MoWq_XYM4gJ<(2Ml z1iJ@PGuZD-pq-kYl$b=xu{oGHb|*x}6L&+LONopqq(+IU6nF9>0~yK^vm_n}M>`BP zRelI1K^??gh{%SazyXtpC*Z=cVdU zD)0KU;} z01|VHbJnnEIvJBP`1Ie}8~BRQ&ggJ@H#RV#NQDY{N7FJyN6aqy;b|KUq=mEh&2-Tt8_;8XJgz;cgNtgpm zyaK`~ULawB*CdgsddoZ?S3pO?R5JPS+aT@`;pc{{2TO;RJe60b*|7&-^lC$i*H z*j@qsur{C^>>v;iAliVT*!by zyTU0`IY1l+>5an_$W2zG^!)xzN9kaf<4FLcW0y#iGGHnWso4UX{pKg6t$jDz#TEJVYrXhkQfX5onMhfcXQgpzM@65#jSxFd)bRh4Y#) zE~MmCH`s|PNx}l=-XI4_{)xrap+Jy*YTP3E#<2X0H3OlswkSKr(df3gLdkuh37}d6 zac)GGnz)df3#oObM2nn|l%f-aNtGmp5a3&smYG1ku>jndSN5c3OHzr7XVSqQhpCLet=XV9DfuF1Aq`|NK0X19TnkZ&f>Qen?!(2Qxr)#V4i5!$Ob^f&Y<^%!b^c?!>1=Mfe*WV|YH(lhO=!&lYBZih3am zgdw90477oZate)tbCK#yMk`57((t;Y&`;qG2>nqV>gUK9!LVRa$vBWu1d;;UxIGj@ z;d2op;H)sg7zKbIITBK%q+)OhOfxw$iQ&K{A!RSjLz&~jz{|cRNe594gzBTzlx7iQ z68usSNKaBXBspV9D5M`2g*XL{iTNQ?G5axFk~PROqfwnS@P&*285JrbEM+{g|y6XA9><{t}uGAVx?D3nCT>)I$6TW|4e}7&j;6 zDmI28B4`BLWNypmKS&fXQ%D%LhsB30z*NvVz5(aJ$S}u9F!%An8Uo%?849wAwkfwj zWz2DzEh{fpk!YQef*ct%ATEH(Bv7N2kg!E|0xD$nNM?~PqkI_KA)pa&hK)7*FXKk{*Q8q)5+0?Uqzn5HJfNgGUiKOfU(F4uXY}C2%FbAq;Kt zzU6N?esGoS9e`nh#Gn>IqDj^lk3cO3`T+4ouc0gfunJVl(3uW0`sCYCXKqG;JtPQ; zl``@QOF#u283ZbR!K^@ZOdA!)RO1>jW&k7jBUF^ydkQU4V3N|TGOz`$prV=(TeL+s zEg^qp^#NU^goFGpd>jln;8Ut#h@&7|37$M)Pt+ZMKmrA3n_QqkBXF>k*7#u;fR5O1 zH(MSUC;5_6FW6$890Fkg6hB%6 zl&<2k@ha>$VJBUw?ky-9ZWb?(ODC};oD^3;cfuI5@de{Uk`b<+O=lVey_0klAPCSy zt^w(nA^9Zc0`?M|sfBjVybo!6srALwxgmQY&;e3ZmQdt{7sI?#yaR&eV`|bcR1yjR zLZJ8|I|(yF#hNS=L&853%9M~-YVgeam@V~fk^z9z0f!JbOQp0QMIfw^9BrZ9HqRHF zf<(bwP_;xgEmf*WB19u;PbnZX&of)RDOihG444bNh4}JA(vhsd^dqNb>f3NSY*u3P zAjtu8cLE|L#YLciB_qvY_G`BADaN1bDt_>Vv?WRHYT4UI?k zOG(HE|X6Ez|9Qdd8k}M<0xKM8YX}#QN zu7q;t`2T6W!00%qqILME^&+uJAyZMF^`F)Yo`w`fQQgWvtrrx6?5`-oFaNM!Y?=rV zrx(i6Kdl#t2QOWel>Mjm0`yQUrAO*CBI{NJFD(Cd{cwxe+&~$5{I}~#K^5VDS^M>G z*B8>tk1Z&3|9`vQY*>OZ4V1AT|91UJTu59}D95IJ{#$uq^pFThYL#PcHCL*O)gy^=6 zJ*A|DO>FXY4aD)l|8SiN1f>**!hxI5Wwrow+)4Ob7$|k3CXuaMQZR(Cr#_=h|NoYc z*3A4@NG0rrq0K)%kJNk<#24D9e|jDp84plZATVbdq=`U0k;v&UXY-W;rE8MrF z7zv-qTe77#*S#P4MvC)+!nY;~jH9OUVgtUSRJnK=R%3LNpX z4q_cBR-!|Kf->?cp9L zjY^zOtz8)3WlS>-H8C65lL;d+DK!w#c)&%7M5<^BuqioW>keR--Be64!5M4~40ho< zkSoRPORXEEq8+jfvYiV+aiqtkno6S%o{f`)wd^dD?}GsQfrQQZ;Wm_HKa*|^5u zI3j0q{uE|WDuBgeHzm~`5bnSy5=~NwDcc>x&oO0k@!Cu2QX1DETU#IpH!s)_^1~J`oWJ$8k8brAh@GUK8|8pBt_DZ1f#_6#GG#GP5A+gVo%`} z6*77-!<3Y;H;^C*hR}_DWqU5dXg;Uel58LsNdB5?J-9;I;y@*a6quu8KyyTu%rwD~ z_PEI1*R^kOJFy2y)o7L`@0v2q8z}6&h2%gn$}f zN(YD!h*k(mAYDkb$bMZaK4BB^9|X9t!cx5LgJvPXW&2zi`$F(ZPLo0!n1Aws)RK^Y zz(A156^u*RPy8YoATJ>;aVyaoaUgrdsrQj`Vfj)OxIIb_i9=xwU?8cLBXA}@A&M^K zWz6}4Z6$X>O^tAg&Yy+iCf@CjBK@>`$NLG8y+>wIw zOQj6Vnhu37xoN@6aAdN>Q@)=C;gg-uu(*s%c6Wzj7j`8}DJt?->czcS3J5vmm8^#B z@r69*-pCUCpM0|lu|9#hls1!!q4vj&E*7`CC!kMuvw1F=h``B&DK4MUpE*Dacwg?QljMl`3v(L?L%&iyro*$bN;k z!-1#B*g~;mAws1om;#CTNXp4Tq_&>)D2xFN78*!AY))&qI3e;qeQfR_WR16PI5f98o+5MYjA0$Tzxj=z2q$^1Z zN%*m59wZT_i*K>Pg-iBEHhci?$aGM{!& z2$C2G$~knj5MoO3JSLfClWIF$ndIAu7g=2(t`sBUIpHy3ok{ml$^c7gK9|`7C85wl z>3hr~QcQh2X#>8l0tOCeM{O#P1^bH^W$z~a@@+OOHMW7A0k8y?o*XhMDR2zpE_j4o6?Jm`Z6usipsoy1GOSYE^VcAB7u`BxC z0&|XJ=V7QwNYX5PM+e2nOcKrqik#9kDTP&l9iiksxey2F51UQZBL8a}{oh@Gz0$0I~1irEd( zm;$N*$k0jUY}x(9Y$w6yLO}DI#1nZL0uIXXVHBzNDl1I= zanME?`$pM4j*5aZ!hLELVbEoBD?8xbl!}lRr_cy|?%29lvfz)#E`V$EIxDWv62QX&Q#A-@)RQQyttQfe&P0mkFY z9e5HO6=CEopklEzxV54>H^#s85%CBk2@e4^^jR^(QDYXUW`LcB6L#WdsBaG`8YlwFM ziZgXk>`aw>16a{`4$5<~KZd_^MTkS_$IFcW&6y%@xVd@&#uHn;=6RfgF%?_;){ zj3H*N@qJVR%BFMT4`Ic4KnmZG3Y64xY;&?F9&??%W7QgPVgq$S3d z=X1=LzxtWBzP6JgZu(I5Ktvg^C}V`>7Kt7!F7MIkk!TXpNh6Z+V@$_i8Br<^8}&PX zGPqyf4w47k5>4rk66mq<(q`pxsCUC=(HkoDaM8LcD-r=RHR z_f2$D7UwEMmGmnfQlZis^mTZHya+7;jT|JdGi^Ut8kWj4B?+r#jD)`8l5aK0097eA zxplq9?EllX@Bz7ONr#=Qc+$`jF;S3)q}a@qagAswOq`IQT(i6zTX?Z_F`bz2Wr9kv&8049iG*kUC6mi<} zwH3L(k#|bvUXu7P7@Fe%xBrcZ+S&c!zPJOx`)GxxwBM%A7#4+fXm*jF;H$|;Y2D3?DBX^>- znKC$7uE=C;sf21$L^7;2@GI0OcO&FRgnTbb-{_Hh57JNQ@$tIs<$RD&%1K-&B_d z(q4XkcXK)$H3RkMW_n`sMQfRULVvq?UeWTBZ}FDcn@RUe03{@%I0xvu%X%qB2trX}U&rcd>y@|FD=nRFmgnKXm{ z7s#iBJF|M;uzaj%vcm{8viw<2=1AnSfC6QOSUgPb_5yo4rHv%Ay8KwQ2{A*ywiHdBSF}Gckhy+lx=G75$UhnD zk=HWx6l@bHN@uhE89nnzsVSyR|5JMT*f^4oI}}#sIvoQc0NZTWgX;1mUY5aKGNvdj zw`=8UT5hq*P#cM2ZMaBwxm;%SaVHR7S2CW$3u>h~yS@QIlQMqo$-w z)DQRd2QqYcBX{BDcD&rvlS@!}5F&%GW|mDoV8tn_!h#l(8QCf?70az1xmc4M333NgVt4&XLkS)w zaF&e6`Ol#J;Pc}0bBMI)|J+_n<@F3AW;T&YlhOR3|IW&cg|;KL9=K#Xkku=JefhMn zWzxMe=a+eVsaqmhGw)$ux=Z~*bp1+GN54doS$|V1-<|67WAa8*UtGS=uXo4t`9yC< zX2L03*5qSZ<4`)J`|0kDW!L8xmI~;Z0{Sy%0u8aZf1JOI<`Xh8gM7(k5|J6l&)Il_ zFH;6&Wm=)Ql&h>7|KXeIy>hukT>4*4`*Jg9%$QRfs!l?-QcIid6{$s)IXlIGcs%*1 z!hT&1Ue7XyN7)~j+OF3FdHtcs30^S^_DhgfT{m8!6@E+ScXA?|F3WU+{ymU4`IV%A zVYHJ;i^pLF%8!OpNGw0&(mTgBZohL}`ua!TVfw%R7A>)BdPJCvFO^T={@;FGeYOJ* znRY~hsk(WUW@nJ+Ibk}}ats;_@DXP1a&WKJhcKsQd_ z%)cWO3MH*{a2j|rQ-~}&UXXTg<~os?V`PSqP1#gFVNTtW)tonH_S{8HOZ;P7mb5LG zc|f=Tx2|qp+_I)+)yjEVaOEohnC8`sv>5g`tzNcvMf1uwf92X0i<(y#70CV-Eo;`a ztX$?(rnqy`^ggrK`k8+5QLEN8`-@gLEp9eeG_Px0-Q;^;kjYRE7dbC45r9myBW^fI z?Rn8;Z(dKkvXEVi{!Ed~X%g~}O~v!wrUS}k6P>A?o^K?dmJ>u~zAG-{%3JhR%70th z)LxV)S?Krot?$!cNYb6_e1B7SI-SV{=9qhDYY+9jwSBsalW@^b>Phu{GliM9*=%~@ zZZEvKs68m}W+`X?n5LuFHh-~nuP5`SAXhy}itcIyg_t(Qn?KVF=e$Sm_WVQTo%^uA zwr#O@%4wdwF{)>Wk+tJzdSCSBW;v}`S#^1szfF$Ll$Qi;dO8_TTWn`h^CNz#MG{-< zY4H|HCn@_=aVcJF7=*@^FA`LmiMV7sHB%0@v;&k+$7DvhmEHoGMbbM|{|OeEBuPj0 zdiY;oqRUK}wa{OSLctzeCN{~W`9n5mv;Hjo!9KlGJl>uj$-l=`zn_U2MbOu>-1&w-I)HzDyTI6yrdVBY32fl&%E^S`26hE&q9BWiKU>9-FmSdET$ur z3!#z<8F&1Sf=X(#1)#gPQgdKWAXUt-3(a_l~mw?fDS|$Wbcdiej7Uysl`qa1X|C7S;^_5K|dlH@b zO8nYlkqHLn_0rOLG+9XF%9rW&X^h4`*OTd#%mjMAd;E0h#d3|C3wkr>o3F3oOn<}N zCYVpkDF7-AYK*`hh^Kp%l)l=PX_tC?(-NlXdF)KrX3BIDbw&Hio7aCno|3kqk782& z+K=dCjr+N5r!N-TTd$MKv;QkCuj199EjC<17fbIm@}Edw@tW4u0xm>L)$w>(%EfY; zpzd_SaqR^MNClN#vGrwdgOudxh!^t<>c!s7kU4baO9q}tbw$C_0vm56^xK%Kn8?Oo zZe#q6rKWcJGa>&N z6OCnJscg=VWfT6~s`=G&uWqiIUo+1{#dB-sH_T)E4eZ5~z4{X@`hHraKLc7agTyMG1-N;O8gVug|A!ddsBggX<@x_q7?m zq1pmp=5jWbs2i?)p>4g~G6;6!$n4J~`6sh7#iw3AW53qu;da7IyCO5fc1fhPF_?aE z{Q1Z7)4`d!kdwO|B?TsiC$cgrEM`}X#PS(!K4M;5vv$h@Zd292bac?83u&=;^z{{#(O#}`E{zV57KHb*IL zPwvuo=4BpYb0s13Zk8=UdgJ%`bsK$~wO3|j73pP*7ccbZuI-RXpZopBP<1H0psK## zY*wAF!lAG*4ZKCs#HA=%c;%kp2#hcT~sL_=BLlmD8JAzxoZS*FT?YhFOU6&8ED zfR7>HS>OkN`&(?jt>6kggM5APMTYO?6;SU!W}IyUA8u;k@&~|0Z15`@mv*o*pDst(O^7 zEgwF{@{dqJ`;i}E`5Tg6FV)~fO_o0gz8swMOP>h74xIB$KX27|-PF?+F=PkuE#RDA zTFy+fTnO&PBW7EA9J5>r&iScz`_s!!;GBp0Jd3^i!8tGW0`SMdIUn`S;Ln3|ern3U z1^ZDfamGe6C zgUWeCxX#z#U-t-}cQfi`1$gV5)}Dv)WcYaK8QBVYwzl?kk|k*@G*xU3SRYftDpJSfJeY%$oGrj!wz2x?q6i} zP<|Eo=TI-QX_jNb2Oar#@b|!JPYT?-*y=wMda~5x@KeD3OUmWX0UvhwMc`F~<>hcW zcm$mFdky%2!*2i|arhnJ-lbMQ_1sVW4u6#T9sX(xqKXa(BZw{-nYx;H-cvzeg^n~s2AxL%yJ%h z!I2*XZ@R+j=kb0AycPUR=((199DXx+<~vpo<$nzBU0Ke520rNUUxNGJEtmf-_^`vD z1&>@+F8>nv!{9uwx4=iiXXCj33hsT+>LLFaJPbY`@>_3f+ikleza#jdBfls3T&G_4 z2Y&$ajML_VkAgQL-zsqbYHKI?Lhy{k7lYpcPW?xLkASm3Sqtu6WA&4t2;K-z|JViI z3Ql`6;6o1I0{)Vt=PYn<$mScv@qP_F^m{JoS%&`{2~`EAU~5KMfxFL3zIa1O6~L!Xoca;G>TGU%=b1E7$WO_)Fl@ z&6?#?@G(bz`gGfFH~i4*k>+idoxumdd0d|ZpYkIsFKW&5dGHEw%FhSC6kImVQVTxh z$R7?q`}*ZZZU*F+fj6UG7)PxF4?~{$t^>aVoboa75l8+c@TMDfDbzS8SsL`{|LSc^}_b{I(Yb&3lJ2>+`pr|{BHrzIQ(w#JHV;`LGTgq7|Qv-z{7W1{p6$ILk@oqe9B!`p88(~uK;Jg z{F!S1 z{9$nV->-ugz~{mKZ-H0bYwaPw8a(3g>%lV{tvt`i+sPgId%=es{xJBc!ygCt?kl(F zci{8Dd0a1mN5EN+uYwOc{2lOu!~YH*zTf6cJ)Sr?-985#J_CHz;k$tQKP}g@H+T%3 z_8&<7;76lg7JwHVUI!j|!0M;`5#VQ`Uf7Q<10QnaTfx1bmFqbUyxrj);3E!S55Dt* zRu7L$-%rxz76xZKKaKhwelGZ+!!H3JarhPBV-Ej5xc`u~hxy(F-s$h`@C(3M4q@;i@G2Z{BY45#i@^OytUZ)J61?5vZPf4Z6R6+e zN$P*JTz{H+P%pc|&Q0L$j{E@S9ex4$Q{XIz%fJiZY=_?kulTvOhx|J5h{JCM&w$T| zo%euW1$g`;KL4Y27eEn zcCG~X9<%xxmmUiqadVJ_#NQXe>wOF zcntYo1HLorh5qGw@bKd{U&;@I4>|lk@F`DNdFJ~Fcm?>G$oC2Aarp1S!@stADF46U zcYss>Yv3c`te1Dez28_p>D_tO6f&_&RWJ)XLMI81;ak342Zg zA9i>SJo1#)L-|v|N5QH8tKehcv!VZDaQ|tmhy2^%tqvaoA8`1M;KL5T6TIN?pMqEX zt~}qLgI9sG|Njkm#F2jnd>_;c^1ceAMCp1owV#?PUKyRWdU1n8UXN zZ+G}^;DZj|7ktFw2Z4_{yb|31?{a$@z+1p&(=1Kk?T-AHzy}?^27JWfUjZL;cmmvi z#@bVbeEYx;MZM4;Z3J(3r3?2dB8~V=%ZwFW4Uk4uo zUjqIu@Gl{{F!(a?d%*|5Bj68%kAR249|s=;KMMSJ z;E@+?zAWb#zy}=uD)>*q+1}m(e;l0g!{5OR;B3z_#L)Juf3*3M&j25A_%7h14&NKx zFO=&!5Ip1X1>hs#^HC0U-~*@^*)+@H;A4>IedA@|;g@W_yF$Jdd@;BjzFCd~ZwFrk z-T^)W&i1e#yZ|nnX32wlFWY>1zMKZ`gR_3m1e(K=7hJ+%v+NE&0Db`Ye&E-F^SBNM9|rd! z9|j)w~0Z0D3;6o0-4*XtlmfNl1kAU-e#694TfwMdx z0)GOW&!HXzA9eIR1zrH>dnC_;`>)yZ+z;jR3i#pRye@tlycK+Z$bSHy24{Qw1pH3a z3+rne>7aDGJr(jiuARUKz*)|-z`q5~a+?i)jicuf@M|4j4L%Gmn`Zd}_$WC2T{HM= z;A|%=!QXfE9}E70!`s3C;qVmrzrfl4v*6pjZtI2Ra|-wja9$6d1HJ<|+s{SdyE=L< z2On|Hm#e||fINmDde?)`0%ti4gNMP{@7)K!44n1#2>8+9wEqe4c5wE$zXu-xpO5AxFrnP@A^n4k7E;#M!1do8z zzx05&gC7b#{osS(mEfm?KLpP5KM#BqJPi3kaPKW^C*{8bzBM@8)wSR|fiupz8T@^e zC-vL~?nC}?;KSetf&T&g8E~Gz1@Pw_{wDYf;M1Y!eef~x z1Hu0VzT2N|`S3j5N;*v4ZufBb4&bxEsecb}ADn(+fADs29`9W6A#k>bD)13-wzq}g zW8iH6i^09k)_(fgBf z`+u?ausvT0z6zZ8QNID+4o*E+fuH5b{}B8FaQ54`fe(VSpZN*+2>9nw4kO@W;5;9H z1-|z?)_%6GwYYFM!j|ZN=g0 zc3bhTwQ~;iRDegoS^j&0XTVtw2Y?TO*Fevq;018rPpbj17_<5MkpCih7@TqYQt+d| zS?{aB*EoC~_?I0X1CKfUB=8!PKlNw9Gmz)`bqe?p_yX8}4)`c|EBHm={(JU#spoR= zR`7+8zXp5|oaJx>_%Jx*z&pT4!P!6D4?YIYdU+H){Jyn^`hN}H3hu+6{|3*1GcJ7* zdB>>8{}0{?#5A{pmj7 zKDdO(W|;%7z^Ok39s#F4_2BK`jN2pNr-ReqwSb=uPXD+Xd^UAhvccNV^RWYb zG0K7Ee-ijn;Ou9z;O*cNZkgp|@XQvgpT~O^_-1h0ee5L|AXn56~$``~PEM}yx8&i?i|@L_PahZy+X;4HTk zcq{6K{wM?f5afBCvKjo>4j%x24xGn(KKLKO*`5c%-vFndy#oA0a31dv_$S~zPj3L9 zaf)pZj3 zmfOJJ1gHJ?fRBN*ULFLWa+m0pr#-dczQex=eh@hAYz7a5)6Ny(CxElQ)`F+N**}~Bo&je)Ccsa2crW-l zj{bh|L2#Zgr-6SLoaOda@bjH|`8xQ`kZ1e(CV1ftTh0feom>UJ&4A_9e;xQ9;Ozfz z0iOlV`xrk4-y59u@&I@kobm9_!P~*vZ~Pj30G#Lb@4+tzXTC3hf5+i}0>8@PZ-ZZq za-*KVf?wmv{|o$DhfkA^MYsPSI($3u8yvnX_{|RA8~iqKw*SwA-{r_33Vshb{Y5qS z{SH42{6R@7d0rd|{)8jH27J_!KOX#9aJJh{@K?ZjzN`m-%h8_$zZCUCdrk&_ z7xFybv%vrA=)VyBBZprGKIKf?&e@)?1fK>@{nvtT3(k7E34D8Swx2t}E5HxL`E@^d zjU)dEcs)4nc^teEocTTtemFSG=Xvm@;Ou{125$wYoo|7!arD0rz7Cw{??>R@LA|hl zm?9VEy8WLBdDia?@B}#HoSngQ;Iw})@KeC)r)Gnn1I~VU9{8Z6rwaTEaN5%devPBQ z3H%0dmVXQQP2entqrr#4S)Rv%-{t6!fj{8Lr@$X__y+Jtz-j*$@Lz%R{5li-M$`-A z&-1~5@8}-{{{uM7{|fLwg0mckz{kKP3^2V@U76ZjzHdH;M*@KHz4{@~s@*3P4m?ZM#f;8oz2;Fp5)JgNsD0_SlZ0Y2*R zW#HadZN8LW1s-M4ay!ohZ*}-3;Qw;Y zm&?Hi9QmukhaLVS@Pfl{1Ftx*+@5>DtH60&4}wR)=b;{d37&EIli))Re+GOMocCQ{ z1RrzcUjz5gw|25UzXKitr#&BnXB_?s_z*bT$u@H1QJ)v1j{J_`-UT+_MjY=R;DflY zIG62Nxc+|5;D%;HZb65;0zA@hc_TWAK5#E%`PoyfqKm-?Hd*dN&&|U1cayHTWtkDA zUwaVz28TZdJ^qr#M*f%3{}OoQOP1ffwaxb(@Uc~v-#Fd!Pr*lHmN!Fwx>TG#Uhhjw zjNn`tv>W(Xvz1?k4sH(k;JKD71p2k$qf4zG{rxh%G=uwHR$jj+qn9<*bAsi&qdcSF z!%@rk2Ty~C&$j#<(0>N_*fN{%PLRJ0d}y7Oe*^Yk13s9u{4#XJw}FpdY5B)DTRR^h z|Ayrs!7-1LpJVxhuxAY1-`(?GUSfy06=Vdq@8m^7_Ph`y%(8~OvYf|+Ydx)XOO4!>a4>1` zu_nv!#|71y;Ncp}_eQ-83fJf9NZ#rn@a%H6aIN3}ij~h?Wcf|tgU4EaHp<~1@ZmPg zUxfZg!M*nv83lTrw_cv}VgD3c{*U1Sz`NjM?^^kp(DQHb!39>o{tk;?rp>nJuZMDr z80vX@fscgkarxl0h3n(W9AfqCJI(Gm1bp})%k_7`^il&ok=tzlz!d)^0+++q3sr&zxI0k-@{-beXB|7`LP z%XuC7-^%%sJ}}kh+fV*!IlmA*^6zqf4f#~GbLjc8aC08bu<|uCtp3Nq z2Y0dji|8j`03Y4Y@*hKfjPi3We-`pvectvbL(ccyb``Gk^|n~~FWGFpL%>_XZv<}x zA3Z5z$Zx?<0UrTpyZScx;G4ERe~fncF!}qI=ciglZ-G~QVEG!fhaC^}ylp(*mGQiF z$hT3rwtqNn?LQ0cqz!x|8!?jSLw^E%Xuah;-W>QqzvV}oRGxP(^_*h)Pod{J@KMO$ zyOmAw5cuH9Rz3`So&s-$yi}7}UIQOE-OBHEu;u>*&wOIbp&oknor89=i-EZayoeXRIBGV$oCS;Z)153XV`L{UvEKv_)}XBHzMDU!NXfw`P;#FJjj;M$N^UV z&&YQc_^5CBJ2A97b+zHssz)yW>mX1J7ChB>eA} z!7FaC{Ce1VlF`4HH;n!Y-G+BA_`MGQzTvaHOvc*7@_YjN3$HFRh8zL?W8foiSY8Xh z?_6uY|GMQ@fiD6dd&%;{z+>RyS1fM@KO21DPnI7CegpW>$4iYpzXcxwA1+w=h2SrM zdpAdn{H?W9&F}l*gYe_4E%v6&v-Q}HcFX%AyMWI{d*gk%Ip7g+wugG*x*jv9+4i#^ z?9p>IJ+7yWytFH{f8S#7Pmmv6XXU&0v^#V$P4s=~4~?Fky>GTI zhlb+MMDkmi>wsOyeGhzh;ZwZv-vi$d^6vM>s|>Fg_ucX(MvoYc^M%%YS@5Z8R_ z`0vL54f12_t^D(lpCaX;%d_1%t{uT!d#(H$$nRq~HcEcNkT3L<%O3$gw5#Q_R@y|X zC(*NE68=@;x_sRFx(xbMXC@srUP#X8`2@GrdO*FH>PQ zp3!>rcck$hew>cptI*@4eI}5!Ldw5FUoUTJDO2`=mY=$VSEz^>&UW=R=;6Eol}NS2 zeA}*C@m!MaYFFWG8>Jb{6|VDj+f|K`-@%KZ+?elTa@5xeQ1+L(ww+`?vVI|i^Jv8+ z`F23hSSDgLDCkL3KgwBdiolAqOtzXo=m=#=}E{eH=%}bU3g+4nWCsKWhWqs%4F2p zEnYGk>y@cV`g?n~NRpB*GoMSDsGe~tnvt1TVqFREz(ikvZ?sPm=N44e)R%3m>hjIT zvQ0<0z7~7U+=Qjd00M2?raEi~`mikuqtOHPTqbe|$#m4r`&CAa)f4b^GAR=y=#g1aRA|vrO-DAXMbVaHJehB<1g$AWb|$(7swUh}9mo}7 zqZ}I&+c~)wsOsvPs`0R2G^d`2%AzVcG&|5oOzwsC;{zfGeS#6k=eRh8kyE zY%SYg=WN$I+YQdP9D&SvQyp3_(@V$JCp}Dr)h2e?DY4qbBCLrmSQ9Jknw_l-8<@e& zlwD{|%d!=nG7ZA&Q4RGjstz|c z29xZDO6DI7=1nwHDFs{ZgonY7;+%*?oOUb}ZEac-&P7#mN^XNrwTvZl&Nhk4+nb`Ni|n$xKhiNIj4K^n>EueBD|%){ zZB;ml6yBNttBQ72(XJ}mRYkk1XcseA zv`f)073`v2igqd5rD&I;U5a)o+NEfhqFsu1DcYrIm!e(Fvzm5Q)2?dTRUOFCu4>v< zO}naTS2gXbrd`#vtD1II)2?dTRZY99X&1Aqp zk#k#=ccWV*^m+SN$A8fjM}?P{c5jkJr2VzetpyJEB}M!RCPD@MCw zv@1rtVzetpyJA5Wv@1rtVzetpyJED9vK_RmgLZY$t`6GOLAyF=R|oCtpj{obtAloR z(5{XkFWS{XyUYx~+7ETmE{b&0u1?z3NxM2}S10Z2q+Ok~tCMzh(ymV0)k(WLX;){E zDedZHd3Dk*?upZ`IPHqlt~l+A)2=w}iqoz*?TXW`IPHqlt~l+A)2?`sJMD_oE`kK@ zO3_Og)CKSUk#V|~T0}+^~!Z1&TVV;sG z)*P-1!#ov+c`6L^6vHqThIuLs^Hdn-sW8k_48s`QD28E*VVIKG+vdqIOfd{o48s(| zFvT!TF$_}-!&DWDO)(5p48s(|FvT!TF$`m@rGkPBEG_P0c`*!A48s(|FvT!Tt_^TB z48s(|FvT!TF$_}-!xY0X#V|~+eQlvI3{wol6vHsN0Hh4-kztr(7^WD8DTZN+VVGhV zrWl4PhGB|fm|_^F7={H!z%WcP3{wol6vHsZFih33eK8DE48v3n%Zp){Vi=|vhAD<& zieZ>y7^WD81vSDjOfd{o48s(|FvT!TF$~iee73k5hAD<&ieZ>y7^WD8DTZN+VVGhV zrWl3=4TNEsVi=|vhAD<&ieZ>y7^WD8sXCsI48s(|FjdEP&oE3e3{wol6vHsZFf3@V z48s(|FvT!TF$_}-!xY0X#V}0O)2@2fBf~JoFibHFQw+lt!!X4#Ofd`#P9KJ0ieZ>y z7^WD8DTZN+VVGhVCKunRP=;Zuf&CZ5FvT!TF$_}-!xY0X#V{;5n;C{FhGB|fm|_^F z7=|f^VTxgxVi=|vhAD<&ieZ>y7^WD8DTZN+VVGhV7IZEQx)g&h#h^7;7oUT8gojVyvYY zYpD)88^&6Sv6f=274)x+wG?A5#aK%*)>4eM6k{#LSW7Y1QjE0}V=cv4OEK0`jI~rJ zogiZ^#aJuo?ip(-##)N8mSU`>7;7oUT8gojVyvYYYbnNBim{ertfd%hDaKkVPUjr_ zB9u`Ku@plr#Slv|#8M2g6hkb<5KA${QVg*aLoCG*OEJV!46zhLEX5Ej@PSF%#Slv| z#8M2g6hkb<5KA${QVg*aLoE19x>R~pI#l}8YPeH+Q#w=nQo2%lQaV!lQMyrjQ94oj zP^hN|r30n^r2C}zr1PZjr0b;Tq~oODq}!y|q|>C&q|1a)ro*Jaq`RcIq_d>2q^qQ- zq@$#tq?@Fdq?4qNq>H47gy*GyqjbYb*hbYS#fbYJvdbYApbbY1jZ zbX@dXbX#z2bXxRTbXoLRbXfFPbXW9NbXN3LbXD|JbX4?HbW`+Fa9{LMbW!wBbWrq9 zbWik7bWZe5bWQY3bWHS1bW8L~ya52`#LIuWCVD11Ci*41C3+<~CHf?~Bzhz|B>E$| zBYGn`BV1n7710yX5z!CP4bcnH3DF191@R)E*Z91|=M_FL@OgbNm-oq3q9-2h?9XmY z$OTJPV`$CMtJ|V0s>bg~CZe6OY<5eux4-8z_U1P9$FhkD1roBWC)%+kFAtl?XP*uyRMHvo5u9^G}XnSe{G(!f((1(D%9E% zZEIR|RI}F`uL%{8rZ-+&vX#z-5}Q+bPky@-u}n19)06IuN$r?t)n4&YseR~P1UAQD zzj;I(Y{80bBH5GZ%!gvRXi6d#Ze|lbv3zP{f=x`t$1!L~lH_x}~*w#S-0IqbtJ`!Kw-1>WL&*kCUtmPoPu7i6qDC6v?7aTMqJQyh`Fi z*d8!_1Hon05>vRWR&F**Tgaz+6CpYGbJ1vVGnY$bF`z+i7*eVu-QO3_MLW9_o$I5C zY&M+@b;tVRJqf!ZV;?9PPb6dgJ<_KbMRIOOld)7!e^%;721|?+>q&QY$k&!y7PTP&jD5Gi#G?~n5i6%A##GE$8dNqwfmA3vR{*#P~gwl2E9xD~Zs&H~jKmP^Y(sEDiN%92o5dTfJs?d2;lf>AsDjXtJu#jB+X=)ygGxHRU9h$t3#X z(T-F;7o-ET?vm=`sjgBP?HpqHs6$iI*@@%S=Sg3p%XDY|V%d0lQ{QI^B{pZo`;AX5xiZ!nmvwI})#sV6J~(K*8INtrNkK@POL+bH zWJ4&{*_p`X#b5SyNmyEnwA~=KC$izjrtVa>CzDS1gcgUrl8vg;4OO~PUAj?Ix=~xY zQCGTAU$U`!amhw80@-W>_UNLfHOFTBx&C%wSOT^(t z<(!hpR>Jt$7Ks|;UUbQEE1OodEH2+8?K-QIE?c=a+PoYZmM>ZDMVB45YEjcs(N#;A zu4!(wago;Alj`Vk$YrQ?hyI2O}fU}%j8 znl%~GC*5R!UuQ1aEtgc$D7t5xQ(|*oN}xNLlU==uUTLdEt=8tQzW!*pN=8!&xo#7s zrdY}j!5p{2QQhLo6=>&{?ks0=u(5nhnyoG1;AlmCSFeN(R+lc)crG2a(S~f8;;GhV zc4oE|HOiyRXv-=|q=(S<=j1B0q$*4(8IAWuB~H|_XhJK`i{Hzn5~fVWZ6zi&u_KoY zEYxL?RNX-tn1VG0)|=i~QV+JolBvy7ZSiD2C6@HVYALzySgt#f)%8J%xR#I&BdbH_ z;!#;uZ7UWBjaJv2Z7QZZjP;N_aUhcw#r2nr;YPM5*3I(`Bw6rz*0$=9j@q1I<6y1k-XEQQT~KXHdducDc5AZGTNHM zyZ`_G>hDJAR}(O7-YZOv$d)I+=EsxIrj#vsjUiy4m$hx>Khu9aH6mM{_c6eMW~=yz z?<0`Z$x3N@e_F)s^6|c$Z?=km-1JLi*N2~enr8kHq>msy?dN+097j)$`h5x+O&{3b zj`ZzFKOG0WjmYR#rsw;M#|YD+%)fi9h-`UYHw^uj*(&~lx&WLgYoC_b{|VB6g7o}u z8trF3{9P~UKPgE+YwL*7Jqro!mVO7g+SFIxFg1hxF@^J`6$T?;ig-NWTbj z=Og|3NH9{8Ucc()roUL2E)#8^S@>Q9UPR<~O}HDy!cFf2Su0KNBfXFGgMp-70hV`9 z?D9?dDNR3&^urK%wO6;!;=*(!SISCh`YZ5$%@wEHbbK#_@~-_uNYC=;dpq8MOzj>EvyvApLZtpN{+~NA=w1?~AfSw>{=xf%FwfU(l5+ z3)?5t@i<d(Atqc zb~baizpg$160CL6{!zS#^zbXl;hfJ-uZ`FChs(u0rkB^t$`&oFm(t&$?b}`E?-=v% zv`{z0cg08^H~U}xo)c}ilJ@V|Qu_wfsJs_dx-efd{aX1%=|^%l{R}68v+4amm%q&K 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 02/14] [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 03/14] [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 04/14] 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 05/14] [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 06/14] [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 07/14] [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 From ff60b752bd11e654b5bfe210043cd63379e2ca34 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Mar 2022 22:35:10 +0000 Subject: [PATCH 08/14] Replace `#if` with `if` where possible --- src/main.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1e1e957cb..e01ea0308 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -384,7 +384,7 @@ i32 linker_stage(lbGenerator *gen) { // NOTE(zangent): Sometimes, you have to use -framework on MacOS. // This allows you to specify '-f' in a #foreign_system_library, // without having to implement any new syntax specifically for MacOS. - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { if (string_ends_with(lib, str_lit(".framework"))) { // framework thingie String lib_name = lib; @@ -400,7 +400,7 @@ i32 linker_stage(lbGenerator *gen) { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); } - #else + } else { // NOTE(vassvik): static libraries (.a files) in linux can be linked to directly using the full path, // since those are statically linked to at link time. shared libraries (.so) has to be // available at runtime wherever the executable is run, so we make require those to be @@ -418,7 +418,7 @@ i32 linker_stage(lbGenerator *gen) { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); } - #endif + } } gbString object_files = gb_string_make(heap_allocator(), ""); @@ -456,11 +456,11 @@ i32 linker_stage(lbGenerator *gen) { // line arguments prepared previously are incompatible with ld. // // Shared libraries are .dylib on MacOS and .so on Linux. - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { output_ext = STR_LIT(".dylib"); - #else + } else { output_ext = STR_LIT(".so"); - #endif + } link_settings = gb_string_appendc(link_settings, "-Wl,-init,'_odin_entry_point' "); link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' "); } else if (build_context.metrics.os != TargetOs_openbsd) { @@ -477,24 +477,24 @@ i32 linker_stage(lbGenerator *gen) { gbString platform_lib_str = gb_string_make(heap_allocator(), ""); defer (gb_string_free(platform_lib_str)); - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lSystem -lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib"); - #else + } else { platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm"); - #endif + } - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.arch == TargetOs_darwin) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' - #if defined(GB_CPU_ARM) - link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); - #else - link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); - #endif + if (build_context.metrics.arch == TargetArch_amd64) { + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); + } else { + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); + } // This points the linker to where the entry point is link_settings = gb_string_appendc(link_settings, " -e _main "); - #endif + } gbString link_command_line = gb_string_make(heap_allocator(), "clang -Wno-unused-command-line-argument "); defer (gb_string_free(link_command_line)); From ba412fd87bc1a24ca8ce9ee9ae665aa15b4cde2b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 09:36:21 +0000 Subject: [PATCH 09/14] Fix typo --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index e01ea0308..4d25aea48 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -483,7 +483,7 @@ i32 linker_stage(lbGenerator *gen) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm"); } - if (build_context.metrics.arch == TargetOs_darwin) { + if (build_context.metrics.os == TargetOs_darwin) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' From ea9c2fed57a885b74f3ed96461b7aba485b78e36 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 10:52:37 +0000 Subject: [PATCH 10/14] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index abbdccecd..e8b3d3050 100644 --- a/.gitignore +++ b/.gitignore @@ -279,3 +279,5 @@ shared/ *.ll *.sublime-workspace +examples/bug/ +build.sh From 8e4d6b3e5dde51fdd71a49b2bf703ae3428c1c21 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 11:24:36 +0000 Subject: [PATCH 11/14] Fix typo --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 4d25aea48..aab695de2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -487,7 +487,7 @@ i32 linker_stage(lbGenerator *gen) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' - if (build_context.metrics.arch == TargetArch_amd64) { + if (build_context.metrics.arch == TargetArch_arm64) { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); } else { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); From 17eebf338c7c2428db99470f8e1dd6c8d2f7ac0f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:05:51 +0000 Subject: [PATCH 12/14] Fix #1606 (Call `runtime._cleanup_runtime_contextless()` for `os.exit`) --- core/os/os_darwin.odin | 1 + core/os/os_freebsd.odin | 1 + core/os/os_linux.odin | 1 + core/os/os_openbsd.odin | 2 ++ core/os/os_wasi.odin | 2 ++ core/os/os_windows.odin | 2 ++ core/runtime/core.odin | 5 +++++ 7 files changed, 14 insertions(+) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 4365842b0..ace622582 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -680,6 +680,7 @@ make_directory :: proc(path: string, mode: u32 = 0o775) -> Errno { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(i32(code)) } diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e31eb31bb..7fb9dd26f 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -419,6 +419,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 200d6d68d..9716e2925 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -802,6 +802,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index 3862851a1..bca93880a 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -5,6 +5,7 @@ foreign import libc "system:c" import "core:runtime" import "core:strings" import "core:c" +import "core:runtime" Handle :: distinct i32 Pid :: distinct i32 @@ -658,6 +659,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_wasi.odin b/core/os/os_wasi.odin index d2ba166bd..7bab1b949 100644 --- a/core/os/os_wasi.odin +++ b/core/os/os_wasi.odin @@ -1,6 +1,7 @@ package os import "core:sys/wasm/wasi" +import "core:runtime" Handle :: distinct i32 Errno :: distinct i32 @@ -93,5 +94,6 @@ heap_free :: proc(ptr: rawptr) { exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() wasi.proc_exit(wasi.exitcode_t(code)) } \ No newline at end of file diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index e6efb89df..fe9496e4c 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -2,6 +2,7 @@ package os import win32 "core:sys/windows" +import "core:runtime" Handle :: distinct uintptr File_Time :: distinct u64 @@ -128,6 +129,7 @@ get_page_size :: proc() -> int { exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() win32.ExitProcess(win32.DWORD(code)) } diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 8d315a238..08ca4c049 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -459,6 +459,11 @@ _cleanup_runtime :: proc() { default_temp_allocator_destroy(&global_default_temp_allocator_data) } +_cleanup_runtime_contextless :: proc "contextless" () { + context = default_context() + _cleanup_runtime() +} + ///////////////////////////// ///////////////////////////// From 6d1a91f5b309e7d7dde69a91293b3f8908a1748d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:11:38 +0000 Subject: [PATCH 13/14] Fix typo --- core/os/os_openbsd.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index bca93880a..a99c8fef0 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -2,7 +2,6 @@ package os foreign import libc "system:c" -import "core:runtime" import "core:strings" import "core:c" import "core:runtime" From dc8d28c383a404d01dcbcb65ba84ff814da9424e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:15:30 +0000 Subject: [PATCH 14/14] Fix #1607 --- src/llvm_backend_expr.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 844deb43c..026350440 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2202,6 +2202,21 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri } } + if (is_type_matrix(a) && (op_kind == Token_CmpEq || op_kind == Token_NotEq)) { + Type *tl = base_type(a); + lbValue lhs = lb_address_from_load_or_generate_local(p, left); + lbValue rhs = lb_address_from_load_or_generate_local(p, right); + + + // TODO(bill): Test to see if this is actually faster!!!! + auto args = array_make(permanent_allocator(), 3); + args[0] = lb_emit_conv(p, lhs, t_rawptr); + args[1] = lb_emit_conv(p, rhs, t_rawptr); + args[2] = lb_const_int(p->module, t_int, type_size_of(tl)); + lbValue val = lb_emit_runtime_call(p, "memory_compare", args); + lbValue res = lb_emit_comp(p, op_kind, val, lb_const_nil(p->module, val.type)); + return lb_emit_conv(p, res, t_bool); + } if (is_type_array(a) || is_type_enumerated_array(a)) { Type *tl = base_type(a); lbValue lhs = lb_address_from_load_or_generate_local(p, left);