From c4194f2d780b88db78b974018e41745d9c1da1c2 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Thu, 8 Jan 2026 17:24:21 +0100 Subject: [PATCH 01/12] refactor: use commitments for ciphertext in crisp --- .../CRISP/circuits/src/ciphertext_addition.nr | 112 +++++++----------- examples/CRISP/circuits/src/hash.nr | 58 +++++++++ examples/CRISP/circuits/src/main.nr | 26 +++- .../contracts/CRISPVerifier.sol | 98 +++++++-------- 4 files changed, 167 insertions(+), 127 deletions(-) create mode 100644 examples/CRISP/circuits/src/hash.nr diff --git a/examples/CRISP/circuits/src/ciphertext_addition.nr b/examples/CRISP/circuits/src/ciphertext_addition.nr index 82a4b2a56b..616fa1ff4c 100644 --- a/examples/CRISP/circuits/src/ciphertext_addition.nr +++ b/examples/CRISP/circuits/src/ciphertext_addition.nr @@ -23,8 +23,8 @@ //! - For CRT (Chinese Remainder Theorem) bases, we have arrays [c0_i, c1_i] for each modulus q_i //! //! Homomorphic addition is performed component-wise: -//! - sum_c0_i = zero_c0_i + prev_c0_i + r0_i * q_i -//! - sum_c1_i = zero_c1_i + prev_c1_i + r1_i * q_i +//! - sum_c0_i = ct0_i + prev_c0_i + r0_i * q_i +//! - sum_c1_i = ct1_i + prev_c1_i + r1_i * q_i //! //! Where r0_i and r1_i are correction terms (quotient polynomials) that account for modular //! reduction when coefficients exceed the modulus q_i. @@ -40,93 +40,72 @@ //! 4. Checks range constraints on all coefficients use greco::CryptographicParams; -use polynomial::{flatten, Polynomial}; -use safe::SafeSponge; +use polynomial::Polynomial; + +use crate::hash::generate_hash; /// Parameters for ciphertext addition verification. /// /// # Arguments /// * `N` - Polynomial degree. /// * `L` - Number of CRT bases. -/// * `BIT_ZERO_CT` - Bit-width bound per coefficient for zero ciphertext polynomials `zero_ct0is`/`zero_ct1is`. +/// * `BIT_CT` - Bit-width bound per coefficient for ciphertext polynomials `ct0is`/`ct1is`. /// * `BIT_PREV_CT` - Bit-width bound per coefficient for previous ciphertext polynomials `prev_ct0is`/`prev_ct1is`. /// * `BIT_SUM_CT` - Bit-width bound per coefficient for sum ciphertext polynomials `sum_ct0is`/`sum_ct1is`. -pub struct CiphertextAddition { +pub struct CiphertextAddition { crypto_params: CryptographicParams, - zero_ct0is: [Polynomial; L], - zero_ct1is: [Polynomial; L], + ct0is: [Polynomial; L], + ct1is: [Polynomial; L], + ct_commitment: Field, prev_ct0is: [Polynomial; L], prev_ct1is: [Polynomial; L], + prev_ct_commitment: Field, sum_ct0is: [Polynomial; L], sum_ct1is: [Polynomial; L], + sum_ct_commitment: Field, r0is: [Polynomial; L], r1is: [Polynomial; L], } -impl CiphertextAddition { +impl CiphertextAddition { /// Creates a new CiphertextAddition instance. /// /// # Arguments /// * `crypto_params` - Cryptographic parameters for the ciphertext addition circuit. - /// * `zero_ct0is`, `zero_ct1is` - Zero ciphertext polynomials. + /// * `ct0is`, `ct1is` - Ciphertext polynomials. /// * `prev_ct0is`, `prev_ct1is` - Previous ciphertext polynomials. /// * `sum_ct0is`, `sum_ct1is` - Ciphertext addition polynomials. /// * `r0is`, `r1is` - Quotient/correction polynomials for modular reduction. pub fn new( crypto_params: CryptographicParams, - zero_ct0is: [Polynomial; L], - zero_ct1is: [Polynomial; L], + ct0is: [Polynomial; L], + ct1is: [Polynomial; L], + ct_commitment: Field, prev_ct0is: [Polynomial; L], prev_ct1is: [Polynomial; L], + prev_ct_commitment: Field, sum_ct0is: [Polynomial; L], sum_ct1is: [Polynomial; L], + sum_ct_commitment: Field, r0is: [Polynomial; L], r1is: [Polynomial; L], ) -> Self { Self { crypto_params, - zero_ct0is, - zero_ct1is, + ct0is, + ct1is, + ct_commitment, prev_ct0is, prev_ct1is, + prev_ct_commitment, sum_ct0is, sum_ct1is, + sum_ct_commitment, r0is, r1is, } } - /// Flattens all polynomials coefficients into a single array for challenge generation. - /// - /// This function serializes all polynomial coefficients into a 1D array to enable - /// the generation of random challenge values using the Fiat-Shamir transform. - /// The coefficients are arranged in a specific order to ensure deterministic - /// challenge generation. - /// - /// # Returns - /// An array containing all polynomials coefficients in flattened form - fn payload(self) -> Vec { - let mut inputs = Vec::new(); - - // Flatten zero ciphertext polynomials - inputs = flatten::<_, _, BIT_ZERO_CT>(inputs, self.zero_ct0is); - inputs = flatten::<_, _, BIT_ZERO_CT>(inputs, self.zero_ct1is); - - // Flatten previous ciphertext polynomials - inputs = flatten::<_, _, BIT_PREV_CT>(inputs, self.prev_ct0is); - inputs = flatten::<_, _, BIT_PREV_CT>(inputs, self.prev_ct1is); - - // Flatten sum ciphertext polynomials - inputs = flatten::<_, _, BIT_SUM_CT>(inputs, self.sum_ct0is); - inputs = flatten::<_, _, BIT_SUM_CT>(inputs, self.sum_ct1is); - - // Flatten quotient/correction polynomials - inputs = flatten::<_, _, 1>(inputs, self.r0is); - inputs = flatten::<_, _, 1>(inputs, self.r1is); - - inputs - } - /// Verifies the correct addition constraints for the ciphertext addition circuit. /// /// This function implements the core zero-knowledge proof verification using a three-step @@ -145,8 +124,8 @@ impl Vec { - let inputs = self.payload(); + let mut inputs = Vec::new(); - // Domain separator for ciphertext addition circuit - "CiphertextAddition" in hex - let domain_separator = [ - 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x41, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ]; + inputs.push(self.ct_commitment); + inputs.push(self.prev_ct_commitment); + inputs.push(self.sum_ct_commitment); - // IO Pattern: ABSORB(input_size), SQUEEZE(2*L) - let input_size = inputs.len(); - let io_pattern = [0x80000000 | input_size, 0x00000000 | (2 * L)]; + let gammas = generate_hash::(inputs); - let mut sponge = SafeSponge::start(io_pattern, domain_separator); - sponge.absorb(inputs); - let gammas = sponge.squeeze(); - sponge.finish(); gammas } @@ -254,7 +222,7 @@ impl0, use weight gamma_i for i in 0..L { - // Build the expected sum: zero_ct0i + prev_ct0i + r0i * q_i - let mut p = self.zero_ct0is[i]; + // Build the expected sum: ct0i + prev_ct0i + r0i * q_i + let mut p = self.ct0is[i]; let r0i_scaled = self.r0is[i].mul_scalar(self.crypto_params.qis[i]); p = p.add(self.prev_ct0is[i]); @@ -289,11 +257,11 @@ impl( + poly0is: [Polynomial; L], + poly1is: [Polynomial; L], +) -> Field { + let mut inputs = Vec::new(); + + // Flatten polynomials + inputs = flatten::<_, _, BIT>(inputs, poly0is); + inputs = flatten::<_, _, BIT>(inputs, poly1is); + + let hash = generate_hash::(inputs); + + hash.get(0) +} + +/// Generates a hash of a set of field elements using a cryptographic sponge +/// +/// The sponge absorbs all field elements and squeezes out a single deterministic field element +/// that will be used as the hash. +/// +/// # Returns +/// A field element representing the hash. +pub fn generate_hash(inputs: Vec) -> Vec { + // Domain separator for CRISP - "CRISP" in hex + let domain_separator = [ + 0x43, 0x52, 0x49, 0x53, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ]; + + // IO Pattern: ABSORB(input_size), SQUEEZE(2*L) + let input_size = inputs.len(); + let io_pattern = [0x80000000 | input_size, 0x00000000 | (2 * L)]; + + let mut sponge = SafeSponge::start(io_pattern, domain_separator); + + sponge.absorb(inputs); + + let hash = sponge.squeeze(); + + sponge.finish(); + + hash +} diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index 012decb959..f8a51aad7b 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -7,6 +7,8 @@ use greco::{Greco, Params}; use polynomial::Polynomial; +mod hash; +use hash::generate_commitment; mod constants; mod ciphertext_addition; use ciphertext_addition::CiphertextAddition; @@ -45,8 +47,9 @@ use utils::{check_coefficient_values_with_balance, check_coefficient_zero}; /// fn main( // Ciphertext Addition Section - prev_ct0is: [Polynomial<512>; 2], // todo: make this pub - prev_ct1is: [Polynomial<512>; 2], // todo: make this pub + prev_ct0is: [Polynomial<512>; 2], + prev_ct1is: [Polynomial<512>; 2], + prev_ct_commitment: pub Field, sum_ct0is: [Polynomial<512>; 2], sum_ct1is: [Polynomial<512>; 2], sum_r0is: [Polynomial<512>; 2], @@ -82,7 +85,7 @@ fn main( slot_address: pub Field, balance: Field, is_first_vote: pub bool, -) -> pub ([Polynomial<512>; 2], [Polynomial<512>; 2]) { +) -> pub Field { // ============================================================================ // STEP 1: Authentication - Derive voter's address from signature // ============================================================================ @@ -116,6 +119,7 @@ fn main( merkle_proof_indices, merkle_proof_siblings, ); + assert(merkle_root_calculated == merkle_root); // ============================================================================ @@ -146,6 +150,7 @@ fn main( p1is, p2is, ); + assert(greco.verify()); // ============================================================================ @@ -157,17 +162,26 @@ fn main( // // Mask votes add zero to the previous ciphertext, creating a different ciphertext // with the same plaintext as the previous ciphertext. + assert(prev_ct_commitment == generate_commitment::<512, 2, 36>(prev_ct0is, prev_ct1is)); + + let ct_commitment = generate_commitment::<512, 2, 36>(ct0is, ct1is); + let sum_ct_commitment = generate_commitment::<512, 2, 36>(sum_ct0is, sum_ct1is); + let ct_add: CiphertextAddition<512, 2, 36, 36, 36> = CiphertextAddition::new( params.crypto_params(), ct0is, ct1is, + ct_commitment, prev_ct0is, prev_ct1is, + prev_ct_commitment, sum_ct0is, sum_ct1is, + sum_ct_commitment, sum_r0is, sum_r1is, ); + let is_ct_add_valid = ct_add.verify(); // ============================================================================ @@ -190,17 +204,17 @@ fn main( if (is_signature_valid == true) & (slot_address == address) { check_coefficient_values_with_balance(k1, params.crypto_params().q_mod_t, balance); - (ct0is, ct1is) + ct_commitment } else { let is_vote_zero = check_coefficient_zero(k1); assert(is_vote_zero == true); if is_first_vote { - (ct0is, ct1is) + ct_commitment } else { assert(is_ct_add_valid); - (sum_ct0is, sum_ct1is) + sum_ct_commitment } } } diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol index 24bda8bdb0..a23ed59c5a 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol @@ -7,85 +7,85 @@ pragma solidity >=0.8.21; uint256 constant N = 262144; uint256 constant LOG_N = 18; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 2068; -uint256 constant VK_HASH = 0x1ca8d8a2b64dc27e11e756a83b5efcf951b1dddf2ecb023022dcbf4ba1005de2; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 22; +uint256 constant VK_HASH = 0x26f28ae3b73a5773ae1a7bea2467431fe822acc31169456e60a4250c310fd07b; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(262144), logCircuitSize: uint256(18), - publicInputsSize: uint256(2068), + publicInputsSize: uint256(22), ql: Honk.G1Point({ - x: uint256(0x0c3acef8966ceb2984e47121b763f16a862f3cdb33c24d4b03009a9f737408f6), - y: uint256(0x0da7bce94c82ecdbd4ae789e9753251fd8afc89d9605932b1154387a3d8c00e6) + x: uint256(0x1d865fd06e48b51b676783f0d19ebf1b445d94e7f6500d1396a376631fe469f4), + y: uint256(0x250e743c64a732b74de550769b42f9357695c942ff43cc8dc9f4c11c0258a03f) }), qr: Honk.G1Point({ - x: uint256(0x2e41f2c832adad1d96df181c43ca52c717835470c7e471c087067197e33860d6), - y: uint256(0x25d16a68285523a3e9d8a42344a7489d493b8ddd51ed24b0c566651ca06eb8dc) + x: uint256(0x03e7631b7936c67e35025dacd207cac9ca1823137e7afa46b10afa8a01595b3e), + y: uint256(0x22dc98828cb737561d4dd7ab0523ff5e0779a031c5b6fa1373e352021cec5919) }), qo: Honk.G1Point({ - x: uint256(0x0c0e53fdc05955a112f7b1efaa77afb15271c8ee842163186bbca2a110a6deba), - y: uint256(0x05a9f03fe46a2347ef8aceb395dbc221cf4e180f63bd6e9de07cded19378fdb2) + x: uint256(0x0b1aab94c1d2875a3c7ddaf9a06c23f37773a4810e3f8d3b401c33dd347c1e7a), + y: uint256(0x01d6e038b7cead36031e884f4bd60257fc2f83987e8bbc86900fef27ba4e4d93) }), q4: Honk.G1Point({ - x: uint256(0x1e1cc841a9a3716e0689dca8bcc18f2b9e290bfeaef1f78c28cdcedb13f29d40), - y: uint256(0x12774484a5526ca36a7e91d0d53ec3e115321f609a662b5050ad378a024311e5) + x: uint256(0x1e47edff5786bd2491bf1afbc096d7aa5c18b4c8c9a3bd6f95a08ffd840c02ea), + y: uint256(0x00caf9b62e891ef209fffb0fd53552c6c76f270d760432c51c82df860b8093c3) }), qm: Honk.G1Point({ - x: uint256(0x251c96f789fb3fc5258489bec45ec137c054966c8674132e27feeccf5a81cf25), - y: uint256(0x20491536be9bafbc08346c0a71a3ed3beffb13f2e9f092008230397a1c5fc98d) + x: uint256(0x16ef6679dad594688b37fe23806dd1923b52ecfdc676e3e719f40bcd18c4a93e), + y: uint256(0x1bde423278b0fae5c5875857294be6c3adb369503a7ac170e314105f6cb811f1) }), qc: Honk.G1Point({ - x: uint256(0x0936620bea178cd901115b75f458c8de74899315505e3e52852f668b6fd37674), - y: uint256(0x1ea7f29d26f0d4a3ecd04724b76fe410c7a30e6eb4d8e44f09c5beeaa5f78780) + x: uint256(0x0d4c8e0e3f07a974542f767c5f0ac3845bd7ef66e3b38d1f2b0a8d3656ea746d), + y: uint256(0x1ff7e4aa7f2043681e4cbd8a16763435be5e39e2c68f68b3a0fd180d4991fedd) }), qLookup: Honk.G1Point({ - x: uint256(0x21ed84b63d62aef10a8cd203641cd62f5a42825efd4807a47a4f5d006e44b6af), - y: uint256(0x306347f78166296722434632227c5ac52adfcdf24ee09169a6fb79d4258c7cca) + x: uint256(0x111ada27d4243c5df982e1cd77f2d9aff394ba4f2ba2faf8ec1a8e5b6d78d1e7), + y: uint256(0x1cf81a5fe339ef18222213e43155e149d0211317fe0a68d795681f31ef25ad0f) }), qArith: Honk.G1Point({ - x: uint256(0x053507710ff715cf9363741dc46cc5d686fdd09012e3ccf83a38e3f79f491bb0), - y: uint256(0x0d004c2714d1630398938e93adc23622cb4ae4ca78141a68fb9e365295650cde) + x: uint256(0x15315dbbc48d4a68a159982ab8429bb8a45ad8c24cad6084d18d8c0605c57904), + y: uint256(0x0d0b5e2415664e6ff568c64a4646a7f70c6cd85af2b42ac064e1e12c8ab3d2b5) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x0ddde3ce2b24613aed779dde885daa094fb9087cba224838118a08fa197139db), - y: uint256(0x0030cdcf467265124848353360e5e29839ebd846b687a512f99ae7f8a2a54490) + x: uint256(0x158f89a99b62a2b373a4af0075e87edbb5074f5eadef23bad302fb210c44ccbc), + y: uint256(0x08c449452d60acb69e40392a5fc2a0a29d34159f8e1ac113dde6558f09098162) }), qElliptic: Honk.G1Point({ - x: uint256(0x0214eea9bd774ccbaea3cd9753e77adb6af9bfc2c5ef210160d6af8520204de9), - y: uint256(0x0ac1443dca135c5ddc9a1c38a4323d54a554867a0db1b82b752f9416b6eb8301) + x: uint256(0x017922f3fc081735c9d6f2718bf2baf8a49d7d78ddfefd3eb00f1c15e54629dd), + y: uint256(0x2827a762c7ae2443b085ce320c191170b82f8c7f630ad98b723025f90edf3b31) }), qMemory: Honk.G1Point({ - x: uint256(0x1cb6ea41a55bb0a307ebbbc130d80e6039a971ac4664ed84a2968b8bf2ebbf49), - y: uint256(0x0047bc403498ca5f6ed5c9d15827dcd65dae3030a28002112e1d789680eaac2e) + x: uint256(0x18dfc23c3145e8cb78afafeef8a988f9170290c1ba023c95f0688d9633f2eba6), + y: uint256(0x1c624620d941c6b372acb92bad03174efb480aa4e5106535f6ba16135c8bbea8) }), qNnf: Honk.G1Point({ - x: uint256(0x2c45a53bef969d29924c1585f468d78c3f81a9a2026a37029e4651b8099f61b2), - y: uint256(0x1ff421b8b79665b7ad9c598f4143d155db08e0120f2a8bdd93fae19c5c8caca8) + x: uint256(0x0077c51217cdcdf469f054042dd945185be6677a920042c77e93d86dcf335be8), + y: uint256(0x1898a1bf87489aebe082ce062baf3576b8ac912ba8492382c6c2c17c7ec6b826) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x29a806a3d3deae47f9de89d35a3200f2f66c4b78bab19c0dfb5fe8348f669582), - y: uint256(0x0dc3b792592ccdde2d18bae94cca0e8d499814c70e8bfaeaa63dd902ea7ad008) + x: uint256(0x061ec1e2a88e6a4e315fd2f036ce3ab5b16b4a75ad465adb5c9a9ec0fa7f2778), + y: uint256(0x26847cf463d35b576aabdf21e0f57817568f76fde3c666eb425024628b086e24) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x05024f6de65a4dcced2738308dbda5326cbaafad2981f8b67526eb0eb1cce144), - y: uint256(0x07ec05f2076b4369362030c2c7acbef7efca4eea33e2b13c8a5b92b02a8e34c3) + x: uint256(0x00cd86c00718de5d85a7dd98c5caf77426f2236847d1a4f67de2fe3ee3b02261), + y: uint256(0x04ed434352485cb0c24f861d5e46a8350edf7f0bc34912a3f0ef7fb6b162f40c) }), s1: Honk.G1Point({ - x: uint256(0x01e80e00cc438bef1c0311d8e860d214f1f4f8c030cb97110c64fdb2dbb24f51), - y: uint256(0x17441e3965eacb1bedc71d9983aeb0558222c093f142e597fc66a0b7e9973907) + x: uint256(0x0b8ddadd38386aa67ea96f4a25d7cfadc0523fb112bbbacc652c24626216ab8e), + y: uint256(0x1953e3e6e56fac58d9f3be004a1674769b548a6f502e9c6e7cb94d235232cb08) }), s2: Honk.G1Point({ - x: uint256(0x0d4e58d4f2698d73f7d0980c9e07a20d0587292bbc97212f9f85a786e03847bc), - y: uint256(0x27d389ca0c65494fab3c321aafe3f289ad39b778b76b524fa396c6b51004f812) + x: uint256(0x0bac1ce7376d890ab715b04c6a1b928e8c742e51a2f9cb6516f5c9ce1395a17e), + y: uint256(0x009850df5f3d2cf17cee9dea2572461604a28de7975a0f7d23b4b6e08a39cbb8) }), s3: Honk.G1Point({ - x: uint256(0x27e70f21603a4902a769ea6822a6c06d0715a9f39795fe18fdb6327bf41abca0), - y: uint256(0x1fedc45c7c852a9ebcb12ad5aa0a6df0c8f9576bed8a6d51ba8187b8936d4bd5) + x: uint256(0x1c3e7f90779a9d7a7ddfd427a34de2387f8cda3f070effc37144cb2d4f71b6b9), + y: uint256(0x27b3618027edf37d01f85c478b4a059f278c05fc42364bfa3e81f041010040b1) }), s4: Honk.G1Point({ - x: uint256(0x1ff580dc873878337c5f7697ceb402342ce1b821c37d766f97cedd93b63d0359), - y: uint256(0x196d7d19376846c104f0ef472a6ed732fd243e356908ba33f6c68901ffe8ce13) + x: uint256(0x022433380316455da7a7afd341ffc0da5b293c66db4cbb65c84fab3d527c8df0), + y: uint256(0x2d2fdf2d082e9c60dcb5f8cc4f85d35ad72413409686b742a350cd3d2aa9d923) }), t1: Honk.G1Point({ x: uint256(0x1f16b037f0b4c96ea2a30a118a44e139881c0db8a4d6c9fde7db5c1c1738e61f), @@ -104,28 +104,28 @@ library HonkVerificationKey { y: uint256(0x2d7e8c1ecb92e2490049b50efc811df63f1ca97e58d5e82852dbec0c29715d71) }), id1: Honk.G1Point({ - x: uint256(0x0fc864a6c1236d620b1c09c9278c95610758a8f5fea80f681fd1587c9406ecbf), - y: uint256(0x077911571c3508dbc02c65c15ae1cb3af33b2b69fe73f460925f5c5f906fb51e) + x: uint256(0x11a6b7aca7d05ea2d35ddd74a875c69a9f2f6594ad469df1d2d026e7236616ff), + y: uint256(0x02ce80b8cded10c12ed81ac20da8c5895f4ea6b9b75415740511e4772d3a3926) }), id2: Honk.G1Point({ - x: uint256(0x23760b478cf3aaefe6782ad269e6bed4dbad373b85cf73685b5eb77ec9498bcf), - y: uint256(0x12b6be9b4f5b3cce944a695ad7517218ffb6648ec1a74d4bd028b053a565de67) + x: uint256(0x06aa6de0cf0fb3d6cc77673a7b5dd980e7d11453e33287a757ada5629bf18096), + y: uint256(0x26ae7e73586c3e296172b022f0de8b79aea7aa7b7255839c7349a83144f3e16c) }), id3: Honk.G1Point({ - x: uint256(0x144205f099b5c04c0a4a51e30bf20bd5fff8a82be5eac9a059961db089cb34dc), - y: uint256(0x256a6fdb5a8a8a5dfb285dcaeefb4bf590f58900fb648ba715e465cd3f745918) + x: uint256(0x17c3af29ef11f6f215863b3d63c2d64f683554076da0af1fb1d43480729d9ac5), + y: uint256(0x022f3c451c11490892bceaecb4b2d1635ce84f45b84b2b403bdb7d385912757f) }), id4: Honk.G1Point({ - x: uint256(0x1e1ea32eea4d1afcee4572ecca811099f54e90fcf09b4037f8505248cb65f2c6), - y: uint256(0x10df7dee70bc3946d428fe27811eedbe58a9a9565c9b734268e646b30aed50b8) + x: uint256(0x2fdb37fbe00da4c51efae957e1a99650a86f26d8a0d22ecd9431aa76a37b7a3f), + y: uint256(0x14e184683b870a80cb2efad30c16f4b98e735d429248142c540071f5b7d61722) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x2e8854320df8d7e2bc104a691285ebb73e6a6aeb5834d8818ddfb90779ef7b4a), - y: uint256(0x2a1a85f62dd5371e29e46b650f9b995e91b864d6bebd1bcb0604635f5a5c4270) + x: uint256(0x2999796704e174ce17834f2bd8d5789d1fef54e60fd19cc6a6c14d1c5ab1f8b4), + y: uint256(0x2abb6acbedaef28c6920446c9f70df97df6f158f767b5f3d9c4566f41376e425) }) }); return vk; From 6ca18c1bb355f1d629fe4c7e544738c44f3d8cf2 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Thu, 8 Jan 2026 17:26:30 +0100 Subject: [PATCH 02/12] chore: add license header to hash.nr --- examples/CRISP/circuits/src/hash.nr | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/CRISP/circuits/src/hash.nr b/examples/CRISP/circuits/src/hash.nr index a8ff112f2b..ae73bd418b 100644 --- a/examples/CRISP/circuits/src/hash.nr +++ b/examples/CRISP/circuits/src/hash.nr @@ -1,3 +1,9 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + use polynomial::{flatten, Polynomial}; use safe::SafeSponge; From fff69e70fd3e050695daf8922ad47706d5c9284e Mon Sep 17 00:00:00 2001 From: Cedoor Date: Fri, 9 Jan 2026 11:29:59 +0100 Subject: [PATCH 03/12] refactor: add squeeze count to hash function --- examples/CRISP/circuits/src/ciphertext_addition.nr | 2 +- examples/CRISP/circuits/src/hash.nr | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/CRISP/circuits/src/ciphertext_addition.nr b/examples/CRISP/circuits/src/ciphertext_addition.nr index 616fa1ff4c..cf2d990802 100644 --- a/examples/CRISP/circuits/src/ciphertext_addition.nr +++ b/examples/CRISP/circuits/src/ciphertext_addition.nr @@ -202,7 +202,7 @@ impl(inputs); + let gammas = generate_hash::(inputs, 2 * L); gammas } diff --git a/examples/CRISP/circuits/src/hash.nr b/examples/CRISP/circuits/src/hash.nr index ae73bd418b..cec9deb5eb 100644 --- a/examples/CRISP/circuits/src/hash.nr +++ b/examples/CRISP/circuits/src/hash.nr @@ -26,7 +26,7 @@ pub fn generate_commitment( inputs = flatten::<_, _, BIT>(inputs, poly0is); inputs = flatten::<_, _, BIT>(inputs, poly1is); - let hash = generate_hash::(inputs); + let hash = generate_hash::(inputs, 1); hash.get(0) } @@ -36,9 +36,13 @@ pub fn generate_commitment( /// The sponge absorbs all field elements and squeezes out a single deterministic field element /// that will be used as the hash. /// +/// # Arguments +/// * `inputs` - The input field elements to hash. +/// * `squeeze_count` - The number of field elements to squeeze out of the sponge. +/// /// # Returns /// A field element representing the hash. -pub fn generate_hash(inputs: Vec) -> Vec { +pub fn generate_hash(inputs: Vec, squeeze_count: u32) -> Vec { // Domain separator for CRISP - "CRISP" in hex let domain_separator = [ 0x43, 0x52, 0x49, 0x53, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -50,7 +54,7 @@ pub fn generate_hash(inputs: Vec) -> Vec { // IO Pattern: ABSORB(input_size), SQUEEZE(2*L) let input_size = inputs.len(); - let io_pattern = [0x80000000 | input_size, 0x00000000 | (2 * L)]; + let io_pattern = [0x80000000 | input_size, 0x00000000 | squeeze_count]; let mut sponge = SafeSponge::start(io_pattern, domain_separator); From 05a89ac26b18e8021826f469b7f7508ae59440f8 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Fri, 9 Jan 2026 11:31:43 +0100 Subject: [PATCH 04/12] docs: add documentation to main circuit function --- examples/CRISP/circuits/src/main.nr | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index f8a51aad7b..52e385d42b 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -162,6 +162,18 @@ fn main( // // Mask votes add zero to the previous ciphertext, creating a different ciphertext // with the same plaintext as the previous ciphertext. + // + // Commitments are cryptographic hashes of the polynomial coefficients that bind the + // prover to specific ciphertext values. Three commitments are generated: + // - prev_ct_commitment: commitment to the previous ciphertext (prev_ct0is, prev_ct1is) + // - ct_commitment: commitment to the new vote ciphertext (ct0is, ct1is) + // - sum_ct_commitment: commitment to the sum ciphertext (sum_ct0is, sum_ct1is) + // + // The prev_ct_commitment is verified against the actual polynomials to ensure the + // prover hasn't tampered with the previous ciphertext. The commitments are then used + // in the Fiat-Shamir transform to generate random challenges for the Schwartz-Zippel + // lemma verification, ensuring the addition equations hold without revealing the full + // polynomial coefficients. assert(prev_ct_commitment == generate_commitment::<512, 2, 36>(prev_ct0is, prev_ct1is)); let ct_commitment = generate_commitment::<512, 2, 36>(ct0is, ct1is); From 585061696fffae4d2af4bbca2a97e786b4c1a7bb Mon Sep 17 00:00:00 2001 From: Cedoor Date: Fri, 9 Jan 2026 19:49:37 +0100 Subject: [PATCH 05/12] refactor: add ct commitment computation in the sdk --- examples/CRISP/Cargo.lock | 4 ++ .../CRISP/circuits/src/ciphertext_addition.nr | 11 ++- examples/CRISP/circuits/src/hash.nr | 30 +++++---- .../CRISP/crates/zk-inputs-wasm/Cargo.toml | 2 + .../CRISP/crates/zk-inputs-wasm/src/lib.rs | 56 ++++++++++++++++ examples/CRISP/crates/zk-inputs/Cargo.toml | 2 + .../zk-inputs/src/ciphertext_addition.rs | 24 ++++++- examples/CRISP/crates/zk-inputs/src/lib.rs | 51 +++++++++++--- .../crates/zk-inputs/src/serialization.rs | 5 ++ examples/CRISP/packages/crisp-sdk/src/sdk.ts | 3 +- .../CRISP/packages/crisp-sdk/src/types.ts | 9 ++- .../CRISP/packages/crisp-sdk/src/utils.ts | 12 +++- examples/CRISP/packages/crisp-sdk/src/vote.ts | 67 +++++++++++++++---- .../packages/crisp-sdk/tests/vote.test.ts | 52 +++++--------- 14 files changed, 251 insertions(+), 77 deletions(-) diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index da9fadaae2..0dd5f41a2e 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -2080,6 +2080,8 @@ version = "0.1.0" dependencies = [ "getrandom 0.2.16", "js-sys", + "num-bigint", + "serde_json", "wasm-bindgen", "wasm-bindgen-test", "web-sys", @@ -6646,6 +6648,8 @@ dependencies = [ name = "zk-inputs" version = "0.1.0" dependencies = [ + "ark-bn254 0.5.0", + "ark-ff 0.5.0", "bigint-poly", "crisp-constants", "e3-sdk", diff --git a/examples/CRISP/circuits/src/ciphertext_addition.nr b/examples/CRISP/circuits/src/ciphertext_addition.nr index cf2d990802..6c2cdfc6c1 100644 --- a/examples/CRISP/circuits/src/ciphertext_addition.nr +++ b/examples/CRISP/circuits/src/ciphertext_addition.nr @@ -202,7 +202,16 @@ impl(inputs, 2 * L); + // Domain separator for ciphertext addition circuit - "CiphertextAddition" in hex + let domain_separator = [ + 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]; + + let gammas = generate_hash::(inputs, domain_separator, 2 * L); gammas } diff --git a/examples/CRISP/circuits/src/hash.nr b/examples/CRISP/circuits/src/hash.nr index cec9deb5eb..7aa2aef85d 100644 --- a/examples/CRISP/circuits/src/hash.nr +++ b/examples/CRISP/circuits/src/hash.nr @@ -9,6 +9,7 @@ use safe::SafeSponge; /// Generates a commitment to a set of polynomials by hashing the polynomial coefficients. /// This is done by flattening the polynomial coefficients and hashing them. +/// TODO: Replace with a function from Enclave circuits (PVSS circuits). /// /// # Arguments /// * `poly0is` - The first set of polynomials. @@ -26,7 +27,16 @@ pub fn generate_commitment( inputs = flatten::<_, _, BIT>(inputs, poly0is); inputs = flatten::<_, _, BIT>(inputs, poly1is); - let hash = generate_hash::(inputs, 1); + // Domain separator for commitment - "Greco" in hex + let domain_separator = [ + 0x47, 0x72, 0x65, 0x63, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + ]; + + let hash = generate_hash::(inputs, domain_separator, 1); hash.get(0) } @@ -38,21 +48,17 @@ pub fn generate_commitment( /// /// # Arguments /// * `inputs` - The input field elements to hash. +/// * `domain_separator` - The domain separator to use for the sponge. /// * `squeeze_count` - The number of field elements to squeeze out of the sponge. /// /// # Returns /// A field element representing the hash. -pub fn generate_hash(inputs: Vec, squeeze_count: u32) -> Vec { - // Domain separator for CRISP - "CRISP" in hex - let domain_separator = [ - 0x43, 0x52, 0x49, 0x53, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - ]; - - // IO Pattern: ABSORB(input_size), SQUEEZE(2*L) +pub fn generate_hash( + inputs: Vec, + domain_separator: [u8; 64], + squeeze_count: u32, +) -> Vec { + // IO Pattern: ABSORB(input_size), SQUEEZE(squeeze_count) let input_size = inputs.len(); let io_pattern = [0x80000000 | input_size, 0x00000000 | squeeze_count]; diff --git a/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml b/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml index 33a4f26c72..67274e1eb3 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml +++ b/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml @@ -15,6 +15,8 @@ wasm-bindgen = "0.2" js-sys = "0.3" web-sys = "0.3" getrandom = { version = "0.2", features = ["js"] } +serde_json.workspace = true +num-bigint = "0.4.6" [dev-dependencies] wasm-bindgen-test = "0.2" diff --git a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs index 50cb82cc76..15ad6f9b10 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs @@ -9,6 +9,7 @@ //! This crate provides JavaScript bindings for the CRISP ZK inputs generator using WASM. use js_sys; +use num_bigint::BigInt; use wasm_bindgen::prelude::*; use zk_inputs::ZKInputsGenerator as CoreZKInputsGenerator; @@ -106,6 +107,61 @@ impl ZKInputsGenerator { } } + /// Compute the commitment to a set of ciphertext polynomials from JavaScript. + #[wasm_bindgen(js_name = "computeCommitment")] + pub fn compute_ct_commitment(&self, ct0is: JsValue, ct1is: JsValue) -> Result { + // Parse nested arrays: ct0is and ct1is are arrays of arrays (one array per CRT limb) + let ct0is_array: js_sys::Array = js_sys::Array::from(&ct0is); + let ct1is_array: js_sys::Array = js_sys::Array::from(&ct1is); + + let mut ct0is_vec: Vec> = Vec::new(); + for i in 0..ct0is_array.length() { + let inner_array = ct0is_array + .get(i) + .dyn_into::() + .map_err(|_| JsValue::from_str("Expected array of arrays for ct0is"))?; + + let mut coefficients: Vec = Vec::new(); + for j in 0..inner_array.length() { + let s = inner_array + .get(j) + .as_string() + .ok_or_else(|| JsValue::from_str("Expected string in inner array"))?; + let bigint = s + .parse::() + .map_err(|e| JsValue::from_str(&format!("Failed to parse BigInt: {}", e)))?; + coefficients.push(bigint); + } + ct0is_vec.push(coefficients); + } + + let mut ct1is_vec: Vec> = Vec::new(); + for i in 0..ct1is_array.length() { + let inner_array = ct1is_array + .get(i) + .dyn_into::() + .map_err(|_| JsValue::from_str("Expected array of arrays for ct1is"))?; + + let mut coefficients: Vec = Vec::new(); + for j in 0..inner_array.length() { + let s = inner_array + .get(j) + .as_string() + .ok_or_else(|| JsValue::from_str("Expected string in inner array"))?; + let bigint = s + .parse::() + .map_err(|e| JsValue::from_str(&format!("Failed to parse BigInt: {}", e)))?; + coefficients.push(bigint); + } + ct1is_vec.push(coefficients); + } + + match self.generator.compute_commitment(&ct0is_vec, &ct1is_vec) { + Ok(commitment) => Ok(commitment.to_string()), + Err(e) => Err(JsValue::from_str(&e.to_string())), + } + } + /// Encrypt a vote from JavaScript. #[wasm_bindgen(js_name = "encryptVote")] pub fn encrypt_vote(&self, public_key: &[u8], vote: Vec) -> Result, JsValue> { diff --git a/examples/CRISP/crates/zk-inputs/Cargo.toml b/examples/CRISP/crates/zk-inputs/Cargo.toml index af6ba0ce03..69f81eb5de 100644 --- a/examples/CRISP/crates/zk-inputs/Cargo.toml +++ b/examples/CRISP/crates/zk-inputs/Cargo.toml @@ -25,6 +25,8 @@ rand = "0.8.5" hex = "0.4.3" itertools = "0.14.0" eyre.workspace = true +ark-bn254 = "0.5" +ark-ff = "0.5" diff --git a/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs b/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs index 2736f97a7f..30d4766ab1 100644 --- a/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs +++ b/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs @@ -18,6 +18,8 @@ use rayon::iter::{ParallelBridge, ParallelIterator}; use shared::constants::get_zkp_modulus; use std::sync::Arc; +use shared::commitments::compute_pk_commitment; + /// Set of inputs for validation of a ciphertext addition. /// /// This struct contains all the necessary data to prove that a ciphertext addition @@ -26,6 +28,7 @@ use std::sync::Arc; pub struct CiphertextAdditionInputs { pub prev_ct0is: Vec>, pub prev_ct1is: Vec>, + pub prev_ct_commitment: BigInt, pub sum_ct0is: Vec>, pub sum_ct1is: Vec>, pub r0is: Vec>, @@ -42,6 +45,7 @@ impl CiphertextAdditionInputs { CiphertextAdditionInputs { prev_ct0is: vec![vec![BigInt::zero(); degree]; num_moduli], prev_ct1is: vec![vec![BigInt::zero(); degree]; num_moduli], + prev_ct_commitment: BigInt::zero(), sum_ct0is: vec![vec![BigInt::zero(); degree]; num_moduli], sum_ct1is: vec![vec![BigInt::zero(); degree]; num_moduli], r0is: vec![vec![BigInt::zero(); degree]; num_moduli], @@ -57,6 +61,7 @@ impl CiphertextAdditionInputs { /// * `ct` - The ciphertext being added (from Greco) /// * `sum_ct` - The result of the ciphertext addition /// * `params` - BFV parameters + /// * `bit_ct` - Bit width for ciphertext bounds (used for packing) /// /// # Returns /// CiphertextAdditionInputs containing all necessary proof data @@ -66,6 +71,7 @@ impl CiphertextAdditionInputs { ct: &Ciphertext, sum_ct: &Ciphertext, params: &BfvParameters, + bit_ct: u32, ) -> Result { let ctx: &Arc = params .ctx_at_level(pt.level()) @@ -226,6 +232,8 @@ impl CiphertextAdditionInputs { res.r1is[i] = r1i; } + res.prev_ct_commitment = compute_pk_commitment(&res.prev_ct0is, &res.prev_ct1is, bit_ct); + Ok(res) } @@ -238,6 +246,7 @@ impl CiphertextAdditionInputs { CiphertextAdditionInputs { prev_ct0is: reduce_coefficients_2d(&self.prev_ct0is, zkp_modulus), prev_ct1is: reduce_coefficients_2d(&self.prev_ct1is, zkp_modulus), + prev_ct_commitment: self.prev_ct_commitment.clone() % zkp_modulus, sum_ct0is: reduce_coefficients_2d(&self.sum_ct0is, zkp_modulus), sum_ct1is: reduce_coefficients_2d(&self.sum_ct1is, zkp_modulus), r0is: reduce_coefficients_2d(&self.r0is, zkp_modulus), @@ -274,6 +283,13 @@ mod tests { Plaintext::try_encode(&message_data, Encoding::poly(), params).unwrap() } + fn calculate_bit_ct(params: &Arc) -> u32 { + use greco::bounds::GrecoBounds; + use shared::template::calculate_bit_width; + let (_, bounds) = GrecoBounds::compute(params, 0).unwrap(); + calculate_bit_width(&bounds.pk_bounds[0].to_string()).unwrap() + } + #[test] fn test_new_initialization() { let inputs = CiphertextAdditionInputs::new(2, 1024); @@ -303,7 +319,9 @@ mod tests { let sum_ct = &ct1 + &ct2; // Compute ciphertext addition inputs. - let result = CiphertextAdditionInputs::compute(&pt2, &ct1, &ct2, &sum_ct, &bfv_params); + let bit_ct = calculate_bit_ct(&bfv_params); + let result = + CiphertextAdditionInputs::compute(&pt2, &ct1, &ct2, &sum_ct, &bfv_params, bit_ct); assert!(result.is_ok()); let inputs = result.unwrap(); @@ -327,8 +345,10 @@ mod tests { let (ct2, _u2, _e0_2, _e1_2) = pk.try_encrypt_extended(&pt, &mut rng).unwrap(); let sum_ct = &ct1 + &ct2; + let bit_ct = calculate_bit_ct(&bfv_params); let inputs = - CiphertextAdditionInputs::compute(&pt, &ct1, &ct2, &sum_ct, &bfv_params).unwrap(); + CiphertextAdditionInputs::compute(&pt, &ct1, &ct2, &sum_ct, &bfv_params, bit_ct) + .unwrap(); let standard_form = inputs.standard_form(); // Verify structure is preserved. diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 2eb9f48c2c..2a18bffcf9 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -9,11 +9,11 @@ //! This crate contains the main logic for generating CRISP inputs for zero-knowledge proofs. use crisp_constants::get_default_paramset; +use e3_sdk::bfv_helpers::BfvParamSet; use e3_sdk::bfv_helpers::{ build_bfv_params_arc, - utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext} + utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext}, }; -use e3_sdk::bfv_helpers::BfvParamSet; use eyre::{Context, Result}; use fhe::bfv::BfvParameters; use fhe::bfv::Ciphertext; @@ -23,7 +23,9 @@ use fhe::bfv::{Encoding, Plaintext}; use fhe_traits::{DeserializeParametrized, FheEncoder, Serialize}; use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; +use num_bigint::BigInt; use rand::thread_rng; +use shared::commitments::compute_pk_commitment; use std::sync::Arc; mod ciphertext_addition; use crate::ciphertext_addition::CiphertextAdditionInputs; @@ -118,14 +120,20 @@ impl ZKInputsGenerator { // Deserialize the previous ciphertext. let (ct0is, ct1is) = abi_decode_greco_ciphertext(prev_ciphertext, &self.bfv_params); let prev_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, &self.bfv_params); - + // Compute the ciphertext addition. let sum_ct = &ct + &prev_ct; // Compute the inputs of the ciphertext addition. - let ciphertext_addition_inputs = - CiphertextAdditionInputs::compute(&pt, &prev_ct, &ct, &sum_ct, &self.bfv_params) - .with_context(|| "Failed to compute ciphertext addition inputs")?; + let ciphertext_addition_inputs = CiphertextAdditionInputs::compute( + &pt, + &prev_ct, + &ct, + &sum_ct, + &self.bfv_params, + bit_pk, + ) + .with_context(|| "Failed to compute ciphertext addition inputs")?; // Construct Inputs Section. let inputs = construct_inputs( @@ -195,9 +203,15 @@ impl ZKInputsGenerator { let sum_ct = &ct + &prev_ct; // Compute the inputs of the ciphertext addition. - let ciphertext_addition_inputs = - CiphertextAdditionInputs::compute(&pt, &prev_ct, &ct, &sum_ct, &self.bfv_params) - .with_context(|| "Failed to compute ciphertext addition inputs")?; + let ciphertext_addition_inputs = CiphertextAdditionInputs::compute( + &pt, + &prev_ct, + &ct, + &sum_ct, + &self.bfv_params, + bit_pk, + ) + .with_context(|| "Failed to compute ciphertext addition inputs")?; // Construct Inputs Section. let inputs = construct_inputs( @@ -245,6 +259,25 @@ impl ZKInputsGenerator { Ok(pk.to_bytes()) } + /// Computes the commitment to a set of ciphertext polynomials. + /// + /// # Arguments + /// * `ct0is` - The first component of the ciphertext polynomials. + /// * `ct1is` - The second component of the ciphertext polynomials. + /// + /// # Returns + /// The commitment as a BigInt. + pub fn compute_commitment( + &self, + ct0is: &[Vec], + ct1is: &[Vec], + ) -> Result { + let (_, bounds) = GrecoBounds::compute(&self.bfv_params, 0)?; + let bit = shared::template::calculate_bit_width(&bounds.pk_bounds[0].to_string())?; + + Ok(compute_pk_commitment(ct0is, ct1is, bit)) + } + /// Returns a clone of the BFV parameters used by this generator. pub fn get_bfv_params(&self) -> Arc { self.bfv_params.clone() diff --git a/examples/CRISP/crates/zk-inputs/src/serialization.rs b/examples/CRISP/crates/zk-inputs/src/serialization.rs index 6f18dd5657..2940ee8d9e 100644 --- a/examples/CRISP/crates/zk-inputs/src/serialization.rs +++ b/examples/CRISP/crates/zk-inputs/src/serialization.rs @@ -20,6 +20,7 @@ use serde::Serialize; pub struct ZKInputs { prev_ct0is: Vec, prev_ct1is: Vec, + prev_ct_commitment: String, sum_ct0is: Vec, sum_ct1is: Vec, sum_r0is: Vec, @@ -108,6 +109,9 @@ pub fn construct_inputs( }) }) .collect(), + prev_ct_commitment: ciphertext_addition_inputs_standard + .prev_ct_commitment + .to_string(), sum_ct0is: ciphertext_addition_inputs_standard .sum_ct0is .iter() @@ -357,6 +361,7 @@ mod tests { CiphertextAdditionInputs { prev_ct0is: vec![vec![BigInt::from(1), BigInt::from(2)]], prev_ct1is: vec![vec![BigInt::from(3), BigInt::from(4)]], + prev_ct_commitment: BigInt::from(0), sum_ct0is: vec![vec![BigInt::from(5), BigInt::from(6)]], sum_ct1is: vec![vec![BigInt::from(7), BigInt::from(8)]], r0is: vec![vec![BigInt::from(9), BigInt::from(10)]], diff --git a/examples/CRISP/packages/crisp-sdk/src/sdk.ts b/examples/CRISP/packages/crisp-sdk/src/sdk.ts index 729e1dd9cf..ae7b29ff0b 100644 --- a/examples/CRISP/packages/crisp-sdk/src/sdk.ts +++ b/examples/CRISP/packages/crisp-sdk/src/sdk.ts @@ -7,8 +7,7 @@ import { getIsSlotEmpty, getPreviousCiphertext } from './state' import { generateMaskVoteProof, generateVoteProof } from './vote' -import type { ProofData } from '@aztec/bb.js' -import type { MaskVoteProofRequest, VoteProofRequest } from './types' +import type { MaskVoteProofRequest, ProofData, VoteProofRequest } from './types' /** * A class representing the CRISP SDK. diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index 1d79061fc3..f2e3840252 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -125,6 +125,7 @@ export type CircuitInputs = { // Ciphertext Addition Section. prev_ct0is: Polynomial[] prev_ct1is: Polynomial[] + prev_ct_commitment: string sum_ct0is: Polynomial[] sum_ct1is: Polynomial[] sum_r0is: Polynomial[] @@ -164,9 +165,15 @@ export type CircuitInputs = { is_first_vote: boolean } +export type ProofData = { + publicInputs: string[] + proof: Uint8Array + encryptedVote: `0x${string}`[] +} + export type ExecuteCircuitResult = { witness: Uint8Array - returnValue: [Polynomial[][], Polynomial[][]] + returnValue: bigint } export type ProofInputs = { diff --git a/examples/CRISP/packages/crisp-sdk/src/utils.ts b/examples/CRISP/packages/crisp-sdk/src/utils.ts index 7317a128b9..ce9c82f41a 100644 --- a/examples/CRISP/packages/crisp-sdk/src/utils.ts +++ b/examples/CRISP/packages/crisp-sdk/src/utils.ts @@ -6,7 +6,7 @@ import { poseidon2 } from 'poseidon-lite' import { LeanIMT } from '@zk-kit/lean-imt' -import type { MerkleProof } from './types' +import type { MerkleProof, Polynomial } from './types' import { MERKLE_TREE_MAX_DEPTH, SIGNATURE_MESSAGE_HASH } from './constants' import { publicKeyToAddress } from 'viem/utils' import { hexToBytes, recoverPublicKey } from 'viem' @@ -151,3 +151,13 @@ export async function getOptimalThreadCount(): Promise { // Fallback return 5 } + +/** + * Flatten the ciphertext polynomials into a single array of coefficients + * @param ct0is The first set of ciphertext polynomials + * @param ct1is The second set of ciphertext polynomials + * @returns The flattened ciphertext polynomials as an array of coefficients + */ +export const flattenCiphertext = (ct0is: Polynomial[], ct1is: Polynomial[]): `0x${string}`[] => { + return [...ct0is.flatMap((p) => p.coefficients), ...ct1is.flatMap((p) => p.coefficients)] as `0x${string}`[] +} diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index 2fbb2770f1..11469bd8bd 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -5,11 +5,27 @@ // or FITNESS FOR A PARTICULAR PURPOSE. import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' -import { type CircuitInputs, type Vote, ExecuteCircuitResult, MaskVoteProofInputs, ProofInputs, VoteProofInputs } from './types' -import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' +import { + type CircuitInputs, + type Vote, + ExecuteCircuitResult, + MaskVoteProofInputs, + ProofInputs, + ProofData, + VoteProofInputs, + Polynomial, +} from './types' +import { + generateMerkleProof, + toBinary, + extractSignatureComponents, + getAddressFromSignature, + getOptimalThreadCount, + flattenCiphertext, +} from './utils' import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, ZERO_VOTE, SIGNATURE_MESSAGE_HASH } from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' -import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' +import { UltraHonkBackend } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' import { bytesToHex, encodeAbiParameters, parseAbiParameters, numberToHex, getAddress, hexToBytes } from 'viem/utils' import { Hex } from 'viem' @@ -136,6 +152,22 @@ export const generatePublicKey = (): Uint8Array => { return zkInputsGenerator.generatePublicKey() } +/** + * Compute the commitment to a set of ciphertext polynomials. + * This function is used for testing purposes only. It is not part of the public API. + * @param ct0is - The first component of the ciphertext polynomials. + * @param ct1is - The second component of the ciphertext polynomials. + * @returns The commitment as a bigint. + */ +export const computeCommitment = (ct0is: Polynomial[], ct1is: Polynomial[]): bigint => { + const commitment = zkInputsGenerator.computeCommitment( + ct0is.map((p) => p.coefficients), + ct1is.map((p) => p.coefficients), + ) + + return BigInt(commitment) +} + /** * Generate the circuit inputs for a vote proof. * This works for both vote and masking. @@ -185,7 +217,9 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { const noir = new Noir(circuit as CompiledCircuit) - return noir.execute(crispInputs) as Promise + const { witness, returnValue } = await noir.execute(crispInputs) + + return { witness, returnValue: BigInt(returnValue as `0x${string}`) } } /** @@ -193,7 +227,7 @@ export const executeCircuit = async (crispInputs: CircuitInputs): Promise => { +export const generateProof = async (crispInputs: CircuitInputs) => { const { witness } = await executeCircuit(crispInputs) const backend = new UltraHonkBackend(circuit.bytecode, { threads: optimalThreadCount }) @@ -209,7 +243,7 @@ export const generateProof = async (crispInputs: CircuitInputs): Promise { +export const generateVoteProof = async (voteProofInputs: VoteProofInputs): Promise => { if (voteProofInputs.vote.yes > voteProofInputs.balance || voteProofInputs.vote.no > voteProofInputs.balance) { throw new Error('Invalid vote: vote exceeds balance') } @@ -236,7 +270,9 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { messageHash: voteProofInputs.messageHash, }) - return generateProof(crispInputs) + const encryptedVote = flattenCiphertext(crispInputs.ct0is, crispInputs.ct1is) + + return { ...(await generateProof(crispInputs)), encryptedVote } } /** @@ -255,7 +291,15 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn merkleProof, }) - return generateProof(crispInputs) + let encryptedVote: `0x${string}`[] + + if (crispInputs.is_first_vote) { + encryptedVote = flattenCiphertext(crispInputs.ct0is, crispInputs.ct1is) + } else { + encryptedVote = flattenCiphertext(crispInputs.sum_ct0is, crispInputs.sum_ct1is) + } + + return { ...(await generateProof(crispInputs)), encryptedVote } } /** @@ -279,9 +323,8 @@ export const verifyProof = async (proof: ProofData): Promise => { * @param proof The proof data. * @returns The encoded proof data as a hex string. */ -export const encodeSolidityProof = (proof: ProofData): Hex => { - const vote = proof.publicInputs.slice(4) as `0x${string}`[] - const slotAddress = getAddress(numberToHex(BigInt(proof.publicInputs[2]), { size: 20 })) +export const encodeSolidityProof = ({ publicInputs, proof, encryptedVote }: ProofData): Hex => { + const slotAddress = getAddress(numberToHex(BigInt(publicInputs[2]), { size: 20 })) - return encodeAbiParameters(parseAbiParameters('bytes, bytes32[], address'), [bytesToHex(proof.proof), vote, slotAddress]) + return encodeAbiParameters(parseAbiParameters('bytes, bytes32[], address'), [bytesToHex(proof), encryptedVote, slotAddress]) } diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 075da69168..468934b61d 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -7,7 +7,15 @@ import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vite import { Vote } from '../src/types' import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, ZERO_VOTE, MASK_SIGNATURE } from '../src/constants' import { generateMerkleProof } from '../src/utils' -import { decodeTally, generatePublicKey, verifyProof, encodeVote, generateCircuitInputs, executeCircuit } from '../src/vote' +import { + decodeTally, + generatePublicKey, + verifyProof, + encodeVote, + generateCircuitInputs, + executeCircuit, + computeCommitment, +} from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, LEAVES } from './constants' @@ -117,19 +125,9 @@ describe('Vote', () => { }) const { returnValue } = await executeCircuit(crispInputs) + const commitment = computeCommitment(crispInputs.ct0is, crispInputs.ct1is) - const ct0is = crispInputs.ct0is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const ct1is = crispInputs.ct1is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const outputCt0is = returnValue[0] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - const outputCt1is = returnValue[1] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - - expect([...outputCt0is, ...outputCt1is]).toEqual([...ct0is, ...ct1is]) + expect(returnValue).toEqual(commitment) }) it('Should generate a proof where the output is the ciphertext addition if there is a previous ciphertext and 0 vote', async () => { @@ -151,19 +149,9 @@ describe('Vote', () => { }) const { returnValue } = await executeCircuit(crispInputs) + const commitment = computeCommitment(crispInputs.sum_ct0is, crispInputs.sum_ct1is) - const sumCt0is = crispInputs.sum_ct0is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const sumCt1is = crispInputs.sum_ct1is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const outputSumCt0is = returnValue[0] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - const outputSumCt1is = returnValue[1] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - - expect([...outputSumCt0is, ...outputSumCt1is]).toEqual([...sumCt0is, ...sumCt1is]) + expect(returnValue).toEqual(commitment) }) it('Should generate a proof where the output is the ciphertext of a 0 vote if there is no previous ciphertext', async () => { @@ -182,19 +170,9 @@ describe('Vote', () => { }) const { returnValue } = await executeCircuit(crispInputs) + const commitment = computeCommitment(crispInputs.ct0is, crispInputs.ct1is) - const ct0is = crispInputs.ct0is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const ct1is = crispInputs.ct1is.flatMap((p) => p.coefficients).map((b) => BigInt(b)) - const outputCt0is = returnValue[0] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - const outputCt1is = returnValue[1] - .flat() - .flatMap((p) => p.coefficients) - .map((b) => BigInt(b)) - - expect([...outputCt0is, ...outputCt1is]).toEqual([...ct0is, ...ct1is]) + expect(returnValue).toEqual(commitment) }) }) From 701cd3e3474aafe274994e6b50facda1f7740ede Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 10:49:59 +0100 Subject: [PATCH 06/12] chore: update zkfhe dependencies --- Cargo.lock | 12 ++++++------ crates/aggregator/src/publickey_aggregator.rs | 4 ++-- crates/bfv-helpers/src/client.rs | 6 +++--- crates/indexer/tests/integration.rs | 6 ++++-- crates/tests/tests/integration_legacy.rs | 8 ++++---- crates/wasm/src/lib.rs | 6 ++---- .../crates/zk-inputs/src/ciphertext_addition.rs | 4 ++-- examples/CRISP/crates/zk-inputs/src/lib.rs | 4 ++-- templates/default/Cargo.lock | 12 ++++++------ 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f0c540b24..86b29e9634 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3542,7 +3542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7120,7 +7120,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7217,7 +7217,7 @@ dependencies = [ [[package]] name = "safe" version = "0.1.7" -source = "git+https://github.com/gnosisguild/enclave#ad8c74becdb97608f3279f6a6cb1feba9e68dd1c" +source = "git+https://github.com/gnosisguild/enclave#5f3b221938efc52ad48cee3db8fcbda795b08e9e" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -7897,7 +7897,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9332,7 +9332,7 @@ dependencies = [ [[package]] name = "zkfhe-greco" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -9357,7 +9357,7 @@ dependencies = [ [[package]] name = "zkfhe-shared" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", diff --git a/crates/aggregator/src/publickey_aggregator.rs b/crates/aggregator/src/publickey_aggregator.rs index 2d8fe09f7c..16096ad3d4 100644 --- a/crates/aggregator/src/publickey_aggregator.rs +++ b/crates/aggregator/src/publickey_aggregator.rs @@ -6,7 +6,7 @@ use actix::prelude::*; use anyhow::Result; -use e3_bfv_helpers::client::compute_pk_commitment; +use e3_bfv_helpers::client::compute_poly_commitment; use e3_data::Persistable; use e3_events::{ prelude::*, BusHandle, Die, E3id, EnclaveEvent, EnclaveEventData, KeyshareCreated, OrderedSet, @@ -182,7 +182,7 @@ impl Handler for PublicKeyAggregator { keyshares: msg.keyshares, })?; - let public_key_hash = compute_pk_commitment( + let public_key_hash = compute_poly_commitment( pubkey.clone(), self.fhe.params.degree(), self.fhe.params.plaintext(), diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs index 4b2eebf979..e065c06957 100644 --- a/crates/bfv-helpers/src/client.rs +++ b/crates/bfv-helpers/src/client.rs @@ -130,13 +130,13 @@ where }) } -pub fn compute_pk_commitment( +pub fn compute_poly_commitment( public_key: Vec, degree: usize, plaintext_modulus: u64, moduli: Vec, ) -> Result<[u8; 32]> { - use shared::commitments::compute_pk_commitment as _compute_pk_commitment; + use shared::commitments::compute_poly_commitment as _compute_poly_commitment; use shared::template::calculate_bit_width; let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); @@ -148,7 +148,7 @@ pub fn compute_pk_commitment( let bit_pk = calculate_bit_width(&bounds.pk_bounds[0].to_string())?; let (pk0is, pk1is) = bfv_public_key_to_greco(&public_key, ¶ms); - let commitment_bigint = _compute_pk_commitment(&pk0is, &pk1is, bit_pk); + let commitment_bigint = _compute_poly_commitment(&pk0is, &pk1is, bit_pk); let bytes = commitment_bigint.to_bytes_be().1; diff --git a/crates/indexer/tests/integration.rs b/crates/indexer/tests/integration.rs index 63f02523fb..8b932477e1 100644 --- a/crates/indexer/tests/integration.rs +++ b/crates/indexer/tests/integration.rs @@ -9,7 +9,9 @@ use alloy::{ primitives::{Bytes, FixedBytes, Uint}, sol, }; -use e3_bfv_helpers::{build_bfv_params_from_set_arc, client::compute_pk_commitment, BfvParamSets}; +use e3_bfv_helpers::{ + build_bfv_params_from_set_arc, client::compute_poly_commitment, BfvParamSets, +}; use e3_evm_helpers::contracts::ReadOnly; use e3_indexer::{DataStore, EnclaveIndexer, InMemoryStore}; use eyre::Result; @@ -98,7 +100,7 @@ async fn test_indexer() -> Result<()> { let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); - let public_key_commitment = compute_pk_commitment( + let public_key_commitment = compute_poly_commitment( pk.to_bytes(), params.degree(), params.plaintext(), diff --git a/crates/tests/tests/integration_legacy.rs b/crates/tests/tests/integration_legacy.rs index ebdcb67727..4a17e0cef3 100644 --- a/crates/tests/tests/integration_legacy.rs +++ b/crates/tests/tests/integration_legacy.rs @@ -8,7 +8,7 @@ use actix::prelude::*; use actix::Actor; use alloy::primitives::{FixedBytes, I256, U256}; use anyhow::*; -use e3_bfv_helpers::client::compute_pk_commitment; +use e3_bfv_helpers::client::compute_poly_commitment; use e3_ciphernode_builder::CiphernodeBuilder; use e3_ciphernode_builder::CiphernodeHandle; use e3_ciphernode_builder::EventSystem; @@ -221,7 +221,7 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { let rng_test = create_shared_rng_from_u64(42); let test_shares = generate_pk_shares(¶ms, &crpoly, &rng_test, ð_addrs)?; let test_pubkey = aggregate_public_key(&test_shares)?; - let public_key_hash = compute_pk_commitment( + let public_key_hash = compute_poly_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), @@ -569,7 +569,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { let test_pubkey = aggregate_public_key(&generate_pk_shares( ¶ms, &crpoly, &rng_test, ð_addrs, )?)?; - let public_key_hash = compute_pk_commitment( + let public_key_hash = compute_poly_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), @@ -612,7 +612,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { ¶ms, &crpoly, &rng_test, ð_addrs, )?)?; - let public_key_hash = compute_pk_commitment( + let public_key_hash = compute_poly_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index 2de2751d95..c2bdeb3c57 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -5,9 +5,7 @@ // or FITNESS FOR A PARTICULAR PURPOSE. use e3_bfv_helpers::{ - client::{ - bfv_encrypt, bfv_verifiable_encrypt, compute_pk_commitment as _compute_pk_commitment, - }, + client::{bfv_encrypt, bfv_verifiable_encrypt, compute_poly_commitment}, BfvParamSet, BfvParamSets, }; use serde::{Deserialize, Serialize}; @@ -62,7 +60,7 @@ pub fn compute_pk_commitment( plaintext_modulus: u64, moduli: Vec, ) -> Result, JsValue> { - let commitment = _compute_pk_commitment(public_key, degree, plaintext_modulus, moduli) + let commitment = compute_poly_commitment(public_key, degree, plaintext_modulus, moduli) .map_err(|e| JsValue::from_str(&format!("{}", e)))?; Ok(commitment.to_vec()) } diff --git a/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs b/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs index 30d4766ab1..d49210ef60 100644 --- a/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs +++ b/examples/CRISP/crates/zk-inputs/src/ciphertext_addition.rs @@ -18,7 +18,7 @@ use rayon::iter::{ParallelBridge, ParallelIterator}; use shared::constants::get_zkp_modulus; use std::sync::Arc; -use shared::commitments::compute_pk_commitment; +use shared::commitments::compute_poly_commitment; /// Set of inputs for validation of a ciphertext addition. /// @@ -232,7 +232,7 @@ impl CiphertextAdditionInputs { res.r1is[i] = r1i; } - res.prev_ct_commitment = compute_pk_commitment(&res.prev_ct0is, &res.prev_ct1is, bit_ct); + res.prev_ct_commitment = compute_poly_commitment(&res.prev_ct0is, &res.prev_ct1is, bit_ct); Ok(res) } diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 2a18bffcf9..40f014dddc 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -25,7 +25,7 @@ use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; use num_bigint::BigInt; use rand::thread_rng; -use shared::commitments::compute_pk_commitment; +use shared::commitments::compute_poly_commitment; use std::sync::Arc; mod ciphertext_addition; use crate::ciphertext_addition::CiphertextAdditionInputs; @@ -275,7 +275,7 @@ impl ZKInputsGenerator { let (_, bounds) = GrecoBounds::compute(&self.bfv_params, 0)?; let bit = shared::template::calculate_bit_width(&bounds.pk_bounds[0].to_string())?; - Ok(compute_pk_commitment(ct0is, ct1is, bit)) + Ok(compute_poly_commitment(ct0is, ct1is, bit)) } /// Returns a clone of the BFV parameters used by this generator. diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index ed02af23e4..ea6e39884a 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -1343,7 +1343,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -3084,7 +3084,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -3147,7 +3147,7 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe" version = "0.1.7" -source = "git+https://github.com/gnosisguild/enclave#ad8c74becdb97608f3279f6a6cb1feba9e68dd1c" +source = "git+https://github.com/gnosisguild/enclave#5f3b221938efc52ad48cee3db8fcbda795b08e9e" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -3559,7 +3559,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -4427,7 +4427,7 @@ dependencies = [ [[package]] name = "zkfhe-greco" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -4452,7 +4452,7 @@ dependencies = [ [[package]] name = "zkfhe-shared" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", From 06ff92bf63f55ad6ac24dd89a64d2f1e58ff9d0e Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 12:42:40 +0100 Subject: [PATCH 07/12] refactor: update contracts and sdk --- examples/CRISP/Cargo.lock | 16 ++-- examples/CRISP/circuits/src/main.nr | 15 ++-- .../CRISP/crates/zk-inputs-wasm/src/lib.rs | 52 +++++++++-- examples/CRISP/crates/zk-inputs/src/lib.rs | 45 +++++++--- .../contracts/CRISPProgram.sol | 43 ++++----- .../contracts/CRISPVerifier.sol | 90 +++++++++---------- .../tests/crisp.contracts.test.ts | 2 +- .../CRISP/packages/crisp-sdk/src/types.ts | 2 +- .../CRISP/packages/crisp-sdk/src/utils.ts | 10 --- examples/CRISP/packages/crisp-sdk/src/vote.ts | 54 ++++++----- .../packages/crisp-sdk/tests/vote.test.ts | 10 +-- 11 files changed, 194 insertions(+), 145 deletions(-) diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index 0dd5f41a2e..a6396216b6 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -1091,7 +1091,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1102,7 +1102,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2576,7 +2576,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4906,7 +4906,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4971,7 +4971,7 @@ checksum = "62049b2877bf12821e8f9ad256ee38fdc31db7387ec2d3b3f403024de2034aea" [[package]] name = "safe" version = "0.1.7" -source = "git+https://github.com/gnosisguild/enclave#d4c7e455a8cce813760b454289c3e269710add81" +source = "git+https://github.com/gnosisguild/enclave#5f3b221938efc52ad48cee3db8fcbda795b08e9e" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -5514,7 +5514,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -6683,7 +6683,7 @@ dependencies = [ [[package]] name = "zkfhe-greco" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -6708,7 +6708,7 @@ dependencies = [ [[package]] name = "zkfhe-shared" version = "0.1.0" -source = "git+https://github.com/gnosisguild/zkfhe-generator#9acbf0eaa73214646e472ef8df7499d1fce72ce0" +source = "git+https://github.com/gnosisguild/zkfhe-generator#fec2bc0ceb372e8ea03fce1ea1c90f561acfebfc" dependencies = [ "anyhow", "ark-bn254 0.5.0", diff --git a/examples/CRISP/circuits/src/main.nr b/examples/CRISP/circuits/src/main.nr index 52e385d42b..65bca16190 100644 --- a/examples/CRISP/circuits/src/main.nr +++ b/examples/CRISP/circuits/src/main.nr @@ -170,12 +170,12 @@ fn main( // - sum_ct_commitment: commitment to the sum ciphertext (sum_ct0is, sum_ct1is) // // The prev_ct_commitment is verified against the actual polynomials to ensure the - // prover hasn't tampered with the previous ciphertext. The commitments are then used - // in the Fiat-Shamir transform to generate random challenges for the Schwartz-Zippel - // lemma verification, ensuring the addition equations hold without revealing the full - // polynomial coefficients. - assert(prev_ct_commitment == generate_commitment::<512, 2, 36>(prev_ct0is, prev_ct1is)); - + // prover hasn't tampered with the previous ciphertext. This check is only performed + // for mask votes when it's not the first vote (i.e., when there's a previous ciphertext + // to verify). The commitments are then used in the Fiat-Shamir transform to generate + // random challenges for the Schwartz-Zippel lemma verification, ensuring the addition + // equations hold without revealing the full polynomial coefficients. + let _prev_ct_commitment = generate_commitment::<512, 2, 36>(prev_ct0is, prev_ct1is); let ct_commitment = generate_commitment::<512, 2, 36>(ct0is, ct1is); let sum_ct_commitment = generate_commitment::<512, 2, 36>(sum_ct0is, sum_ct1is); @@ -186,7 +186,7 @@ fn main( ct_commitment, prev_ct0is, prev_ct1is, - prev_ct_commitment, + _prev_ct_commitment, sum_ct0is, sum_ct1is, sum_ct_commitment, @@ -224,6 +224,7 @@ fn main( if is_first_vote { ct_commitment } else { + assert(prev_ct_commitment == _prev_ct_commitment); assert(is_ct_add_valid); sum_ct_commitment diff --git a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs index 15ad6f9b10..72f859013d 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs @@ -62,10 +62,20 @@ impl ZKInputsGenerator { .generator .generate_inputs(prev_ciphertext, public_key, vote_vec) { - Ok(inputs_json) => { - // Parse the JSON string and return as JsValue. + Ok((ciphertext_bytes, inputs_json)) => { + // Parse the JSON string and return as an object with both encryptedVote and inputs. + let result = js_sys::Object::new(); + + // Set encryptedVote as Uint8Array + let ciphertext_array = js_sys::Uint8Array::from(&ciphertext_bytes[..]); + js_sys::Reflect::set(&result, &"encryptedVote".into(), &ciphertext_array.into())?; + + // Parse and set inputs JSON match js_sys::JSON::parse(&inputs_json) { - Ok(js_value) => Ok(js_value), + Ok(js_value) => { + js_sys::Reflect::set(&result, &"inputs".into(), &js_value)?; + Ok(result.into()) + } Err(_) => Err(JsValue::from_str("Failed to parse inputs JSON")), } } @@ -87,10 +97,20 @@ impl ZKInputsGenerator { .generator .generate_inputs_for_update(prev_ciphertext, public_key, vote_vec) { - Ok(inputs_json) => { - // Parse the JSON string and return as JsValue. + Ok((ciphertext_bytes, inputs_json)) => { + // Parse the JSON string and return as an object with both encryptedVote and inputs. + let result = js_sys::Object::new(); + + // Set encryptedVote as Uint8Array + let ciphertext_array = js_sys::Uint8Array::from(&ciphertext_bytes[..]); + js_sys::Reflect::set(&result, &"encryptedVote".into(), &ciphertext_array.into())?; + + // Parse and set inputs JSON match js_sys::JSON::parse(&inputs_json) { - Ok(js_value) => Ok(js_value), + Ok(js_value) => { + js_sys::Reflect::set(&result, &"inputs".into(), &js_value)?; + Ok(result.into()) + } Err(_) => Err(JsValue::from_str("Failed to parse inputs JSON")), } } @@ -237,7 +257,15 @@ mod tests { assert!(result.is_ok()); - let inputs = result.unwrap(); + let result_obj = result.unwrap(); + // Extract encryptedVote and inputs from the result object + let encrypted_vote = js_sys::Reflect::get(&result_obj, &"encryptedVote".into()).unwrap(); + let inputs = js_sys::Reflect::get(&result_obj, &"inputs".into()).unwrap(); + + // Verify encryptedVote is a Uint8Array and not empty + assert!(encrypted_vote.is_object()); + let encrypted_vote_array = encrypted_vote.dyn_into::().unwrap(); + assert!(encrypted_vote_array.length() > 0); // Convert JsValue to string for testing. let inputs_str = js_sys::JSON::stringify(&inputs) @@ -263,7 +291,15 @@ mod tests { assert!(result.is_ok()); - let inputs = result.unwrap(); + let result_obj = result.unwrap(); + // Extract encryptedVote and inputs from the result object + let encrypted_vote = js_sys::Reflect::get(&result_obj, &"encryptedVote".into()).unwrap(); + let inputs = js_sys::Reflect::get(&result_obj, &"inputs".into()).unwrap(); + + // Verify encryptedVote is a Uint8Array and not empty + assert!(encrypted_vote.is_object()); + let encrypted_vote_array = encrypted_vote.dyn_into::().unwrap(); + assert!(encrypted_vote_array.length() > 0); // Convert JsValue to string for testing. let inputs_str = js_sys::JSON::stringify(&inputs) diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 40f014dddc..36aebc5b0c 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -24,6 +24,7 @@ use fhe_traits::{DeserializeParametrized, FheEncoder, Serialize}; use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; use num_bigint::BigInt; +use num_traits::Zero; use rand::thread_rng; use shared::commitments::compute_poly_commitment; use std::sync::Arc; @@ -76,13 +77,13 @@ impl ZKInputsGenerator { /// * `vote` - Vote value as a vector of coefficients /// /// # Returns - /// JSON string containing the CRISP ZK inputs + /// Tuple containing the sum ciphertext bytes and JSON string with CRISP ZK inputs pub fn generate_inputs_for_update( &self, prev_ciphertext: &[u8], public_key: &[u8], vote: Vec, - ) -> Result { + ) -> Result<(Vec, String)> { // Deserialize the provided public key. let pk = PublicKey::from_bytes(public_key, &self.bfv_params) .with_context(|| "Failed to deserialize public key")?; @@ -143,7 +144,11 @@ impl ZKInputsGenerator { &ciphertext_addition_inputs.standard_form(), ); - Ok(serialize_inputs_to_json(&inputs)?) + let inputs_json = serialize_inputs_to_json(&inputs)?; + // For updates, return the sum ciphertext (ct + prev_ct) + let ciphertext_bytes = sum_ct.to_bytes(); + + Ok((ciphertext_bytes, inputs_json)) } /// Generates CRISP ZK inputs for a vote encryption and addition operation. @@ -154,13 +159,13 @@ impl ZKInputsGenerator { /// * `vote` - Vote value as a vector of coefficients /// /// # Returns - /// JSON string containing the CRISP ZK inputs + /// Tuple containing the vote ciphertext bytes and JSON string with CRISP ZK inputs pub fn generate_inputs( &self, prev_ciphertext: &[u8], public_key: &[u8], vote: Vec, - ) -> Result { + ) -> Result<(Vec, String)> { // Deserialize the provided public key. let pk = PublicKey::from_bytes(public_key, &self.bfv_params) .with_context(|| "Failed to deserialize public key")?; @@ -203,7 +208,7 @@ impl ZKInputsGenerator { let sum_ct = &ct + &prev_ct; // Compute the inputs of the ciphertext addition. - let ciphertext_addition_inputs = CiphertextAdditionInputs::compute( + let mut ciphertext_addition_inputs = CiphertextAdditionInputs::compute( &pt, &prev_ct, &ct, @@ -213,6 +218,9 @@ impl ZKInputsGenerator { ) .with_context(|| "Failed to compute ciphertext addition inputs")?; + // For first votes, set prev_ct_commitment to 0 since there's no previous ciphertext + ciphertext_addition_inputs.prev_ct_commitment = BigInt::zero(); + // Construct Inputs Section. let inputs = construct_inputs( &crypto_params, @@ -221,7 +229,10 @@ impl ZKInputsGenerator { &ciphertext_addition_inputs.standard_form(), ); - Ok(serialize_inputs_to_json(&inputs)?) + let inputs_json = serialize_inputs_to_json(&inputs)?; + let ciphertext_bytes = ct.to_bytes(); + + Ok((ciphertext_bytes, inputs_json)) } /// Encrypts a vote using the provided public key. @@ -308,7 +319,9 @@ mod tests { let result = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result.is_ok()); - let json_output = result.unwrap(); + let (ciphertext_bytes, json_output) = result.unwrap(); + // Verify ciphertext is not empty + assert!(!ciphertext_bytes.is_empty()); // Verify it's valid JSON and contains expected fields. assert!(json_output.contains("params")); assert!(json_output.contains("pk0is")); @@ -333,7 +346,9 @@ mod tests { let result = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result.is_ok()); - let json_output = result.unwrap(); + let (ciphertext_bytes, json_output) = result.unwrap(); + // Verify ciphertext is not empty + assert!(!ciphertext_bytes.is_empty()); // Verify it's valid JSON and contains expected fields. assert!(json_output.contains("params")); assert!(json_output.contains("pk0is")); @@ -353,7 +368,9 @@ mod tests { let result = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result.is_ok()); - let json_output = result.unwrap(); + let (ciphertext_bytes, json_output) = result.unwrap(); + // Verify ciphertext is not empty + assert!(!ciphertext_bytes.is_empty()); // Verify it's valid JSON and contains expected fields. assert!(json_output.contains("params")); assert!(json_output.contains("pk0is")); @@ -393,7 +410,8 @@ mod tests { let result = generator.generate_inputs(&ciphertext, &public_key, vote.clone()); assert!(result.is_ok()); - let json_output = result.unwrap(); + let (ciphertext_bytes, json_output) = result.unwrap(); + assert!(!ciphertext_bytes.is_empty()); assert!(json_output.contains("params")); assert!(json_output.contains("pk0is")); assert!(json_output.contains("crypto")); @@ -433,10 +451,12 @@ mod tests { // Test vote = 0. let result_0 = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result_0.is_ok()); + let (_, _) = result_0.unwrap(); // Test vote = 1. let result_1 = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result_1.is_ok()); + let (_, _) = result_1.unwrap(); } #[test] @@ -452,7 +472,8 @@ mod tests { let result = generator.generate_inputs(&prev_ciphertext, &public_key, vote.clone()); assert!(result.is_ok()); - let json_output = result.unwrap(); + let (ciphertext_bytes, json_output) = result.unwrap(); + assert!(!ciphertext_bytes.is_empty()); // Parse JSON to verify structure. let parsed: serde_json::Value = diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol index 111b156947..471fdcc959 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol @@ -128,32 +128,31 @@ contract CRISPProgram is IE3Program, Ownable { if (data.length == 0) revert EmptyInputData(); - (bytes memory noirProof, bytes32[] memory vote, address slotAddress) = abi.decode(data, (bytes, bytes32[], address)); + (bytes memory noirProof, address slotAddress, bytes32 encryptedVoteCommitment, bytes memory encryptedVote) = abi.decode( + data, + (bytes, address, bytes32, bytes) + ); - bytes memory voteBytes = abi.encode(vote); - - (uint40 voteIndex, bool isFirstVote) = _processVote(e3Id, slotAddress, voteBytes); - - // Set public inputs for the proof. Order must match Noir circuit. - bytes32[] memory noirPublicInputs = new bytes32[](4 + vote.length); + (uint40 voteIndex, bytes32 previousEncryptedVoteCommitment) = _processVote(e3Id, slotAddress, encryptedVoteCommitment); // Fetch E3 to get committee public key E3 memory e3 = enclave.getE3(e3Id); - noirPublicInputs[0] = e3.committeePublicKey; - noirPublicInputs[1] = bytes32(e3Data[e3Id].merkleRoot); - noirPublicInputs[2] = bytes32(uint256(uint160(slotAddress))); - noirPublicInputs[3] = bytes32(uint256(isFirstVote ? 1 : 0)); - for (uint256 i = 0; i < vote.length; i++) { - noirPublicInputs[i + 4] = vote[i]; - } + // Set the public inputs for the proof. Order must match Noir circuit. + bytes32[] memory noirPublicInputs = new bytes32[](6); + noirPublicInputs[0] = previousEncryptedVoteCommitment; + noirPublicInputs[1] = e3.committeePublicKey; + noirPublicInputs[2] = bytes32(e3Data[e3Id].merkleRoot); + noirPublicInputs[3] = bytes32(uint256(uint160(slotAddress))); + noirPublicInputs[4] = bytes32(uint256(previousEncryptedVoteCommitment == bytes32(0) ? 1 : 0)); + noirPublicInputs[5] = encryptedVoteCommitment; // Check if the ciphertext was encrypted correctly if (!honkVerifier.verify(noirProof, noirPublicInputs)) { revert InvalidNoirProof(); } - emit InputPublished(e3Id, voteBytes, voteIndex); + emit InputPublished(e3Id, encryptedVote, voteIndex); } /// @notice Decode the tally from the plaintext output @@ -220,22 +219,26 @@ contract CRISPProgram is IE3Program, Ownable { /// @notice Process a vote: insert or update in the merkle tree depending /// on whether it's the first vote or an override. - function _processVote(uint256 e3Id, address slotAddress, bytes memory vote) internal returns (uint40 voteIndex, bool isFirstVote) { + function _processVote( + uint256 e3Id, + address slotAddress, + bytes32 encryptedVoteCommitment + ) internal returns (uint40 voteIndex, bytes32 previousEncryptedVoteCommitment) { uint40 storedIndexPlusOne = e3Data[e3Id].voteSlots[slotAddress]; // we treat the index 0 as not voted yet // any valid index will be index + 1 if (storedIndexPlusOne == 0) { // FIRST VOTE - isFirstVote = true; + previousEncryptedVoteCommitment = bytes32(0); voteIndex = e3Data[e3Id].votes.numberOfLeaves; e3Data[e3Id].voteSlots[slotAddress] = voteIndex + 1; - e3Data[e3Id].votes._insert(PoseidonT3.hash([uint256(keccak256(vote)), voteIndex])); + e3Data[e3Id].votes._insert(uint256(encryptedVoteCommitment)); } else { // RE-VOTE - isFirstVote = false; voteIndex = storedIndexPlusOne - 1; - e3Data[e3Id].votes._update(PoseidonT3.hash([uint256(keccak256(vote)), voteIndex]), voteIndex); + previousEncryptedVoteCommitment = bytes32(e3Data[e3Id].votes.elements[voteIndex]); + e3Data[e3Id].votes._update(uint256(encryptedVoteCommitment), voteIndex); } } diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol index a23ed59c5a..a78f635973 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.21; uint256 constant N = 262144; uint256 constant LOG_N = 18; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 22; -uint256 constant VK_HASH = 0x26f28ae3b73a5773ae1a7bea2467431fe822acc31169456e60a4250c310fd07b; +uint256 constant VK_HASH = 0x0d53ba57f65358b21e53cf07b91c27906ac4d24b9205fda35494e1a44ba7242a; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ @@ -16,76 +16,76 @@ library HonkVerificationKey { logCircuitSize: uint256(18), publicInputsSize: uint256(22), ql: Honk.G1Point({ - x: uint256(0x1d865fd06e48b51b676783f0d19ebf1b445d94e7f6500d1396a376631fe469f4), - y: uint256(0x250e743c64a732b74de550769b42f9357695c942ff43cc8dc9f4c11c0258a03f) + x: uint256(0x112a6aa13787457ce92f268d8f6719287c1add28a224712ea3e2e7d96e2bc70b), + y: uint256(0x14dcf6e306f1dc722638d4984332053df53689114040ccd69d5926f485219e15) }), qr: Honk.G1Point({ - x: uint256(0x03e7631b7936c67e35025dacd207cac9ca1823137e7afa46b10afa8a01595b3e), - y: uint256(0x22dc98828cb737561d4dd7ab0523ff5e0779a031c5b6fa1373e352021cec5919) + x: uint256(0x22a648530332803c4a992d98fd94a036c8ff1341c3d0ba385210b8851049206c), + y: uint256(0x0b891280448cdaee82da9caec22fb4820e3140558570c252669508b4f90fba2b) }), qo: Honk.G1Point({ - x: uint256(0x0b1aab94c1d2875a3c7ddaf9a06c23f37773a4810e3f8d3b401c33dd347c1e7a), - y: uint256(0x01d6e038b7cead36031e884f4bd60257fc2f83987e8bbc86900fef27ba4e4d93) + x: uint256(0x1ca6c37b9177a348c574f214e0683da82632df5c0d10addde3f372cda3f8978a), + y: uint256(0x22ce8ff67ba39a26d4ad603fbe668d9eb3f34f80b4e21e5cbf421d873f6ca040) }), q4: Honk.G1Point({ - x: uint256(0x1e47edff5786bd2491bf1afbc096d7aa5c18b4c8c9a3bd6f95a08ffd840c02ea), - y: uint256(0x00caf9b62e891ef209fffb0fd53552c6c76f270d760432c51c82df860b8093c3) + x: uint256(0x0af0446ba584e461430e07a1f990aaee46d7b5088ad9f54d4a1350d57fa37ab6), + y: uint256(0x152ab3b635c7f88c62d6bb37fdff5bed5e42e01e0f9894058c10deea1994e4ef) }), qm: Honk.G1Point({ - x: uint256(0x16ef6679dad594688b37fe23806dd1923b52ecfdc676e3e719f40bcd18c4a93e), - y: uint256(0x1bde423278b0fae5c5875857294be6c3adb369503a7ac170e314105f6cb811f1) + x: uint256(0x2493bb0b6575f4240fa4ca66ab503effe7ad653c552cfe608e662e18e8ce5eb8), + y: uint256(0x1b5829dbe6ee24d5f1a776ddc4e27a90888310a3f384fe8f70cd86c2f9eebf7e) }), qc: Honk.G1Point({ - x: uint256(0x0d4c8e0e3f07a974542f767c5f0ac3845bd7ef66e3b38d1f2b0a8d3656ea746d), - y: uint256(0x1ff7e4aa7f2043681e4cbd8a16763435be5e39e2c68f68b3a0fd180d4991fedd) + x: uint256(0x2ccaa4f079bfc85f3887807ba17bffd69c73402d557395f6730d31cf1f208e53), + y: uint256(0x11e38adba343d4c9839c5b4ed4d54c38d7d0e17b0c3890add1544aa18a53f805) }), qLookup: Honk.G1Point({ x: uint256(0x111ada27d4243c5df982e1cd77f2d9aff394ba4f2ba2faf8ec1a8e5b6d78d1e7), y: uint256(0x1cf81a5fe339ef18222213e43155e149d0211317fe0a68d795681f31ef25ad0f) }), qArith: Honk.G1Point({ - x: uint256(0x15315dbbc48d4a68a159982ab8429bb8a45ad8c24cad6084d18d8c0605c57904), - y: uint256(0x0d0b5e2415664e6ff568c64a4646a7f70c6cd85af2b42ac064e1e12c8ab3d2b5) + x: uint256(0x2771f716f503f8552b69271a62ec8cd7ab492b67f4859d8ff0321ce075e0361e), + y: uint256(0x0a7762803ccc6145a73d9df81cb83b8d7125f07f998525b8ec888bb39ff32658) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x158f89a99b62a2b373a4af0075e87edbb5074f5eadef23bad302fb210c44ccbc), - y: uint256(0x08c449452d60acb69e40392a5fc2a0a29d34159f8e1ac113dde6558f09098162) + x: uint256(0x0188abc30c433d60b371a87b89bef69474c4de9748b2b4b4e01d3e423cc2e975), + y: uint256(0x2bbddad8b0e16ca7d71b0ca54b0f6251ea7c4457d76ba3327982171026423a40) }), qElliptic: Honk.G1Point({ - x: uint256(0x017922f3fc081735c9d6f2718bf2baf8a49d7d78ddfefd3eb00f1c15e54629dd), - y: uint256(0x2827a762c7ae2443b085ce320c191170b82f8c7f630ad98b723025f90edf3b31) + x: uint256(0x1a2e2850cfbe3912c8f6a4c0099bc93bc50841ce22d665b83b081753ce664a24), + y: uint256(0x1976524b69c879a83c4d704ff5cb39397679528681ad378e6753e8b63457c40e) }), qMemory: Honk.G1Point({ - x: uint256(0x18dfc23c3145e8cb78afafeef8a988f9170290c1ba023c95f0688d9633f2eba6), - y: uint256(0x1c624620d941c6b372acb92bad03174efb480aa4e5106535f6ba16135c8bbea8) + x: uint256(0x2e569e263fc7a1cfa7b839e1d01a24bb6e07a396cbe93280eaa5f428f9bfcda3), + y: uint256(0x232683b772e71e0839c2c22a0325540c142df09d86ad281e95c9a8526c8a8b1d) }), qNnf: Honk.G1Point({ - x: uint256(0x0077c51217cdcdf469f054042dd945185be6677a920042c77e93d86dcf335be8), - y: uint256(0x1898a1bf87489aebe082ce062baf3576b8ac912ba8492382c6c2c17c7ec6b826) + x: uint256(0x21cdfcabf16e6fa296718413cc974b48e44c715143907a9c5cc722aa737b74b0), + y: uint256(0x2280bd00b21340373b65aa88a619fa5f770435b772e1620701f76d769d041ea4) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x061ec1e2a88e6a4e315fd2f036ce3ab5b16b4a75ad465adb5c9a9ec0fa7f2778), - y: uint256(0x26847cf463d35b576aabdf21e0f57817568f76fde3c666eb425024628b086e24) + x: uint256(0x0e5cb0521c16b7e51540251b51adb95e4ce6d507a75c32e0c33377c21853d058), + y: uint256(0x2ca91c89d04305640dcd8eefc8d33d78d27efee8fda3ac261150c8d675dff0d3) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x00cd86c00718de5d85a7dd98c5caf77426f2236847d1a4f67de2fe3ee3b02261), - y: uint256(0x04ed434352485cb0c24f861d5e46a8350edf7f0bc34912a3f0ef7fb6b162f40c) + x: uint256(0x1e7842d12cae260b5fabe275ae67fc449e3a55615f7f83da87b1ea7c9e8f0500), + y: uint256(0x1ea86788529c46dc304e64c22662f3c8c4e3e2e347500ccf539780071a293aad) }), s1: Honk.G1Point({ - x: uint256(0x0b8ddadd38386aa67ea96f4a25d7cfadc0523fb112bbbacc652c24626216ab8e), - y: uint256(0x1953e3e6e56fac58d9f3be004a1674769b548a6f502e9c6e7cb94d235232cb08) + x: uint256(0x0e90e964ef25f8c1aec26541f31cc9320b50fd36e39520d025d13e032037727e), + y: uint256(0x1089017a718fae9b93f24789f8ef17aeed176bf9d16edb535a63d32648528a92) }), s2: Honk.G1Point({ - x: uint256(0x0bac1ce7376d890ab715b04c6a1b928e8c742e51a2f9cb6516f5c9ce1395a17e), - y: uint256(0x009850df5f3d2cf17cee9dea2572461604a28de7975a0f7d23b4b6e08a39cbb8) + x: uint256(0x1aacf9506f5763680928c04b60d8217d4db189f8e148fd444a114ea18338fc8c), + y: uint256(0x0b260dbc5d61e1b32e055570a5dd0a835b4f9672cd12dad8314aaa58eea62dd4) }), s3: Honk.G1Point({ - x: uint256(0x1c3e7f90779a9d7a7ddfd427a34de2387f8cda3f070effc37144cb2d4f71b6b9), - y: uint256(0x27b3618027edf37d01f85c478b4a059f278c05fc42364bfa3e81f041010040b1) + x: uint256(0x00357d87f2822ca4102863d9736d121154762e65008fb88d0851b22f7d564c5f), + y: uint256(0x261b2a08cf2c8f3df7c5758aa7532df230d3348c1ad7b6ff1cf75dce3e8a03c7) }), s4: Honk.G1Point({ - x: uint256(0x022433380316455da7a7afd341ffc0da5b293c66db4cbb65c84fab3d527c8df0), - y: uint256(0x2d2fdf2d082e9c60dcb5f8cc4f85d35ad72413409686b742a350cd3d2aa9d923) + x: uint256(0x063add626791aade9be4f0371c6bb601295f7715cd35c540a64881892bb9015f), + y: uint256(0x242cfc11084db62679ffc86ae33655c2adf2c60ee9a18c3fda51910194358f18) }), t1: Honk.G1Point({ x: uint256(0x1f16b037f0b4c96ea2a30a118a44e139881c0db8a4d6c9fde7db5c1c1738e61f), @@ -104,28 +104,28 @@ library HonkVerificationKey { y: uint256(0x2d7e8c1ecb92e2490049b50efc811df63f1ca97e58d5e82852dbec0c29715d71) }), id1: Honk.G1Point({ - x: uint256(0x11a6b7aca7d05ea2d35ddd74a875c69a9f2f6594ad469df1d2d026e7236616ff), - y: uint256(0x02ce80b8cded10c12ed81ac20da8c5895f4ea6b9b75415740511e4772d3a3926) + x: uint256(0x1dab2791b5e739b6eda84ec6578132dd1f9295f16540f1a221a615f137c750d0), + y: uint256(0x0be694840789fada394fb3182a06d50f0c313775cea2b52e6ec3d09705d4ed13) }), id2: Honk.G1Point({ - x: uint256(0x06aa6de0cf0fb3d6cc77673a7b5dd980e7d11453e33287a757ada5629bf18096), - y: uint256(0x26ae7e73586c3e296172b022f0de8b79aea7aa7b7255839c7349a83144f3e16c) + x: uint256(0x2922506083c612268913dac1af860cae5d49406ce01679ccfc17f95f1ab2a95f), + y: uint256(0x29b3e2aa20c02de724c5142a941fdc7578c80fa8e2984882ffdf2c3a98ab8877) }), id3: Honk.G1Point({ - x: uint256(0x17c3af29ef11f6f215863b3d63c2d64f683554076da0af1fb1d43480729d9ac5), - y: uint256(0x022f3c451c11490892bceaecb4b2d1635ce84f45b84b2b403bdb7d385912757f) + x: uint256(0x021afc0b974f923bb6e3116b7a7d04af835678e17a0e8ef3e9e723ca2c2122e9), + y: uint256(0x1a1a18df93aba1975b374fd27695da35bbc0e243edbbcf67ec6e58c3441198fb) }), id4: Honk.G1Point({ - x: uint256(0x2fdb37fbe00da4c51efae957e1a99650a86f26d8a0d22ecd9431aa76a37b7a3f), - y: uint256(0x14e184683b870a80cb2efad30c16f4b98e735d429248142c540071f5b7d61722) + x: uint256(0x22c8713ddae54a7bb0751e8e2d97049735a71cf2e840c5a8c4e3d94af4bad28b), + y: uint256(0x12b05267a7d72d33761c4742e8b03365cbdb383efd91743447b64d1714259595) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x2999796704e174ce17834f2bd8d5789d1fef54e60fd19cc6a6c14d1c5ab1f8b4), - y: uint256(0x2abb6acbedaef28c6920446c9f70df97df6f158f767b5f3d9c4566f41376e425) + x: uint256(0x23322d7d1115f6d1ee1e781cf348e56fbdf96c6853625397732a472b0711fa65), + y: uint256(0x0359cc7c66a45d683d935dfaac2ada72634fd94dec1136ddf9dda711219be516) }) }); return vk; diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index 5b86070fce..85c8750453 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -94,7 +94,7 @@ describe('CRISP Contracts', function () { slotAddress: address, }) - await mockEnclave.setCommitteePublicKey(proof.publicInputs[0]) + await mockEnclave.setCommitteePublicKey(proof.publicInputs[1]) const encodedProof = encodeSolidityProof(proof) diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index f2e3840252..199eca67b8 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -168,7 +168,7 @@ export type CircuitInputs = { export type ProofData = { publicInputs: string[] proof: Uint8Array - encryptedVote: `0x${string}`[] + encryptedVote: Uint8Array } export type ExecuteCircuitResult = { diff --git a/examples/CRISP/packages/crisp-sdk/src/utils.ts b/examples/CRISP/packages/crisp-sdk/src/utils.ts index ce9c82f41a..77aa2c6f59 100644 --- a/examples/CRISP/packages/crisp-sdk/src/utils.ts +++ b/examples/CRISP/packages/crisp-sdk/src/utils.ts @@ -151,13 +151,3 @@ export async function getOptimalThreadCount(): Promise { // Fallback return 5 } - -/** - * Flatten the ciphertext polynomials into a single array of coefficients - * @param ct0is The first set of ciphertext polynomials - * @param ct1is The second set of ciphertext polynomials - * @returns The flattened ciphertext polynomials as an array of coefficients - */ -export const flattenCiphertext = (ct0is: Polynomial[], ct1is: Polynomial[]): `0x${string}`[] => { - return [...ct0is.flatMap((p) => p.coefficients), ...ct1is.flatMap((p) => p.coefficients)] as `0x${string}`[] -} diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index 11469bd8bd..28106263dc 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -15,14 +15,7 @@ import { VoteProofInputs, Polynomial, } from './types' -import { - generateMerkleProof, - toBinary, - extractSignatureComponents, - getAddressFromSignature, - getOptimalThreadCount, - flattenCiphertext, -} from './utils' +import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, ZERO_VOTE, SIGNATURE_MESSAGE_HASH } from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend } from '@aztec/bb.js' @@ -172,15 +165,18 @@ export const computeCommitment = (ct0is: Polynomial[], ct1is: Polynomial[]): big * Generate the circuit inputs for a vote proof. * This works for both vote and masking. * @param proofInputs - The proof inputs. - * @returns The circuit inputs as a CircuitInputs object. + * @returns The circuit inputs as a CircuitInputs object and the encrypted vote as a Uint8Array. */ -export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { +export const generateCircuitInputs = async ( + proofInputs: ProofInputs, +): Promise<{ crispInputs: CircuitInputs; encryptedVote: Uint8Array }> => { const encodedVote = encodeVote(proofInputs.vote) let crispInputs: CircuitInputs + let encryptedVote: Uint8Array if (!proofInputs.previousCiphertext) { - crispInputs = await zkInputsGenerator.generateInputs( + const result = await zkInputsGenerator.generateInputs( // A placeholder ciphertext vote will be generated. // This is safe because the circuit will not check the ciphertext addition if // the previous ciphertext is not provided (is_first_vote is true). @@ -188,8 +184,14 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise i.toString()) crispInputs.merkle_proof_siblings = proofInputs.merkleProof.proof.siblings.map((s) => s.toString()) - return crispInputs + return { crispInputs, encryptedVote } } /** @@ -261,7 +263,7 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs): Promi const merkleProof = generateMerkleProof(voteProofInputs.balance, address, voteProofInputs.merkleLeaves) - const crispInputs = await generateCircuitInputs({ + const { crispInputs, encryptedVote } = await generateCircuitInputs({ ...voteProofInputs, slotAddress: address, merkleProof, @@ -270,8 +272,6 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs): Promi messageHash: voteProofInputs.messageHash, }) - const encryptedVote = flattenCiphertext(crispInputs.ct0is, crispInputs.ct1is) - return { ...(await generateProof(crispInputs)), encryptedVote } } @@ -283,7 +283,7 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs): Promi export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs): Promise => { const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) - const crispInputs = await generateCircuitInputs({ + const { crispInputs, encryptedVote } = await generateCircuitInputs({ ...maskVoteProofInputs, signature: MASK_SIGNATURE, messageHash: SIGNATURE_MESSAGE_HASH, @@ -291,14 +291,6 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn merkleProof, }) - let encryptedVote: `0x${string}`[] - - if (crispInputs.is_first_vote) { - encryptedVote = flattenCiphertext(crispInputs.ct0is, crispInputs.ct1is) - } else { - encryptedVote = flattenCiphertext(crispInputs.sum_ct0is, crispInputs.sum_ct1is) - } - return { ...(await generateProof(crispInputs)), encryptedVote } } @@ -324,7 +316,13 @@ export const verifyProof = async (proof: ProofData): Promise => { * @returns The encoded proof data as a hex string. */ export const encodeSolidityProof = ({ publicInputs, proof, encryptedVote }: ProofData): Hex => { - const slotAddress = getAddress(numberToHex(BigInt(publicInputs[2]), { size: 20 })) - - return encodeAbiParameters(parseAbiParameters('bytes, bytes32[], address'), [bytesToHex(proof), encryptedVote, slotAddress]) + const slotAddress = getAddress(numberToHex(BigInt(publicInputs[3]), { size: 20 })) + const encryptedVoteCommitment = publicInputs[5] as `0x${string}` + + return encodeAbiParameters(parseAbiParameters('bytes, address, bytes32, bytes'), [ + bytesToHex(proof), + slotAddress, + encryptedVoteCommitment, + bytesToHex(encryptedVote), + ]) } diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 468934b61d..baaa8cb621 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -114,7 +114,7 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, address, LEAVES) - const crispInputs = await generateCircuitInputs({ + const { crispInputs } = await generateCircuitInputs({ vote, publicKey, signature, @@ -135,9 +135,8 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) - // update to an invalid leaf to fail auth in the circuit - merkleProof.leaf = 0n - const crispInputs = await generateCircuitInputs({ + + const { crispInputs } = await generateCircuitInputs({ publicKey, balance, slotAddress, @@ -159,7 +158,8 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) - const crispInputs = await generateCircuitInputs({ + + const { crispInputs } = await generateCircuitInputs({ vote: ZERO_VOTE, publicKey, signature: MASK_SIGNATURE, From 9a6beaebb5875ac67c1be917509a1d0a9dd1348c Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 12:43:47 +0100 Subject: [PATCH 08/12] chore: fix lint errors --- examples/CRISP/packages/crisp-sdk/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CRISP/packages/crisp-sdk/src/utils.ts b/examples/CRISP/packages/crisp-sdk/src/utils.ts index 77aa2c6f59..7317a128b9 100644 --- a/examples/CRISP/packages/crisp-sdk/src/utils.ts +++ b/examples/CRISP/packages/crisp-sdk/src/utils.ts @@ -6,7 +6,7 @@ import { poseidon2 } from 'poseidon-lite' import { LeanIMT } from '@zk-kit/lean-imt' -import type { MerkleProof, Polynomial } from './types' +import type { MerkleProof } from './types' import { MERKLE_TREE_MAX_DEPTH, SIGNATURE_MESSAGE_HASH } from './constants' import { publicKeyToAddress } from 'viem/utils' import { hexToBytes, recoverPublicKey } from 'viem' From 41d89ba55d80626e906d3e047daad65dd008eeec Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 14:47:40 +0100 Subject: [PATCH 09/12] refactor: update merkle tree builder to use ciphertext commitment --- Cargo.lock | 1 + crates/aggregator/src/publickey_aggregator.rs | 4 +- crates/bfv-helpers/src/client.rs | 44 +- crates/bfv-helpers/src/utils/greco.rs | 413 +++++++----------- crates/compute-provider/Cargo.toml | 1 + .../compute-provider/src/compute_manager.rs | 7 +- .../src/merkle_tree_builder.rs | 29 +- crates/indexer/tests/integration.rs | 6 +- crates/tests/tests/integration_legacy.rs | 8 +- crates/wasm/src/lib.rs | 6 +- examples/CRISP/Cargo.lock | 1 + examples/CRISP/crates/evm_helpers/src/lib.rs | 8 +- examples/CRISP/crates/zk-inputs/src/lib.rs | 9 +- .../contracts/CRISPProgram.sol | 4 +- examples/CRISP/program/src/lib.rs | 10 +- examples/CRISP/server/src/server/indexer.rs | 4 +- 16 files changed, 234 insertions(+), 321 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86b29e9634..9ac07831d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2847,6 +2847,7 @@ version = "0.1.7" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", + "e3-bfv-helpers", "hex", "lean-imt", "light-poseidon", diff --git a/crates/aggregator/src/publickey_aggregator.rs b/crates/aggregator/src/publickey_aggregator.rs index 16096ad3d4..2d8fe09f7c 100644 --- a/crates/aggregator/src/publickey_aggregator.rs +++ b/crates/aggregator/src/publickey_aggregator.rs @@ -6,7 +6,7 @@ use actix::prelude::*; use anyhow::Result; -use e3_bfv_helpers::client::compute_poly_commitment; +use e3_bfv_helpers::client::compute_pk_commitment; use e3_data::Persistable; use e3_events::{ prelude::*, BusHandle, Die, E3id, EnclaveEvent, EnclaveEventData, KeyshareCreated, OrderedSet, @@ -182,7 +182,7 @@ impl Handler for PublicKeyAggregator { keyshares: msg.keyshares, })?; - let public_key_hash = compute_poly_commitment( + let public_key_hash = compute_pk_commitment( pubkey.clone(), self.fhe.params.degree(), self.fhe.params.plaintext(), diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs index e065c06957..2b5db229cf 100644 --- a/crates/bfv-helpers/src/client.rs +++ b/crates/bfv-helpers/src/client.rs @@ -5,14 +5,16 @@ // or FITNESS FOR A PARTICULAR PURPOSE. use crate::build_bfv_params_arc; -use crate::utils::greco::bfv_public_key_to_greco; +use crate::utils::greco::{bfv_ciphertext_to_greco, bfv_public_key_to_greco}; use anyhow::{anyhow, Result}; -use fhe::bfv::{Encoding, Plaintext, PublicKey}; +use fhe::bfv::{Ciphertext, Encoding, Plaintext, PublicKey}; use fhe::Error as FheError; use fhe_traits::{DeserializeParametrized, FheEncoder, FheEncrypter, Serialize}; use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; use rand::thread_rng; +use shared::commitments::compute_poly_commitment; +use shared::template::calculate_bit_width; /// Encrypt some data using BFV homomorphic encryption /// @@ -130,15 +132,12 @@ where }) } -pub fn compute_poly_commitment( +pub fn compute_pk_commitment( public_key: Vec, degree: usize, plaintext_modulus: u64, moduli: Vec, ) -> Result<[u8; 32]> { - use shared::commitments::compute_poly_commitment as _compute_poly_commitment; - use shared::template::calculate_bit_width; - let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); let public_key = PublicKey::from_bytes(&public_key, ¶ms) @@ -148,7 +147,7 @@ pub fn compute_poly_commitment( let bit_pk = calculate_bit_width(&bounds.pk_bounds[0].to_string())?; let (pk0is, pk1is) = bfv_public_key_to_greco(&public_key, ¶ms); - let commitment_bigint = _compute_poly_commitment(&pk0is, &pk1is, bit_pk); + let commitment_bigint = compute_poly_commitment(&pk0is, &pk1is, bit_pk); let bytes = commitment_bigint.to_bytes_be().1; @@ -170,6 +169,37 @@ pub fn compute_poly_commitment( Ok(public_key_hash) } +pub fn compute_ct_commitment( + ct: Vec, + degree: usize, + plaintext_modulus: u64, + moduli: Vec, +) -> Result<[u8; 32]> { + let params = build_bfv_params_arc(degree, plaintext_modulus, &moduli, None); + + let ct = Ciphertext::from_bytes(&ct, ¶ms) + .map_err(|e| anyhow!("Error deserializing ciphertext: {}", e))?; + + let (ct0is, ct1is) = bfv_ciphertext_to_greco(&ct, ¶ms); + + let (_, bounds) = GrecoBounds::compute(¶ms, 0)?; + let bit_ct = calculate_bit_width(&bounds.pk_bounds[0].to_string())?; + + let commitment_bigint = compute_poly_commitment(&ct0is, &ct1is, bit_ct); + + let bytes = commitment_bigint.to_bytes_be().1; + + let mut padded_bytes = vec![0u8; 32]; + let start_idx = 32 - bytes.len(); + padded_bytes[start_idx..].copy_from_slice(&bytes); + + let ciphertext_hash: [u8; 32] = padded_bytes + .try_into() + .map_err(|_| anyhow!("Failed to convert padded bytes to array"))?; + + Ok(ciphertext_hash) +} + #[cfg(test)] mod tests { use crate::BfvParamSets; diff --git a/crates/bfv-helpers/src/utils/greco.rs b/crates/bfv-helpers/src/utils/greco.rs index 3bc32003b5..247e535de2 100644 --- a/crates/bfv-helpers/src/utils/greco.rs +++ b/crates/bfv-helpers/src/utils/greco.rs @@ -4,184 +4,12 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -use alloy_dyn_abi::{DynSolType, DynSolValue}; -use alloy_primitives::I256; use fhe::bfv::{BfvParameters, Ciphertext, PublicKey}; -use fhe_math::rq::{traits::TryConvertFrom, Poly, Representation}; -use itertools::izip; -use ndarray::Array2; +use fhe_math::rq::Representation; use num_bigint::BigInt; -use num_traits::ToPrimitive; use shared::constants::get_zkp_modulus; use std::sync::Arc; -/// Converts a greco coefficient (centered, in standard form) to BFV format [0, qi). -/// Standard-form coefficients are centered coefficients reduced mod ZKP modulus. -/// If standard_form >= zkp_modulus/2, it represents a negative centered coefficient. -fn convert_greco_coefficient_to_bfv(centered_coeff: &BigInt, qi: u64, zkp_modulus: &BigInt) -> u64 { - let qi_bigint = BigInt::from(qi); - let half_zkp = zkp_modulus / 2u64; - - // Recover centered coefficient mod qi - // If standard_form >= zkp_modulus/2, it's a negative centered value: centered = standard_form - zkp_modulus - let centered_mod_qi = if centered_coeff >= &half_zkp { - (centered_coeff - zkp_modulus) % &qi_bigint - } else { - centered_coeff % &qi_bigint - }; - - // Un-center: convert from [-(qi-1)/2, (qi-1)/2] to [0, qi) - // Use modular arithmetic: (centered_mod_qi + qi) % qi ensures result is in [0, qi) - let result = (¢ered_mod_qi + &qi_bigint) % &qi_bigint; - result - .to_u64() - .expect("Result should be in [0, qi) and fit in u64") -} - -/// Converts greco-formatted coefficients (reversed, centered) to BFV coefficients. -fn convert_greco_coefficients_to_bfv( - greco_coeffs: &[BigInt], - qi: u64, - zkp_modulus: &BigInt, -) -> Vec { - greco_coeffs - .iter() - .rev() - .map(|coeff| convert_greco_coefficient_to_bfv(coeff, qi, zkp_modulus)) - .collect() -} - -/// Converts greco-formatted coefficients back to a BFV ciphertext. -/// -/// Takes greco-formatted coefficients (centered, reversed, in standard form) and reconstructs -/// the BFV ciphertext. Conversion is exact modulo qi for each modulus. -/// -/// # Safety -/// This function assumes valid input: -/// - `ct0is` and `ct1is` must have length equal to the number of moduli -/// - Each coefficient vector must have length equal to the polynomial degree -/// -/// # Arguments -/// * `ct0is` - Greco coefficients for ct0 (one vector per modulus, standard form) -/// * `ct1is` - Greco coefficients for ct1 (one vector per modulus, standard form) -/// * `params` - BFV parameters -pub fn greco_to_bfv_ciphertext( - ct0is: &[Vec], - ct1is: &[Vec], - params: &Arc, -) -> Ciphertext { - let moduli = params.moduli(); - let degree = params.degree(); - - // Convert greco coefficients to BFV format for each modulus - let zkp_modulus = get_zkp_modulus(); - let mut ct0_coeffs_all = Vec::with_capacity(moduli.len()); - let mut ct1_coeffs_all = Vec::with_capacity(moduli.len()); - - for (ct0i, ct1i, qi) in izip!(ct0is, ct1is, moduli) { - ct0_coeffs_all.push(convert_greco_coefficients_to_bfv(ct0i, *qi, &zkp_modulus)); - ct1_coeffs_all.push(convert_greco_coefficients_to_bfv(ct1i, *qi, &zkp_modulus)); - } - - // Create Poly objects with all RNS limbs - let ctx = params.ctx()[0].clone(); - let ct0_array = Array2::from_shape_fn((moduli.len(), degree), |(i, j)| ct0_coeffs_all[i][j]); - let ct1_array = Array2::from_shape_fn((moduli.len(), degree), |(i, j)| ct1_coeffs_all[i][j]); - - let mut ct0_poly = - Poly::try_convert_from(ct0_array, &ctx, false, Some(Representation::PowerBasis)) - .expect("Failed to create ct0 Poly: invalid coefficient format"); - let mut ct1_poly = - Poly::try_convert_from(ct1_array, &ctx, false, Some(Representation::PowerBasis)) - .expect("Failed to create ct1 Poly: invalid coefficient format"); - - ct0_poly.change_representation(Representation::Ntt); - ct1_poly.change_representation(Representation::Ntt); - - Ciphertext::new(vec![ct0_poly, ct1_poly], params) - .expect("Failed to create Ciphertext: invalid polynomial format") -} - -/// Decodes ABI-encoded greco ciphertext from bytes32[] array. -/// -/// The bytes are expected to be ABI-encoded bytes32[] arrays from Solidity contracts. -/// The array contains ct0is coefficients followed by ct1is coefficients, where each -/// coefficient is a bytes32 value. The coefficients are organized as: -/// - First `num_moduli * degree` bytes32 values are ct0is (grouped by modulus) -/// - Next `num_moduli * degree` bytes32 values are ct1is (grouped by modulus) -/// -/// # Safety -/// This function assumes valid input: -/// - `bytes` must be valid ABI-encoded bytes32[] array -/// - Array must contain exactly `2 * num_moduli * degree` bytes32 values -/// - All values must be valid bytes32 FixedBytes -/// -/// # Arguments -/// * `bytes` - ABI-encoded bytes32[] array containing greco ciphertext coefficients -/// * `params` - BFV parameters (used to determine num_moduli and degree) -/// -/// # Returns -/// A tuple of (ct0is, ct1is) where each is Vec> (one vector per modulus) -pub fn abi_decode_greco_ciphertext( - bytes: &[u8], - params: &Arc, -) -> (Vec>, Vec>) { - let degree = params.degree(); - let num_moduli = params.moduli().len(); - - // ABI-decode the bytes to get bytes32[] array - let array_type = DynSolType::Array(Box::new(DynSolType::FixedBytes(32))); - let decoded = array_type - .abi_decode(bytes) - .expect("Failed to ABI decode bytes32[] array: invalid encoding"); - - let bytes32_array = match decoded { - DynSolValue::Array(arr) => arr, - _ => panic!("Expected array from ABI decode, got invalid type"), - }; - - let ct0is_bytes32_count = num_moduli * degree; - - // Split into ct0is and ct1is (use slices to avoid unnecessary allocations) - let (ct0is_bytes32, ct1is_bytes32) = bytes32_array.split_at(ct0is_bytes32_count); - - // Helper function to extract bytes32 from DynSolValue (assumes valid input) - fn extract_bytes32(value: &DynSolValue) -> [u8; 32] { - match value { - DynSolValue::FixedBytes(b, _) => b - .as_slice() - .try_into() - .expect("Invalid bytes32 length: expected 32 bytes"), - _ => panic!("Expected bytes32 FixedBytes, got invalid type"), - } - } - - // Convert bytes32 arrays to greco coefficient format - let mut ct0is = Vec::with_capacity(num_moduli); - let mut ct1is = Vec::with_capacity(num_moduli); - - for i in 0..num_moduli { - let mut ct0_modulus = Vec::with_capacity(degree); - let mut ct1_modulus = Vec::with_capacity(degree); - - for j in 0..degree { - let idx = i * degree + j; - - // Convert ct0 and ct1 bytes32 to BigInt - let ct0_bytes32 = extract_bytes32(&ct0is_bytes32[idx]); - let ct1_bytes32 = extract_bytes32(&ct1is_bytes32[idx]); - - ct0_modulus.push(bytes32_to_bigint(&ct0_bytes32)); - ct1_modulus.push(bytes32_to_bigint(&ct1_bytes32)); - } - - ct0is.push(ct0_modulus); - ct1is.push(ct1_modulus); - } - - (ct0is, ct1is) -} - /// Converts a BFV coefficient (in [0, qi)) to centered format [-(qi-1)/2, (qi-1)/2]. fn convert_bfv_coefficient_to_centered(coeff: u64, qi: u64) -> BigInt { let qi_bigint = BigInt::from(qi); @@ -219,6 +47,63 @@ fn convert_bfv_coefficients_to_greco( .collect() } +/// Converts a BFV ciphertext to Greco format. +/// +/// Takes a BFV ciphertext and converts it to Greco format, returning ct0is and ct1is +/// as vectors of coefficient vectors (one vector per modulus, standard form). +/// +/// # Arguments +/// * `ct` - BFV ciphertext +/// * `params` - BFV parameters +/// +/// # Returns +/// A tuple of (ct0is, ct1is) where each is Vec> (one vector per modulus) +pub fn bfv_ciphertext_to_greco( + ct: &Ciphertext, + params: &Arc, +) -> (Vec>, Vec>) { + let moduli = params.moduli(); + let degree = params.degree(); + let zkp_modulus = get_zkp_modulus(); + + let ct0_poly = &ct.c[0]; + let ct1_poly = &ct.c[1]; + + let mut ct0_power = ct0_poly.clone(); + let mut ct1_power = ct1_poly.clone(); + ct0_power.change_representation(Representation::PowerBasis); + ct1_power.change_representation(Representation::PowerBasis); + + let mut ct0is = Vec::with_capacity(moduli.len()); + let mut ct1is = Vec::with_capacity(moduli.len()); + + for (i, qi) in moduli.iter().enumerate() { + let mut ct0_modulus = Vec::with_capacity(degree); + let mut ct1_modulus = Vec::with_capacity(degree); + + for j in 0..degree { + let ct0_coeff = ct0_power.coefficients()[(i, j)]; + let ct1_coeff = ct1_power.coefficients()[(i, j)]; + + ct0_modulus.push(ct0_coeff); + ct1_modulus.push(ct1_coeff); + } + + ct0is.push(convert_bfv_coefficients_to_greco( + &ct0_modulus, + *qi, + &zkp_modulus, + )); + ct1is.push(convert_bfv_coefficients_to_greco( + &ct1_modulus, + *qi, + &zkp_modulus, + )); + } + + (ct0is, ct1is) +} + /// Converts a BFV public key to Greco format. /// /// Takes a BFV public key and converts it to Greco format, returning pk0is and pk1is @@ -282,106 +167,15 @@ pub fn bfv_public_key_to_greco( (pk0is, pk1is) } -/// Converts bytes32 (signed 256-bit, two's complement, big-endian) to BigInt -fn bytes32_to_bigint(bytes: &[u8; 32]) -> BigInt { - // Use I256::from_be_bytes which handles two's complement conversion automatically - let i256 = I256::from_be_bytes(*bytes); - - // Convert I256 to BigInt via its string representation - // I256 handles two's complement correctly, so we can use its Display implementation - use std::str::FromStr; - BigInt::from_str(&i256.to_string()) - .expect("I256::to_string() should always produce a valid BigInt string") -} - #[cfg(test)] mod tests { use super::*; - use alloy_primitives::FixedBytes; use fhe::bfv::{Encoding, Plaintext, PublicKey, SecretKey}; - use fhe_traits::{DeserializeParametrized, FheEncoder, Serialize}; + use fhe_traits::FheEncoder; use greco::bounds::GrecoBounds; use greco::vectors::GrecoVectors; use rand::thread_rng; - /// Helper function to set up test parameters, keys, and ciphertext - fn setup_test() -> ( - Arc, - Ciphertext, - (Vec>, Vec>), - ) { - use crate::{BfvParamSet, BfvParamSets}; - let params = BfvParamSet::from(BfvParamSets::InsecureSet512_10_1).build_arc(); - - let mut rng = thread_rng(); - let sk = SecretKey::random(¶ms, &mut rng); - let pk = PublicKey::new(&sk, &mut rng); - - let vote = vec![1u64, 0u64, 0u64]; - let pt = Plaintext::try_encode(&vote, Encoding::poly(), ¶ms).unwrap(); - let (ct, u_rns, e0_rns, e1_rns) = pk.try_encrypt_extended(&pt, &mut rng).unwrap(); - - let (_, bounds) = GrecoBounds::compute(¶ms, 0).unwrap(); - - let bit_pk = - shared::template::calculate_bit_width(&bounds.pk_bounds[0].to_string()).unwrap(); - - let greco_vectors = - GrecoVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk, ¶ms, bit_pk) - .unwrap(); - let standard_vectors = greco_vectors.standard_form(); - - (params, ct, (standard_vectors.ct0is, standard_vectors.ct1is)) - } - - /// Helper function to convert BigInt to bytes32 (big-endian, two's complement) - fn bigint_to_bytes32(bigint: &BigInt) -> [u8; 32] { - use std::str::FromStr; - let i256 = I256::from_str(&bigint.to_string()) - .expect("BigInt should fit in I256 range for bytes32 conversion"); - i256.to_be_bytes() - } - - #[test] - fn test_greco_to_bfv_ciphertext() { - let (params, original_ct, (ct0is, ct1is)) = setup_test(); - - let reconstructed_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); - - assert_eq!(reconstructed_ct.c.len(), original_ct.c.len()); - assert_eq!(reconstructed_ct.level, original_ct.level); - - // Verify serialization/deserialization works - let ct_bytes = reconstructed_ct.to_bytes(); - let deserialized_ct = Ciphertext::from_bytes(&ct_bytes, ¶ms).unwrap(); - assert_eq!(deserialized_ct.c.len(), original_ct.c.len()); - } - - #[test] - fn test_abi_decode_greco_ciphertext_round_trip() { - let (params, original_ct, (ct0is, ct1is)) = setup_test(); - - // Convert greco coefficients to bytes32[] and ABI-encode - let mut bytes32_array = Vec::new(); - for coeffs in [&ct0is, &ct1is] { - for modulus_coeffs in coeffs { - for coeff in modulus_coeffs { - let bytes32 = bigint_to_bytes32(coeff); - bytes32_array.push(DynSolValue::FixedBytes(FixedBytes::from(bytes32), 32)); - } - } - } - - let encoded_bytes = DynSolValue::Array(bytes32_array).abi_encode(); - - // Test full round-trip: ABI decode -> greco -> BFV. - let (ct0is, ct1is) = abi_decode_greco_ciphertext(&encoded_bytes, ¶ms); - let reconstructed_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); - - assert_eq!(reconstructed_ct.c.len(), original_ct.c.len()); - assert_eq!(reconstructed_ct.level, original_ct.level); - } - #[test] fn test_bfv_public_key_to_greco() { use crate::{BfvParamSet, BfvParamSets}; @@ -470,4 +264,93 @@ mod tests { } } } + + #[test] + fn test_bfv_ciphertext_to_greco() { + use crate::{BfvParamSet, BfvParamSets}; + let params = BfvParamSet::from(BfvParamSets::InsecureSet512_10_1).build_arc(); + + let mut rng = thread_rng(); + let sk = SecretKey::random(¶ms, &mut rng); + let pk = PublicKey::new(&sk, &mut rng); + + // Get expected ct0is and ct1is from GrecoVectors + let (_, bounds) = GrecoBounds::compute(¶ms, 0).unwrap(); + let bit_pk = + shared::template::calculate_bit_width(&bounds.pk_bounds[0].to_string()).unwrap(); + + let vote = vec![1u64, 0u64, 0u64]; + let pt = Plaintext::try_encode(&vote, Encoding::poly(), ¶ms).unwrap(); + let (ct, u_rns, e0_rns, e1_rns) = pk.try_encrypt_extended(&pt, &mut rng).unwrap(); + + let greco_vectors = + GrecoVectors::compute(&pt, &u_rns, &e0_rns, &e1_rns, &ct, &pk, ¶ms, bit_pk) + .unwrap(); + let standard_vectors = greco_vectors.standard_form(); + let expected_ct0is = &standard_vectors.ct0is; + let expected_ct1is = &standard_vectors.ct1is; + + // Convert using our function + let (actual_ct0is, actual_ct1is) = bfv_ciphertext_to_greco(&ct, ¶ms); + + // Verify the structure matches + assert_eq!(actual_ct0is.len(), expected_ct0is.len()); + assert_eq!(actual_ct1is.len(), expected_ct1is.len()); + assert_eq!(actual_ct0is.len(), params.moduli().len()); + + // Verify coefficients match for each modulus + for (i, (actual_ct0i, expected_ct0i)) in + actual_ct0is.iter().zip(expected_ct0is.iter()).enumerate() + { + assert_eq!( + actual_ct0i.len(), + expected_ct0i.len(), + "ct0is[{}] length mismatch", + i + ); + assert_eq!( + actual_ct0i.len(), + params.degree(), + "ct0is[{}] should have degree coefficients", + i + ); + + for (j, (actual_coeff, expected_coeff)) in + actual_ct0i.iter().zip(expected_ct0i.iter()).enumerate() + { + assert_eq!( + actual_coeff, expected_coeff, + "ct0is[{}][{}] coefficient mismatch", + i, j + ); + } + } + + for (i, (actual_ct1i, expected_ct1i)) in + actual_ct1is.iter().zip(expected_ct1is.iter()).enumerate() + { + assert_eq!( + actual_ct1i.len(), + expected_ct1i.len(), + "ct1is[{}] length mismatch", + i + ); + assert_eq!( + actual_ct1i.len(), + params.degree(), + "ct1is[{}] should have degree coefficients", + i + ); + + for (j, (actual_coeff, expected_coeff)) in + actual_ct1i.iter().zip(expected_ct1i.iter()).enumerate() + { + assert_eq!( + actual_coeff, expected_coeff, + "ct1is[{}][{}] coefficient mismatch", + i, j + ); + } + } + } } diff --git a/crates/compute-provider/Cargo.toml b/crates/compute-provider/Cargo.toml index 15328cd855..f4e832224d 100644 --- a/crates/compute-provider/Cargo.toml +++ b/crates/compute-provider/Cargo.toml @@ -18,3 +18,4 @@ ark-ff = "=0.4.2" ark-bn254 = "=0.4.0" rayon = "=1.10.0" zk-kit-imt = "0.0.7" +e3-bfv-helpers = { workspace = true } diff --git a/crates/compute-provider/src/compute_manager.rs b/crates/compute-provider/src/compute_manager.rs index 04fecbed2e..b4db0aab86 100644 --- a/crates/compute-provider/src/compute_manager.rs +++ b/crates/compute-provider/src/compute_manager.rs @@ -59,7 +59,10 @@ where let num_leaves = self.input.fhe_inputs.ciphertexts.len(); let mut tree_builder = MerkleTreeBuilder::new(num_leaves); - tree_builder.compute_leaf_hashes(&self.input.fhe_inputs.ciphertexts); + tree_builder.compute_leaf_hashes( + &self.input.fhe_inputs.ciphertexts, + &self.input.fhe_inputs.params, + ); self.input.leaf_hashes = tree_builder.leaf_hashes.clone(); // Compute the ciphertext @@ -87,7 +90,7 @@ where .map(|chunk| { let mut tree_builder = MerkleTreeBuilder::new(chunk.len()); - tree_builder.compute_leaf_hashes(&chunk); + tree_builder.compute_leaf_hashes(&chunk, params.as_slice()); let merkle_root = tree_builder.build_tree().root().unwrap(); let fhe_inputs = FHEInputs { diff --git a/crates/compute-provider/src/merkle_tree_builder.rs b/crates/compute-provider/src/merkle_tree_builder.rs index 324f57ad20..a5914801b5 100644 --- a/crates/compute-provider/src/merkle_tree_builder.rs +++ b/crates/compute-provider/src/merkle_tree_builder.rs @@ -6,10 +6,10 @@ use ark_bn254::Fr; use ark_ff::{BigInt, BigInteger}; +use e3_bfv_helpers::{client::compute_ct_commitment, decode_bfv_params}; use light_poseidon::{Poseidon, PoseidonHasher}; use num_bigint::BigUint; use num_traits::Num; -use sha3::{Digest, Keccak256}; use std::str::FromStr; use zk_kit_imt::imt::IMT; @@ -35,22 +35,19 @@ impl MerkleTreeBuilder { self } - pub fn compute_leaf_hashes(&mut self, data: &[(Vec, u64)]) { + pub fn compute_leaf_hashes(&mut self, data: &[(Vec, u64)], params_bytes: &[u8]) { + let params = decode_bfv_params(params_bytes); + let degree = params.degree(); + let plaintext_modulus = params.plaintext(); + let moduli = params.moduli().to_vec(); + for item in data { - let hex_output = hex::encode(Keccak256::digest(&item.0)); - let sanitized_hex = hex_output.trim_start_matches("0x"); - let numeric_value = BigUint::from_str_radix(sanitized_hex, 16) - .unwrap() - .to_string(); - let fr_element = Fr::from_str(&numeric_value).unwrap(); - let index_element = Fr::from_str(&item.1.to_string()).unwrap(); - let mut poseidon_instance = Poseidon::::new_circom(2).unwrap(); - let hash_bigint: BigInt<4> = poseidon_instance - .hash(&[fr_element, index_element]) - .unwrap() - .into(); - let hash = hex::encode(hash_bigint.to_bytes_be()); - self.leaf_hashes.push(hash); + let commitment = + compute_ct_commitment(item.0.clone(), degree, plaintext_modulus, moduli.clone()) + .expect("Failed to compute ciphertext commitment"); + + let commitment_hex = hex::encode(commitment); + self.leaf_hashes.push(commitment_hex); } } diff --git a/crates/indexer/tests/integration.rs b/crates/indexer/tests/integration.rs index 8b932477e1..63f02523fb 100644 --- a/crates/indexer/tests/integration.rs +++ b/crates/indexer/tests/integration.rs @@ -9,9 +9,7 @@ use alloy::{ primitives::{Bytes, FixedBytes, Uint}, sol, }; -use e3_bfv_helpers::{ - build_bfv_params_from_set_arc, client::compute_poly_commitment, BfvParamSets, -}; +use e3_bfv_helpers::{build_bfv_params_from_set_arc, client::compute_pk_commitment, BfvParamSets}; use e3_evm_helpers::contracts::ReadOnly; use e3_indexer::{DataStore, EnclaveIndexer, InMemoryStore}; use eyre::Result; @@ -100,7 +98,7 @@ async fn test_indexer() -> Result<()> { let sk = SecretKey::random(¶ms, &mut rng); let pk = PublicKey::new(&sk, &mut rng); - let public_key_commitment = compute_poly_commitment( + let public_key_commitment = compute_pk_commitment( pk.to_bytes(), params.degree(), params.plaintext(), diff --git a/crates/tests/tests/integration_legacy.rs b/crates/tests/tests/integration_legacy.rs index 4a17e0cef3..ebdcb67727 100644 --- a/crates/tests/tests/integration_legacy.rs +++ b/crates/tests/tests/integration_legacy.rs @@ -8,7 +8,7 @@ use actix::prelude::*; use actix::Actor; use alloy::primitives::{FixedBytes, I256, U256}; use anyhow::*; -use e3_bfv_helpers::client::compute_poly_commitment; +use e3_bfv_helpers::client::compute_pk_commitment; use e3_ciphernode_builder::CiphernodeBuilder; use e3_ciphernode_builder::CiphernodeHandle; use e3_ciphernode_builder::EventSystem; @@ -221,7 +221,7 @@ async fn test_public_key_aggregation_and_decryption() -> Result<()> { let rng_test = create_shared_rng_from_u64(42); let test_shares = generate_pk_shares(¶ms, &crpoly, &rng_test, ð_addrs)?; let test_pubkey = aggregate_public_key(&test_shares)?; - let public_key_hash = compute_poly_commitment( + let public_key_hash = compute_pk_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), @@ -569,7 +569,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { let test_pubkey = aggregate_public_key(&generate_pk_shares( ¶ms, &crpoly, &rng_test, ð_addrs, )?)?; - let public_key_hash = compute_poly_commitment( + let public_key_hash = compute_pk_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), @@ -612,7 +612,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { ¶ms, &crpoly, &rng_test, ð_addrs, )?)?; - let public_key_hash = compute_poly_commitment( + let public_key_hash = compute_pk_commitment( test_pubkey.to_bytes(), params.degree(), params.plaintext(), diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index c2bdeb3c57..2de2751d95 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -5,7 +5,9 @@ // or FITNESS FOR A PARTICULAR PURPOSE. use e3_bfv_helpers::{ - client::{bfv_encrypt, bfv_verifiable_encrypt, compute_poly_commitment}, + client::{ + bfv_encrypt, bfv_verifiable_encrypt, compute_pk_commitment as _compute_pk_commitment, + }, BfvParamSet, BfvParamSets, }; use serde::{Deserialize, Serialize}; @@ -60,7 +62,7 @@ pub fn compute_pk_commitment( plaintext_modulus: u64, moduli: Vec, ) -> Result, JsValue> { - let commitment = compute_poly_commitment(public_key, degree, plaintext_modulus, moduli) + let commitment = _compute_pk_commitment(public_key, degree, plaintext_modulus, moduli) .map_err(|e| JsValue::from_str(&format!("{}", e)))?; Ok(commitment.to_vec()) } diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index a6396216b6..67db7860ed 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -2364,6 +2364,7 @@ version = "0.1.7" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", + "e3-bfv-helpers", "hex", "lean-imt", "light-poseidon 0.2.0", diff --git a/examples/CRISP/crates/evm_helpers/src/lib.rs b/examples/CRISP/crates/evm_helpers/src/lib.rs index d9e4025ee0..8955ce4386 100644 --- a/examples/CRISP/crates/evm_helpers/src/lib.rs +++ b/examples/CRISP/crates/evm_helpers/src/lib.rs @@ -32,7 +32,7 @@ sol! { } sol! { - event InputPublished(uint256 indexed e3Id, bytes vote, uint256 index); + event InputPublished(uint256 indexed e3Id, bytes encryptedVote, uint256 index); } /// Type alias for read-only provider (no wallet) @@ -138,7 +138,11 @@ impl CRISPContract { ) -> Result { let contract = CRISPProgram::new(self.contract_address, self.provider.as_ref()); - match contract.isSlotEmptyByAddress(e3_id, slot_address).call().await { + match contract + .isSlotEmptyByAddress(e3_id, slot_address) + .call() + .await + { Ok(is_empty) => Ok(is_empty), Err(e) => Err(eyre::eyre!("Failed to check if slot is empty: {}", e)), } diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 36aebc5b0c..9bbfb0fe51 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -9,11 +9,8 @@ //! This crate contains the main logic for generating CRISP inputs for zero-knowledge proofs. use crisp_constants::get_default_paramset; +use e3_sdk::bfv_helpers::build_bfv_params_arc; use e3_sdk::bfv_helpers::BfvParamSet; -use e3_sdk::bfv_helpers::{ - build_bfv_params_arc, - utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext}, -}; use eyre::{Context, Result}; use fhe::bfv::BfvParameters; use fhe::bfv::Ciphertext; @@ -119,8 +116,8 @@ impl ZKInputsGenerator { // Ciphertext Addition Section. // Deserialize the previous ciphertext. - let (ct0is, ct1is) = abi_decode_greco_ciphertext(prev_ciphertext, &self.bfv_params); - let prev_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, &self.bfv_params); + let prev_ct = Ciphertext::from_bytes(prev_ciphertext, &self.bfv_params) + .with_context(|| "Failed to deserialize previous ciphertext")?; // Compute the ciphertext addition. let sum_ct = &ct + &prev_ct; diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol index 471fdcc959..5a39e5e9a9 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol @@ -10,7 +10,7 @@ import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IE3Program } from "@enclave-e3/contracts/contracts/interfaces/IE3Program.sol"; import { IEnclave } from "@enclave-e3/contracts/contracts/interfaces/IEnclave.sol"; import { E3 } from "@enclave-e3/contracts/contracts/interfaces/IE3.sol"; -import { LazyIMTData, InternalLazyIMT, PoseidonT3 } from "@zk-kit/lazy-imt.sol/InternalLazyIMT.sol"; +import { LazyIMTData, InternalLazyIMT } from "@zk-kit/lazy-imt.sol/InternalLazyIMT.sol"; import { HonkVerifier } from "./CRISPVerifier.sol"; contract CRISPProgram is IE3Program, Ownable { @@ -56,7 +56,7 @@ contract CRISPProgram is IE3Program, Ownable { error MerkleRootNotSet(); // Events - event InputPublished(uint256 indexed e3Id, bytes vote, uint256 index); + event InputPublished(uint256 indexed e3Id, bytes encryptedVote, uint256 index); /// @notice Initialize the contract, binding it to a specified RISC Zero verifier. /// @param _enclave The enclave address diff --git a/examples/CRISP/program/src/lib.rs b/examples/CRISP/program/src/lib.rs index 1d894a3851..7e54fb13e3 100644 --- a/examples/CRISP/program/src/lib.rs +++ b/examples/CRISP/program/src/lib.rs @@ -4,13 +4,10 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -use e3_bfv_helpers::{ - decode_bfv_params_arc, - utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext}, -}; +use e3_bfv_helpers::decode_bfv_params_arc; use e3_compute_provider::FHEInputs; use fhe::bfv::Ciphertext; -use fhe_traits::Serialize; +use fhe_traits::{DeserializeParametrized, Serialize}; /// CRISP Implementation of the CiphertextProcessor function pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { @@ -18,8 +15,7 @@ pub fn fhe_processor(fhe_inputs: &FHEInputs) -> Vec { let mut sum = Ciphertext::zero(¶ms); for ciphertext_bytes in &fhe_inputs.ciphertexts { - let (ct0is, ct1is) = abi_decode_greco_ciphertext(&ciphertext_bytes.0, ¶ms); - let ciphertext = greco_to_bfv_ciphertext(&ct0is, &ct1is, ¶ms); + let ciphertext = Ciphertext::from_bytes(&ciphertext_bytes.0, ¶ms).unwrap(); sum += &ciphertext; } diff --git a/examples/CRISP/server/src/server/indexer.rs b/examples/CRISP/server/src/server/indexer.rs index d5d92880f9..86696debc5 100644 --- a/examples/CRISP/server/src/server/indexer.rs +++ b/examples/CRISP/server/src/server/indexer.rs @@ -393,10 +393,10 @@ pub async fn register_input_published( "InputPublished: e3_id={}, index={}, data=0x{}...", event.e3Id, event.index, - hex::encode(&event.vote[..8.min(event.vote.len())]) + hex::encode(&event.encryptedVote[..8.min(event.encryptedVote.len())]) ); - repo.insert_ciphertext_input(event.vote.to_vec(), event.index.to::()) + repo.insert_ciphertext_input(event.encryptedVote.to_vec(), event.index.to::()) .await?; Ok(()) } From bd6d20d602ac6e6583bdf0ad6ec1a5bb19afd3fc Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 14:52:36 +0100 Subject: [PATCH 10/12] chore: update cargo lockfile --- templates/default/Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index ea6e39884a..f7eb90d5d0 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -1201,6 +1201,7 @@ version = "0.1.7" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", + "e3-bfv-helpers", "hex", "lean-imt", "light-poseidon", From 649480d0ffe12509866e3614ffacfea0c7a920e4 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 15:07:01 +0100 Subject: [PATCH 11/12] test: update previous ciphertext in vote test --- .../tests/fixtures/previous-ciphertext.json | 1860 ----------------- .../packages/crisp-sdk/tests/vote.test.ts | 9 +- 2 files changed, 5 insertions(+), 1864 deletions(-) delete mode 100644 examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json diff --git a/examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json b/examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json deleted file mode 100644 index cd4d5fbe43..0000000000 --- a/examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json +++ /dev/null @@ -1,1860 +0,0 @@ -[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 147, 53, 41, 191, 223, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 49, 40, 127, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 79, 150, 215, 168, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 186, 190, 77, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 50, 137, - 242, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 3, 39, 22, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 241, 137, 106, 171, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 106, 249, 44, 212, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 255, 227, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 129, 34, 213, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 175, 160, 109, 35, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 146, 199, 35, 225, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 103, 248, 109, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 180, 22, 194, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 175, 175, 31, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 146, 202, 94, 241, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 145, 183, 117, 69, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 180, 119, 211, - 29, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 36, - 189, 139, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 131, 199, 22, 40, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 89, 182, 189, 220, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 243, 189, 2, 238, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 12, 107, - 180, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, - 52, 87, 193, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 56, 70, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 12, 52, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 131, 44, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 81, 172, 168, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 243, 117, 54, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 146, 4, 154, 16, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 191, 254, 208, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 33, 36, 54, - 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 201, 215, 127, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 242, 28, 151, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 55, 37, 43, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 90, 175, 210, 217, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 67, 27, - 252, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 182, 147, 96, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 186, 189, 120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 188, 152, 93, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 112, 153, 133, 157, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 134, 193, 248, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 244, 164, 92, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 147, 159, 247, 81, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 96, 254, 163, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 182, 64, 153, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 103, 78, 57, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 135, 210, 222, 45, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 140, 245, 82, 222, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 30, 107, 193, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 15, - 242, 167, 22, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 143, 243, 61, 252, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 114, 87, 69, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 88, 127, 167, 237, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 73, 27, 156, - 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 164, - 64, 4, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 55, 106, 218, 239, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 159, 50, 40, 233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 136, 19, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 144, 56, 149, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 143, 120, 27, 192, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 171, 2, 143, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 199, 36, 206, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 217, 11, 123, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 65, 173, - 14, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 77, 153, 37, 147, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 207, 73, 207, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 177, 16, 189, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 15, 86, 22, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 2, 55, 34, 61, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 139, 253, 231, 193, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 25, 77, 107, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 150, 216, 75, 158, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 58, 104, 66, 86, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 190, 239, 97, 209, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 36, 76, 37, 2, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 242, 217, 168, 25, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 124, 152, 199, 188, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 134, 221, 207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 189, 59, 123, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 22, 157, 116, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 161, 208, 107, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 82, 72, 45, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 224, 216, 169, - 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 28, - 58, 8, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 189, 73, 56, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 140, 80, 120, 174, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 150, 20, 150, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 112, 151, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 165, 105, 116, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 119, 183, 246, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 5, 175, 49, 224, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 145, 4, 239, 97, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 83, 248, - 153, 1, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, - 24, 117, 146, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 179, 58, 132, 178, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 114, 198, 109, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 255, 13, 52, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 218, 49, 245, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 242, 229, 196, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 52, 93, 163, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 192, 40, 111, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 65, 81, - 243, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 82, 175, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 190, 130, 188, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 214, 174, 72, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 147, 49, 138, 69, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 227, 91, 243, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 168, 214, 84, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 193, 33, 247, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 248, 135, 53, 222, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 41, 237, 40, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 109, 48, 124, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, 53, 176, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 213, 168, 102, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 131, 132, 171, 3, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 146, 19, 67, 195, 98, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 145, 64, 180, 195, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 73, 34, 194, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 30, 216, 29, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 133, 56, 106, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 147, 121, 250, 186, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 223, 166, 224, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 3, 26, 238, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 113, 33, 211, 183, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 170, 143, 8, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 250, 163, 13, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 133, 66, 204, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 137, 139, 54, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 126, 148, 188, 211, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 201, 240, 250, - 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 81, 211, 213, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 132, 169, 236, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 168, 87, 176, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 185, 32, 64, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 143, 174, 194, 180, 68, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 165, 30, 155, 65, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 161, 48, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 205, 68, 208, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 177, 244, 252, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 244, 125, 150, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 133, 116, 241, 238, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 117, 67, 99, 165, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 77, 44, 70, 31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 90, 29, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 3, 199, 1, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 97, 158, 145, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 198, 16, 12, 108, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 98, 111, 31, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 46, 72, 127, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 110, 88, 147, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 64, 61, 160, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 80, 141, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 217, 21, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 229, 5, 1, 119, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 200, 248, - 239, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, - 209, 209, 241, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 91, 67, 128, 33, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 80, 202, 103, 27, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, 72, 157, 42, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 34, 212, - 202, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 55, 178, 20, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 97, 86, 251, 15, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 97, 56, 219, 138, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 190, 22, 20, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 222, 166, 236, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 63, 227, 37, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 187, 170, 225, 76, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 98, 92, 99, 215, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 19, 55, 105, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 140, 53, 180, 163, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 104, 162, 171, 246, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 138, 145, 233, 220, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 192, 90, 232, 165, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 112, 117, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 93, 241, 144, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 113, 20, 93, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 84, 212, 220, 67, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 62, 59, 8, - 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 57, 7, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 24, 20, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 2, 140, 148, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 162, 210, 9, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 145, 111, 171, 176, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 192, - 25, 203, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 186, 78, 123, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 0, 249, 211, 144, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 18, 59, 185, 72, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 5, 1, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 53, 85, 209, 244, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 29, 228, 13, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 113, 44, 86, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 44, 111, 207, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 142, 1, 83, 111, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 246, 67, - 35, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 182, 222, 14, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 47, 52, 178, 15, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 79, 136, 168, 217, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 156, 62, 10, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 103, 133, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 169, 178, 26, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 102, 233, 226, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, 164, 70, 186, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 80, 180, 93, - 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 246, 249, 163, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 235, 85, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 68, 236, 116, 236, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 50, 111, 177, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 242, 233, 94, 191, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 247, 226, 72, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 42, 251, 128, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 130, 53, 17, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 187, 15, 50, - 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 208, 8, 194, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 209, 95, 43, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 3, 228, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 143, 240, 9, 26, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 174, 174, 39, - 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 203, 234, 86, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 151, 193, 140, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 154, 21, 238, 143, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 181, 147, 20, 40, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 141, 196, 118, 231, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 56, 171, 131, 223, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 10, 184, 201, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 67, 30, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 30, 122, 191, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 146, 117, 20, 26, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 206, 80, 62, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 49, 216, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 3, 177, 24, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 134, 192, 96, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 146, 93, 214, 71, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 226, 247, 44, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 137, 191, 182, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 59, 162, 222, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 202, 95, 250, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 219, 111, 137, 70, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 146, 88, 142, 38, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 205, 161, 39, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 199, 79, 242, 128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 77, 20, 184, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 83, 171, 10, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 183, 232, 188, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 254, 49, 67, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 147, 105, 221, 51, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 144, 56, 22, 79, 97, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 147, 226, 41, 211, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 219, 155, 127, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 53, 9, 236, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 192, 100, 235, 160, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 87, 78, 135, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 2, 9, 213, 153, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 47, 70, 197, 145, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 206, 23, 80, 170, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 35, 186, 214, 248, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 76, 104, 222, 215, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 51, 58, - 211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 93, 21, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 235, 35, 79, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 150, 107, 134, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 80, 200, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 210, 67, 82, 113, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 13, 4, 61, 173, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 146, 217, 42, 236, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 29, 3, 109, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 107, 13, 81, 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 7, 10, 144, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 227, 146, 232, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 216, 161, 247, 190, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 142, 89, 8, 233, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 123, 184, - 153, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 249, 95, 116, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 80, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 134, 9, 105, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 211, 153, 167, - 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 168, - 42, 229, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 218, 156, 127, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 196, 23, 183, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 59, 143, 94, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 146, 185, 189, 180, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 145, 147, 51, 121, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 211, 166, 128, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 205, 236, 185, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 77, 203, 20, 234, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 145, 130, 172, 31, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 106, 182, 142, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 130, 115, 228, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 214, 129, 74, 64, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 174, 142, 223, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 45, 73, 211, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 141, 142, 194, 28, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 98, 254, 192, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 237, 43, 158, 156, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 43, 112, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 125, 164, 132, 135, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 213, 120, 200, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 40, 146, 115, 183, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 235, 230, 221, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 55, 37, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 87, 150, 55, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 143, 254, 245, 140, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 49, 191, 72, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 108, - 107, 89, 125, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 142, 117, 255, 68, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 14, 253, 201, 192, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 28, 93, 74, 116, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 156, 150, 130, - 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 100, 147, 199, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 34, 253, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 135, 224, 104, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 101, 199, 244, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 37, 183, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 88, 18, 182, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 194, 225, 237, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 147, 239, 59, 33, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 142, 28, 206, 202, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 224, 144, 111, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 234, 241, 187, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 161, 194, 29, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 205, 112, 253, 133, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 34, 124, - 135, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 208, 137, 178, 216, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 111, 112, 0, 34, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 42, 230, 153, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 180, 91, 165, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 148, 94, 68, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 110, 163, 91, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 211, 59, 159, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 41, 249, 46, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 168, 212, 10, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 145, 173, 203, 242, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 89, 45, 78, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 142, 146, 216, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 67, 50, 86, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 220, 124, 0, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 77, 174, 137, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 18, 33, 180, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 144, 104, 215, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 146, 133, 29, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 48, 212, 118, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 252, 177, 178, 39, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 63, 7, 6, 206, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 161, 9, 100, 253, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 199, 119, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 82, 128, 144, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 202, 79, 223, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 82, 167, 40, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 84, 37, 152, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 188, 133, 204, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 145, 194, 210, 254, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 147, 206, 124, 103, 82, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 59, 123, 134, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 16, 81, 181, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 138, 61, 20, 198, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 143, 210, 128, 210, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 154, 108, 175, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 216, 120, 169, 82, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 117, 156, 68, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 28, 223, 172, 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 141, 251, 152, 164, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 104, 209, 4, 111, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 145, 8, 194, 73, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 87, 62, 188, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 134, 201, - 182, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 167, 53, 245, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 19, 182, 183, 21, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 4, 23, 135, 106, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 57, 64, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 243, 106, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 177, 131, 224, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 236, 224, 74, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 87, 20, 150, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 144, 42, 126, 149, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 216, 220, 45, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 193, 72, 161, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 3, 30, 227, 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 39, 24, 13, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 172, 225, 134, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 205, 68, 51, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 129, 160, 247, 67, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 141, 120, 222, 133, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 143, 85, 181, 18, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 99, 60, 80, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 233, - 119, 223, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 144, 11, 229, 119, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 135, 108, 248, 57, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 240, 175, 90, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 193, 63, 217, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 36, 229, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 209, 17, 65, 111, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 142, 227, 102, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 243, 152, 25, - 155, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 29, - 64, 31, 40, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 143, 128, 50, 166, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 166, 207, 152, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 204, 145, 56, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 146, 178, 76, 100, 240, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 192, 202, 99, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 145, 26, 237, 25, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 37, 159, 18, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 45, 248, 173, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 56, 25, 249, 70, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 108, 210, 183, 154, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 110, 125, 134, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 238, 93, 201, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 50, 1, 213, 190, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 226, 238, 254, 61, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 248, 154, 74, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 239, 94, 236, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 39, 251, 173, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 124, 251, 229, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 106, 41, 152, 126, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 140, 229, 30, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 147, 53, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 86, 101, 231, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 174, 227, 65, - 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 211, - 10, 115, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 141, 87, 104, 79, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 131, 253, 165, 195, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 105, 194, 106, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 158, 109, - 126, 79, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, - 251, 84, 194, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 145, 177, 156, 55, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 139, 52, 34, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 210, 208, 243, - 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 57, - 92, 21, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 216, 6, 150, 235, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 239, 152, 225, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 233, 35, 253, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 16, 26, 254, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 45, - 104, 42, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 145, 120, 227, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 216, 54, 4, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 164, 183, 247, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 205, 115, 52, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 136, 213, 224, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 182, 242, 194, 149, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 219, 45, 64, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 214, 43, 61, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 214, 131, 82, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 21, 168, 105, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 140, 158, 107, 177, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 214, 233, 167, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 104, 97, - 206, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, - 183, 86, 236, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 143, 168, 225, 240, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 145, 214, 113, 107, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 142, 213, 215, 234, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 143, 198, 178, 252, 212, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 131, 87, 141, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 85, 198, 194, 106, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 221, 63, 224, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 77, 133, 41, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 254, - 113, 26, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 89, 61, 240, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 33, 66, 57, 217, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 49, 90, 185, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 66, 226, 11, 239, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 143, 62, 176, 114, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 7, 88, 84, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 12, 22, 235, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 144, 252, 70, 109, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 144, 243, 177, 63, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 15, 63, 217, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 140, 39, 52, 146, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 63, 12, 210, 154, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 160, 78, 234, 104, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 129, 216, 212, 187, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 158, 10, 92, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 170, 49, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 146, 55, 211, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 142, 154, 198, 145, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 144, 59, 177, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 62, 196, 52, 47, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 128, 5, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 254, 172, 125, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 87, 190, 171, 67, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 78, 217, 53, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 16, 167, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 71, 204, 126, 73, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 147, 53, 167, 71, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 226, 37, - 100, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 43, 61, 68, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 47, 51, 89, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 75, 67, 206, 120, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 105, 123, 198, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 191, 173, 43, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 207, 136, 18, 120, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 142, 129, 143, 47, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 216, 107, 236, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 153, 12, - 168, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 219, 163, 107, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 172, 221, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 240, 87, 231, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 142, 3, 192, 116, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 110, 195, 142, 224, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 143, 8, 207, 163, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 147, 162, 41, 182, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 224, 197, 18, - 112, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 237, - 212, 25, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 233, 11, 64, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 183, 50, 249, 233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 87, 134, 24, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 172, 25, 252, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 82, 106, 193, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 171, 66, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 216, 52, 147, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 202, 242, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 198, 163, - 83, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 207, 252, 12, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 208, 178, 208, 225, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 104, 86, 200, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 203, 230, 223, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 247, 137, 223, 193, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 240, 243, 55, 45, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 141, 64, 215, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 153, 99, 187, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 173, 81, 58, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 144, 225, 145, 114, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 53, 76, 130, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 215, 148, 114, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 240, 156, 67, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 151, - 216, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 249, 64, 26, 3, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 188, 139, 36, 247, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 88, 142, 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 113, 41, 203, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 38, 154, 125, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 99, 197, 63, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 141, 85, 210, 43, 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 147, 110, 156, 212, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 190, 152, 54, - 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 73, 182, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 130, 56, 50, 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 20, 92, 81, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 212, 63, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 190, - 161, 30, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 143, 209, 63, 53, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 143, 62, 113, 144, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 145, 83, 68, 132, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 147, 123, 73, 236, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 146, 174, 53, 184, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 69, 2, 71, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 107, 181, 47, 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 138, 14, 196, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 121, 96, 49, 157, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 6, 128, - 197, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 102, 194, 96, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 26, 29, 131, 193, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 90, 199, 67, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 247, 250, 6, 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 213, 123, 26, 4, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 17, 108, 251, 78, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 200, 180, 102, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 144, 115, 201, 60, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 181, 128, 39, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 52, 95, 252, 163, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 48, 77, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 102, 50, 158, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 37, 128, 138, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 157, 56, 174, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 47, - 88, 86, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 139, 18, 42, 177, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 181, 31, 242, 100, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 218, 170, 112, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 99, 116, 163, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 163, 5, 118, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 26, 222, 18, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 58, 4, 107, 131, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 227, 173, 153, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 216, 209, 49, 37, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 106, 208, 205, 192, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 189, 155, 133, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 223, 117, 122, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 60, 26, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 134, - 170, 153, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 140, 200, 179, 173, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 112, 88, 218, 130, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 254, 253, 213, 73, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 17, 168, 69, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 12, 44, 230, 133, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 121, 104, 131, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 249, 167, 69, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 39, 25, 19, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 146, 51, 187, 212, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 218, 241, 207, 148, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 160, 135, 73, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 144, 162, 210, 219, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 143, 86, 9, 89, 215, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 145, 11, 35, 185, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 97, 48, 204, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 208, 24, 230, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 225, 97, 42, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 119, 67, - 202, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 133, 70, 228, 48, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 145, 11, 19, 61, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 147, 33, 200, 240, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 91, 249, 38, 235, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 6, 198, 157, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 192, 210, 219, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 225, 197, 177, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 119, 101, 143, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 200, 196, 23, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 132, 28, 92, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 158, 225, 179, 168, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 5, 149, 240, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 32, 22, 140, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 52, 86, 151, - 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 61, 86, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 102, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 164, 56, 67, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 106, 68, 237, 147, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 212, 200, 145, 132, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 125, 150, 130, 85, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 17, 1, 177, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 40, 105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 77, 209, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 147, 167, 96, 75, 139, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 144, 203, 134, 102, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 45, 93, 59, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 211, 186, 23, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 65, 7, 204, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 214, 29, 249, 254, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 146, 3, 164, 38, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 175, 25, 41, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 211, 165, 81, 90, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 101, 247, 106, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 115, 13, 167, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 33, 1, 92, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 56, 70, 57, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 147, 91, 212, 129, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 189, 150, 70, 110, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 242, 243, - 232, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 193, 210, 203, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 187, 230, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 53, 32, 107, 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 73, 65, 76, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 0, - 156, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 173, 49, 184, 92, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 9, 196, 176, 57, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 237, 145, 68, 161, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 4, 16, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 180, 162, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 221, 201, 56, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 220, 38, 102, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 203, 247, 219, 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 152, 94, 182, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 71, 167, 221, 50, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 68, 95, 31, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 92, 20, 250, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 188, 220, 127, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 226, 130, 62, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 108, - 63, 115, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 248, 200, 207, 116, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 168, 148, 226, 132, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 153, 8, 63, 129, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 70, 99, - 121, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 141, 54, 160, 187, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 32, 113, 99, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 227, 73, 146, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 32, 252, 188, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 113, 3, 78, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 214, 86, 143, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 174, 84, 76, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 228, 93, 224, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 139, 89, 50, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 212, 12, 151, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 81, 172, 30, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 147, 55, 231, 149, 227, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 147, 154, 18, 246, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 123, 39, 138, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 208, 115, 191, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 191, 154, 9, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 233, 14, 19, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 253, - 93, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, - 226, 66, 197, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 145, 211, 180, 200, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 142, 8, 203, 111, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 114, 47, 219, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 247, 72, 234, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 93, 138, 102, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 134, 80, 122, 208, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 50, 120, 65, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 109, 241, 110, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 94, 86, - 43, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, - 150, 80, 253, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 141, 245, 31, 171, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 8, 120, 106, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 149, 174, 120, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 233, 197, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 196, 6, 169, 60, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 213, 30, 131, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 252, 187, 36, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 48, 59, 154, 239, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 214, 76, 41, 179, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 186, 50, 170, 224, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 138, 136, 176, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 207, 232, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 34, 88, - 15, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, - 170, 125, 197, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 150, 158, 53, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 140, 161, 19, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 137, 228, 114, - 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, - 35, 55, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 33, 243, 194, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 117, 103, 94, 16, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 137, 201, 5, 90, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 122, 171, 44, - 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 232, - 129, 57, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 233, 2, 189, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 87, 137, 73, 134, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 147, 122, 98, 200, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 52, 30, 252, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 97, 2, 2, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 99, 206, 185, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 13, 75, 200, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 212, 49, 170, 127, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 192, 143, 21, - 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 138, 96, 103, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 189, 197, 77, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 1, 66, 149, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 147, 24, 185, 7, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 141, 43, 154, 194, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 143, 99, 250, 105, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 141, 25, 233, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 199, 39, 25, 143, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 210, 154, 173, 245, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 151, 135, 251, 121, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 62, 67, 112, 139, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 206, 71, 92, 149, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 143, 120, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 49, 144, 91, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 239, 171, 36, 35, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 226, 9, 77, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 45, 227, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 181, 85, 206, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 23, 248, 38, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 141, 160, 10, 93, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 114, 254, 225, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 50, 209, 57, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 186, 85, 186, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 224, 135, 150, - 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 210, 202, 88, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 126, 78, 100, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 252, 71, 5, 226, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 44, 15, 107, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 146, 242, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 95, - 253, 92, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 216, 230, 187, 111, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 144, 190, 76, 11, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 5, 59, 70, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 173, 250, 72, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 96, 85, 17, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 252, 247, 175, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 145, 170, 40, 244, 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 252, 1, 125, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 145, 41, 130, 51, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 68, 188, 228, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 140, 74, 249, 7, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 142, 63, 226, 4, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 249, 85, - 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 185, 228, 126, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 75, 225, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 40, 0, 244, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 160, 58, 12, 8, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 142, 254, 211, 243, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 147, 7, 121, 212, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 219, 86, 9, 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 153, 235, 16, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 140, 205, 34, 161, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 188, 214, 162, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 110, 159, 246, 120, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 94, 140, 47, 207, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 107, 225, 62, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 6, 23, 210, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 131, 183, 62, 89, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 163, 199, 73, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 116, 170, 167, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 179, 149, 75, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 103, 130, - 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 7, - 157, 111, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 195, 8, 11, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 139, 242, 252, 24, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 138, 130, 175, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 203, - 68, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 94, 29, 37, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 146, 98, 252, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 162, 170, 122, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 247, 239, 227, - 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 115, - 66, 99, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 176, 164, 249, 253, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 47, 210, 16, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 158, 174, 248, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 84, 27, - 62, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 179, 255, 30, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 135, 67, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 186, 137, 166, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 73, 72, 192, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 136, 149, 99, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 178, 39, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 30, 197, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 187, 157, 227, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 129, 40, - 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 182, 175, 192, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 242, 183, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 71, 105, 176, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 68, 57, 5, 58, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 165, 211, - 143, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 243, 99, 91, 51, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 241, 247, 234, 230, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 193, 18, 146, 125, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 196, 171, 98, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 234, 188, 74, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 163, 181, 108, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 159, 94, 57, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 197, 125, 228, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 25, 68, 217, 174, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 244, 28, 32, 78, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 130, 181, 209, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 174, 226, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 18, 133, 50, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 228, 119, 133, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 166, 231, 88, 63, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 211, 254, 187, 88, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 213, 146, 211, 36, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 22, 185, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 247, 45, 41, 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 74, 94, 168, 66, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 202, 242, 68, 67, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 216, 98, 170, 235, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 128, 226, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 10, 53, 105, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 26, 128, 125, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 213, 249, 143, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 179, 245, 134, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 74, 170, 147, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 77, 75, 234, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 144, 204, 119, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 147, 70, 218, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 142, 242, 15, 182, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 196, 77, 165, - 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 31, - 51, 111, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 92, 0, 254, 44, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 92, 146, 16, 49, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 86, 7, 160, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 156, 43, 211, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 144, 50, 228, 196, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 174, 253, 252, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 39, 205, 163, 237, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 158, 14, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 98, 167, 162, 207, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 174, 248, 11, 241, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 179, 70, 116, 124, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 126, 87, 163, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 58, 55, 33, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 141, 134, 8, 9, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 172, 44, 236, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 153, 100, 52, 163, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 112, 83, 91, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 43, 56, 21, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 196, 216, 72, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 108, 193, 145, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 150, 148, 105, 214, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 174, 245, 238, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 111, 137, 50, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 136, 216, 9, 140, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 216, 247, 61, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 88, 144, 183, 174, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 217, 122, 142, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 55, 192, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 149, 35, 171, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 96, 225, 109, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 28, 76, 204, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 232, 243, - 151, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 207, 88, 96, 93, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 71, 200, 193, 185, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 23, 162, 153, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 143, 231, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 187, 150, 242, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 183, 15, 190, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 25, 125, 79, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 124, 215, 182, 103, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 231, 117, 127, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 165, 231, 147, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 163, 242, 144, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 18, 126, 40, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 123, 138, 87, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 29, 210, 114, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 8, 38, 42, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 147, 124, 180, 193, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 227, 232, 165, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 211, 85, - 222, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 130, 129, 78, 132, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 41, 167, 80, 225, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 172, 247, 86, 63, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 135, 180, 102, - 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 85, 8, - 207, 189, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 187, 100, 91, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 82, 240, 20, 168, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 130, 99, 76, 211, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 232, 138, 36, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 110, 75, 179, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 154, 226, 167, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 254, 230, 61, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 131, 135, 181, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 78, 211, 235, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 231, 21, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 57, 123, 123, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 67, 151, 31, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 245, 182, 6, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 141, 134, 66, 90, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 37, - 59, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 61, 124, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 239, 164, 6, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 110, 79, 37, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 195, 91, 164, - 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 100, 236, 162, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 93, 222, 177, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 211, 123, 183, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 28, 76, 239, 161, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 47, 138, 137, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 219, 155, 199, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 143, 95, 30, 233, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 24, 123, 212, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 207, 144, 115, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 118, 60, 1, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 61, 91, 246, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 143, 150, 26, 207, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 191, 176, 99, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 159, 1, - 244, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, - 202, 195, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 140, 235, 17, 67, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 174, 39, 219, 172, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 154, 219, 152, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 109, 202, 21, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 36, 32, 115, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 25, 122, 231, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 147, 237, 209, 81, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 124, 217, 185, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 149, 47, 125, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 145, 23, 127, 189, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 114, 32, 142, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 206, 219, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 29, 86, 60, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 229, 246, 133, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 80, 19, 102, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 223, 255, 152, 226, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 133, 39, 15, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 93, 130, 197, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 43, 181, 66, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 229, 220, 91, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 135, 63, 248, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 18, 149, 14, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 210, 61, 80, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 84, 135, 175, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 165, 100, 122, 120, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 80, 139, 72, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 16, 11, 101, 128, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 197, 207, 210, 219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 51, 91, 51, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 34, 46, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 145, 225, 94, 231, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 61, 26, 16, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 172, 118, 55, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 89, 18, 6, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 245, 243, 200, 29, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 215, 78, 14, - 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 75, - 204, 233, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 109, 25, 48, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 231, 110, 248, 160, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 233, 35, 218, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 119, 138, 14, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 213, 70, 39, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 145, 208, 43, 185, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 95, 199, 121, 87, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 207, 4, 85, - 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 155, - 194, 43, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 73, 92, 45, 154, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 186, 100, 37, 31, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 179, 216, 247, 200, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 35, 64, 52, 191, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 27, 241, 97, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 213, 143, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 43, 219, 100, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 251, 211, 117, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 212, 213, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 26, 42, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 160, 50, 203, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 79, 39, 57, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 11, 187, 71, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 44, 47, 214, - 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 210, 150, 65, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 20, 217, 109, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 220, 70, 207, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 143, 35, 248, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 120, 18, 192, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 32, 17, 169, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 26, 124, 230, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 106, 35, 51, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 173, 20, - 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 250, - 202, 135, 244, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 74, 163, 190, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 160, 4, 140, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 77, 13, 214, 32, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 132, 252, 107, 120, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 150, 82, 128, 11, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 253, 153, 100, 175, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 198, 28, 71, 223, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 12, 118, 144, 227, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 5, 99, 227, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 57, 142, 47, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 15, 131, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 163, 30, 32, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 58, 107, 212, 89, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 146, 170, 72, 2, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 139, 96, 169, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 127, 52, 114, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 70, 0, 94, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 141, 240, 221, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 35, 168, 229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 249, 25, 152, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 226, 117, 117, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 224, 221, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 108, 33, 154, 73, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 146, 162, 105, 114, 53, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 79, 177, 146, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 116, 216, 250, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 148, 64, 62, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 143, 213, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 99, 2, 231, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 161, 160, 18, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 174, 143, 68, 49, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 74, 29, 4, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 58, 247, 65, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 230, 14, 183, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 238, 63, 71, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 138, 5, 2, 93, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 118, 202, 252, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 94, 121, 202, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 195, 55, 14, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 230, 13, 61, 110, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 111, 234, 221, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 242, 192, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 124, - 121, 175, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 144, 242, 16, 59, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 146, 255, 142, 188, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 215, 201, 190, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 222, 112, - 182, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 113, 18, 39, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 88, 219, 233, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 239, 185, 249, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 237, 148, 115, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 24, 2, 148, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 147, 26, 207, 94, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 145, 181, 60, 89, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 181, 208, 186, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15, 226, 165, 222, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 163, 100, 126, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 170, 72, 214, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 117, 10, 109, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 116, 221, 244, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 197, 107, 75, 205, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 211, 129, 105, 105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 90, 109, 21, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 147, 176, 194, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 202, 22, 52, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 208, 18, 188, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 143, 202, 182, 37, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 175, 6, 225, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 158, 21, 52, 213, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 239, 177, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 9, 184, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 163, 40, 85, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 144, 130, 16, 127, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 141, 62, 41, 66, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 196, 110, 242, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 219, 50, 33, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 35, 42, 119, 197, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 118, 99, 171, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 120, 88, 246, 227, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 175, 46, 92, 51, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 128, 168, 214, 192, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 9, 125, 212, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 191, 159, 12, 161, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 8, 41, 197, 181, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 227, 219, 230, 141, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 247, 25, 55, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 118, 163, 245, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 208, 134, 42, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 218, - 10, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 79, 239, 136, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 169, 204, 245, 122, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 219, 247, 63, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 24, 140, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, - 102, 57, 189, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 140, 58, 176, 144, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 175, 87, 34, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 192, 66, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 205, 16, 161, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 183, 88, 174, 53, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 146, 46, 32, 139, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 8, 16, 172, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 133, 240, 9, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 217, 96, 200, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 141, 220, 210, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 37, 201, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 232, 119, 218, 49, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 165, 87, 108, 103, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 170, 175, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 142, 47, 211, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 44, 220, 11, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 146, 7, 249, 130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 194, 94, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 1, 7, 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 239, 7, 139, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 217, 68, 100, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 147, 178, 235, 49, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 145, 96, 30, 254, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 141, 4, 176, 168, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 125, 71, 252, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 206, 240, 4, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 233, 73, 193, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 99, 22, 210, - 3, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 93, - 226, 200, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 147, 175, 13, 237, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 41, 207, 166, 226, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 238, 170, 57, 172, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 44, 138, - 6, 8, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 68, - 192, 17, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 179, 83, 31, 85, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 73, 146, 45, 108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 250, 156, 161, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 231, 3, 56, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 234, 213, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 204, 190, 238, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 10, 190, 42, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 118, 197, 151, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 235, 114, 40, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 22, 43, 223, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 225, 246, 79, 142, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 219, 136, 110, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 109, 50, 135, 119, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 34, 118, 194, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 228, 33, 27, 207, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 113, 76, 139, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 206, 216, 158, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 166, 255, - 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 48, 158, 20, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 220, 32, 128, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 206, 170, 246, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 210, 24, 78, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 70, - 168, 146, 62, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 72, 20, 232, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 141, 36, 220, 150, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 56, 230, 150, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 198, 251, 97, 45, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 136, 153, 36, 40, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 69, 205, 233, 15, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 31, 185, 191, 189, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 38, 115, 127, 167, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 128, 207, 41, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 251, 147, 131, 35, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 84, 115, 36, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 156, 242, 178, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 142, 38, 8, 130, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 85, 120, 156, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 248, 0, 157, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 131, 205, 197, 158, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 214, 156, 9, 182, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 128, 218, - 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 1, - 57, 43, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 145, 214, 154, 196, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 102, 41, 5, 75, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 186, 125, 97, 95, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 117, 249, 225, - 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 145, - 152, 162, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 202, 116, 64, 74, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 86, 173, 138, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 40, 41, 17, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 147, 219, 220, 133, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 118, 190, 168, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 150, 159, 253, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 67, 210, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 218, 18, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 133, - 247, 99, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 127, 83, 217, 163, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 51, 101, 23, 66, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 8, 47, 142, 71, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 243, 149, 116, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 58, 231, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 20, 218, 45, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 143, 247, 92, 167, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 49, 57, 0, 135, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 153, 74, 167, 201, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 40, 21, 214, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 241, 179, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 108, 29, 184, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 190, 243, 21, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 22, 204, 207, 115, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 102, 52, 99, 155, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 226, 120, 253, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 67, 14, 159, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 110, 28, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 118, 223, 132, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 106, 55, 249, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 100, 191, 18, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 165, 247, 11, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 122, - 2, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 255, 115, 160, 21, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 65, 175, 102, 239, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 156, 218, 152, 180, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 108, 84, 189, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 126, 145, 95, 33, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 109, 244, 80, 83, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 70, 0, 252, 158, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 156, 80, 134, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 220, 43, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 250, 80, - 54, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 66, 104, 182, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, 83, 208, 53, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 175, 88, 243, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 118, 195, 79, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 100, 178, 28, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 193, 162, 102, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 247, 91, 152, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 142, 139, 35, 72, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 144, 92, 55, 38, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 108, 33, 105, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 98, 140, 109, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 77, 132, 234, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 65, 17, 132, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 123, 162, 28, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 188, 135, 94, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 45, 187, 141, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 135, 16, 236, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 78, 157, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 98, 84, 19, 29, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 234, 181, 12, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 57, 227, 254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 104, 121, 214, 52, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 152, 78, 98, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 245, 87, - 225, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 245, 127, 231, 41, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 229, 208, 52, 134, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 74, 219, 227, 241, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 33, 166, 120, 112, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 134, 102, 44, 29, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 248, 251, 210, 113, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 122, 249, 149, 36, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 111, 60, 156, 243, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 195, 226, 142, 21, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 82, 78, 229, 137, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 1, 90, 193, 75, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 99, 142, 123, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 69, 107, 107, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 117, 117, 168, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 203, 39, 71, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 224, 166, 160, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 224, 0, 240, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 141, 81, 167, 31, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 109, - 147, 101, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 142, 72, 255, 189, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 120, 253, 219, 18, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 29, 243, 83, 210, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 34, 136, 14, 102, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 230, 122, 204, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 132, 41, 181, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 47, 165, 234, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 100, 235, 215, - 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 96, - 244, 85, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 76, 92, 133, 80, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 169, 244, 29, 202, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 128, 113, 172, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 221, 237, 249, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 69, 85, 24, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 73, 123, 7, 139, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 144, 200, 205, 60, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 163, 184, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 18, 128, 37, 151, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 225, 88, 104, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 123, 180, 122, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 147, 66, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 199, 139, - 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 103, 120, 124, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 198, 56, 115, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109, 250, 166, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 141, 160, 137, - 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 253, - 108, 114, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 136, 169, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 229, 45, 188, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 220, 192, 56, 74, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 112, 53, 196, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 69, 158, 107, 59, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 192, 39, 255, 106, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 141, 76, 53, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 25, 157, 120, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 213, 57, - 139, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 180, 245, 233, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 144, 201, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 87, 204, 192, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 146, 58, 13, 4, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 187, 69, - 173, 238, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, - 105, 108, 153, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 181, 203, 193, 234, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 187, 96, 111, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 168, 34, 119, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 174, 137, 197, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 85, 15, 199, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 141, 36, 197, 131, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 12, 40, 128, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 10, 0, - 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 122, 19, 46, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 3, 233, 106, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 249, 111, 157, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 216, 211, 61, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 12, 28, 65, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 90, 142, 155, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 50, 64, 25, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69, 22, 203, 227, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 102, 59, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 22, 123, 229, 159, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 115, 57, 91, 72, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 36, 167, 245, 216, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 104, 121, 246, 150, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 67, 70, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 152, 36, 106, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 134, 82, 9, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 103, 12, 131, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 72, 187, 201, 87, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 28, 160, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, 17, 52, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 207, 125, 119, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 15, 59, 196, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 255, 75, 47, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 0, 88, 172, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 99, 105, 121, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 210, 118, 8, 224, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 247, 121, 207, 214, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 213, 75, 51, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 134, 80, 92, 148, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 255, 150, 148, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 229, 141, 241, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 229, 214, 47, 66, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 113, 241, 225, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 214, 231, 214, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 208, 157, 164, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 27, 157, 214, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 252, 190, 29, 81, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 27, 12, 143, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 117, 53, 138, 86, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 59, 3, 255, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 186, 89, 98, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 18, 35, 69, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 141, 234, 23, - 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 243, - 142, 169, 183, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 143, 31, 223, 251, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 141, 92, 236, 89, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 158, 173, 179, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 32, 91, 110, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 169, 34, 119, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 141, 213, 234, 94, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 202, 87, 4, 84, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 161, 102, 181, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 89, 224, 227, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 88, 160, 90, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 118, 19, 250, 6, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 141, 150, 27, 192, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 216, 169, - 81, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 104, 46, 171, 146, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 11, 216, 120, 152, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 38, 208, 15, 247, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 141, 119, 138, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 45, 250, 34, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 42, 119, 247, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 122, 201, 220, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 143, 237, 160, 209, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 156, 159, 157, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 147, 72, 204, 175, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 124, 61, 240, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 140, 246, 76, 174, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 46, 91, 180, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 179, 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 186, 124, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 199, 43, 5, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 81, 37, 155, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 99, 143, 220, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 183, 17, 51, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 180, 50, 180, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 114, 133, 225, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 116, 6, 46, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37, 129, 47, 94, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 233, 0, 43, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 189, 3, 120, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 215, 110, 220, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 175, 130, 255, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 244, 40, 75, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 147, 76, 213, 198, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 189, 2, 129, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 29, 152, 148, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 161, 231, 107, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 167, 97, 148, - 10, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 77, - 157, 212, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 214, 63, 206, 153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 65, 56, 181, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 26, 253, 21, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 178, 155, 116, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 195, 87, 86, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 131, 17, 78, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 142, 164, 45, 149, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 120, 125, - 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 87, 45, 63, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 36, 30, 13, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 174, 117, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 76, 52, 62, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 46, 129, 20, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 141, 60, 214, 12, 68, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 201, 18, 216, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 120, 147, 168, 115, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 218, 219, 170, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 179, - 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 18, 63, 125, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 45, 146, 246, 129, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 158, 38, 130, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 59, 84, 214, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 195, - 215, 5, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 141, 185, 2, 67, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 140, 250, 185, 104, 205, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 47, 209, 156, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 195, 84, - 18, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 243, 168, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 144, 240, 204, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 16, 163, 123, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 142, 77, 103, 45, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 133, - 116, 192, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 144, 132, 21, 3, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 224, 38, 171, 121, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 62, 81, 44, 237, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 246, 25, 193, - 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 172, 135, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 154, 38, 213, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 196, 218, 203, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 254, 113, 156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, - 188, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, - 207, 158, 62, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 140, 145, 144, 104, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 185, 166, 38, 76, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60, 109, 139, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 149, 46, 83, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 140, 89, 147, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 200, 192, 1, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 198, 234, 14, 222, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 156, 176, - 18, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 115, 107, 140, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 10, 113, 77, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 140, 179, 101, 57, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 22, 130, 143, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 75, 203, 72, 155, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 61, 227, 124, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 220, 10, 100, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 162, 176, - 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 199, 158, 47, 164, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 79, 150, 206, 146, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 54, 158, 224, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 159, 69, 160, 121, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 26, 3, 192, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 112, 234, 39, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 192, 182, 54, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 134, 19, 135, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 97, 181, 219, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 118, 246, - 208, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 67, 133, 50, 110, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 238, 34, 210, 123, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 27, 70, 185, 238, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 95, 109, 174, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 217, 29, 150, 147, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 241, 223, 106, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 255, 255, 233, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 166, 23, 0, 15, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 235, 67, 238, - 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 45, - 148, 19, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 35, 12, 241, 82, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 147, 161, 212, 124, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 48, 71, 179, 215, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 57, 82, - 246, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 59, 236, 245, 31, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 249, 195, 61, 120, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 238, 194, 220, 22, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 212, 96, 61, 181, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 2, 141, 205, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 106, 148, 213, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 219, 53, 84, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 60, 174, 3, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 156, 224, 103, 162, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 14, 237, 175, 5, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 65, 72, 32, 48, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 223, 28, 215, 145, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 172, 180, 61, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50, 140, 125, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 208, - 37, 206, 17, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 140, 148, 234, 69, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 147, 238, 191, 46, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 117, 195, 106, 160, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 231, 40, - 1, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, - 158, 155, 213, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 218, 208, 214, 112, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 45, 210, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 34, 96, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 240, 240, 114, 110, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 159, 165, 45, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 160, 68, 148, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 224, 121, 71, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 19, 206, 86, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 170, - 2, 93, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, - 183, 191, 168, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 140, 6, 142, 96, 152, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 141, 152, 215, 160, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 122, 143, - 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 75, - 187, 123, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 141, 232, 14, 64, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 68, 32, 227, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 253, 194, 246, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 230, 202, 181, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 61, 214, 153, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 72, 81, 199, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 203, 62, 242, 116, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 43, 174, 244, - 153, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 41, - 103, 230, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 220, 182, 172, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 225, 122, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 1, 131, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 147, 199, 222, 229, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 227, 247, 110, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 14, 94, 55, 144, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 161, 161, 197, 182, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15, 13, 52, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 251, 186, 108, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 106, 188, 199, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 182, 242, 114, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 14, 42, 194, 80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 40, 182, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 140, 229, 18, 182, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 203, 80, 42, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 65, 56, 77, 166, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 126, 52, 128, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 99, 171, 52, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 179, 235, 203, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 123, 200, 43, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 115, 103, 49, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 107, 143, 6, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 2, 219, 78, 121, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 95, 136, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 79, 74, 220, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 64, 87, 152, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 158, 196, 93, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 196, 247, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 77, 19, 121, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 60, 206, 70, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 154, 231, 236, 150, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 224, 7, - 198, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 150, 180, 134, 25, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 211, 62, 69, 50, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 53, 75, 30, 243, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 133, 94, 5, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 232, 162, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 242, 195, 56, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 152, 172, 126, 211, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 128, 248, 104, - 163, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 145, - 157, 47, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 220, 71, 157, 34, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 198, 191, 226, 252, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 97, 30, 176, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 62, 230, 121, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 235, 164, 77, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 209, 84, 230, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 30, 160, 177, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 175, 54, 91, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 25, 108, - 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 197, - 169, 180, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 34, 164, 150, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 141, 68, 213, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 99, 215, 153, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 76, 76, - 138, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 141, 228, 152, 18, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 24, 180, 100, 197, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 0, 64, 132, 157, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 152, 48, 121, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 231, 40, 148, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 167, 56, 157, 102, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 91, 217, 18, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 154, 40, 7, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 162, 129, 16, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 141, 86, 211, 22, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 171, 80, 57, 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 143, 181, 6, 184, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 143, 94, 49, 63, 52, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 69, 95, 152, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 30, 39, 21, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 102, 134, 58, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, - 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 167, 227, 146, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 61, 127, 121, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 143, 1, 213, 86, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 73, 207, - 209, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, - 134, 127, 22, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 69, 136, 216, 220, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 229, 85, 154, 131, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 246, 87, 64, 103, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 61, 129, - 193, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 36, 78, 219, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 29, 5, 253, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 185, 110, 132, 23, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 196, 33, 115, 182, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 72, 233, - 66, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 1, 136, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 242, 18, 192, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 62, 245, 99, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 126, 106, 1, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 214, 36, 206, 179, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 146, 159, 66, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 239, 53, 58, 32, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 166, 139, 217, 236, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 2, 187, 182, 118, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 235, 71, 73, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 235, 25, 29, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 112, 138, 57, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 202, 236, 254, 161, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 215, 68, 249, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 95, 41, 130, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 26, 50, 128, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 210, 208, 225, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 72, 77, 100, 10, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 80, 67, 177, - 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 103, - 90, 112, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 26, 51, 144, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 128, 101, 241, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 139, 30, 241, 117, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 113, 58, 159, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 142, 113, 138, 216, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 221, 250, 230, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 191, 211, 91, 201, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 31, 198, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 195, 130, 188, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 171, 160, 243, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 19, 54, 131, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 228, 232, 75, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 145, 172, 97, 247, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 145, 80, 26, 169, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 226, 244, 104, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 47, 181, 21, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 49, 159, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 244, 215, - 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 236, - 48, 113, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 59, 32, 67, 123, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 60, 226, 172, 46, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 65, 14, 220, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 11, 201, 177, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 120, 6, 45, 31, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 144, 9, 156, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 234, 80, 167, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 130, 190, 36, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 140, 47, 67, 182, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 232, 193, 7, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 29, 228, 100, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 227, 128, 123, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 20, 219, 146, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 142, 27, 184, 217, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 69, 35, 147, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 248, 164, 65, 162, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 141, 79, 59, 4, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 171, 85, 12, 236, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 154, 183, - 87, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 235, 86, 35, 93, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 194, 73, 236, 128, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 207, 132, 21, 179, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 161, 167, 50, 146, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 64, 66, - 109, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 199, 168, 119, 29, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 11, 14, 128, 151, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 162, 212, 81, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 145, 128, 178, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 203, 10, 253, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 238, 153, 34, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 220, 132, 210, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 65, 205, 87, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 91, 29, 91, - 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 76, - 154, 174, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 6, 208, 6, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 162, 105, 15, 165, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 244, 113, 178, 205, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 160, 132, 222, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 105, 111, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 222, 249, 200, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 31, 227, 190, 109, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 81, 225, 162, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 175, 108, 122, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 16, 179, 217, 196, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 156, 154, 204, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 76, 2, 251, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 9, 35, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 174, 177, 118, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 102, 254, 72, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 46, 193, 204, 48, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 115, 126, 219, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 193, 217, 204, 36, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, - 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 89, 31, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 150, 238, 105, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 130, 74, 107, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 141, 119, 104, 22, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 180, 251, 43, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 79, 186, 40, 132, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 149, 61, 172, 95, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 128, 55, 242, 119, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 172, 13, 161, 141, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 32, 18, 215, 41, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 48, 59, 98, 188, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 221, 158, 239, 193, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 95, 196, 71, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 240, 186, 52, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 185, 192, 165, 192, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 49, 97, 59, 142, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 45, 147, 30, 43, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 37, 234, 47, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 72, 217, 150, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 239, 24, 228, 34, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 146, 122, 234, 41, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 121, 235, 172, 176, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 98, 228, 69, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 216, 239, 231, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 144, 74, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 85, 161, 12, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 140, 126, 42, 202, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 108, 201, - 228, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 234, 29, 111, 136, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 88, 242, 187, 38, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 200, 112, 165, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 173, 182, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 54, 192, 120, 153, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 64, 53, 242, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 128, 44, 123, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 169, 198, 21, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 140, 70, 175, 0, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 144, 149, 208, 32, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 221, 190, 18, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 146, 9, 135, 111, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 239, 128, 126, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 138, 94, 211, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 238, 9, 109, 45, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 25, 100, 65, 69, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 242, 123, 101, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 222, 43, 93, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 191, 231, 163, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 141, 191, 233, 228, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 171, 142, 240, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 187, 65, 106, 100, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 141, 60, 125, 101, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 58, - 197, 135, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 122, 4, 35, 213, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 238, 182, 44, 169, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 45, 136, 87, 124, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 249, 131, 145, - 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 245, 91, 198, 154, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 181, 56, 187, 116, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 190, 145, 202, 106, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 12, 67, 50, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 120, 163, 93, 30, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 244, 91, 120, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 152, 71, 212, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 67, 136, 51, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 188, 1, 247, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 241, - 143, 134, 102, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 155, 138, 115, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 25, 190, 154, 159, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 207, 195, 116, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 246, 116, 124, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 152, 242, 127, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 255, 165, 158, 19, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 107, 166, 169, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 246, 20, - 207, 135, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, - 126, 125, 163, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 37, 225, 47, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 254, 21, 119, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 213, 90, 117, 227, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 21, 22, 66, 107, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 20, 218, 138, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 244, 82, 145, 108, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 176, 52, 125, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 38, 155, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, - 61, 174, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 46, 68, 103, 68, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 15, 244, 171, 180, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 204, 149, 232, 15, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 219, 184, 140, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 254, 224, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 110, 42, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 232, 200, 179, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 89, 48, 133, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 202, 34, 232, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 78, 227, 125, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 94, 76, 175, 12, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 226, 241, 194, 107, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 3, 187, 156, 172, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 103, 177, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 123, 236, 101, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 37, 84, 6, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 148, 122, 1, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 72, 254, 187, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 226, 47, 114, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 179, 5, 164, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 83, 136, 45, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 73, 108, 189, 224, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 58, 37, - 226, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 227, 144, 231, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 218, 151, 122, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 168, 125, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 226, 105, 65, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 24, 232, 184, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 109, 174, 198, 90, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 201, 0, 33, 212, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 200, 76, 129, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 176, 15, 114, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 48, 135, 9, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 156, 207, 141, 240, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 145, 121, 143, 203, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 243, 121, - 125, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 82, 225, 222, 218, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 188, 255, 46, 140, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 101, 30, 174, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 173, 37, 199, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 33, - 202, 75, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 143, 161, 173, 6, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 92, 6, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 78, 12, 67, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 203, 245, 163, 169, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 203, 71, 194, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 183, 117, 45, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 218, 168, 218, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 214, 233, 1, - 143, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 114, - 49, 168, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 100, 9, 247, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 126, 196, 100, 160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 186, 8, 186, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 184, 169, 41, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 134, 190, 118, 98, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 146, 251, 196, 225, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 5, 33, 167, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 78, 138, 198, - 173, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 135, - 114, 109, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 63, 198, 244, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 110, 125, 238, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 107, 242, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 207, 237, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 140, 27, 146, 175, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 205, 122, 17, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 108, 214, 244, 132, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 249, 165, 249, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 232, 115, 117, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 157, 231, 27, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 237, 85, 102, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 85, 41, 43, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 146, 236, 100, 182, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 136, 29, 77, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 219, 89, 205, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 142, 138, 116, 249, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 62, 206, 5, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 242, 81, 68, 123, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 94, 247, - 85, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 133, 28, 230, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 108, 229, 239, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 64, 1, 242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 216, 80, 197, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 148, - 1, 84, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 248, 126, 72, 150, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 16, 98, 93, 80, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 252, 67, 69, 21, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 175, 23, 81, 111, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 98, 214, - 247, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 178, 212, 210, 65, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 75, 55, 147, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 112, 241, 57, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 61, 43, 77, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 55, 15, 234, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 124, 222, 166, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 64, 214, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 33, 104, 69, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 32, 89, - 37, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, - 54, 13, 157, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 143, 47, 224, 164, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 140, 148, 180, 175, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 144, 174, 119, 109, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 105, - 115, 150, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 188, 138, 195, 30, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 12, 42, 78, 162, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 214, 165, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 244, 169, 79, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 189, 150, 30, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 45, 113, 201, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 141, 170, 243, 91, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 147, 114, 53, 54, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 12, - 146, 33, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 124, 84, 190, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 174, 70, 72, 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 180, 183, 25, 233, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 100, 128, 183, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 209, 72, 13, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 47, 42, 156, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 213, 150, 116, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 146, 222, 47, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 124, 234, 20, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 242, 250, 31, 24, 48, 100, 78, 114, 225, 49, 160, - 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 232, 121, 246, 200, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 100, 153, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, - 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 68, 91, 33, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 23, 185, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 175, 10, 143, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 144, 37, 214, 180, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 140, 226, 5, 218, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 241, 149, 209, - 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 73, 207, 199, 247, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 153, 196, 134, 126, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 86, 185, 107, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 186, 197, 1, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 25, - 39, 38, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 141, 80, 2, 135, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 92, 225, 16, 209, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 146, 4, 107, 130, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 158, 42, - 200, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 107, 63, 135, 208, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 234, 108, 194, 59, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 88, 162, 54, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 112, 90, 33, 205, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, - 72, 121, 185, 112, 145, 67, 225, 245, 146, 208, 103, 111, 22, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, - 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 197, 63, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 46, 15, 142, 45, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 71, 131, 233, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 212, 65, 247, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 81, 81, 125, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 35, 194, 125, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 69, 54, 112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 76, 237, 188, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 196, 39, 102, 153, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 75, 7, 192, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 199, 37, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 156, 246, 140, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 181, 36, 107, 52, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19, 62, 224, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 12, 111, 225, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 74, 78, 200, 117, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 251, 166, 190, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 154, 114, 212, - 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 168, - 85, 57, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 116, 87, 127, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 82, 115, 232, 180, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 180, 177, 208, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, - 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 84, 139, 239, 176, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 230, 207, 186, 58, 48, 100, 78, 114, 225, 49, - 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 162, 52, 139, 141, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 219, 116, 72, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 176, 185, 234, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 212, - 209, 190, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 167, 37, 36, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 18, 241, 90, 84, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 157, 107, 127, 177, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 176, 185, 196, - 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 44, - 165, 237, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 42, 205, 107, 87, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 207, 29, 213, 81, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 77, 221, 101, 199, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 50, 64, - 115, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, - 56, 84, 126, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 147, 148, 219, 102, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 141, 30, 74, 134, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, - 112, 145, 67, 225, 245, 145, 91, 38, 195, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 140, 17, 159, 241, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 221, 249, 203, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 166, 58, 90, 150, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 140, 54, 253, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 201, 31, 187, 48, 100, 78, 114, 225, 49, 160, 41, - 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 227, 135, 124, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 134, 189, 204, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 187, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 25, 45, - 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 126, - 47, 129, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 146, 25, 124, 176, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 223, 27, 146, 231, 48, 100, - 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 156, 180, 102, 245, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 183, 148, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 34, 200, 221, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 179, 227, 214, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 255, 216, 72, 222, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 86, 8, 211, - 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 141, - 221, 52, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 124, 120, 35, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 251, 73, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 93, 244, 161, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 105, 48, 174, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 14, - 19, 26, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 145, 177, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 81, 88, 71, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 221, 153, 217, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 142, 238, 243, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 39, 87, 179, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 30, 181, 12, 52, 48, 100, 78, 114, - 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 20, 43, 48, 77, 48, 100, 78, - 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 122, 137, 160, 215, 48, - 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 215, 81, 56, - 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 4, - 205, 244, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 32, 203, 4, 20, 48, 100, 78, 114, 225, - 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 212, 51, 44, 140, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 88, 128, 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 191, 12, 146, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 140, 216, 7, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, - 245, 140, 131, 94, 243, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 253, 221, 176, 135, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 229, 20, 64, 48, 100, 78, 114, 225, 49, 160, 41, 184, - 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 67, 182, 164, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 210, 17, 244, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, - 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 231, 10, 15, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, - 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 5, 141, 235, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, - 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 37, 134, 102, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 192, 85, 162, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 234, 222, 91, 19, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 146, 168, 105, 156, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 175, 69, 92, - 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 56, 73, 38, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 140, 70, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 183, 169, 244, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 214, 43, 126, 153, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 71, 47, 249, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 236, 117, 124, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 174, 170, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, - 67, 225, 245, 143, 201, 63, 19, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 131, 42, 220, 230, - 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 165, 17, - 129, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 25, 44, 230, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 129, 163, 3, 137, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, - 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 247, 244, 120, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 24, 144, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, - 121, 185, 112, 145, 67, 225, 245, 142, 31, 172, 185, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 139, 140, 255, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 144, 115, 22, 198, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 140, 28, 34, 239, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 111, 62, 196, - 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 14, - 118, 143, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, - 140, 37, 238, 199, 11, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, - 225, 245, 141, 238, 214, 13, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, - 145, 67, 225, 245, 147, 101, 251, 49, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, - 185, 112, 145, 67, 225, 245, 143, 35, 19, 195, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 77, - 65, 92, 164 -] diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index baaa8cb621..0d516c285d 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -15,11 +15,11 @@ import { generateCircuitInputs, executeCircuit, computeCommitment, + encryptVote, } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, LEAVES } from './constants' -import previousCiphertextEncoded from './fixtures/previous-ciphertext.json' import { CrispSDK } from '../src/sdk' describe('Vote', () => { @@ -29,14 +29,14 @@ describe('Vote', () => { let address: string let slotAddress: string let publicKey: Uint8Array - + let previousCiphertext: Uint8Array let e3Id: number let sdk: CrispSDK const mockGetPreviousCiphertextResponse = () => ({ ok: true, - json: async () => ({ ciphertext: previousCiphertextEncoded }), + json: async () => ({ ciphertext: previousCiphertext }), }) as Response const mockIsSlotEmptyResponse = (isEmpty: boolean) => @@ -62,6 +62,7 @@ describe('Vote', () => { // Address of the last leaf in the Merkle tree, used for mask votes. slotAddress = '0x145B2260E2DAa2965F933A76f5ff5aE3be5A7e5a' publicKey = generatePublicKey() + previousCiphertext = encryptVote(ZERO_VOTE, publicKey) e3Id = 0 sdk = new CrispSDK(CRISP_SERVER_URL) }) @@ -144,7 +145,7 @@ describe('Vote', () => { vote: ZERO_VOTE, signature: MASK_SIGNATURE, messageHash: SIGNATURE_MESSAGE_HASH, - previousCiphertext: new Uint8Array(previousCiphertextEncoded), + previousCiphertext, }) const { returnValue } = await executeCircuit(crispInputs) From 04c07c7c9f1e8a47214ba38dfd9c3fe627497150 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 12 Jan 2026 15:13:12 +0100 Subject: [PATCH 12/12] fix: add check for commitment length --- crates/bfv-helpers/src/client.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/bfv-helpers/src/client.rs b/crates/bfv-helpers/src/client.rs index 2b5db229cf..d740fd4c0d 100644 --- a/crates/bfv-helpers/src/client.rs +++ b/crates/bfv-helpers/src/client.rs @@ -189,6 +189,13 @@ pub fn compute_ct_commitment( let bytes = commitment_bigint.to_bytes_be().1; + if bytes.len() > 32 { + return Err(anyhow!( + "Commitment must be at most 32 bytes, got {}", + bytes.len() + )); + } + let mut padded_bytes = vec![0u8; 32]; let start_idx = 32 - bytes.len(); padded_bytes[start_idx..].copy_from_slice(&bytes);